为实现多个协议的任何对象定义 Swift 类型别名



我正在尝试为符合多个协议的UITableViewCell的委托属性定义一个typealias。这就是我正在尝试做的事情,Swift 抱怨我的语法是错误的:

// The typealias definition
typealias CellDelegate = AnyObject<UIPickerViewDataSource, UIPickerViewDelegate>
// In my UITableViewCell subclass:
weak var delegate: CellDelegate?

"无法专门化非通用类型 AnyObject"是我遇到的错误。如何正确执行此操作?

您发布的代码与您期望的不同含义。您将AnyObject视为泛型类型,将UIPickerViewDataSourceUIPickerViewDelegate视为类型参数。这与创建具有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 太通用了,这就是为什么你不能这样做

最新更新