এখানে একটি এক্সটেনশান যা আপনাকে মানগুলির Intপরিবর্তে একটি স্ট্রিংয়ের সীমানায় প্রবেশ করতে দেয় String.Index:
import Foundation
extension StringProtocol {
func countableRange<SearchType: StringProtocol>(
of search: SearchType,
options: String.CompareOptions = [],
range: Range<String.Index>? = nil,
locale: Locale? = nil
) -> CountableRange<Int>? {
guard let trueRange = self.range(of: search, options: options, range: range, locale: locale) else {
return nil
}
let intStart = self.distance(from: startIndex, to: trueRange.lowerBound)
let intEnd = self.distance(from: trueRange.lowerBound, to: trueRange.upperBound) + intStart
return Range(uncheckedBounds: (lower: intStart, upper: intEnd))
}
}
কেবল সচেতন হন যে এটি অদ্ভুততার দিকে পরিচালিত করতে পারে, এজন্য অ্যাপল এটিকে কঠোর করতে বেছে নিয়েছে। (যদিও এটি একটি বিতর্কিত ডিজাইনের সিদ্ধান্ত - একটি বিপজ্জনক জিনিসটিকে কেবল শক্ত করে লুকিয়ে রাখার ...)
আপনি অ্যাপলের স্ট্রিং ডকুমেন্টেশনে আরও পড়তে পারেন , তবে tldr হ'ল এই "সূচকগুলি" আসলে বাস্তবায়ন-নির্দিষ্ট। ওএস দ্বারা রেন্ডার হওয়ার পরে তারা সূচকগুলিকে স্ট্রিংয়ে উপস্থাপন করে এবং ইউনিকোড স্পেকের কোন সংস্করণ ব্যবহৃত হচ্ছে তার উপর নির্ভর করে ওএস-ও-ওএস-এ পরিবর্তিত হতে পারে। এর অর্থ সূচক দ্বারা মানগুলি অ্যাক্সেস করা আর ধ্রুবক-সময় ক্রিয়াকলাপ নয়, কারণ স্ট্রিংয়ের সঠিক স্থান নির্ধারণের জন্য ইউটিএফ স্পেকটিকে ডেটা দিয়ে চালানো উচিত। এই সূচকগুলি এনএসএসটিং দ্বারা উত্পাদিত মানগুলির সাথেও সীমাবদ্ধ থাকবে না, যদি আপনি এটি ব্রিজ করেন, বা অন্তর্নিহিত ইউটিএফ স্কেলারগুলিতে সূচকগুলি সহ। গুহাত বিকাশকারী।