Xcode
iOS
Swift

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

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