【发布时间】:2015-03-20 15:46:20
【问题描述】:
我在 RubyMotion 项目中使用第 3 方 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 中,可以像这样达到这些值: 名称 = 传输文件->名称 但是没有定义 getter,所以你不能使用点符号。
在 RubyMotion 中,可能是因为没有 getter,没有暴露给我的实例变量。我尝试使用 .instance_variables 方法,它返回一个空数组。我也尝试了 instance_variable_get('@name') 方法,但这也不起作用。我可以调用 isFolder 和 isShared 这两种方法,它们按预期工作。
更新:我尝试在 Swift 语言中做类似的事情,它有类似的问题,这导致我建议使用 valueForKeyPath('name') 方法来访问 'name' 实例变量。这在 Swift 中有效,并让我检查了 RubyMotion 是否可以使用类似的方法。好消息是这可行,但有点笨拙,所以我暂时保留这个问题,希望有更好的答案。
我意识到第 3 方库没有遵循最佳实践,如果直接使用实例变量,我会向供应商建议他们定义一些属性,但现在我需要一种解决方法。
谁能建议一种从 RubyMotion 访问这些公共实例变量的方法,或者将供应商的库包装在另一个 ObjC 库中。我从未编写过 ObjC 库(无论是否为包装器),因此在开始使用此选项之前,我会很感激一些建议。
完整的 API 可以在这里查看:https://secure.connecteddata.com/developer 请注意,我使用的是 Mac OS X 10.10 和 Xcode 6.1.1 和最新版本的 RubyMotion。从上述站点下载的 Mac OS X API 缺少头文件,因此我使用了 iOS 下载的头文件。
非常感谢, 克雷格。
【问题讨论】:
标签: objective-c macos rubymotion