拥有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
?
答案 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
,
但我需要从
更改所有现有的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_
访问。