Swift 是否可以在扩展中使用非只读计算属性?
扩展中的计算属性是否可能同时具有getter和setter?苹果的指南中没有提到这一点,我所看到的唯一一个示例仅显示了扩展中的只读计算属性。这一方法有效:Swift 是否可以在扩展中使用非只读计算属性?,swift,swift-extensions,computed-properties,Swift,Swift Extensions,Computed Properties,扩展中的计算属性是否可能同时具有getter和setter?苹果的指南中没有提到这一点,我所看到的唯一一个示例仅显示了扩展中的只读计算属性。这一方法有效: extension Bool { public var integerValue: Int { get { return true ? 1 : 0 } set { self = (newValue
extension Bool
{
public var integerValue: Int
{
get
{
return true ? 1 : 0
}
set
{
self = (newValue > 0) ? true : false
}
}
}
所以是
扩展中是否可能存在具有getter和setter的computed属性
对
在我的经验中,扩展中计算属性最常见的用途之一可能是提供一个包装器,以便更容易地访问特定属性
例如,当我们想要修改UIKit
中任何内容的边界层、边界颜色或角半径时,我们必须通过层
属性
但是我们可以使用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运行时来模拟扩展中存储的属性(当然这意味着设置和获取)。例如,参加:
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的扩展中属性的一个示例。如何编写计算属性?还是我不明白这个问题?这意味着一个带有setter的计算属性,而不仅仅是getter。所以它似乎只限于setter,它不必使用存储属性来存储状态。您不能在扩展中定义存储属性。“不必使用存储属性来存储状态”让我困惑了一秒钟。我以为您在谈论访问setter中的属性。是的,您不能在扩展中定义存储的属性。@nhgrif:尽管如此,我还是维护我的语句。手动使用运行时将值与对象关联并不等同于在扩展中定义存储的属性。