いろんなところでSwiftのサンプルコードを見ていて、
あんまり使われていないけれどこれって便利なのにな〜
と言うテクニックをまとめてみました。
そんなの知ってるるよ!と言う方も多いと思いますが、自分の中で知ったときに驚いたものということで、
連続 guard let
関数hoge
の返り値がOptional
でその返り値を使って関数huga
を呼び出してと言うのを普通にやると以下のようになるかと思います。
guard let _hoge = hoge() else {return}
guard let _huga = fuga(_hoge) else {return}
ただこれだとguard
×2回で冗長です。
そんな時Swiftでは、guard
条件を連続で使用できます。
guard
let _hoge = hoge(),
let _fuga = fuga(_hoge)
else {return}
(この例だとモナドを使えと言われそうですが、それは割愛。)
didSet
willSetは
どこでも使える!
よくプロパティ監視に使われるdidSet
willSet
ですが、実はどんな変数にでも使えます。
var value = 1{
willSet{
print(newValue)
}
didSet{
print(oldValue)
}
}
value = 6 // 6、1
このように変数宣言につけておけばどんな変数でも監視できるので変数の代入の流れを追うのに便利です。
do
でスコープを切る
Swiftのdo
はdo-catch
やdo-while
の組み合わせとして語れることが多いですが、実は単体でも結構使える子です。
do
節はそのまま実行されますが、スコープ内から出ると名前空間が変わり、またガベージコレクタも動くので、同じ変数名が多く出てくる時やメモリを食う処理をするときに使えます。
do{
let name = "Alice"
...
}
do{
let name = "Bob"
...
}
私はUnitTestをしたり、PlayGround
なんかでロジックの試しをするときなんかに使います。
optional
なprotocol
Obj-C時代ではdelegate
の任意に実装する関数なんかは
@optional
属性にしていたと思います。
ただこれをSwiftで実装しようと思うと@objc
を使う必要が出てきますし、そのprotocol
のすべての引数、返り値などにNSObject
を継承させる必要があります。
なのでPure Swiftでoptionalなprotocol
を実現する方法を探してみました。
protocol SomeProtocol{
func hoge()
func fuga()
}
extension SomeProtocol{
func hoge() {}
}
Swift2.0から導入されたprotocol extension
を用いることで、hoge
は@optional
にhuga
は@required
にできます。
ミス、間違いなどありましたら。
よろしくお願いします。