3

Например, я хочу извлечь протокол Swift из моего существующего класса Objective-C MyFoo. Назовем этот протокол FooProtocol.В Swift, возможно ли, чтобы свойства класса Objective-C удовлетворяли требованию вычитаемого свойства Swift @obj?

Ситуация выглядит следующим образом:

// In Objective-C 
@interface MyFoo 
@property(nonatomic, copy) NSString *foo; 
@end 
@implementation MyFoo 
// ... -(instancetype)initWithString: is implemented here 
@end 

// In Swift 
@objc protocol FooProtocol { 
    var foo: String { get set } 
} 

extension MyFoo: FooProtocol { 
    // do nothing here! 
} 

Тогда я должен иметь возможность сделать это:

let theFoo: FooProtocol = MyFoo(string: "Awesome") 
NSLog("\(theFoo.foo)") // Prints awesome. 

Но я получаю сказал "MYFOO не соответствует протоколу FooProtocol". Хорошо. Справедливо, я предполагаю, что расширение протокола нужно немного подтолкнуть:

extension MyFoo: FooProtocol { 
    var foo: String! { get { return foo } set { NSLog("noop") }} 
} 

, но я получаю ошибки компилятора, которые выглядят как

Getter for 'foo' with Objective-C selector 'foo' conflicts with previous declaration with the same Objective-C selector 

Что я делаю не так?

+0

'MyFoo' нуждается в базовый класс, в противном случае код Objective-C не компилируется. 'let theFoo: Foo =', вероятно, должен быть 'let theFoo: FooProtocol ='. - И тогда ваш код * делает * компилируется как в Xcode 6.4, так и в Xcode 7 GM. - Это ваш настоящий код? –

+1

вы переопределяете свойство класса в расширении протокола. swift не будет знать, какой должен быть запущен – Mousavian

+0

@MartinR спасибо, я обновил вопрос. Нет, это не мой настоящий код. Мне нужно настроить тестовый проект и попробовать ... удивительно, потому что в моем реальном проекте я сделал именно это, и я продолжаю получать ошибку. – fatuhoku

ответ

0

Интерфейсы имеют разные подписи, поэтому компилятор действительно не знает, что делать.

Попробуйте это:

// In Objective-C 
@interface MyFoo 
@property(nonatomic, copy) NSString *foo; 
@end 
@implementation MyFoo 
// ... -(instancetype)initWithString: is implemented here 
@end 

// In Swift 
@objc protocol FooProtocol { 
    var foo: NSString { get set } 
} 

extension MyFoo: FooProtocol { 
    // do nothing here! 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^