【发布时间】:2015-09-12 19:12:57
【问题描述】:
例如,我想从我现有的 Objective-C 类MyFoo 中提取一个 Swift 协议。我们称这个协议为FooProtocol。
情况如下:
// 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 不知道应该运行哪个
-
@MartinR 谢谢,我更新了这个问题。不,这不是我真正的代码。我需要建立一个测试项目并尝试......令人惊讶,因为在我的真实项目中我确实做到了,但我不断收到错误。
-
@fatuhoku:如果您发布的代码没有出现问题,那么谁能回答这个问题?
标签: swift objective-c-category swift-extensions swift-protocols