2014-11-03 3 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

Какая ошибка компилятор дает вам? –

+0

'свойство не найдено на объекте типа id' – sunnyxx

+0

Каково имя класса, объявляющего свойство' foo'? –

ответ

1

Если obj является прокси объект типа Foo (который имеет свойство foo) просто делать то, что естественно и использовать Foo * как его тип.

Компилятор позволит использовать синтаксис точек только в том случае, если известно, что статический тип отвечает на этот селектор. id не будет работать.

+0

Я хочу перевести JSON в objc 'Model objects', но я стараюсь не писать эти классы модели (или протоколы), вместо этого я создаю объект' proxy' (изменяемый словарь может выполнять эту работу), forward '-foo' на 'objectForKey'. Все готово, только я мог скомпилировать этот код. – sunnyxx

1

Объявив obj как тип id вы сообщаете компилятору, что obj может быть экземпляром любого класса, поэтому компилятор не знает, если он имеет какие-либо специфические свойства и методы. Если вы должны утверждать, что obj может быть более одного класса, но только классы, имеющие свойство foo, попробуйте использовать protocol.

id<ObjectWithFoo> obj = /* ... */ 
obj.foo // no error 
Смежные вопросы