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.
myślę, metoda ta nie rzucać 'Any' do wpisywanych opcjonalnie w Swift 3/Xcode 8. – SimplGy
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
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:" _ –