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