这出现在另一个问题中(由meronix友好地回答),但我很想了解更多关于这里发生的事情,这是一个 LLVM/Clang 问题,还是这两个陈述在某种程度上不同。
我知道我可以通过添加(见下文)来解决这个问题,所以比什么都好奇......
这出现在另一个问题中(由meronix友好地回答),但我很想了解更多关于这里发生的事情,这是一个 LLVM/Clang 问题,还是这两个陈述在某种程度上不同。
我知道我可以通过添加(见下文)来解决这个问题,所以比什么都好奇......
两种说法不同。只有当左值的类型声明了属性时,才能使用属性。这是因为属性的 getter 和 setter 可能不明显(通常是布尔属性的情况,其中 getter 显式设置为isSomething
。)如果没有强类型信息,编译器无法推断出这一点。
然而[lvalue message]
,语法没有这种歧义,因此编译器允许它。由于左值的类型是id
,任何已知消息都可以发送给它而不会发出编译器警告。编译器只会在两个签名对应于同一个选择器时发出警告(例如,一个类 has- (UIWindow *)window
和另一个 has - (int)window
。)
该UIApplicationDelegate
协议定义了一个window
属性,因此当您将对象显式键入为id <UIApplicationDelegate>
时,编译器会知道该属性并可以使用它。