2015-03-15 13 views

Odpowiedz

7

Dla Swift 2.0, można użyć następujące:

let x: Int? = 10 
let y: Any = x 
let z = Mirror(reflecting: y).descendant("Some") as? Int 

lub jako funkcja:

func castToOptional<T>(x: Any) -> T? { 
    return Mirror(reflecting: x).descendant("Some") as? T 
} 
let x: Int? = 10 
let y: Any = x 
let z: Int? = castToOptional(y) 

Albo można to zrobić, jeśli nie podoba refleksji:

func castToOptional<T>(x: Any) -> T { 
    return x as! T 
} 
let x: Int? = 10 
let y: Any = x 
let z: Int? = castToOptional(y) 
+0

myślę, metoda ta nie rzucać 'Any' do wpisywanych opcjonalnie w Swift 3/Xcode 8. – SimplGy

+0

Ah hah! małe litery "s" w "niektórych". Czytanie notatek do wydania jest czasem przydatne! Dla szybkiego 3, użyj 'let z = Mirror (reflecting: y) .descendant (" some ") as? Int' – SimplGy

+0

Podejście 'Mirror (reflecting: x) .descendant (...)' nie działa w Swift 3 ('Mirror (reflecting: x) .children.count' to' 0'), ale 'return x as ! T' robi! Z jakiegoś dziwnego powodu próba zrobienia '(myAnyVar jako! SCNRenderingAPI?)' Daje mi błąd podczas kompilacji 'error: nie można spuścić z" Any "do bardziej opcjonalnego typu 'SCNRenderingAPI?' ', Ale robi to samo odlewanie wewnątrz funkcja, jaką masz, działa świetnie. Twoje zdrowie! | Sugerowana edycja: _ "Lub możesz to zrobić, jeśli nie lubisz Reflection:" _ → _ "Lub możesz to zrobić w Swift 3 lub jeśli nie lubisz Reflection:" _ –

0

Można to zrobić, aby uzyskać opcjonalny się na wszystkich

func unwrap(any:Any) -> Any? { 
    let mi:MirrorType = reflect(any) 
    if mi.disposition != .Optional { 
     return any 
    } 
    if mi.count == 0 { return nil } // Optional.None 
    let (name,some) = mi[0] 
    return some.value 
} 

Tak więc w Twoim przypadku,

let z = unwrap(y) as? Int

referencyjny: How to unwrap an optional value from Any type?

+0

ale odlew nie jest possible..it powraca nil –

0
func castAsOptionalInt(value: Any)->Int? { 
    let mirror = Mirror(reflecting:value) 
    if mirror.subjectType == Optional<Int>.self { 
     let ret = mirror.children.first?.1 
     return ret as? Int 
    } else { 
     return nil 
    } 
} 

let x: Int? = 10 
let y: Any = x 
let z = castAsOptionalInt(y) // 10 
let a: Double? = 10 
let b: Any = a 
let c = castAsOptionalInt(b) // nil 
0

jak o tym rozwiązaniu, zrobiłem generycznych wersji poprzedniej odpowiedź.

fileprivate func unwrap<T>(value: Any) 
    -> (unwraped:T?, isOriginalType:Bool) { 

    let mirror = Mirror(reflecting: value) 
    let isOrgType = mirror.subjectType == Optional<T>.self 
    if mirror.displayStyle != .optional { 
    return (value as? T, isOrgType) 
    } 
    guard let firstChild = mirror.children.first else { 
    return (nil, isOrgType) 
    } 
    return (firstChild.value as? T, isOrgType) 
} 

let value: [Int]? = [0] 
let value2: [Int]? = nil 

let anyValue: Any = value 
let anyValue2: Any = value2 

let unwrappedResult:([Int]?, Bool) 
    = unwrap(value: anyValue) // ({[0]}, .1 true) 
let unwrappedResult2:([Int]?, Bool) 
    = unwrap(value: anyValue2) // (nil, .1 true) 
let unwrappedResult3:([UInt]?, Bool) 
    = unwrap(value: anyValue) // (nil, .1 false) 
let unwrappedResult4:([NSNumber]?, Bool) 
    = unwrap(value: anyValue) ({[0]}, .1 false) 

Poniższy kod znajduje się na placu zabaw.

enter image description here