2014-11-03 67 views
1

正如我們所知,obj.foo將被編譯爲[obj foo]爲@property吸氣讓objc點語法編譯

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停止編譯時檢查?
或以某種方式使編譯器高興?

+0

編譯器給你什麼錯誤? – 2014-11-03 07:02:23

+0

在id類型的對象上找不到屬性 – sunnyxx 2014-11-03 07:40:30

+0

聲明屬性「foo」的類的名稱是什麼? – 2014-11-03 17:19:36

回答

1

如果obj是代理Foo類型(其中有一個foo屬性)的對象只是做很自然,並使用Foo *作爲其類型。

只有已知靜態類型響應此選擇器,編譯器纔會允許點語法。 id將不起作用。

+0

我想將JSON轉換爲objc模型對象,但我儘量不寫這些Model類(或協議),而是建立一個'proxy'對象(一個可變字典可以做它的工作),向前'-foo'到'objectForKey'。準備好了,只有我可以編譯這些代碼。 – sunnyxx 2014-11-03 07:39:32

1

通過將obj聲明爲id類型,您告訴編譯器obj可能是任何類的實例,因此編譯器不知道它是否具有任何特定的屬性或方法。如果您必須保證obj可以多於一個類,但只有具有foo屬性的類,請嘗試使用protocol

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