Edited at

IBOutletで接続したUIパーツにコードで修飾を記述する場所としてdidSetをご提案

More than 1 year has passed since last update.

レイアウトを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での修飾を今後使っていこうと思います。