我试图为符合多种协议的UITableViewCell代理属性定义typealias
。这就是我想要做的事情,Swift抱怨我的语法错误:
// The typealias definition
typealias CellDelegate = AnyObject<UIPickerViewDataSource, UIPickerViewDelegate>
// In my UITableViewCell subclass:
weak var delegate: CellDelegate?
&#34;不能专门化非泛型类型AnyObject&#34;是我得到的错误。我该如何正确地做到这一点?
答案 0 :(得分:27)
您发布的代码与您期望的内容具有不同的含义。您将AnyObject
视为通用类型,UIPickerViewDataSource
和UIPickerViewDelegate
作为类型参数。这与使用Dictionary
键和Int
值创建String
相同,例如:
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语言指南中解释,here。
编辑:已更新为Swift 3语法,感谢@raginmari
答案 1 :(得分:3)
如果你想宣布多协议:
protocol<A, B>
答案 2 :(得分:2)
使用Swift 3,语法改变了。
直到Swift 2.3:
typealias CellDelegate = protocol<UIPickerViewDataSource, UIPickerViewDelegate>
自Swift 3开始:
typealias CellDelegate = UIPickerViewDataSource & UIPickerViewDelegate
答案 3 :(得分:1)
我不明白为什么你这样打字weak var delegate: <CellDelegate>?
以及为什么你不输入weak var delegate: CellDelegate?
问题是AnyObject是通用的。在第一行中,您尝试使AnyObject非泛型,并且它不是。
您最好创建一个实现它们的类(数据源和委托)。
答案 4 :(得分:1)
你应该传递一个已知对象,AnyObject太通用了,这就是你不能这样做的原因