2017-07-18 8 views
-1

Ich versuche, einen Tupel-Typ zu machen, der einen Hash-Artikel & ein beliebiges Element, & hat, verwenden Sie es in einem benutzerdefinierten Initialisierer für Dictionary. Allerdings wird Swift auf diese Weise nicht Hashable verwenden, & Ich stecke für eine Alternative fest. Ich möchte die Wörterbücher, die ich erstellen kann, nicht auf die Verwendung von Strings als Schlüssel beschränken.Tuple-Typ mit hashbaren Elementen

protocol CollectionInitializeable { 
    associatedtype T 
    init(items: [T]) 
} 

extension Dictionary: CollectionInitializeable { 

    typealias T = (Hashable, Any) // not allowed 

    init(items: [T]) { 

     self.init() 
     // etc... 
    } 
} 
+0

'CollectionInitializeable' noch der Initialisierer nimmt ein' Array', nicht irgendeine 'Sammlung'. – Alexander

+0

@Alexander Punkt auf den Namen genommen, vielleicht sollte ich das Protokoll ArrayInitializeable :) nennen - aber ich habe keine Angabe aus diesem Codebeispiel gegeben, warum ich es so umgesetzt habe - ich glaube nicht, dass das das Problem hier ist. Wenn ich ein Wörterbuch mit einem Array von Tupeln initialisiere, dann ist das mein Ruf ... – SomaMan

+0

Update: Das ist jetzt unnormal, dank ['Dictionary.init (uniqueKeysWithValues:)'] (https://developer.apple .com/documentation/swift/dictionary/2894798-init) und ['Dictionary.init (_: uniquingKeysWith:)'] (https://developer.apple.com/documentation/swift/dictionary/2892961-init) – Alexander

Antwort

1

Update:

Dieses unnessary jetzt ist dank Dictionary.init(uniqueKeysWithValues:) und Dictionary.init(_:uniquingKeysWith:)

Original-Beitrag:

Suchen Sie so etwas?

protocol CollectionInitializeable { 
    associatedtype T 
    init<C: Collection>(items: C) where C.Iterator.Element == T 
} 

extension Dictionary: CollectionInitializeable { 
    typealias T = Iterator.Element 

    init<C: Collection>(items c: C) 
    where C.Iterator.Element == T { 
     self.init() 
     for (key, value) in c { 
      self[key] = value 
     } 
    } 
} 

let a = [ 
    (key: 1, value: "a"), 
    (key: 2, value: "b"), 
    (key: 3, value: "c") 
] 

print(Dictionary(items: a)) 
+0

Danke Ich könnte das machen, wenn ich nicht mit dem Protokoll beschäftigt wäre, aber das Problem mit diesem Ansatz ist, dass ich nicht mit dem Protokoll konform bin. Ich habe andere Klassen, die die Init implementieren, und ich hoffte, es auch hier zu verwenden ... – SomaMan

+0

@SomaMan Edited – Alexander