在 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
的变量声明?
如果您熟悉 工厂模式,那么这在能够返回实现某个接口的特定类的对象的上下文中是有意义的。
就像在我的例子中一样,有时我们喜欢定义应用于特定对象时有意义的接口。我的表视图单元格示例就是这样一个例子。
虽然提供的类型并不完全符合所提到的接口,但是工厂返回的对象完全符合,因此我希望在与基类类型和声明的协议接口交互时具有灵活性