Ich habe eine Objective-C-Variable, die mehreren Protokollen entspricht.
id <NSObject, NSCopying, NSCoding> identityToken;
Wie würde ich diesen Typ in Swift darstellen?
Das sollte funktionieren:
var identityToken: NSObjectProtocol & NSCopying & NSCoding
Beachten Sie, dass Sie schnell NSObjectProtocol anstelle von NSObject verwenden müssen.
Hier einige zusätzliche Beispiele:
Array von Objekten, die mehreren Protokollen entsprechen:
var array: [NSObjectProtocol & NSCopying & NSCoding]
Funktion mit einem Parameter, der mehreren Protokollen entspricht:
func foo(param: NSObjectProtocol & NSCopying & NSCoding) {
}
Verwenden Sie für die Swift-Version vor 3.1:
var identityToken: (NSObjectProtocol, NSCopying, NSCoding)
NSObjectProtocol
verwendet werden muss?MyClass<ProtcolOne, ProtocolTwo>
?Swift 3
var idToken: NSObjectProtocol & NSCopying & NSCoding func foo(_ delegateAndDataSource: UICollectionViewDelegate & UICollectionViewDataSource) { ... }
quelle
Anscheinend können Sie auch die zusammengesetzten Protokolle als Alias eingeben, was nützlich sein kann, wenn Sie dieselbe Protokollkombination mehrmals verwenden möchten.
typealias IDToken = NSObjectProtocol & NSCopying & NSCoding
Gleiche Beispiele wie in der akzeptierten Antwort unter Verwendung eines Typ-Alias:
var idToken: IDToken var array: [IDToken] = [] func foo(param: IDToken) { ... }
quelle
Die obige Antwort von conner ist richtig. Sie sollten jedoch häufig ein separates Protokoll implementieren, das selbst von den anderen Protokollen erbt und Ihnen mehr Flexibilität bietet, wenn Sie später zusätzliche Protokollmethoden hinzufügen oder die Protokolle der obersten Ebene ändern möchten.
internal protocol MyOtherProtocol : NSObjectProtocol, NSCopying, NSCoding { func someOtherNecessaryMethod() }
Dann verwendet:
var identityToken : MyOtherProtocol
quelle
Für Generika funktioniert dies auch:
func setCollectionViewDataSourceDelegate<D: UICollectionViewDataSource & UICollectionViewDelegate>
quelle