从Swift类访问Objective-c基类的实例variables
有一个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! } }
如何从SwiftClass
访问ObjcClass
SwiftClass
?
伟大的查询。 我们努力去完成这件事。 唯一的工作解决scheme,我发现
通过使用self.valueForKey("aVariable_")
来获取值
使用self.setValue("New Value", forKey: "aVariable_")
设置值self.setValue("New Value", forKey: "aVariable_")
希望有所帮助。 可能的解决scheme,而不改变超级类。
我找不到一个“正确”的方式来做到这一点,但我需要很好的工作。 我的解决scheme是在我的Objective C超类中创build一个简单的getter方法,如下所示:
头文件
@interface ObjcClass : NSObject { NSString *myVariable; } - (NSString *)getMyVariable;
在执行文件中
- (NSString *)getMyVariable { return myVariable; }
我很乐意听到更好的方法,但这至less起作用。
我为此搜寻了很多。 最终我改变了我的代码:
@interface PrjRec : NSObject { @public NSString* name; } @end
至:
@interface PrjRec : NSObject { } @property NSString* name; @end
类似于@JasonTyler解决scheme。 然后我可以用简单的点符号<object instance>.name
从Swift代码访问我的对象属性,
但是我需要改变所有现有的Objective-C引用
<object instance>->name
至:
<object instance>.name
要么
_name
如果是课堂单元。
我希望有一个更好的解决scheme。
如果你愿意有一个财产,那么你可以创造财产,以适应您的需求。
@interface ObjcClass : NSObject { NSString *aVariable_; } @property (nonatomic) NSString *aVariable_;
…
@implementation ObjcClass @synthesize aVariable_ = aVariable_;
这允许variables作为inst->aVariable_
或inst.aVariable_
被访问。 在Objective C类中,variables可以作为variablesaVariable_
或self.aVariable_
被访问。
我真的不知道为什么有人做了实例variables(一个,默认情况下是私有的)vs属性。 看看乔治·卡尔佐拉托(Giorgio Calzolato)对此的回答(除了最后一句关于寻找更好的解决scheme – 这是最好的解决scheme:))。
在我的情况下,我已经有一个财产,并为什么它不工作额外困惑。 但是我意识到这个属性有一个自定义时间,需要将它添加到我的SDK-Bridging-Header.h文件中。
所以如果你的属性设置为这样的自定义types:
@property (nonatomic, weak) IBOutlet SDKMyCustomObject *customObject;
然后记得把它添加到桥头。
这对我来说是一个很好的解决scheme,只需添加一个Swiftvariables:
var myInstanceVar: String { return self.value(forKey: "myInstanceVar") as! String }