Подтвердить что ты не робот

Доступ к переменным экземпляра класса 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?

4b9b3361

Ответ 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
}