符合swift中多个协议的类型

时间:2014-06-04 01:01:06

标签: swift

我有一个符合多种协议的Objective-C变量。

id <NSObject, NSCopying, NSCoding> identityToken; 

我如何在Swift中表示这种类型?

5 个答案:

答案 0 :(得分:137)

这应该有效:

var identityToken: NSObjectProtocol & NSCopying & NSCoding 

注意你必须在swift中使用NSObjectProtocol而不是NSObject。

以下是一些其他示例:

符合多种协议的对象数组:

var array: [NSObjectProtocol & NSCopying & NSCoding]

具有符合多种协议的参数的函数:

func foo(param: NSObjectProtocol & NSCopying & NSCoding) {

}

对于3.1之前的Swift版本,请使用:

var identityToken: (NSObjectProtocol, NSCopying, NSCoding)

答案 1 :(得分:10)

Swift 3

var idToken: NSObjectProtocol & NSCopying & NSCoding

func foo(_ delegateAndDataSource: UICollectionViewDelegate & UICollectionViewDataSource) { ... }

答案 2 :(得分:4)

conner的上述答案是正确的,但是你经常应该实现一个单独的协议,它本身继承了其他协议,如果你想稍后添加其他协议方法或更改顶级协议,你可以更灵活。 / p>

internal protocol MyOtherProtocol : NSObjectProtocol, NSCopying, NSCoding {
    func someOtherNecessaryMethod()
}

然后利用:

var identityToken : MyOtherProtocol

答案 3 :(得分:0)

对于泛型也是如此:

func setCollectionViewDataSourceDelegate<D: UICollectionViewDataSource & UICollectionViewDelegate>

答案 4 :(得分:0)

似乎您也可以对复合协议进行类型别名,如果您打算多次使用相同的协议组合,这可能会派上用场。

typealias IDToken = NSObjectProtocol & NSCopying & NSCoding

与接受的答案中给出的示例相同,使用类型别名:

var idToken: IDToken

var array: [IDToken] = []

func foo(param: IDToken) { ... }