我正在尝试为符合多个协议的UITableViewCell的委托属性定义一个typealias
。这就是我正在尝试做的事情,Swift 抱怨我的语法是错误的:
// The typealias definition
typealias CellDelegate = AnyObject<UIPickerViewDataSource, UIPickerViewDelegate>
// In my UITableViewCell subclass:
weak var delegate: CellDelegate?
"无法专门化非通用类型 AnyObject"是我遇到的错误。如何正确执行此操作?
您发布的代码与您期望的不同含义。您将AnyObject
视为泛型类型,将UIPickerViewDataSource
和UIPickerViewDelegate
视为类型参数。这与创建具有Int
键和String
值的Dictionary
相同,例如:
var someDictionary: Dictionary<Int, String>
您尝试完成的任务需要不同的构造,称为协议组合。Swift 专门提供它来表达符合多个协议的类型。它的语法如下,您可以在任何可以使用常规类型的任何地方使用它:
FirstProtocol & SecondProtocol
使用此功能,您的代码将变为:
// The typealias definition
typealias CellDelegate = UIPickerViewDataSource & UIPickerViewDelegate
// In my UITableViewCell subclass:
weak var delegate: CellDelegate?
协议组合在 Apple 的 Swift 语言指南中进行了解释,在这里。
编辑:更新为 Swift 3 语法,感谢@raginmari
如果要声明多协议:
protocol<A, B>
在 Swift 3 中,语法发生了变化。
直到 Swift 2.3:
typealias CellDelegate = protocol<UIPickerViewDataSource, UIPickerViewDelegate>
自 Swift 3 以来:
typealias CellDelegate = UIPickerViewDataSource & UIPickerViewDelegate
我不明白你为什么像这样weak var delegate: <CellDelegate>?
输入,为什么你不输入weak var delegate: CellDelegate?
问题是AnyObject是通用的。对于第一行,您尝试使AnyObject成为非通用的,但事实并非如此。
你最好创建一个实现这些(数据源和委托)的类。
你应该传递一个已知的对象,AnyObejct 太通用了,这就是为什么你不能这样做