符合swift中多个协议的类型

Dre*_*ack 73 swift

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

id <NSObject, NSCopying, NSCoding> identityToken; 
Run Code Online (Sandbox Code Playgroud)

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

Con*_*nor 146

这应该工作:

var identityToken: NSObjectProtocol & NSCopying & NSCoding 
Run Code Online (Sandbox Code Playgroud)

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

以下是一些其他示例:

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

var array: [NSObjectProtocol & NSCopying & NSCoding]
Run Code Online (Sandbox Code Playgroud)

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

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

}
Run Code Online (Sandbox Code Playgroud)

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

var identityToken: (NSObjectProtocol, NSCopying, NSCoding)
Run Code Online (Sandbox Code Playgroud)

  • 很酷.没有意识到这种(有点尴尬)的语法.但是,如何使用显式类来完成此操作,例如在obj-c:`MyClass <ProtcolOne,ProtocolTwo>`? (8认同)
  • @devios您可以使用泛型替换MyClass <ProtocolOne,ProtocolTwo>:func foo <T:MyClass其中T:protocol <ProtocolOne,ProtocolTwo >>(params:T) (4认同)
  • @Oscar感谢您的帮助提示.如何将MyClass <ProtocolOne,ProtocolTwo>声明为变量? (3认同)

Kal*_*zem 10

斯威夫特3

var idToken: NSObjectProtocol & NSCopying & NSCoding

func foo(_ delegateAndDataSource: UICollectionViewDelegate & UICollectionViewDataSource) { ... }
Run Code Online (Sandbox Code Playgroud)


Phl*_*man 5

似乎您还可以为复合协议键入别名,如果您计划多次使用相同的协议组合,这可能会派上用场。

typealias IDToken = NSObjectProtocol & NSCopying & NSCoding
Run Code Online (Sandbox Code Playgroud)

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

var idToken: IDToken

var array: [IDToken] = []

func foo(param: IDToken) { ... }
Run Code Online (Sandbox Code Playgroud)