在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
这将返回错误,因为表格视图单元格不符合协议.
我希望能够指定单元格是UITableViewCell
,并且符合变量声明中的MyProtocol
?
对齐
如果您熟悉Factory Pattern,那么在能够返回实现特定接口的特定类的对象的上下文中,这是有意义的.
就像在我的示例中一样,有时我们喜欢定义在应用于特定对象时有意义的接口.我的表视图单元格示例就是这样一个理由.
虽然提供的类型不完全符合上述接口,但工厂返回的对象符合,因此我希望能够灵活地与基类类型和声明的协议接口进行交互