2015-07-30 3 views
7

Ho un dizionario di oggetti e quello che vorrei fare è passare attraverso il set di dati e restituire un array di oggetti conformi a un determinato protocollo. Sto avendo problemi con la sintassi per il passaggio in un protocollo desiderato:Come passare un tipo come parametro in Swift

func getObjectsThatConformTo<T>(conformance: T.Type) -> [AnyClass]{ 
    var returnArray: [AnyClass] = [] 
    for(myKey, myValue) in allCreatedObjects{ 
    if let conformantObject = myValue as? conformance{ 
     returnArray.append(conformantObject) 
    } 
    return returnArray 
} 

L'errore che sto vedendo è 'conformità' non è un tipo

Grazie per il vostro aiuto e il tempo

+0

Ciò che è 'leftNavCompliant' – avismara

+0

oops che era qualcosa che ho dimenticato di fare genaric per questo esempio dovrebbe essere il mio caso lascia che l'oggetto modifichi – CWineland

risposta

14

penso che questo dovrebbe funzionare:

func getObjectsThatConformToType<T>(type:T.Type) -> [T]{ 
    var returnArray: [T] = [] 
    for(myKey, myValue) in allCreatedObjects{ 
     if let comformantModule = myValue as? T { 
      returnArray.append(comformantModule) 
     } 
    } 
    return returnArray 
} 
+0

Si usa T !!! perfecto. grazie per l'aiuto – CWineland

1

Mentre è possibile scrivere un metodo generico che filtra attraverso una matrice e vede quali elementi della matrice sono un determinato tipo, questo problema scansiona per l'uso di filter.

Esempio:

var dict: [String: AnyObject] = [:] 
// Populate dict with some values 
let strings = dict.values.filter { return $0 is String } 

avvolto in una funzione che prende digitare:

func getObjectsThatConformTo<T>(array: [Any], conformance: T.Type) -> [T]? { 
    return array.filter { return $0 is T } as? [T] 
} 

Spiegazione: Filter è un metodo su array che restituisce un sottoinsieme della matrice sulla base di una prova. In questo caso il nostro test è "l'elemento è una stringa?" il metodo di filtro accetta una chiusura con un parametro, l'elemento da testare, sopra indicato con $ 0.

leggere su filtro qui: https://www.weheartswift.com/higher-order-functions-map-filter-reduce-and-more/

+0

così in questo esempio tu ora stai filtrando per punire, mi piacerebbe essere in grado di passare al tipo Sting perché non so cosa mi piacerebbe filtrare! – CWineland

+0

Capito, aggiornato – rudd