在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中,可以编写类似的东西:
@property(retain) UIView<Protocol1, Protocol2, ...> *myView;
Run Code Online (Sandbox Code Playgroud)
但是如何在swift中编写这段代码呢?
我已经知道如何使属性符合许多协议,但它不能使用继承:
var myView: ??? protocol<Protocol1, Protocol2, ...>
Run Code Online (Sandbox Code Playgroud)
编辑:
我使用许多UIView子类型UIImageView,UILabel或者其他类型,我需要使用一些UIView属性以及协议中定义的一些方法.在最坏的情况下,我可以UIViewProtocol使用所需的属性创建一个,但我知道在Swift中是否可以声明一个属性/变量,其类型和一些协议符合.
在Swift 2.0中,我该怎么做@property (nonatomic, strong) NSManagedObject*<SomeProtocol> model呢?
基本上,我正在尝试在我的类上定义一个属性,它必须都是NSManagedObjectAND 的子类符合SomeProtocol(我将调用两者定义的方法).
我看到了这个:https://stackoverflow.com/a/25826948/363789,但我不确定如何将此语法应用于属性定义...