Aşağıda, bir alt dizenin sınırlarına değerler Intyerine s olarak erişmenizi sağlayacak bir uzantı verilmiştir 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))
}
}
Bunun tuhaflığa yol açabileceğinin farkında olun, bu yüzden Apple bunu zorlaştırmayı seçti. (Bu tartışmalı bir tasarım kararı olsa da - tehlikeli bir şeyi sadece zorlaştırarak gizlemek ...)
Apple'ın String belgelerinde daha fazlasını okuyabilirsiniz , ancak tldr, bu "indekslerin" aslında uygulamaya özgü olmasından kaynaklanıyor olmasıdır. İşletim sistemi tarafından oluşturulduktan sonra dizeye dizinleri temsil ederler ve bu nedenle, kullanılan Unicode spesifikasyonunun sürümüne bağlı olarak işletim sisteminden işletim sistemine geçiş yapabilirler. Bu, dizide doğru yeri belirlemek için UTF spesifikasyonunun veriler üzerinde çalıştırılması gerektiğinden, dizine göre değerlere erişmenin artık sabit zamanlı bir işlem olmadığı anlamına gelir. Bu endeksler ayrıca NSString tarafından oluşturulan değerlerle, eğer ona köprü kurarsanız veya temeldeki UTF skalerlerinin indeksleriyle aynı çizgide olmayacaktır. Uyarı geliştirici.