Типы, соответствующие нескольким протоколам в быстрых

У меня есть переменная Objective-C, которая соответствует нескольким протоколам.

id <NSObject, NSCopying, NSCoding> identityToken; 

Как я могу представить этот тип в Swift?

Ответ 1

Это должно работать:

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)

Ответ 2

Swift 3

var idToken: NSObjectProtocol & NSCopying & NSCoding

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

Ответ 3

Вышеприведенный ответ от conner является правильным, однако вам часто необходимо реализовать отдельный протокол, который сам наследует от других протоколов, и позволяет вам более гибко, если вы хотите позже добавить дополнительные методы протокола или изменить протоколы верхнего уровня.

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

Затем используется:

var identityToken : MyOtherProtocol

Ответ 4

Для дженериков это также работает:

func setCollectionViewDataSourceDelegate<D: UICollectionViewDataSource & UICollectionViewDelegate>

Ответ 5

Похоже, вы также можете вводить псевдонимы составных протоколов, что может пригодиться, если вы планируете использовать одну и ту же комбинацию протокола несколько раз.

typealias IDToken = NSObjectProtocol & NSCopying & NSCoding

Те же примеры, что и в принятом ответе, с использованием псевдонима типа:

var idToken: IDToken

var array: [IDToken] = []

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