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の初期化はギリギリまで待ちたい」というケースで良く利用しています。
class BaseViewController: UIViewController {
lazy var firstViewController = UIStoryboard(name: "FirstView", bundle: nil).instantiateInitialViewController()
lazy var secondViewController = UIStoryboard(name: "SecondView", bundle: nil).instantiateInitialViewController()
}