আপনি একমাত্র তিনিই নন যে সমাধানটি খুঁজে পেলেন না।
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]