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