【问题标题】:Non-generic Swift class can implement UIPickerViewDataSource but Generic version can't非泛型 Swift 类可以实现 UIPickerViewDataSource 但泛型版本不能
【发布时间】:2015-04-12 02:38:49
【问题描述】:

Swift 1.2 / Xcode 6.3。

为什么这是有效的:

class RangeDelegateNongeneric: NSObject, UIPickerViewDataSource {
    var values = [Int]()

    func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
        return 1
    }

    func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return values.count
    }
}

但这不是:

class RangeDelegateGeneric<T>: NSObject, UIPickerViewDataSource {
    var values = [T]()

    func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
        return 1
    }

    func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return values.count
    }
}

错误:Type RangeDelegateGeneric&lt;T&gt; does not conform to protocol UIPickerViewDataSource

更奇怪的是,Fix-it 消息:Candidate is not @objc, but protocol requires it@objc 添加到每个函数的开头,但这不是 Fix-it,Fix-it 工具很乐意重复添加 @objc

【问题讨论】:

  • 您在哪一行收到此错误?我将泛型类复制到我的游乐场,它似乎编译得很好。
  • 泛型类不能成为 Foundation 方法的代表,例如,请参阅此答案:stackoverflow.com/a/26104946/1187415
  • 谢谢。在实践中,这给了我我需要知道的东西。虽然编译器的错误消息是明确的证据,但如果您可以指出 Apple 技术文档中对此进行了解释,我很高兴为您提供答案。我很沮丧,因为我无法在任何规范中明确说明这一事实。

标签: xcode swift protocols generics


【解决方案1】:

这已在 Swift 2.0 中得到修复,专门在 Xcode 7 中进行了测试(撰写本文时为 beta 5)。

99% 肯定这个博客片段解释了它,尽管奇怪的是很难找到对编译器更友好的显式规范声明:

https://developer.apple.com/swift/blog/?id=29

[强调我的]

Swift-er SDK:Swift 2 与 Apple SDK 一起工作得更好,谢谢 部分归功于 Objective-C 中的两个新特性:可空性注释 和泛型。 SDK 已更新以注释无法使用的 API 返回 nil,这样你就不需要经常使用选项了。并带有一个 SDK 采用的真正的泛型系统,您可以更经常地保留 Swift 2 代码中的详细类型信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-19
    相关资源
    最近更新 更多