使objc点语法编译

时间:2014-11-03 06:54:03

标签: objective-c xcode properties clang

众所周知,obj.foo将编译为[obj foo] @property getter

我的obj是一个在运行时存储属性的代理对象 但是-foo选择器在编译时不会定义

id obj = ...; // obj can perform -foo at runtime, but not at compile time  
id obj1 = [obj foo]; // may compile  
id obj2 = obj.foo;  // compile error

我可以使用一些#pragma技巧来停止编译时检查吗? 或者以某种方式让编译器开心?

2 个答案:

答案 0 :(得分:1)

如果objFoo类型的对象(具有foo属性)的代理,那么只需执行自然的操作并使用Foo *作为其类型。

只有当已知静态类型响应此选择器时,编译器才会允许点语法。 id无效。

答案 1 :(得分:1)

通过将obj声明为类型id,您告诉编译器obj可能是任何类的实例,因此编译器不知道它是否具有任何特定属性或方法。如果您必须认为obj可以是多个类,但只有foo属性的类,请尝试使用protocol

id<ObjectWithFoo> obj = /* ... */
obj.foo // no error