扩展中的计算属性是否可能同时具有 getter 和 setter?Apple 的指南没有提到它,我看到的唯一示例仅显示扩展中的只读计算属性。
问问题
619 次
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 回答