是否可以在扩展中使用非只读计算属性?
Posted
技术标签:
【中文标题】是否可以在扩展中使用非只读计算属性?【英文标题】:Is it possible use non read-only computed property in extension? 【发布时间】:2016-02-23 23:46:55 【问题描述】:扩展中的计算属性是否可以同时具有 getter 和 setter? Apple 的指南没有提到它,我看到的唯一示例仅显示扩展中的只读计算属性。
【问题讨论】:
如何编写计算属性?还是我不明白这个问题? 表示使用 setter 的计算属性,而不仅仅是 getter。 【参考方案1】:这行得通:
extension Bool
public var integerValue: Int
get
return true ? 1 : 0
set
self = (newValue > 0) ? true : false
所以是的。
【讨论】:
所以它似乎仅限于不必使用存储属性来存储状态的设置器。 不能在扩展中定义存储属性。 “不必使用存储的属性来存储状态”让我困惑了一秒钟。我以为你在谈论访问 inside setter 的属性。 是的,您不能在扩展中定义存储的属性。 @nhgrif:我仍然坚持我的说法。手动使用运行时将值与对象关联起来并不等同于在扩展中定义存储属性。【参考方案2】:扩展中的计算属性是否可能具有 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 运行时来模拟扩展中存储的属性(这当然意味着设置和获取)。以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 的扩展中的一个属性示例。
【讨论】:
以上是关于是否可以在扩展中使用非只读计算属性?的主要内容,如果未能解决你的问题,请参考以下文章