Доступ к переменным экземпляра класса 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 super instance variables!
}
}
Как мне получить доступ к ObjcClass
aVariable_
из SwiftClass
?
Ответы
Ответ 1
Отличный запрос. Мы пытались это сделать. Единственное рабочее решение, которое я нашел
получить значение с помощью self.valueForKey("aVariable_")
установить значение с помощью self.setValue("New Value", forKey: "aVariable_")
Надеюсь, что это поможет. Возможное решение без изменения суперкласса.
Ответ 2
Я не мог найти "правильный" способ сделать это, но мне было нужно плохо работать. Мое решение состояло в том, чтобы создать простой метод getter в моем суперклассе Objective C, например:
заголовочный файл
@interface ObjcClass : NSObject {
NSString *myVariable;
}
- (NSString *)getMyVariable;
в файле реализации
- (NSString *)getMyVariable {
return myVariable;
}
Мне бы хотелось услышать лучший способ сделать это, но это по крайней мере работает.
Ответ 3
Я много искал для этого.
В конце концов я сменил свой код на:
@interface PrjRec : NSObject {
@public
NSString* name;
}
@end
To:
@interface PrjRec : NSObject {
}
@property NSString* name;
@end
похож на решение @JasonTyler.
Затем я могу получить доступ к свойству объекта из кода Swift с помощью простой точечной нотации <object instance>.name
,
Но мне нужно было изменить все существующие ссылки objective-c из
<object instance>->name
To:
<object instance>.name
или
_name
если внутри класса.
Я надеюсь на лучшее решение.
Ответ 4
Если вы хотите иметь свойство, вы можете создать свойство, соответствующее вашим потребностям.
@interface ObjcClass : NSObject {
NSString *aVariable_;
}
@property (nonatomic) NSString *aVariable_;
...
@implementation ObjcClass
@synthesize aVariable_ = aVariable_;
Это позволяет получить доступ к переменной как inst->aVariable_
или как inst.aVariable_
. В классе Objective C переменную можно получить как aVariable_
или self.aVariable_
.
Ответ 5
Я серьезно не знаю, почему все переменные экземпляра больше (например, они по умолчанию закрыты) vs properties. См. Ответ Джорджио Кальцолато об этом (кроме его последней строки о поиске лучшего решения - это лучшее решение:)).
В моем случае у меня уже было свойство и было лишнее недоумение по поводу того, почему это не сработало. Но я понял, что свойство имеет собственное время, и его нужно было добавить в мой файл SDK-Bridging-Header.h.
Итак, если для вашего свойства задан особый тип, например:
@property (nonatomic, weak) IBOutlet SDKMyCustomObject *customObject;
... затем не забудьте добавить его в заголовок моста.
Ответ 6
Это работало для меня довольно аккуратным решением, просто добавив переменную Swift, например:
var myInstanceVar: String {
return self.value(forKey: "myInstanceVar") as! String
}