2016-10-19 14 views
5

स्विफ्ट 3 पर निम्न कोड क्रैश हो गया है, क्या कोई भी कृपया बता सकता है क्यों?स्ट्रक्चर की सरणी 3 सरणी -> NSObject पर डाली गई -> वापस कास्ट => क्रैश

struct S { 
    let a:Int 
} 

let t = [S(a: 8)] 
let u:AnyObject = t as NSObject 
let v:[S] = u as! [S] 

कि क्योंकि स्विफ्ट में structs के 3 सरणी NSObject है (यह स्विफ्ट 2 में नहीं है) और यह किसी भी तरह अच्छी तरह से NSArray को नहीं बदला जा सकता है? और यह क्यों है NSObject ..

+0

क्या आपको \ NObject = t NSObject के रूप में भी आपके लिए संकलित करता है ...? तेजी से Arrays मूल्य प्रकार हैं और स्वाभाविक रूप से कंक्रीट वर्ग प्रकार 'NSObject' से प्राप्त नहीं है। स्विफ्ट में स्विफ्ट देशी प्रकारों और ओब्जे-सी प्रकारों के बीच निहित ब्रिजिंग थोड़ा उलझन में रूपांतरण की अनुमति दे सकती है, लेकिन स्विफ्ट 3 में अंतर्निहित ब्रिजिंग सुविधाओं को हटा दिया गया है। – dfri

+0

यह अजीब है, क्योंकि चलो वी = यू के रूप में? [एस] 'काम करता है। – JAL

+0

@dfri - हाँ, यह संकलित करता है, यह स्विफ्ट 3 में एक बग हो सकता है .. – silyevsk

उत्तर

2

सम्भावित समाधान एक वैकल्पिक खिन्न साथ एक सशर्त बाध्यकारी उपयोग करने के लिए किया जाएगा:

if let v = u as? [S] { /* */ } 

सुनिश्चित नहीं हैं कि क्यों आरोपित खिन्न हालांकि काम नहीं होगा। NSObject के साथ कुछ मजेदार हो सकता है।

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