在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
这会返回错误,因为表视图单元格不符合协议...
我想能够指定单元格是a UITableViewCell
并符合MyProtocol
变量声明中的?
理由
如果您熟悉工厂模式,那么在能够返回实现特定接口的特定类的对象的背景下,这将是有意义的。
就像在我的示例中一样,有时我们希望定义在应用于特定对象时有意义的接口。我关于表格视图单元格的示例就是这样一种证明。
尽管提供的类型与所提到的接口不完全一致,但是工厂返回的对象却与之一致,因此我希望在与基类类型和声明的协议接口交互时具有灵活性