2014-10-07 15 views
11

Capisco che con Swift è possibile specificare una funzione specifica generico con questa forma:Generico in pedice per rapida

func someFunction<T>(type: T.Type) {...} 

Tuttavia, è possibile fare qualcosa di simile con indici? Dove è possibile specificare un tipo all'interno delle parentesi in questo modo:

subscript<T>(type: T.Type) -> T {...} 

EDIT: soluzione di aggiornamento in base alla risposta accettata

subscript(type: AnyClass.Type) -> Any { 
    return sizeof(type) 
} 

EDIT 2: Su test, sembra che non posso effettivamente utilizzare questo pedice . Ottengo "CLASS non è identico a AnyClass.Type" quindi sono tornato al punto uno

+1

Dang, ma non sarebbe questo essere impressionante. Questo è frustrante che non è supportato. Un pedice è in realtà solo una funzione speciale, quindi non c'è alcun motivo architettonico per cui il compilatore non possa supportarlo. Forse lo otterremo in una versione futura della lingua. – devios1

risposta

9

Non è possibile definire un subscript come una funzione generica, ma è possibile utilizzare un tipo generico se è dichiarato a livello di classe.

Ad esempio, supponiamo di voler creare una classe in cui il subscript prende un tipo T e restituisce un tipo U. Sarebbe qualcosa di simile:

class SomeClass<T, U> { 
    subscript(someParameter: T) -> U { 
     /* something that returns U */ 
    } 
} 

Ad esempio, è possibile creare una classe Converter che utilizza la funzione subscript convertire da tipo T digitare U:

Nota: Questo è molto artificiosa Ad esempio, normalmente non lo farei in questo modo.

class Converter<T, U> { 
    var _converter: (T -> U) 

    init(converter: (T -> U)) { 
     _converter = converter 
    } 

    subscript(input: T) -> U { 
     let output = _converter(input) 
     return output 
    } 
} 

var convert = Converter(converter: { 
    (input: Int) -> String in 
    return "The number is: \(input)" 
}) 

let s = convert[1] 
println(s) // The number is: 1 
+0

Nel mio scenario, non sono in grado di utilizzare un generico di classe. Ma sto sradicando la tua risposta dal momento che ha buone informazioni per gli altri –

+0

ok, questo ha senso. Ma ora una mia domanda: come puoi cambiare il tipo generico se vuoi usarne un altro nel pedice? –

+0

ok grazie. –

0

Non credo sia possibile. Invece è possibile utilizzare Any o AnyObject e restituire il risultato della funzione al tipo specificato.

subscript(type: AnyObject) -> AnyObject { 
    ... 
} 

Suggerimento: invece di type: T.Type, utilizzare type: T.

+0

Ho provato 'type: T' ma ottengo sempre l'errore" Nome membro previsto o chiamata costruttore dopo il tipo nome " –

+0

ah allora T non è una classe? –

+0

T è una classe come UInt8. Devo inserire UInt8.self per farlo costruire. Inoltre, come posso usare un input 'type' di input in qualcosa come 'sizeof()' –