2014-09-28 89 views
18

具有物C基类访问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! 
    } 
} 

如何从访问ObjcClassaVariable_SwiftClass

回答

5

我找不到一个“正确”的方式来做到这一点,但我非常需要它的工作。我的解决办法是我的目标C超类创建一个简单的getter方法,是这样的:在实现文件

- (NSString *)getMyVariable { 
    return myVariable; 
} 

头文件

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


我喜欢听到更好的做法,但这至少起作用。

+1

我建议名词形式' - (的NSString *)myVariable'。按照惯例,当通过引用返回结果时,通常使用“get”前缀(例如'NSArray'的' - (void)getObjects:(id [])缓冲区范围:(NSRange)range')。更好的是,使用其他答案建议的属性。 – 2014-11-08 23:05:04

17

伟大的查询。我们努力完成这项工作。唯一的工作解决我用用self.setValue("New Value", forKey: "aVariable_")

希望帮助self.valueForKey("aVariable_")

设定值时发现

获取价值。可能的解决方案,而不会改变超类。

+0

这就是我所做的。尽管我喜欢@ JasonTyler的回答。 – Shai 2014-10-15 10:35:48

+0

感谢@Narendra对于我来说,我更喜欢这种方式,如果让var aVar = self.valueForKey(“aVariable_”)就好像您的代码在Swift中一样,并且您使用的是不能修改的Objective C库。很棒。 – Dam 2015-05-28 09:09:27

+0

这是最简单的方法,即使是类型检查的湖泊。 – 2016-11-26 15:28:25

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 

如果是内部单元。

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

0

如果您愿意拥有一个房产,那么您可以创建该房产以适应您的需求。

@interface ObjcClass : NSObject { 
    NSString *aVariable_; 
} 

@property (nonatomic) NSString *aVariable_; 

...

@implementation ObjcClass 

@synthesize aVariable_ = aVariable_; 

这使得可变作为inst->aVariable_或作为inst.aVariable_进行访问。在Objective C类中,变量可以被访问为aVariable_self.aVariable_

0

我真的不知道为什么有人不再为实例变量(比如默认情况下它们是私有的)和属性。看到Giorgio Calzolato对此的回答(除了最后一行关于寻找更好的解决方案 - 这是最好的解决方案:))。

在我的情况下,我已经有一个属性,并为什么它不工作额外困惑。但我意识到该属性有一个自定义时间,它需要被添加到我的SDK-Bridging-Header.h文件中。

所以如果你的属性设置为自定义类型是这样的:

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

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

1

这个工作对我来说是非常简洁的解决方案,只是增加像雨燕变量:

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