レイアウトをStoryboardで作成して、コードで修飾する(layer.borderColorとか)ことがあると思います。
私は今まで、 カスタムViewを作ってawakeFromNib
内で修飾コードを記述してきましたが、後輩からdidSet
で行うのはどうかと言われました。
今までの書き方
AsIs.swift
class CustomView: UIView {
@IBOutlet weak var label: UILabel!
@IBOutlet weak var okButton: UIButton!
@IBOutlet weak var cancelButton: UIButton!
override func awakeFromNib() {
super.awakeFromNib()
// OKボタンの修飾
okButton.layer.borderColor = UIColor.white.cgColor
okButton.layer.borderWidth = 1.0
okButton.layer.cornerRadius = 5.0
// キャンセルボタンの修飾
cancelButton.layer.borderColor = UIColor.black.cgColor
cancelButton.layer.borderWidth = 1.0
cancelButton.layer.cornerRadius = 5.0
}
}
この書き方でも特に不便は無いのですが、修飾するパーツが増えたときにawakeFromNib
のfunctionが肥大化するというデメリットが有りました。
そこでdidSet
ToBe.swift
class CustomView: UIView {
@IBOutlet weak var label: UILabel!
@IBOutlet weak var okButton: UIButton! {
didSet {
// OKボタンの修飾
okButton.layer.borderColor = UIColor.white.cgColor
okButton.layer.borderWidth = 1.0
okButton.layer.cornerRadius = 5.0
}
}
@IBOutlet weak var cancelButton: UIButton! {
didSet {
// キャンセルボタンの修飾
cancelButton.layer.borderColor = UIColor.black.cgColor
cancelButton.layer.borderWidth = 1.0
cancelButton.layer.cornerRadius = 5.0
}
}
// awakeが要らなくなる!
}
※ 追記:willSetを使ってみる
willSet
を使うと、newValue
が使えるので、よりswiftらしい!(@rd0501 さん、ありがとうございます!)
willSet.swift
class CustomView: UIView {
@IBOutlet weak var label: UILabel!
@IBOutlet weak var okButton: UIButton! {
willSet {
// OKボタンの修飾
newValue.layer.borderColor = UIColor.white.cgColor
newValue.layer.borderWidth = 1.0
newValue.layer.cornerRadius = 5.0
}
}
@IBOutlet weak var cancelButton: UIButton! {
willSet {
// キャンセルボタンの修飾
newValue.layer.borderColor = UIColor.black.cgColor
newValue.layer.borderWidth = 1.0
newValue.layer.cornerRadius = 5.0
}
}
// awakeが要らなくなる!
}
今までの書き方に比べて
メリット
- パーツが増えてもパーツ毎の修飾がまとまっていて見やすい
-
didSet
を使うことにより、よりswiftらしい(個人的感想)
デメリット
- パーツ毎に
didSet
を書く必要があるので、定義部が肥大化(行数が増える意味で)
最後に
行数は増えますが、awakeFromNib
の肥大化が抑えられるのでdidSetでの修飾を今後使っていこうと思います。