我有两个关于
Swift计算属性的问题.
是否每次访问计算属性时都会对其进行评估?或者它们存储在某个地方以供将来访问?
这是什么类型的财产,因为我无法谷歌:
let navigationController: UINavigationController = { var navigator = UINavigationController() navigator.navigationBar.translucent = false return navigator }()
每次访问时都会评估它吗?
那不是计算属性.
let navigationController: UINavigationController = { var navigator = UINavigationController() navigator.navigationBar.translucent = false return navigator }()
var navigator = UINavigationController() navigator.navigationBar.translucent = false return navigator
在实例化类的实例时执行该块.只有一次.
写这个
struct Person { let name: String = { let name = "Bob" return name }() // <- look at these }
相当于此
struct Person { let name: String init() { self.name = "Bob" } }
恕我直言,第一种方法更好,因为:
>它确实允许您在同一“空间”中声明和填充属性
>它更清楚
>如果您有多个初始化程序,确实可以防止代码重复
注意#1:在属性中存储闭包
正如dfri在下面的评论中指出的那样,代码块以()结尾.这意味着将评估代码并将结果分配给属性.
另一方面,如果我们删除块末尾的(),我们会得到一些不同的东西,实际上不会对块进行求值.
在这种情况下,Swift尝试将存储的闭包分配给属性.这将产生编译错误,因为该属性具有此类型UINavigationController.
struct Person { let sayHello: ()->() = { print("Hello") } }
现在我们有一个sayHello属性,它包含一个闭包.闭包接收0参数并返回Void.
let bob = Person() bob.sayHello // this does NOT execute the code inside closure bob.sayHello() // this does execute the code in the closure and does print the message
注意#2:让我们谈谈计算属性
所以我们明确表示这个问题中的代码不是计算属性.
但是,正如EmilioPelaez在下面的另一条评论中指出的那样,我们还应该声明每次访问计算属性时都会对其进行评估.
在下面的示例中,我创建了一个Computed Property时代.正如您每次调用它时所看到的那样,块中的代码也会被执行.
计算财产的例子(年龄)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。