【问题标题】:How to access an Obj-C public instance variable in RubyMotion without a getter?如何在没有 getter 的情况下访问 RubyMotion 中的 Obj-C 公共实例变量?
【发布时间】: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


    【解决方案1】:

    我更新了我的问题以解释我发现以下方法允许我访问公共实例变量。

    obj.valueForKeyPath('name')
    

    但是,我很高兴听到任何更好的方法来做到这一点,因为它有点笨重。

    ps。为什么我可以花费数小时试图找到问题的解决方案,然后在开放论坛上发布问题后的几分钟内,我找到了潜在的答案?哎呀... :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-17
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 2021-10-13
      相关资源
      最近更新 更多