🦅

【Swift5】UIViewControllerで必須のプロパティをsetする場合はinit(イニシャライザ)の方が推奨される話Xcode

2022/02/07に公開

例でお話ししましょう。

テーブルビューで各Amazonの商品URLなどが並んでいるとして、
押下して、次画面にNavigationControllerがpushして、
WKWebViewで次の画面が開くと想定しましょう。

その場合、WKWebViewを表示するViewControllerはURLが必ず必要なので、URL(もしくはURLStringという文字列)が必須となります。

このようなViewControllerによって必須のプロパティが存在している場合はイニシャライザを用意してあげて、初期化する時にsetして上げた方が良いという話です。

// 変更前
class BeforeWebViewController : UIViewController {
   var urlString : String = ""
   
   func print() {
       Swift.print(self.urlString)  // playgroundなのでSwift.と入ってますがprintです。
   }
}

// 変更後
class AfterWebViewController : UIViewController {
   var urlString : String
   
   init(urlString: String) {
       self.urlString = urlString
       super.init(nibName: nil, bundle: nil)
   }
   
   required init?(coder: NSCoder) {
       fatalError("init(coder:) has not been implemented")
   }
}

変更前だとイニシャライザを明示的に書いていないので、変数urlStringの初期値をオプショナル型にしてnilを許容してnilを入れる、もしくはコードのように空文字を入れることでしか宣言できません。
(しかしながら、urlは必須なので空文字とnilは要らない宣言ですよね)

変更後を見てみると、イニシャライザを宣言しているので、AfterWebViewControllerクラスを宣言する際は必須であると分かりやすく、また初期化と一緒にurlStringの値をセットしているので不要な処理がありません。

今回冒頭で述べたような何かしらの要素を必須でプロパティで保持する必要があるクラスにつきましてはイニシャライザで宣言を行った方が好ましいと考えました。

Discussion