Đây là một tiện ích mở rộng sẽ cho phép bạn truy cập các giới hạn của chuỗi con dưới dạng Int
s thay vì các String.Index
giá trị:
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))
}
}
Chỉ cần lưu ý rằng điều này có thể dẫn đến sự kỳ lạ, đó là lý do tại sao Apple đã chọn làm khó nó. (Mặc dù đó là một quyết định thiết kế gây tranh cãi - che giấu một điều nguy hiểm bằng cách chỉ làm cho nó khó ...)
Bạn có thể đọc thêm trong tài liệu Chuỗi của Apple , nhưng điều quan trọng là nó bắt nguồn từ thực tế là các "chỉ số" này thực sự dành riêng cho việc triển khai. Chúng đại diện cho các chỉ số trong chuỗi sau khi nó được hệ điều hành hiển thị và do đó có thể chuyển từ OS-sang-OS tùy thuộc vào phiên bản của thông số Unicode đang được sử dụng. Điều này có nghĩa là việc truy cập các giá trị theo chỉ mục không còn là một hoạt động liên tục theo thời gian nữa, vì thông số UTF phải được chạy trên dữ liệu để xác định đúng vị trí trong chuỗi. Các chỉ số này cũng sẽ không phù hợp với các giá trị do NSString tạo ra, nếu bạn kết nối với nó hoặc với các chỉ số vào các vô hướng UTF cơ bản. Nhà phát triển báo trước.