2015-01-10 23 views
10

Puoi trasmettere a un tipo di metatype in Swift? Sembra davvero che dovresti essere in grado di (dopotutto puoi istanziare oggetti da Metatypes).Trasmetti un tipo di metatype in Swift?

Quanto segue non funziona:

class Super {} 

class A : Super {} 

let superA:Super = A() 
let subType = superA.dynamicType 
let afterCast = superA as subType 

//Compiler error: "use of undeclared type 'subType'" 

Qualcuno sa il modo giusto per fare questo?

Edit:

Come newacct sottolineato, il risultato di .dynamicType è, ovviamente, non sa fino a runtime, per cui un cast in fase di compilazione per il risultato di .dynamicType non avrebbe senso.

Quindi la risposta è: "Non puoi" (e non ci sono buoni motivi per provare).

+0

Immagino che tu non possa farlo. Il 'let' crea un'istanza, non un tipo. –

+0

Scusa, quale "let'? Vuoi dire 'let subType = superA.dynamicType' crea un'istanza? Quindi non c'è modo di accedere al tipo stesso (in realtà l'istanziazione di un metatipo)? – thekwiat

+0

Puoi approfondire come sarebbe utile? – newacct

risposta

4

Prima di tutto, as prende un tipo, non un'espressione, sul lato destro. Quindi quello che hai è un errore di sintassi.

Quello che sembra si stia tentando di fare è "trasmettere" a un tipo che viene calcolato in fase di esecuzione. Cosa significherebbe? Consideriamo innanzitutto cosa è un "cast".

Di solito, quando abbiamo un'espressione getto x as T, ha due componenti:

  • a tempo di compilazione: L'intera espressione getto x as T ha il tempo di compilazione tipo T?, che ti permette di fare cose con la risultante espressione che forse non è possibile fare direttamente su x. In altre parole, ti permette di cambiare il tipo di tempo di compilazione.
  • In fase di esecuzione: controlla se il tipo di runtime di è un sottotipo di T e, in caso affermativo, valuta l'opzione facoltativa che contiene quel valore, altrimenti valuta nil.

Se il tipo T non è noto in fase di compilazione, ovviamente non è possibile eseguire la parte di compilazione di esso. (Il tipo in fase di compilazione dell'espressione risultante non può, ovviamente, dipendere da qualcosa che non è noto in fase di compilazione.)

L'altra parte, la componente di runtime, potrebbe essere eseguita con un tipo calcolato in fase di esecuzione? Sicuro. Ad esempio,

import Foundation 
let afterCast : Super? = 
    (superA as AnyObject).isKindOfClass(subType) ? superA : nil 

Non è chiaro se questo è ciò che desideri.

+0

Ok, capisco perché non potresti eseguire controlli in fase di compilazione su un risultato di dynamicType. Quindi hai ragione, la risposta è essenzialmente "No." – thekwiat

+0

Dettagli minori: in riferimento alla prima frase, non è un'espressione di metatype che si suppone possa comportarsi come un tipo? Sono leggermente confuso sul motivo per cui si tratta di un errore di sintassi – thekwiat

+0

@thekwiat: un'espressione di tipo metatype o qualsiasi altro tipo è ancora un'espressione Le espressioni vengono utilizzate in diversi punti sintatticamente rispetto ai tipi – newacct

Problemi correlati