Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/100.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 访问Objective-c基类';s实例变量来自Swift类_Ios_Objective C_Swift - Fatal编程技术网

Ios 访问Objective-c基类';s实例变量来自Swift类

Ios 访问Objective-c基类';s实例变量来自Swift类,ios,objective-c,swift,Ios,Objective C,Swift,具有目标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

具有目标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
中访问
objclass
aVariable

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

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


在实现文件中


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

很好的疑问。我们已尽力做到这一点。我找到的唯一有效的解决办法

使用
self.valueForKey(“变量”)获取值

使用
self.setValue(“新值”,forKey:“变量”)设置值


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

我已经为此搜索了很多。 最终,我将代码更改为:

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

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

但我需要更改所有现有的objective-c参考

<object instance>->name
如果在班级单元内


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

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

@interface ObjcClass : NSObject {
    NSString *aVariable_;
}

@property (nonatomic) NSString *aVariable_;


这允许以
inst->aVariable\uz
inst.aVariable\uz
的形式访问变量。在Objective C类中,变量可以被访问为
aVariable\uu
self。aVariable\u
我真的不知道为什么还有人再使用实例变量(比如,它们默认为私有)和属性。请参阅Giorgio Calzolato对此的回答(除了他最后一句关于寻找更好的解决方案——这是最好的解决方案:))

就我而言,我已经有了一处房产,对它为什么不起作用感到特别困惑。但我意识到该属性有一个自定义时间,需要将其添加到我的SDK bridgeing Header.h文件中

因此,如果属性设置为如下自定义类型:

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

…然后记得将其添加到桥接标头

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

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

我就是这么做的。不过,我喜欢@JasonTyler的答案。谢谢@Narendra,我更喜欢用if let var aVar=self.valueForKey(“aVariable_u2;”)的方式,就好像你的代码在Swift中,你使用的是一个无法修改的目标C库。非常好。这是最简单的方法,即使它是一个类型检查的湖。我建议使用名词形式
-(NSString*)myVariable
。按照惯例,“get”前缀通常在通过引用返回结果时使用(例如,
NSArray
-(void)getObjects:(id[])缓冲区范围:(NSRange)范围
)。更好的是,按照其他答案的建议使用属性。
_name
@interface ObjcClass : NSObject {
    NSString *aVariable_;
}

@property (nonatomic) NSString *aVariable_;
@implementation ObjcClass

@synthesize aVariable_ = aVariable_;
@property (nonatomic, weak) IBOutlet SDKMyCustomObject *customObject;
var myInstanceVar: String {
    return self.value(forKey: "myInstanceVar") as! String
}