【问题标题】:Accessing Objective-c base class's instance variables from a Swift class从 Swift 类访问 Objective-c 基类的实例变量
【发布时间】:2014-09-28 08:19:48
【问题描述】:

拥有一个 Objective c 基类:

@interface ObjcClass : NSObject {
    NSString *aVariable_;
}

还有一个 swift 子类:

class SwiftClass : ObjcClass {
    func init() {
        // aVariable_ can't be accessed here. An Objective-c derived
        // class has direct access to it's super's instance variables!
    }
}

如何从SwiftClass 中访问ObjcClass aVariable_

【问题讨论】:

    标签: ios objective-c swift


    【解决方案1】:

    很好的查询。我们已经努力完成这项工作。我找到的唯一可行的解​​决方案

    使用self.valueForKey("aVariable_")获取价值

    使用self.setValue("New Value", forKey: "aVariable_")设置值

    希望对您有所帮助。不改变超类的可能解决方案。

    【讨论】:

    • 我就是这么做的。不过我喜欢@JasonTyler 的回答。
    • 谢谢@Narendra 对我来说,我更喜欢这种方式 if let var aVar = self.valueForKey("aVariable_") 就好像你的代码在 Swift 中并且你使用了一个你不能使用的 Objective C 库调整。效果很好。
    • 这是最简单的方法,即使是类型检查湖。
    【解决方案2】:

    我找不到“正确”的方法来做到这一点,但我非常需要它才能工作。我的解决方案是在我的 Objective C 超类中创建一个简单的 getter 方法,如下所示:

    头文件

    @interface ObjcClass : NSObject {
        NSString *myVariable;
    }
    - (NSString *)myVariable;
    


    在实现文件中

    - (NSString *)myVariable {
        return myVariable;
    }
    

    我很想听听更好的方法,但这至少可行。

    【讨论】:

    • 我建议使用名词形式- (NSString *)myVariable。按照惯例,“get”前缀通常用于通过引用返回结果(例如NSArray- (void)getObjects:(id[])buffer range:(NSRange)range)。更好的是,按照其他答案的建议使用属性。
    【解决方案3】:

    我为此搜索了很多。 最终我改变了我的代码:

    @interface PrjRec : NSObject {
        @public
        NSString* name;
    }
    @end
    

    收件人:

    @interface PrjRec : NSObject {
    }
    
    @property NSString* name;
    
    @end
    

    类似于@JasonTyler 解决方案。 然后我可以使用简单的点符号<object instance>.name 从 Swift 代码访问我的对象属性,

    但我需要从

    更改所有现有的objective-c引用
    <object instance>->name
    

    收件人:

    <object instance>.name
    

    _name
    

    如果在班级单元内。

    我也希望有更好的解决方案。

    【讨论】:

      【解决方案4】:

      这对我来说是一个非常简洁的解决方案,只需添加一个 Swift 变量,例如:

      var myInstanceVar: String {
          return self.value(forKey: "myInstanceVar") as! String
      }
      

      【讨论】:

        【解决方案5】:

        如果您愿意拥有一处房产,那么您可以创建该房产以满足您的需求。

        @interface ObjcClass : NSObject {
            NSString *aVariable_;
        }
        
        @property (nonatomic) NSString *aVariable_;
        

        ...

        @implementation ObjcClass
        
        @synthesize aVariable_ = aVariable_;
        

        这允许以inst-&gt;aVariable_inst.aVariable_ 访问变量。在 Objective C 类中,变量可以通过aVariable_self.aVariable_ 访问。

        【讨论】:

          【解决方案6】:

          我真的不知道为什么有人不再使用实例变量(一方面,默认情况下它们是私有的)vs 属性。请参阅 Giorgio Calzolato 对此的回答(除了他关于寻找更好解决方案的最后一行 - 这是最好的解决方案:))。

          在我的情况下,我已经有一个财产,并且对为什么它不起作用感到特别困惑。但我意识到该属性有一个自定义时间,需要将其添加到我的 SDK-Bridging-Header.h 文件中。

          因此,如果您的属性设置为这样的自定义类型:

          @property (nonatomic, weak) IBOutlet SDKMyCustomObject *customObject;
          

          ...然后记得将其添加到桥接头中。

          【讨论】:

            猜你喜欢
            • 2012-01-23
            • 2011-07-26
            • 1970-01-01
            • 1970-01-01
            • 2020-10-28
            • 2011-01-12
            • 1970-01-01
            • 2011-05-07
            • 1970-01-01
            相关资源
            最近更新 更多