非泛型Swift类可以实现UIPickerViewDataSource,但通用版本不能

时间:2015-04-12 02:38:49

标签: xcode swift protocols generics

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<T> does not conform to protocol UIPickerViewDataSource

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

1 个答案:

答案 0 :(得分:1)

这已在Swift 2.0中修复,特别是在Xcode 7(本文撰写时为beta 5)中进行了测试。

99%确定这个博客片段解释了它,虽然更难以找到更加编译器 - 书呆子友好的显式规范声明:

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

[强调我的]

  

Swift-er SDK:感谢使用Apple SDK,Swift 2工作得更好   部分是Objective-C中的两个新功能:可空性注释   和泛型。 SDK已更新为注释不能的API   返回nil,因此您不需要经常使用选项。和一个    SDK使用的真正的泛型系统您可以更经常地保留   Swift 2代码中的详细类型信息。