Types conforming to multiple protocols in swift

前端 未结 5 537
一整个雨季
一整个雨季 2020-12-13 11:43

I have an Objective-C variable that conforms to multiple protocols.

id  identityToken; 

How would I re

相关标签:
5条回答
  • 2020-12-13 12:19

    This should work:

    var identityToken: NSObjectProtocol & NSCopying & NSCoding 
    

    Note you have to use NSObjectProtocol instead of NSObject in swift.

    Here are some additional examples:

    Array of objects conforming to multiple protocols:

    var array: [NSObjectProtocol & NSCopying & NSCoding]
    

    Function with a parameter that conforms to multiple protocols:

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

    For Swift version before 3.1, use:

    var identityToken: (NSObjectProtocol, NSCopying, NSCoding)
    
    0 讨论(0)
  • 2020-12-13 12:19

    Swift 3

    var idToken: NSObjectProtocol & NSCopying & NSCoding
    
    func foo(_ delegateAndDataSource: UICollectionViewDelegate & UICollectionViewDataSource) { ... }
    
    0 讨论(0)
  • 2020-12-13 12:19

    The above answer from conner is correct, however you often should implement a separate protocol that itself inherits from the other protocols, and allows you more flexibility, should you want to add additional protocol methods later or change the top level protocols.

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

    Then utilized:

    var identityToken : MyOtherProtocol
    
    0 讨论(0)
  • 2020-12-13 12:31

    Seems like you could also type-alias the composite protocols, which may come in handy if you plan on using the same combination of protocol multiple times.

    typealias IDToken = NSObjectProtocol & NSCopying & NSCoding
    

    Same examples as given in the accepted answer, using a type-alias:

    var idToken: IDToken
    
    var array: [IDToken] = []
    
    func foo(param: IDToken) { ... }
    
    0 讨论(0)
  • 2020-12-13 12:39

    For generics this works as well:

    func setCollectionViewDataSourceDelegate<D: UICollectionViewDataSource & UICollectionViewDelegate>
    
    0 讨论(0)
提交回复
热议问题