2014-10-10 21 views
5

Come si crea un'istanza di un tipo in modo dinamico in base a un valore di ricerca in un dizionario in Swift?Creare un oggetto Swift da un dizionario

+1

Purtroppo hai ora curato la questione del tutto il riconoscimento. Non è più chiaro quale fosse la domanda o quale fosse la soluzione. Sarebbe meglio tornare alla domanda originale e inserire la risposta come risposta, non come una modifica della domanda che sovrascrive la domanda originale. – matt

+0

Sì, non è più una domanda. Ho fatto una domanda ora, è meglio? O dovrei tornare? – possen

+1

In sostanza non puoi farlo affatto in Swift. Comunque puoi farlo in Objective-C e Swift è perfettamente in grado di interagire con oggetti Objective-C. Nota che qualsiasi sottoclasse di NSObject non è un oggetto rapido, è un oggetto Objective-C. Si comportano prevalentemente allo stesso modo, ma quelli Objective-C sono in grado di essere dinamici, ma hanno altri svantaggi (ad esempio: sono molto più lenti). –

risposta

4

Speriamo che questo sia utile per gli altri. Ci sono volute alcune ricerche per capirlo. L'obiettivo è evitare l'anti-pattern delle istruzioni if ​​o switch giganti per creare ogni tipo di oggetto da un valore.

class NamedItem : CustomStringConvertible { 
    let name : String 

    required init() { 
     self.name = "Base" 
    } 

    init(name : String) { 
     self.name = name 
    } 

    var description : String { // implement Printable 
     return name 
    } 
} 

class File : NamedItem { 
    required init() { 
     super.init(name: "File") 
    } 
} 

class Folder : NamedItem { 
    required init() { 
     super.init(name: "Folder") 
    } 
} 

// using self to instantiate. 
let y = Folder.self 
"\(y.init())" 

let z = File.self 
"\(z.init())" 

// now put it in a dictionary. 
enum NamedItemType { 
    case Folder 
    case File 
} 

var typeMap : [NamedItemType : NamedItem.Type] = [.Folder : Folder.self, 
                .File : File.self] 
let p = typeMap[.Folder] 
"\(p!.init())" 
let q = typeMap[.File] 
"\(q!.init())" 

aspetti interessanti:

  • uso di "necessaria" per inizializzatori
  • uso di .Type per ottenere il tipo per il valore di dizionario.
  • uso di .self per ottenere la "classe" che può essere istanziata
  • uso di() per istanziare l'oggetto dinamico.
  • uso del protocollo stampabile per ottenere valori di stringa impliciti.
  • come inizializzare utilizzando un init non parametrizzato e ottenere i valori dall'inizializzazione della sottoclasse.

Aggiornato a Swift 3.0 sintassi

+2

Ho trovato questo illuminante. Grazie per aver condiviso la tua ricerca. – vacawama

+0

grazie per i tuoi suggerimenti precedenti. – possen

Problemi correlati