2016-10-25 2 views
4

j'ai écrit une struct qui contient les données d'actifs de base:Swift 3, Extend tableau où les éléments de tableau sont d'un certain type

struct Asset: AssetProtocol { 

    init (id: Int = 0, url: String) { 
     self.id = id 
     self.url = URL(string: url) 
    } 

    var id: Int 
    var url: URL? 

} 

Il souscrit à AssetProtocol

protocol AssetProtocol { 
    var id: Int { get } 
    var url: URL? { get } 
} 

Je suis en espérant étendre le tableau (séquence) où les éléments de ce tableau sont des éléments qui souscrivent au AssetProtocol. Aussi, pour que ces fonctions puissent muter le tableau en place.

extension Sequence where Iterator.Element: AssetProtocol { 

    mutating func appendUpdateExclusive(element newAsset: Asset) {  
     ... 

Comment puis-je parcourir et muter cette séquence? J'ai essayé une demi-douzaine de façons et n'arrive pas à bien faire les choses!

Répondre

6

Plutôt que d'utiliser une méthode qui prend un Asset comme argument, pensez à réutiliser Element à la place. Puisque vous avez déjà défini la contrainte sur Element dans votre définition d'extension, toutes les méthodes et propriétés sur AssetProtocol seront disponibles sur l'instance de Element:

protocol AssetProtocol { 
    var id: Int { get } 
    var url: URL? { get } 

    static func someStaticMethod() 
    func someInstanceMethod() 
} 

extension Array where Element:AssetProtocol { 
    mutating func appendUpdateExclusive(element newAsset: Element) { 
     newAsset.someInstanceMethod() 
     Element.someStaticMethod() 

     append(newAsset) 
    } 
} 
+2

Je pense que la clé est de déclarer ici le paramètre de la fonction d'être: Element . Merci! – achi