当前位置:  开发笔记 > IOS > 正文

Swift:为什么带有setter的变量也必须有一个getter?

如何解决《Swift:为什么带有setter的变量也必须有一个getter?》经验,为你挑选了1个好方法。



1> mathielo..:

快速回答" 为什么? ":

get(或set)添加到属性后,它将变为Computed Property.计算属性可能是只读的,因此只需要一个getter,但它们可能不是只写的.因此,如果您向属性添加setter,则将其转换为计算机属性,因此您还必须添加getter.

编辑:以下评论,为什么计算属性是只读的,但不是只写的?

我找不到官方文档来支持这一点,所以以下解释完全基于我的逻辑观点:

计算属性不会在其变量上存储实际数据 ; 相反,他们计算要显示的数据.

var a:Int = 5 // Stored property
var timesTen:Int { // Computed Property
    get {
        return a * 10
    }
}

从上面的示例:a是一个存储属性.因此,它的get方法自动返回a值.现在想一想timesTen:它的价值是什么?由于它不在timesTen变量中存储任何值,因此必须告诉计算属性如何以及从何处读取其"值".这就是为什么你不能将计算属性用于只写目的.


解决方法/如何避免它

对于简单属性,您可以使用didSetwillSet达到预期目的:

var proxy: MyProxy?
{
    willSet { if _proxy == nil && newValue != nil { _proxy = newValue } }
}

如果您使用的是Swift 2.x,则可以使用该guard语句获得更清晰的代码:

var proxy: MyProxy?
{
    willSet { 
         guard (_proxy == nil && newValue != nil) else { return }
         _proxy = newValue
    }
}

另一个观察

如果_proxy不是必须的话,private你可以完全删除它,只使用一个变量/属性而不是两个:

var proxy: MyProxy!
{
    willSet { 
         guard (proxy == nil && newValue != nil) else { return }
         // By not preventing `willSet` to continue, `newValue` will automatically assigned to `proxy`
    }
}

推荐阅读
360691894_8a5c48
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有