これは、値Int
の代わりにsとして部分文字列の境界にアクセスできるようにする拡張機能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のStringドキュメントを参照してください。ただし、tldrは、これらの「インデックス」が実際には実装固有であるという事実に由来しているということです。これらは、OSによってレンダリングされた後の文字列へのインデックスを表すため、使用されているUnicode仕様のバージョンに応じてOSからOSにシフトできます。これは、文字列内の適切な場所を決定するためにUTF仕様をデータに対して実行する必要があるため、インデックスによる値へのアクセスが定数時間操作ではなくなったことを意味します。これらのインデックスは、NSStringにブリッジした場合、NSStringによって生成された値、または基になるUTFスカラーへのインデックスとも一致しません。警告開発者。