2015-09-12 18 views
8

Sto cercando di determinare se un determinato tipo t (Any.Type) è un tipo facoltativo, sto usando questo testDeterminare se Any.Type è facoltativo

t is Optional<Any>.Type 

ma restituisce sempre false.

Quindi c'è un modo per raggiungere questo obiettivo?

risposta

7

Supponendo che ciò che si sta cercando di fare è qualcosa di simile:

let anyType: Any.Type = Optional<String>.self 
anyType is Optional<Any>.Type // false 

Purtroppo rapida attualmente (come di Swift 2) non supporta covariance nor contravariance e di tipo controlli direttamente contro Optional.Type non può essere fatto:

// Argument for generic parameter 'Wrapped' could not be inferred 
anyType is Optional.Type // Causes error 

Un'alternativa è quella di rendere Optional estendere un protocollo specifico, e verificare la presenza di quel tipo:

protocol OptionalProtocol {} 

extension Optional : OptionalProtocol {} 

let anyType: Any.Type = Optional<String>.self 
anyType is OptionalProtocol.Type // true 
+0

Il 'OptionalProtocol' può avere alcuni buoni usi: Può essere usato per fornire [un'interfaccia * generico-less * per accedere ai valori Opzionali] (http: // stackoverflow .com/questions/27989094/how-to-unwrap-an-optional-value-from-any-type/32780793 # 32780793) e [anche il tipo wrapper] (http://stackoverflow.com/questions/32645612/check -se-variabili-è-un-optional-e-cosa-tipo-da-avvolge/32.781.143 # 32.781.143). – LopSae

-2

Si potrebbe utilizzare farmaci generici per raggiungere questo obiettivo:

func isOptional<T>(x:T?)->Bool 
{ 
    return true 
} 

func isOptional<T>(x:T)->Bool 
{ 
    return false 
} 

Modifica

Il codice di cui sopra può essere utilizzato per sapere se una variabile è di tipo opzionale. L'unico modo che ho capito conoscere una variabile contenente un tipo è utilizzando riflessione:

var t1:Any.Type=(String?).self 
var t2:Any.Type=(String).self 
Mirror(reflecting: t1).description 
Mirror(reflecting: t2).description 

La prima chiamata a specchio dà la stringa "Mirror for Optional<String>.Type", e il secondo dà "Mirror for String.Type".

ho capito che il confronto stringa non è un modo conveniente per fare questo controllo, cercherò di nuovo di trovare qualcosa di più performante ..

+0

't' non è mai un optional, è sempre un oggetto di tipo (probabilmente rappresenta un optional), quindi verrà sempre chiamato il secondo metodo. – idmean

+0

ok scusate, sto cercando di trovare qualcosa che funzioni – hariseldon78

1

un po 'tardi per il partito. Ma mi sono imbattuto nello stesso problema. Ecco il mio codice.

func isOptional(_ instance: Any) -> Bool { 
    let mirror = Mirror(reflecting: instance) 
    let style = mirror.displayStyle 
    return style == .optional 
} 

let a: Int = 1 // false 
let b: Int? = 2 // true 
let c: Double = 3.0 // false 
let d: Double? = 4.0 // true 
let e: NSString = "Hello" // false 
let f: NSString? = "Hello" // true 


isOptional(a) // fasle 
isOptional(b) // true - warning 
isOptional(c) // false 
isOptional(d) // true - warning 
isOptional(e) // false 
isOptional(f) // true - warning 

Mi sembra bello. swift4

Problemi correlati