【问题标题】:In Swift, is it possible for a Objective-C class' properties to satisfy a Swift @obj protocol computed property requirement?在 Swift 中,Objective-C 类的属性是否可以满足 Swift @obj 协议的计算属性要求?
【发布时间】: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


【解决方案1】:

接口有不同的签名,因此编译器并不知道该怎么做。

试试这个:

// 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!
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-15
    • 2020-06-28
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多