У меня есть переменная Objective-C, которая соответствует нескольким протоколам.
id <NSObject, NSCopying, NSCoding> identityToken;
Как я могу представить этот тип в Swift?
У меня есть переменная Objective-C, которая соответствует нескольким протоколам.
id <NSObject, NSCopying, NSCoding> identityToken;
Как я могу представить этот тип в Swift?
Это должно работать:
var identityToken: NSObjectProtocol & NSCopying & NSCoding
Обратите внимание, что вы должны использовать NSObjectProtocol вместо NSObject в swift.
Вот несколько дополнительных примеров:
Массив объектов, соответствующих нескольким протоколам:
var array: [NSObjectProtocol & NSCopying & NSCoding]
Функция с параметром, который соответствует нескольким протоколам:
func foo(param: NSObjectProtocol & NSCopying & NSCoding) {
}
Для версии Swift до 3.1 используйте:
var identityToken: (NSObjectProtocol, NSCopying, NSCoding)
Swift 3
var idToken: NSObjectProtocol & NSCopying & NSCoding
func foo(_ delegateAndDataSource: UICollectionViewDelegate & UICollectionViewDataSource) { ... }
Вышеприведенный ответ от conner является правильным, однако вам часто необходимо реализовать отдельный протокол, который сам наследует от других протоколов, и позволяет вам более гибко, если вы хотите позже добавить дополнительные методы протокола или изменить протоколы верхнего уровня.
internal protocol MyOtherProtocol : NSObjectProtocol, NSCopying, NSCoding {
func someOtherNecessaryMethod()
}
Затем используется:
var identityToken : MyOtherProtocol
Для дженериков это также работает:
func setCollectionViewDataSourceDelegate<D: UICollectionViewDataSource & UICollectionViewDelegate>
Похоже, вы также можете вводить псевдонимы составных протоколов, что может пригодиться, если вы планируете использовать одну и ту же комбинацию протокола несколько раз.
typealias IDToken = NSObjectProtocol & NSCopying & NSCoding
Те же примеры, что и в принятом ответе, с использованием псевдонима типа:
var idToken: IDToken
var array: [IDToken] = []
func foo(param: IDToken) { ... }