いろんなところで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にできます。
ミス、間違いなどありましたら。
よろしくお願いします。