考虑以下代码:
class Foo {
let bar = "Hello world!"
init () {
self // Warning: Expression of type 'Foo' is unused
self.bar // Error: Expression resolves to an unused l-value
}
func test () {
self.bar // Warning: Expression of type 'String' is unused
}
}
为什么消息不同,为什么只有一条消息是错误的?我理解它们的意思,我只是不明白为什么编译器会以不同的方式处理它们。
发布于 2018-08-22 06:56:07
编译器之所以在初始化器中将self.bar
视为l值,是因为在初始化期间,您可以在初始化期间的任何时候为常量属性赋值,即使您已将其声明为常量,因此编译器会将其视为错误,因为有机会修改常量...
而test()
函数中的self.bar
被视为r值,因为该属性被声明为常量,并且编译器知道您不能修改它,因此不会生成错误,它将被视为r值,并且返回值未使用。
如果您需要更好地理解,请尝试将属性更改为变量而不是常量,您会发现即使是test()
方法中的self.bar
语句也会出错,因为编译器猜测这个值也可以是左值。
class Foo {
var bar = "Hello world!"
init () {
self // Warning: Expression of type 'Foo' is unused
self.bar // Error: Expression resolves to an unused l-value
}
func test () {
self.bar // Changed to : Error: Expression resolves to an unused l-value
}
}
https://stackoverflow.com/questions/51956912
复制相似问题