Например, я хочу извлечь протокол 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
Что я делаю не так?
'MyFoo' нуждается в базовый класс, в противном случае код Objective-C не компилируется. 'let theFoo: Foo =', вероятно, должен быть 'let theFoo: FooProtocol ='. - И тогда ваш код * делает * компилируется как в Xcode 6.4, так и в Xcode 7 GM. - Это ваш настоящий код? –
вы переопределяете свойство класса в расширении протокола. swift не будет знать, какой должен быть запущен – Mousavian
@MartinR спасибо, я обновил вопрос. Нет, это не мой настоящий код. Мне нужно настроить тестовый проект и попробовать ... удивительно, потому что в моем реальном проекте я сделал именно это, и я продолжаю получать ошибку. – fatuhoku