在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变量声明?
如果您熟悉工厂模式,那么在能够返回实现特定接口的特定类的对象的上下文中这将是有意义的.
就像在我的例子中一样,有时我们喜欢定义在应用于特定对象时有意义的接口.我的表格视图单元格的例子就是这样一个理由.
虽然提供的类型并不完全符合上面提到的接口,但是工厂返回的对象也是如此,因此我希望能够灵活地与基类类型和声明的协议接口进行交互
在Objective-C中,您可以将类型定义为给定类的类并实现协议:
- (UIView <Protocol> *)someMethod;
Run Code Online (Sandbox Code Playgroud)
这将告诉返回的值someMethod是UIView实现给定协议Protocol.有没有办法在Swift中强制执行类似的操作?
在Objective-C中,有一种方法可以声明符合类和一组协议的变量,如下所示:
BaseClass<Protocol1, Protocol2> *variable = ...
Run Code Online (Sandbox Code Playgroud)
在Swift中,我想声明一个数组(实际上是一个类的属性),其中包含由此模式定义的类型的元素.
在这个问题中,有一个解决方案,通过使类通用并相应地约束类型来描述独立属性的类型.为了实例化这样的类,有必要指定确切的类型.这对于独立属性来说不是问题,但在数组中应该可以存储具有不同确切类型的元素.
有没有办法在Swift中表达这个?
我需要声明一个类型的变量,UIView它也符合MyProtocol:
protocol MyProtocol: class {
func foobar()
}
class MyClass {
var myView: UIView<MyProtocol>! // Error: Cannot specialize non-generic type 'UIView'
}
Run Code Online (Sandbox Code Playgroud)
但是我得到了编译错误:无法专门化非泛型类型'UIView'.
我需要从UIView和访问变量的方法MyProtocol.
支持这些要求的正确变量声明是什么?
如果它有任何区别,只有UIView子类才会实现协议.目前,我通过扩展添加协议一致性.
我找到了这个答案:https://stackoverflow.com/a/25771265/233602但不清楚在Swift 2中写这个答案是否仍然是最好的选择.