我在RubyMotion项目中使用第三方Obj-C静态库和API,并且库中的一个类在API头文件的接口部分中定义了一些公共实例变量。这是代码,因为它很短:
@interface TransporterFile : NSObject
{
@public
NSString *name;
TransporterFileType type;
NSDate *modifyTime;
NSDate *createTime;
unsigned long long size;
}
- (BOOL) isFolder;
- (BOOL) isShared;
@end
在ObjC中,可以像这样达到这些值: name = transporterFile-> name 但是没有定义getter,所以你不能使用点符号。
在RubyMotion中,可能因为没有getter,所以没有向我公开实例变量。我尝试使用.instance_variables方法,它返回一个空数组。我还尝试了instance_variable_get(' @ name')方法,但这也不起作用。我可以调用两个方法isFolder和isShared,它们按预期工作。
更新:我尝试在Swift语言中做类似的事情,它有类似的问题,这使我建议使用valueForKeyPath(' name')方法来访问' name& #39;实例变量。这在Swift中有效,并让我检查RubyMotion是否有类似的方法。好消息是这有效,但有点笨拙,所以我现在暂时搁置这个问题,希望有更好的答案。
我意识到第三方库没有遵循最佳实践,如果直接使用实例变量,我会向供应商推荐他们定义一些属性,但是现在我需要一个解决方法。
任何人都可以建议一种方法从RubyMotion访问这些公共实例变量,或者将供应商的库包装在另一个ObjC库中。我从来没有写过ObjC库(包装或不包装),所以在我开始使用这个选项之前,我会感激一些建议。
可在此处查看完整的API:https://secure.connecteddata.com/developer 请注意,我使用Mac OS X 10.10和Xcode 6.1.1以及最新版本的RubyMotion。从上面的网站下载的Mac OS X API缺少头文件,所以我使用了iOS下载的标题。
非常感谢, 克雷格。
答案 0 :(得分:0)
我更新了我的问题以解释我发现以下方法允许我访问公共实例变量。
obj.valueForKeyPath('name')
但是,我很高兴听到有更好的方法来做到这一点,因为它有点笨拙。
PS。为什么我可以花几个小时试图找到问题的解决方案然后在开放论坛上发布问题的几分钟内,我找到了一个潜在的答案? Grr ......:)