【发布时间】:2018-03-10 13:39:53
【问题描述】:
因为'Extensions may not contain stored properties'我见过人们通过使用getter / setter和objc_getAssociatedObject / objc_setAssociatedObject来解决这个问题
(见)How to have stored properties in Swift, the same way I had on Objective-C?
我发现那里讨论的解决方案非常“不灵活”,但仍然希望将变量保持在靠近它们使用的位置。
这就是我最近想在扩展中使用“属性”时开始执行以下操作的原因。
private var lastValue: Int = 0
extension ViewController {
func checkIfBiggerThanLastNumber(_ number: Int) -> Bool {
let savedLast = lastValue
lastValue = number
return number > savedLast
}
}
因为我在其他地方没有找到这个解决方案,所以我想知道这是代码异味还是它有什么缺点。
该源文件中的其他扩展名可以访问lastValue 是我可以忍受的,因为该扩展名在它自己的源文件中。
【问题讨论】:
-
想一想:如果您有该类的两个实例,并为每个实例设置一个值,会发生什么?
-
嗯,这是一个好点......
-
是什么原因让我们不能轻易的给扩展添加属性?
-
因为添加属性会改变对象的大小。在另一个模块中创建的 ViewController 无法知道要分配多少内存。添加该功能需要在 Swift 中创建类似 objc_getAssociatedObject 之类的东西,这可能有朝一日可以用于类(尽管我怀疑结构)。
-
比较stackoverflow.com/a/45495616/1187415: " 因为添加实例属性会改变该类型实例的大小"