SegueAddition
SegueAdditionというライブラリを書きました。
このライブラリはperformSegueWithIdentifier
を便利に使えるようにしたものです。
使い方を見てみましょう。
let customString = "CustomString"
performSegue("SegueIdentfiier") { segue in
guard let toViewController = segue.destinationViewController as? CustomViewController
else {
fatalError()
}
toViewController.string = customString
}
UIViewControllerのメソッドにperformSegue
というメソッドを一つ追加しました。
performSegue
は従来通りUIStoryboardSegue#identifierを引数に渡せば画面遷移をしてくれます。
performSegueWithIdentifier
を使った下記のコードと一緒な動作をします。
...
let customString = "CustomString"
performSegueWithIdentifier("SegueIdentfiier", sender: customString)
...
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
guard let toViewController = segue.destinationViewController as? CustomViewController,
customString = sender as? String
where segue.identifier == "SegueIdentfiier"
else {
fatalError()
}
toViewController.string = customString
}
performSegueWithIdentifier
と違う点は大きく二つです。
-
prepareForSegue
が呼ばれません。 -
performSegue
には(UIStoryboardSegue -> Void)?
の__closure__を引数として渡すことができます。prepareForSegue
でやろうとしていたことをclosureの中に書くことができます。
いかがでしょうか?
従来通りのperformSegueWithIdentifier
, prepareForSegue
で書く場合は、
遷移を命令する場所と準備を行う場所が乖離しており、書くのも読むのも大変でした。
また、senderでAnyObjectを渡せると言ってもprepareForSegue
中でキャストしたり、
二つ以上の引数を渡したい場合はタプルを使用するなどが必要だったのではないでしょうか?
SegueAddition では、performSegue
を使用することで従来通りの方法よりも書きやすさ読みやすさを実現しています。ViewControllerへ値を渡したい場合でもclosureの中に含めることによって柔軟に値を渡すことができます。
そして、SegueAddtionを導入したからといってperformSegueWithIdentifier
とprepareForSegue
のペアが使えなくなるわけではありません。もちろん、ActionSegueも使えます。
ですので、以前からあるコードを変える必要はないです。
中身はとてもシンプルなので見てもらうと分かりますが、
循環参照もしない作りになっています。
Segueを使ってアプリ開発をしている方は是非おためしください。
おまけ
ResourceKitというライブラリを書いています。
このSegueAdditionを書き終わった時にTODOを一つ増やしました。
- Collaboration SegueAddition
ResourceKitでSegueAdditionのような書き方をサポートしようかなと思案中です。
let customString = "CustomString"
performSegueOpen() { segue in
guard let toViewController = segue.destinationViewController as? CustomViewController else {
fatalError()
}
toViewController.string = customString
}
これでwithIdentifierも消えてよりスッキリしそうです。
ResourceKitはこちらの記事で紹介しています。
まだハードコードで消耗してるの? ResourceKitで安全コーディング!
こちらの方も是非ごらんください。
\(^o^)/