2014-06-07 8 views
11

में मैं एक सरणी में एक वैकल्पिक सम्मिलित करना चाहते हैं के रूप मेंकैसे सरणी में शामिल करने के लिए वैकल्पिक स्विफ्ट

let arr: AnyObject[] = [1, 2, nil, 4, 5] 

निम्नलिखित अभिव्यक्ति इस प्रकार

Cannot convert the expression's type 'AnyObject[]' to type 'AnyObject' 

कह मैं इस काम बना सकते हैं कैसे एक संकलन त्रुटि फेंकता ? मुझे सरणी में वैकल्पिक या शून्य मान की आवश्यकता है, भले ही मुझे पता है कि मुझे नहीं करना चाहिए।

उत्तर

5

बस इस तरह:

let arr: AnyObject?[] = [1, 2, nil, 4, 5] 

यह प्रकार के सरणी बनाता AnyObject?

4

आप AnyObject का उपयोग नहीं कर सकते हैं:

18> let ar : AnyObject?[] = [1, 2, nil, 4, 5] 
<REPL>:18:25: error: cannot convert the expression's type 'AnyObject?[]' to type 'AnyObject?' 
let ar : AnyObject?[] = [1, 2, nil, 4, 5] 
         ^~~~~~~~~~~~~~~~~ 

लेकिन आप उपयोग कर सकते हैं Any:

18> let ar : Any?[] = [1, 2, nil, 4, 5] 
ar: Any?[] = size=5 { 
    [0] = Some { 
    Some = <read memory from 0x7f8d4b841dc0 failed (0 of 8 bytes read)> 
    } 
    [1] = Some { 
    Some = <read memory from 0x7f8d50da03c0 failed (0 of 8 bytes read)> 
    } 
    [2] = Some { 
    Some = nil 
    } 
    [3] = Some { 
    Some = <read memory from 0x7f8d4be77160 failed (0 of 8 bytes read)> 
    } 
    [4] = Some { 
    Some = <read memory from 0x7f8d4be88480 failed (0 of 8 bytes read)> 
    } 
} 

एप्पल प्रलेखन इस स्पष्ट करता है:

"स्विफ्ट गैर विशिष्ट प्रकार के साथ काम करने के लिए दो विशेष प्रकार उपनाम प्रदान करता है:
ओ AnyObject किसी भी वर्ग प्रकार का एक उदाहरण का प्रतिनिधित्व कर सकते हैं। स्विफ्ट प्रोग्रामिंग भाषा "iBooks।:
ओ किसी भी किसी भी प्रकार का एक उदाहरण बिल्कुल अलग समारोह प्रकार से" एप्पल इंक

अंश प्रदर्शित होने वाली "का प्रतिनिधित्व कर सकते हैं।। https://itun.es/us/jEUH0.l

ऐसा लगता है कि Int और शायद अन्य आदिम प्रकार एक वर्ग प्रकार के उपप्रकार नहीं हैं और इस तरह AnyObject काम नहीं करेगा।

1

यह धोखाधड़ी है, लेकिन यदि आप एक सेंटीनेल के रूप में नील का उपयोग कर रहे हैं तो यह केवल ट्यूपल्स का उपयोग करने के लिए सलाह दी जा सकती है, दूसरा तत्व Bool है जो दूसरे की वैधता को रेप करने के लिए है।

var arr = [(true, 1), (true, 2) , (false, 0) , (true, 4),(true,5)] 
17

तुम सिर्फ डालने जा करने के लिए या तो Int या nil रों जा रहे हैं, का उपयोग

स्विफ्ट < 2,0

var arr: Int?[] = [1, 2, nil, 4, 5] 

स्विफ्ट> = 2.0

var arr: [Int?] = [1, 2, nil, 4, 5] 

स्विफ्ट 3x

var arr: Array<Int?> = [1, 2, nil, 4, 5] 

यह किसी भी प्रकार (के लिए किया जा सकता है बस Int नहीं; यह है कि यदि आप एक विशिष्ट प्रकार को पकड़ने के लिए array चाहते हैं लेकिन कुछ इंडेक्स में खाली होने की अनुमति दें, जैसे कि अंडे का एक कार्टन कहें।)

3

let ar: AnyObject[] = [1,2,nil,3] अवैध है क्योंकि nil परिवर्तनीय नहीं है AnyObject

let a: AnyObject?[] = [1,3,nil,2] या let a: Int?[] = [1,3,nil,2] काम करता है।

आप एक ऑब्जेक्टिव-सी Bridgeable सरणी का उपयोग की जरूरत है

let a: AnyObject[] = [1, 2, NSNull(), 4, 5]

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