文字列のUTF16ビューでString.IndexのsamePosition(in :)メソッドを使用します。 NSStringはUTF16を使用するので、UTF16インデックスはNSStringがNSRangeに期待するインデックスと同じでなければなりません。
EDIT:
public extension NSRange {
private init(string: String, lowerBound: String.Index, upperBound: String.Index) {
let utf16 = string.utf16
let lowerBound = lowerBound.samePosition(in: utf16)
let location = utf16.distance(from: utf16.startIndex, to: lowerBound)
let length = utf16.distance(from: lowerBound, to: upperBound.samePosition(in: utf16))
self.init(location: location, length: length)
}
public init(range: Range<String.Index>, in string: String) {
self.init(string: string, lowerBound: range.lowerBound, upperBound: range.upperBound)
}
public init(range: ClosedRange<String.Index>, in string: String) {
self.init(string: string, lowerBound: range.lowerBound, upperBound: range.upperBound)
}
}
デュープ? [Swift RangeのNSRange?](https://stackoverflow.com/q/27040924/2415822)。 NSStringに橋渡ししたくない理由は何ですか?また、その質問に対する答えには、NSString以外の解決策がいくつかあります。 – JAL
NSStringへのブリッジは、純粋で直感的で理解でき、自己文書化し、読みやすく、シンプルで、美しく、効率的ではないようです。 emojisを含む文字列の場合、その質問に対する 'NSString'以外の解決策はありません。 – ma11hew28