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
这会返回一个错误,因为表格视图单元格不符合协议...
我想在变量声明中指定cell是UITableViewCell
并符合MyProtocol
,你能帮我翻译吗?
解释
如果您熟悉工厂模式,那么在能够返回实现特定接口的特定类的对象的上下文中,这将是有意义的。
就像我的例子一样,有时我们喜欢定义适用于特定对象的接口。我的表格视图单元格示例就是这样的理由之一。
虽然提供的类型不完全符合所提到的接口,但工厂返回的对象确实符合,因此我希望在与基类类型和声明的协议接口交互时具有灵活性。
NSSomething<ABCProtocolOne,ABCProtocolTwo> * object = ...;
这个对象似乎相当无用,因为NSSomething
已经知道它符合哪些协议。如果它不符合<>
中的任何一个协议,你将会遇到unrecognised selector ...
崩溃。这完全没有提供类型安全性。 - Kirsteins