UIViewでUI部品の初期化処理をSwift2でおこなう

initだと落ちちゃうからね







以下のコメント欄でいろいろ議論されています
http://qiita.com/codelynx/items/f0243d631f2448e89026



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
/** 一つのテキストフィールドを持つシンプルなUI部品 */
class CustomView: UIView {
 
    @IBOutlet weak textField: UITextField!
     
    /* fatal error: unexpectedly found nil while unwrapping an Optional value が発生する。
       というかまだこの時点ではtextFieldはnilになっている
    init() {
        super.init(frame: CGRectZero)
        textField.text = "init value"
    }
     
    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)!
        textField.text = "init value"
    }
    */
     
    /** 初回のみ呼ばれる 初期化処理 */
    private lazy var initialize: (()->())? = {
      
        textField.text = "init value"
         
        // initializeを無効化
        self.initialize = nil
    }
     
    override func layoutSubviews() {
        super.layoutSubviews()
        initialize?()
    }
 
}

self.initialize = nil が個人的には初見で一番わかりやすいかなあ?
最終案のreturn {} と return nil はObjective-C から来て初めて見る場合とかだと厳しい気がする


Swiftのバージョン上がったら使えなくなったりしないよね?

2016年8月25日木曜日