आप एकमात्र ऐसे व्यक्ति नहीं हैं जो समाधान नहीं ढूंढ सके।
String
लागू नहीं करता है RandomAccessIndexType
। शायद इसलिए कि वे अलग-अलग बाइट लंबाई वाले पात्रों को सक्षम करते हैं। इसलिए हमें वर्णों की संख्या प्राप्त करने के लिए string.characters.count
( count
या countElements
स्विफ्ट 1.x में) का उपयोग करना होगा। यह भी पदों पर लागू होता है। _position
शायद बाइट्स के कच्चे सरणी में एक सूचकांक है और वे उस बेनकाब करने के लिए नहीं करना चाहती। इसका String.Index
मतलब हमें पात्रों के बीच में बाइट्स तक पहुंचने से बचाने के लिए है।
अर्थ यह है कि किसी भी सूचकांक आपको मिल से बनाया जाना चाहिए कि String.startIndex
या String.endIndex
( String.Index
औजार BidirectionalIndexType
)। किसी भी अन्य सूचकांकों का उपयोग successor
या predecessor
तरीकों से बनाया जा सकता है ।
अब हमें सूचकांकों में मदद करने के लिए, तरीकों का एक समूह है (स्विफ्ट 1.x में फ़ंक्शन):
स्विफ्ट 4.x
let text = "abc"
let index2 = text.index(text.startIndex, offsetBy: 2) //will call succ 2 times
let lastChar: Character = text[index2] //now we can index!
let characterIndex2 = text.index(text.startIndex, offsetBy: 2)
let lastChar2 = text[characterIndex2] //will do the same as above
let range: Range<String.Index> = text.range(of: "b")!
let index: Int = text.distance(from: text.startIndex, to: range.lowerBound)
स्विफ्ट 3.0
let text = "abc"
let index2 = text.index(text.startIndex, offsetBy: 2) //will call succ 2 times
let lastChar: Character = text[index2] //now we can index!
let characterIndex2 = text.characters.index(text.characters.startIndex, offsetBy: 2)
let lastChar2 = text.characters[characterIndex2] //will do the same as above
let range: Range<String.Index> = text.range(of: "b")!
let index: Int = text.distance(from: text.startIndex, to: range.lowerBound)
स्विफ्ट 2.x
let text = "abc"
let index2 = text.startIndex.advancedBy(2) //will call succ 2 times
let lastChar: Character = text[index2] //now we can index!
let lastChar2 = text.characters[index2] //will do the same as above
let range: Range<String.Index> = text.rangeOfString("b")!
let index: Int = text.startIndex.distanceTo(range.startIndex) //will call successor/predecessor several times until the indices match
स्विफ्ट 1.x
let text = "abc"
let index2 = advance(text.startIndex, 2) //will call succ 2 times
let lastChar: Character = text[index2] //now we can index!
let range = text.rangeOfString("b")
let index: Int = distance(text.startIndex, range.startIndex) //will call succ/pred several times
साथ काम करना String.Index
बोझिल है लेकिन पूर्णांकों द्वारा अनुक्रमणिका के लिए एक आवरण का उपयोग करना (देखें https://stackoverflow.com/a/25152652/669586 ) खतरनाक है क्योंकि यह वास्तविक अनुक्रमण की अक्षमता को छुपाता है।
ध्यान दें कि स्विफ्ट इंडेक्सिंग कार्यान्वयन में वह समस्या है जो एक स्ट्रिंग के लिए बनाए गए सूचकांक / श्रेणियों को मज़बूती से एक अलग स्ट्रिंग के लिए उपयोग नहीं किया जा सकता है , उदाहरण के लिए:
स्विफ्ट 2.x
let text: String = "abc"
let text2: String = "🎾🏇🏈"
let range = text.rangeOfString("b")!
//can randomly return a bad substring or throw an exception
let substring: String = text2[range]
//the correct solution
let intIndex: Int = text.startIndex.distanceTo(range.startIndex)
let startIndex2 = text2.startIndex.advancedBy(intIndex)
let range2 = startIndex2...startIndex2
let substring: String = text2[range2]
स्विफ्ट 1.x
let text: String = "abc"
let text2: String = "🎾🏇🏈"
let range = text.rangeOfString("b")
//can randomly return nil or a bad substring
let substring: String = text2[range]
//the correct solution
let intIndex: Int = distance(text.startIndex, range.startIndex)
let startIndex2 = advance(text2.startIndex, intIndex)
let range2 = startIndex2...startIndex2
let substring: String = text2[range2]