是否可以在扩展中使用非只读计算 属性 ?

Is it possible use non read-only computed property in extension?

扩展中的计算 属性 是否可以同时具有 getter 和 setter?苹果的指南没有提到它,我看到的唯一例子只显示只读计算 属性 in extension.

这个有效:

extension Bool
{
    public var integerValue: Int
    {
        get
        {
            return true ? 1 : 0
        }

        set
        {
            self = (newValue > 0) ? true : false
        }
    }
}

所以

Is it possible computed property in extension that has getter and setter?

是的。

根据我的经验,计算属性在扩展中最常见的用途之一可能是提供包装器以便更轻松地访问特定属性。

例如,当我们想要修改 UIKit 之外的任何内容的边框图层、边框颜色或圆角半径时,我们会卡在 layer 属性 中.

但是我们可以用 属性 和 setter 和 getter 来扩展 UIView,以提供一种更方便的方法来更改其层的属性:

extension UIView {
    var borderColor: UIColor? {
        get {
            guard let color = self.layer.borderColor else {
                return nil
            }
            return UIColor(CGColor: color)
        }
        set {
            self.layer.borderColor = newValue?.CGColor
        }
    }
}

此外,如果我们真的想要,我们可以利用 Objective-C 运行 时间来模拟扩展中的存储属性(当然这意味着设置和获取)。以this Stack Overflow answer的一部分为例:

private var kAssociationKeyNextField: UInt8 = 0

extension UITextField {
    @IBOutlet var nextField: UITextField? {
        get {
            return objc_getAssociatedObject(self, &kAssociationKeyNextField) as? UITextField
        }
        set(newField) {
            objc_setAssociatedObject(self, &kAssociationKeyNextField, newField, .OBJC_ASSOCIATION_RETAIN)
        }
    }
}

这只是扩展中 属性 的一个示例 setter & getter。