53301


<https://stackoverflow.com/a/35372610/1979953>  
では下記のように `set`と `get`のペア。

[code]

    @IBInspectable var borderColor: UIColor? {
        set {
            layer.borderColor = newValue?.cgColor
        }
        get {
            guard let color = layer.borderColor else {
                return nil
            }
            return UIColor(cgColor: color)
        }
    }
    
[/code]

<https://qiita.com/touyu/items/92293c5f9448bdbfa384>  
では

[code]

    @IBInspectable var cornerRadius: CGFloat = 0.0 {
        didSet {
            self.layer.cornerRadius = self.cornerRadius
            self.clipsToBounds = (self.cornerRadius > 0)
        }
    }
    
[/code]

というように `didSet` のみとなっています。

どういう意図で使い分けるものなのでしょうか？


CC BY-SA 4.0
2019-03-07T07:20:21.210
53266
2019-03-08T13:52:36.927
9008
question
swift xcode
@IBInspectableを使うとき「getとsetのペア」もしくは「didSetのみ」など使い分けがあるようだが、違いがわからない


厳密ではない点、ご容赦願います。

上の例は、コンピューテッドプロパティ（計算によって値が求まるプロパティ）で、`UIColor`クラスのインスタンスを返しますが、直接`UIColor`のインスタンスを保存しているわけではなく、（対象の？）レイヤーにボーダーカラーを`CGColor`クラスのインスタンス（なプロパティ）としてセットすることで、あたかも、`UIColor`が保存され、レイヤーの枠の色が変更されます。  
同様に、現在のレイヤーの枠の色を取得するのも、値をストアした（メンバー）がないので、変数をそのまま返せません。このため、レイヤーのボーダーカラーを取得し、設定されていなければ`nil`を、設定されていれば、`UIColor`クラスのインスタンスにキャストして`.
borderColor`で取得出来るようにするためにはどうすれば良いか？を定義したものが、`get {}`の内容になります。

対して下の例は、副作用のあるストアードプロパティ（値を直接保持しておくプロパティ）です。  
`cornerRadius`なので、角の丸み具合の値を`cornerRadius`という`CGFloat`型のメンバー変数に代入して覚えておきますが、`cornerRadius`がインスタンスの外部からセットされたとき
**のみ**
、その数値を代入して保存するだけでなく、自身の持つレイヤーの`cornerRadius`プロパティにその値を代入することで、レイヤーの角の丸さをセットされたときの
**副作用** として変更する動作を行うので、`didset
{}`が必要ですが、角の丸み具合は、メンバーで持っているので、`get`はその値をそのまま返すだけで良いので、`get {}`を省略しているのです。


CC BY-SA 4.0
2019-03-08T13:52:36.927
53301
2019-03-08T13:52:36.927
14745
53266
answer