2017-12-24 68 views
5

स्विफ्ट में जेनेरिक के साथ काम करते समय आज एक दिलचस्प बग में दौड़ें। मैंने एक समाधान निकाला, लेकिन मुझे आश्चर्य है कि कोई जवाब दे सकता है कि क्यों कंपेलर ऐसा कुछ नहीं पकड़ता है। मुझे कोड के ब्लॉक से शुरू करने दें।स्विफ्ट में खाली सरणी और जेनेरिक के साथ क्या है?

func doSomething<T>(with array: [T]) { 
    type(of: array)  // Optional<Array<Int>> 
    array is [Int]  // true 
    array is [String] // true 
} 

var arrayOfInts: [Int] = [] 
doSomething(with: arrayOfInts) 

लाइन 4 देखें। हेक true क्यों है? क्या मैं कुछ भूल रहा हूँ? क्या संकलक यह समझने के लिए पर्याप्त स्मार्ट नहीं होना चाहिए कि यह String एस की सरणी नहीं है? आखिरकार एक बग का नेतृत्व हुआ जहां गलत प्रकार के होने वाले खाली सरणी के कारण एक मान गलत तरीके से सेट किया गया था।

जहाँ तक एक समाधान के रूप में, मैं की तर्ज पर कुछ के साथ चला गया:

if type(of: array).Element.self == Model.self 
+0

आप _know_ सरणी के तत्वों के प्रकार; यह टी। सरल है: 'अगर टी। स्वयं == Int.self' – matt

+1

इसके अलावा मुझे पहली पंक्ति के लिए' वैकल्पिक > 'नहीं मिलता है। – matt

+1

जेनेरिक एक लाल हेरिंग है! '[Int]() है [स्ट्रिंग]' 'सत्य 'है। – matt

उत्तर

6

वास्तव में यह सामान्य से कोई संबंध नहीं है। किसी भी खाली सरणी true साथ is सवाल का जवाब है, तो प्रकार एक सरणी है:

[Int]() is [String] // true 
[1] is [String] // false 

यह अजीब प्रतीत होता है; file a bug

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