Help us understand the problem. What is going on with this article?

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

sasho
もうすぐ坊主にして16年。 主食はiOS系(Objc,swift)
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした