2015-03-15 5 views
5

मान लें कि मैं इस तरह कोड का एक टुकड़ा है:क्या किसी को वैकल्पिक विकल्प देना संभव है?

let x: Int? = 10 
let y: Any = x 

अब मैं कास्ट करने के लिए y Int के लिए ?:

let z = y as Int? // Error: Cannot downcast from 'Any' to a more optional type 'Int?' 

यह सिर्फ संभव नहीं है या वहाँ एक और तरीका है करना चाहते हैं?

उत्तर

7

स्विफ्ट 2.0 के लिए, आप उपयोग कर सकते हैं निम्नलिखित:

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

या एक समारोह के रूप:

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) 

या आप यह कर सकते हैं अगर आप प्रतिबिंब पसंद नहीं है:

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

शून्य रिटर्न possible..it नहीं है मैं इस विधि 'स्विफ्ट 3 में/xcode 8. – SimplGy

+0

कास्ट करने के लिए Any' एक टाइप किया वैकल्पिक करने में विफल रहता आह हां लगता है! 'कुछ' में लोअरकेस "एस"। रिलीज नोट्स पढ़ना कभी-कभी उपयोगी होता है! तेजी से 3 के लिए, 'z z = मिरर (प्रतिबिंबित: y) .descendant ("कुछ") का उपयोग करें? Int' – SimplGy

+0

'मिरर (प्रतिबिंबित: x) .descendant (...) 'दृष्टिकोण स्विफ्ट 3 में काम नहीं करता है (' मिरर (प्रतिबिंबित: x) .children.count' '0' है), लेकिन' वापसी x ! टी' करता है! कुछ अजीब कारणों से, '(myAnyVar as! SCNRenderingAPI?)' करने की कोशिश कर रहा है 'मुझे एक संकलन-समय त्रुटि' त्रुटि देता है: 'किसी भी' से अधिक वैकल्पिक प्रकार 'SCNRenderingAPI' 'में डाउनकास्ट नहीं कर सकता, लेकिन अंदर एक ही कलाकार कर रहा है आपके जैसा काम है यह बहुत अच्छा काम करता है। चीयर्स! | सुझाए गए संपादन: _ "या अगर आप प्रतिबिंब पसंद नहीं करते हैं तो आप यह कर सकते हैं:" _ → _ "या आप इसे स्विफ्ट 3 में कर सकते हैं या यदि आपको प्रतिबिंब पसंद नहीं है:" _ –

0

आप ऐसा कर सकते हैं एक वैकल्पिक, किसी भी

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 
} 
अपने मामले में

तो पर बाहर निकलने के लिए

let z = unwrap(y) as? Int

संदर्भ: How to unwrap an optional value from Any type?

+0

लेकिन कास्टिंग –

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

कैसे इस समाधान के बारे में, मैं पिछले की एक सामान्य संस्करण बनाया जवाब।

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) 

निम्नलिखित खेल के मैदान पर कोड है।

enter image description here

संबंधित मुद्दे