स्विफ्ट में, ऐरे [स्ट्रिंग] स्लाइसिंग रिटर्न प्रकार लगता नहीं है [स्ट्रिंग]


87

मैं स्ट्रिंग्स की एक सरणी स्लाइस कर रहा हूं और इसे एक [String]वैरिएबल पर सेट कर रहा हूं , लेकिन टाइप चेकर शिकायत कर रहा है। यह एक संभव संकलक बग है?

var tags = ["this", "is", "cool"]
tags[1..<3]
var someTags: [String] = tags[1..<3]

स्क्रीनशॉट

जवाबों:


169

श्रेणी के साथ किसी सरणी की सदस्यता लेने से कोई सरणी वापस नहीं होती है, लेकिन एक टुकड़ा। यद्यपि आप उस स्लाइस से एक सरणी बना सकते हैं।

var tags = ["this", "is", "cool"]
tags[1..<3]
var someTags: Slice<String> = tags[1..<3]
var someTagsArray: [String] = Array(someTags)

3
आप कहां से Sliceप्रलेखित हैं? इसके अलावा त्रुटि संदेश गलत है और Sliceखेल के मैदान में [स्ट्रिंग] के रूप में दिखाई देता है। इस प्रकार ऐसा लगता है कि दो संकलक त्रुटियां और लापता दस्तावेज हैं।
ज़ाफ़

1
आप यहाँ सब्स्क्रिप् ट विधि की परिभाषा देख सकते हैं: developer.apple.com/library/prerelease/ios/documentation/…
कॉनर

2
मैं मानता हूं कि त्रुटि गलत है और प्रलेखन कुछ काम का उपयोग कर सकता है। आप दो चरणों में यह कोशिश करते हैं: var someTags = tags[1..<3] var someTagsArray: [String] = someTagsयह आप और अधिक उपयोगी देता हैerror: 'Slice<String>' is not convertible to '[String]'
कॉनर

मेरी गलती, मैं स्विफ्ट iBooks को देखा। मुझे लगता है कि ऐप्पल को उन्हें अप-टू-डेट रखने के लिए हटा देना चाहिए।
ज़ाफ़

1
स्विफ्ट 3 के साथ मुझे तीसरी लाइन पर एक त्रुटि मिल रही है, "टाइप 'स्ट्रिंग' प्रोटोकॉल 'इंडेक्सेबल' के अनुरूप नहीं है।"
रेनीपेट

14
var tags = ["this", "is", "cool"]
var someTags: [String] = Array(tags[1..<3])
println("someTags: \(someTags)") // "someTags: [is, cool]"

0

आप स्लाइस की एक नई सारणी प्राप्त करने के लिए भी ऐसा कर सकते हैं:

var tags = ["this", "is", "cool"]
var someTags = [String]()
someTags += tags[1..<3]
println(someTags[0])  //prints ["is", "cool"]

यह ठीक है, लेकिन यह भ्रामक है।
डॉनसॉन्ग

मुझे उम्मीद है कि यह "प्रिंट" होगा
यित्ज़चेक

0

एक अन्य तरीका है एक ही स्थान पर चर घोषणा गठबंधन है कि ऐसा करने के लिए let someTags: [String]और map(_:), कि बदलना होगा ArraySlice<String>करने के लिए [String]:

let tags = ["this", "is", "cool"]
let someTags: [String] = tags[1..<3].map { $0 } // ["is", "cool"]

0

एक और सुविधाजनक तरीका एक कन्वर्ट करने के ArraySliceलिए Arrayयह है:

var tags = ["this", "is", "cool"] var someTags: [String] = tags[1..<3] + []

यह सही नहीं है क्योंकि एक अन्य डेवलपर (या खुद) जो बाद में इसे देखता है, वह इसके उद्देश्य को नहीं समझ सकता है। अच्छी खबर यह है कि अगर उस डेवलपर (शायद आप) को हटा दें तो + []वे तुरंत एक कंपाइलर त्रुटि के साथ मिलेंगे, जो इसके उद्देश्य को स्पष्ट करेगा।


0

बस स्लाइस को एक एरे के रूप में डालें जब यह बनाया जाता है। एक मध्यवर्ती चर का उपयोग किए बिना एक सरणी के रूप में अपने ऐरे को रखना। कोडेबल प्रकारों का उपयोग करते समय यह बहुत अच्छा काम करता है।

var tags = ["this", "is", "cool"]
tags = Array(tags[1..<3])
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.