2015-09-18 9 views
10

Czy można sprawdzić, czy zmienna jest opcjonalna i jaki rodzaj jest zawijany?Sprawdź, czy zmienna jest opcją i jaki rodzaj jest opakowywany.

Jest możliwe, aby sprawdzić, czy zmienna jest specyficzny opcjonalnie:

let someString: String? = "oneString" 
var anyThing: Any = someString 

anyThing.dynamicType // Swift.Optional<Swift.String> 
anyThing.dynamicType is Optional<String>.Type // true 
anyThing.dynamicType is Optional<UIView>.Type // false 

Ale czy to możliwe, by sprawdzić Agains wszelkiego rodzaju opcja? Coś jak:

anyThing.dynamicType is Optional.Type // fails since T cant be inferred 
// or 
anyThing.dynamicType is Optional<Any>.Type // false 

I raz wiedząc masz opcjonalny, pobierać typ jest Opakowanie:

// hypothetical code 
anyThing.optionalType // returns String.Type 
+0

W każdym razie, nie należy umieszczać w '' Optional' Any'. zobacz: [Jak odwijać opcjonalną wartość od Dowolnego typu?] (http://stackoverflow.com/q/27989094/3804019) – rintaro

+0

Może to być prawidłowy przypadek, możesz mieć funkcję akceptującą 'Any' i która zachowuje się inaczej, jeśli otrzyma komunikat "Opcjonalny". – LopSae

Odpowiedz

5

Z Swift2.0:

let someString: String? = "oneString" 
var anyThing: Any = someString 

// is `Optional` 
Mirror(reflecting: anyThing).displayStyle == .Optional // -> true 

Ale wydobywania owinięte typ nie jest tak łatwo.

Mogłabyś:

anyThing.dynamicType // -> Optional<String>.Type (as Any.Type) 
Mirror(reflecting: anyThing).subjectType // -> Optional<String>.Type (as Any.Type) 

Ale nie wiem, jak wydobyć String.Type z Optional<String>.Type owinięte Any.Type

+0

Do tej pory wydaje się, że obecnie niemożliwe jest wyodrębnienie 'String.Type' z' Opcjonalnie .self'. Można jednak rozszerzyć wyliczenie "Opcjonalne", aby zapewnić metodę zwracającą typ zawinięty i użyć dowolnej instancji, aby uzyskać do niego dostęp. – LopSae

+0

Podoba Ci się [this] (http://stackoverflow.com/a/28964069/3804019)? Jeśli masz "Opcjonalnie .self' jako" Opcjonalnie . Typ ", możesz. Ale myślę, że to niemożliwe dla 'Any.Type'. – rintaro

+0

Właśnie nauczyłeś mnie, jak to zrobić: jeśli masz 'let anyType: Any.Type = Array .self', a następnie po prostu go odeślij:' (anyType as! Array .Type) .Element.self' zwróci 'String.Type' :) – LopSae

6

Od a protocol can be created as means of a typeless Optional ten sam protokół może być używany w celu zapewnienia dostępu do opcjonalnego typu. Przykładem jest Swift 2, mimo że powinien działać podobnie w poprzednich wersjach:

protocol OptionalProtocol { 
    func wrappedType() -> Any.Type 
} 

extension Optional : OptionalProtocol { 
    func wrappedType() -> Any.Type { 
     return Wrapped.self 
    } 
} 

let maybeInt: Any = Optional<Int>.Some(12) 
let maybeString: Any = Optional<String>.Some("maybe") 

if let optional = maybeInt as? OptionalProtocol { 
    print(optional.wrappedType()) // Int 
    optional.wrappedType() is Int.Type // true 
} 

if let optional = maybeString as? OptionalProtocol { 
    print(optional.wrappedType()) // String 
    optional.wrappedType() is String.Type // true 
} 

Protokół mogą być używane nawet do check and unwrap the contained optional value

+0

Dzięki bro! Uratowałeś mi życie! – Sanf0rd

Powiązane problemy