LoginSignup
13
11

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-08-07

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

13
11
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
11