यहां एक एक्सटेंशन दिया गया है जो आपको मानों के 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))
}
}
बस इस बात से अवगत रहें कि इससे अजीबता हो सकती है, यही वजह है कि Apple ने इसे कठिन बनाने के लिए चुना है। (हालांकि यह एक डिबेटेबल डिजाइन का निर्णय है - किसी खतरनाक चीज को सिर्फ कठिन बनाकर छिपाना ...)
आप Apple से स्ट्रिंग प्रलेखन में अधिक पढ़ सकते हैं , लेकिन tldr यह है कि यह इस तथ्य से उपजा है कि ये "सूचकांक" वास्तव में कार्यान्वयन-विशिष्ट हैं। वे ओएस द्वारा प्रस्तुत किए जाने के बाद स्ट्रिंग में सूचकांकों का प्रतिनिधित्व करते हैं , और इसलिए यूनिकोड कल्पना के किस संस्करण का उपयोग किया जा रहा है, इसके आधार पर ओएस-टू-ओएस से स्थानांतरित हो सकता है। इसका अर्थ है कि अनुक्रमणिका द्वारा मानों को एक्सेस करना अब एक निरंतर-समय का संचालन नहीं है, क्योंकि स्ट्रिंग में सही जगह निर्धारित करने के लिए UTF कल्पना को डेटा पर चलाया जाना है। यदि आप इसे पुल करते हैं, या अंतर्निहित UTF स्केलरों में सूचकांकों के साथ, ये सूचकांक NSString द्वारा उत्पन्न मूल्यों के साथ पंक्तिबद्ध नहीं होंगे। कैवियट डेवलपर।