2015-01-21 2 views
0

Я использую стороннюю статическую библиотеку Obj-C для API и API в проекте RubyMotion, а один из классов в библиотеке определяет некоторые переменные общего экземпляра в разделе интерфейса в файле заголовка API. Вот код, как это довольно короткий:Как получить доступ к переменной общего экземпляра Obj-C в RubyMotion без геттера?

@interface TransporterFile : NSObject 
{ 
@public 
    NSString *name; 
    TransporterFileType type; 
    NSDate *modifyTime; 
    NSDate *createTime; 
    unsigned long long size; 
} 
- (BOOL) isFolder; 
- (BOOL) isShared; 
@end 

В ObjC, эти значения могут быть достигнуты, как это: имя = transporterFile-> имя но не добытчик определяется так что вы не можете использовать точечную нотацию.

В RubyMotion, вероятно, из-за отсутствия геттера, нет переменной экземпляра, подверженной мне. Я попытался использовать метод .instance_variables и возвращает пустой массив. Я также попробовал метод instance_variable_get ('@ name'), но это тоже не работает. Я могу назвать два метода isFolder и isShared, и они работают так, как ожидалось.

Обновление: Я попытался сделать подобное на языке Swift, и у него были подобные проблемы, и это привело меня к предложению использовать метод valueForKeyPath ('name') для доступа к переменной экземпляра 'name'. Это работало в Swift и привело меня проверить, доступен ли аналогичный метод RubyMotion. Хорошей новостью является то, что это работает, но немного неуклюже, поэтому я оставлю этот вопрос открытым в настоящее время в надежде, что лучший ответ будет доступен.

Я понимаю, что сторонняя библиотека не соответствует лучшей практике, и я рекомендую поставщику, чтобы они определяли некоторые свойства, вместо того, чтобы напрямую использовать переменные экземпляра, но на данный момент мне нужно обходное решение.

Может кто-нибудь предложить способ доступа к этим переменным публичного экземпляра из RubyMotion или, возможно, путем обертывания библиотеки поставщика в другой библиотеке ObjC. Я никогда не писал библиотеку ObjC (обертка или нет), поэтому я бы по достоинству оценил некоторые советы, прежде чем приступать к этому варианту.

Полный API можно посмотреть здесь: https://secure.connecteddata.com/developer Обратите внимание, что я использую Mac OS X 10.10 с Xcode 6.1.1 и последней версией RubyMotion. Загрузка API Mac OS X с вышеуказанного сайта пропускает файл заголовка, поэтому я использовал заголовок из загрузки iOS.

Большое спасибо, Craig.

ответ

0

Я обновил свой вопрос, чтобы объяснить, что я нашел следующий метод, позволяющий мне получить доступ к переменным публичного экземпляра.

obj.valueForKeyPath('name') 

Однако я был бы рад услышать о возможных способах сделать это, поскольку это немного неуклюже.

пс. Почему я могу потратить часы, пытаясь найти решение проблемы, а затем за несколько минут после публикации вопроса на открытом форуме я нахожу потенциальный ответ? Grr ... :)