-2

扩展中的计算属性是否可能同时具有 getter 和 setter?Apple 的指南没有提到它,我看到的唯一示例仅显示扩展中的只读计算属性。

4

2 回答 2

1

这有效:

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

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

所以的。

于 2015-11-21T14:37:35.520 回答
1

扩展中是否有可能具有 getter 和 setter 的计算属性?

是的。

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

例如,当我们想要修改 之外的任何东西的边框层、边框颜色或角半径时UIKit,我们会被困在layer属性中。

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

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 运行时来模拟扩展中存储的属性(这当然意味着设置和获取)。以这个 Stack Overflow 答案为例:

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 的扩展中的一个属性示例。

于 2015-11-21T19:22:08.267 回答