从Swift类访问Objective-c基类的实例变量

时间:2014-09-28 08:19:48

标签: ios objective-c swift

拥有Objective c基类:

@interface ObjcClass : NSObject {
    NSString *aVariable_;
}

快速的子课程:

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!
    }
}

如何从ObjcClass内访问aVariable_ SwiftClass

6 个答案:

答案 0 :(得分:20)

很棒的查询。我们一直努力做到这一点。我找到的唯一可行的解​​决方案

使用self.valueForKey("aVariable_")

获取价值

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

设置值

希望有所帮助。在不改变超类的情况下可能的解决方案。

答案 1 :(得分:5)

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

标题文件

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


在实施文件中

- (NSString *)myVariable {
    return myVariable;
}

我很想听到更好的方法,但这至少有效。

答案 2 :(得分: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

如果在班级单位内。

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

答案 3 :(得分:1)

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

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

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

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

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

答案 4 :(得分:1)

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

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

答案 5 :(得分:0)

如果您愿意拥有房产,那么您可以根据自己的需要创建房产。

@interface ObjcClass : NSObject {
    NSString *aVariable_;
}

@property (nonatomic) NSString *aVariable_;

...

@implementation ObjcClass

@synthesize aVariable_ = aVariable_;

这允许将变量作为inst->aVariable_inst.aVariable_进行访问。在Objective C类中,变量可以aVariable_self.aVariable_访问。

相关问题