swiftで画面遷移の方法どうする?Segueって使うの?
[Swiftを書き始めたときに悩んだことシリーズ]
Swiftを書き始めたときに[swift][画面遷移] で検索すると『segueを使った画面遷移の方法』などがでてきて、「segueって使うの?」ってなりました。
画面遷移をする方法を大きく分けると
- segueを使う
- コードで書く
周りのiOSエンジニアに聞いたら、業務でsegueを使っているところは、ほぼありませんでした。
シンプルな個人アプリとかを作るんだったら良いけど...
複数人で開発をするなら「1Storyboard + 1ViewController」のルールでコードを使って実装するのが良いと思います。
ゴリゴリに書く方法
class FirstViewController: UIViewController { @IBAction func tapNext(_ sender: Any) { let storyboard = UIStoryboard(name: String(describing: SecondViewController.self), bundle: nil) let vc = storyboard.instantiateInitialViewController()! navigationController?.pushViewController(vc, animated: true) } }
問題点
- 遷移先にデータを渡すときにpublicな変数を作って渡す??? -> 良くない
- ごちゃごちゃしている
Androidで画面遷移を実装するときは、遷移先でstaticメソッドを作ってIntentを作成/取得して、遷移元は呼び出すようにしていました。
そのやり方が良いと思うので、iOSでも自分は以下のように実装しています。
自分がやっている実装方法
遷移元
class FirstViewController: UIViewController { @IBAction func tapNext(_ sender: Any) { let vc = SecondViewController.instantiate() navigationController?.pushViewController(vc, animated: true) } }
遷移先
class SecondViewController: UIViewController { static func instantiate(): SecondViewController { let vc = StoryboardUtil.instantiate(self) return vc } }
UIViewControllerを取得するための便利クラス
class StoryboardUtil { static func instantiate<T: UIViewController>(_ type: T.Type) -> T { let sb = UIStoryboard(name: String(describing: type), bundle: Bundle.main) let vc = sb.instantiateInitialViewController() as! T return vc } }
こっちの方がスッキリ書けて良いと思います。
UIViewControllerを取得する方法は、protocolを作ってする方法など色々あるので、自分のしっくりくる方法でやって見てください^^
swiftのProtocolはextensionごとにするの?コードブロックの順番どうしよっか?
[Swiftを書き始めたときに悩んだことシリーズ]
Android(Java)しかやったことない私。
extensionについて理解し、「SwiftのProtocolはextensionごとにするの?」ってなりました
SwiftのProtocolはextensionごとにするの?
他社のコーディング規約を見ると、extensionごとにしているみたいなので、自分もそうしています。
recruit-lifestyle
SmartTechVentures
実際にコードを書き始めたときに「コードブロックの順番どうしよっか?」ってなりました。
recruit-lifestyleには、コードブロックの順番が書いてあり、参考にさせていただきました。
自分は、以下の順番にしています(しようとしています)。
class 定数 公開 ↓ 内部 変数 公開 ↓ 内部 IBOutlet 公開 ↓ 内部 OverrideMethod (ライフサイクルの順番は意識する) Method 公開 ↓ 内部 IBAction extension protocol 自作 ↓ UIKit (UITableViewDelegateとか)
可読性のためにこのルールを守って書いてまs書きたいです
swiftのStringの連結とキャストどうしようかな?
[Swiftを書き始めたときに悩んだことシリーズ]
"\(textA)\n\n\(textB)"
Stringの連結
①
"\(textA)\n\n\(textB)"
②
textA + "\n\n\" + textB
①を使用します!
Stringのキャスト
① return String(score)
return "\(score)"
②
return String(score)
①を使用します!
Androidの消費型のアプリ内課金で「このアイテムは既に所有しています。」 と表示され購入できないAndroidの課金バグ
[Evernoteのメモシリーズ]
2016年6月頃にv3の消費型のアプリ内課金を実装中に遭遇したバグに関するメモです。
発生する状況
課金処理中に通信が切れ、 再度購入しようとすると 「このアイテムは既に所有しています。」 と表示され購入できない
swiftで[weak self]をguardするときの書き方ってどうするのが良いのだろう?
[Swiftを書き始めたときに悩んだことシリーズ]
今年の始めから本格的にiOSアプリを作り始めて、「swiftで[weak self]をguardするときの書き方ってどうするのが良いのだろう?`」って思いました。
調べたり、人に聞いたりすると以下のパターンがありました。(他にもあると思いますけど)
書き方①
guard let `self` = self else { return }
書き方②
guard let me = self else { return }
書き方③
guard let wSelf = self else { return }
書き方④
guard let strongSelf = self else { return }
自分は、書き方①を使っています。
理由
- 別の変数名をつけたくない
- シンタックスハイライトを有効にするため
エウレカのコーディング規約でも `self` にしているようです。
ただし、これはバグという情報も見つけました。。。
バッククオートでselfに代入できるのはおそらくバグだとアップルの人の回答。その上でこの提案が受け入れられたら、普通にselfにguard節で代入できるようになる。 https://t.co/MVT7iEO5Pu https://t.co/MGYfn6YcHB
— kishikawa katsumi (@k_katsumi) 2016年1月20日
WWDC2017でAppleのエンジニアに知り合いが聞いたら、`self`でも問題ないということを言っていたので、大丈夫かなと思っています。