在 Swift 中,我可以通过如下声明来显式设置变量的类型:
var object: TYPE_NAME
如果我们想更进一步并声明一个符合多个协议的变量,我们可以使用protocol
声明式:
var object: protocol<ProtocolOne,ProtocolTwo>//etc
如果我想声明一个符合一个或多个协议并且也是特定基类类型的对象怎么办?等效的 Objective-C 如下所示:
NSSomething<ABCProtocolOne,ABCProtocolTwo> * object = ...;
在 Swift 中,我希望它看起来像这样:
var object: TYPE_NAME,ProtocolOne//etc
这使我们能够灵活地处理基类型的实现以及协议中定义的添加接口。
我可能会错过另一种更明显的方式吗?
例子
例如,假设我有一家UITableViewCell
工厂负责返回符合协议的单元格。我们可以轻松设置一个通用函数,该函数返回符合协议的单元格:
class CellFactory {
class func createCellForItem<T: UITableViewCell where T:MyProtocol >(item: SpecialItem,tableView: UITableView) -> T {
//etc
}
}
稍后我想将这些单元格出列,同时利用类型和协议
var cell: MyProtocol = CellFactory.createCellForItem(somethingAtIndexPath) as UITableViewCell
这会返回错误,因为表格视图单元格不符合协议...
我希望能够指定单元格是 aUITableViewCell
并符合MyProtocol
变量声明中的?
理由
如果您熟悉工厂模式,这在能够返回实现特定接口的特定类的对象的上下文中是有意义的。
就像在我的示例中一样,有时我们喜欢定义在应用于特定对象时有意义的接口。我的表格视图单元格示例就是这样一种理由。
虽然提供的类型不完全符合上述接口,但工厂返回的对象确实如此,因此我希望与基类类型和声明的协议接口进行交互的灵活性