LoginSignup
43
41

More than 5 years have passed since last update.

Swiftで覚えておくと地味に役立つ機能3選

Posted at

Swiftで知られてない事が多いけど時々役に立つ機能を上げてみました。

2重for文の外側をbreakで抜ける

Swiftでは指定のfor文をbreakで抜ける構文が用意されています。
ラベルを指定してbreakする事で対象のfor文を抜ける事ができます。

label: for i in 0...1 {
    for j in 0...10 {
        if j == 4 { break label }
    }
}

continueも使う事ができます。

label: for i in 0...1 {
    for j in 0...10 {
        if j == 4 { continue label }
    }
}

whileに対しても使えます。

var i = 0
label: while true {
    if i == 5 { break label }
    i++
}

if文に使う事もできるようです。

label: if true {
    if true {
        break label
    }
}

switch文にも使う事ができます。

label: switch 1 {
case 1:
    break label
default: break
}

dynamicTypeで自分のクラス名を知る

dynamicTypeを使うと自分のクラスを知る事ができます。
AnyObjectの中身を知る時などに重宝します。

print("".dynamicType) // → String

dynamicTypeなのですが、これは自分のクラスを返すものです。
なのでdynamicTypeを使えばクラスメソッドを呼び出す事もできます。

class MyClass {
    class func classMethod() {}
}

MyClass().dynamicType.classMethod()

自分のインスタンスを返したい時はselfを使います。

class MyClass {
    func instanceMethod() {}
}

MyClass().self.instanceMethod()

インスタンスの生成を送らせてくれるlazy

lazyを使うとインスタンス生成のタイミングを利用時までずらす事ができます。

class FirstViewController: UIViewController {
    lazy var myClass = MyClass()

    override func viewDidLoad() {
        super.viewDidLoad()

        // 1 → initialized の順番でログが出力される
        print(1)
        _ = myClass // この時に初めてMyClassのinitが走る
    }
}

class MyClass {
    init() {
        print("initialized")
    }
}

下のように「BaseViewControllerの上にViewControllerが2つある」「初期表示の高速化の為に表示しないViewControllerの初期化はギリギリまで待ちたい」というケースで良く利用しています。

スクリーンショット 2015-12-22 11.27.39.png

class BaseViewController: UIViewController {
    lazy var firstViewController  = UIStoryboard(name: "FirstView",  bundle: nil).instantiateInitialViewController()
    lazy var secondViewController = UIStoryboard(name: "SecondView", bundle: nil).instantiateInitialViewController()
}
43
41
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
43
41