Этот ответ от Martin R кажется правильным, потому что он учитывает Unicode.
Однако во время сообщения (Swift 1) его код не компилируется в Swift 2.0 (Xcode 7), поскольку они удалили функцию advance()
. Обновленная версия приведена ниже:
extension String {
func rangeFromNSRange(nsRange : NSRange) -> Range? {
let from16 = utf16.startIndex.advancedBy(nsRange.location, limit: utf16.endIndex)
let to16 = from16.advancedBy(nsRange.length, limit: utf16.endIndex)
if let from = String.Index(from16, within: self),
let to = String.Index(to16, within: self) {
return from ..< to
}
return nil
}
}
extension String {
func rangeFromNSRange(nsRange : NSRange) -> Range? {
if let from16 = utf16.index(utf16.startIndex, offsetBy: nsRange.location, limitedBy: utf16.endIndex),
let to16 = utf16.index(from16, offsetBy: nsRange.length, limitedBy: utf16.endIndex),
let from = String.Index(from16, within: self),
let to = String.Index(to16, within: self) {
return from ..< to
}
return nil
}
}
extension String {
func rangeFromNSRange(nsRange : NSRange) -> Range? {
return Range(nsRange, in: self)
}
}