นี่คือส่วนขยายที่จะช่วยให้คุณเข้าถึงขอบเขตของสตริงย่อยเป็น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 เลือกที่จะทำให้มันยาก (แม้ว่านั่นจะเป็นการตัดสินใจในการออกแบบที่เป็นที่ถกเถียงกันอยู่ - การซ่อนสิ่งที่เป็นอันตรายโดยทำให้มันยาก ... )
คุณสามารถอ่านเพิ่มเติมได้ในเอกสาร String จาก Appleแต่ tldr เกิดจากข้อเท็จจริงที่ว่า "ดัชนี" เหล่านี้เป็นข้อมูลเฉพาะสำหรับการนำไปใช้งานจริง ดัชนีเหล่านี้แสดงดัชนีลงในสตริงหลังจากที่ระบบปฏิบัติการแสดงผลแล้วดังนั้นจึงสามารถเปลี่ยนจาก OS เป็น OS ได้ขึ้นอยู่กับเวอร์ชันของข้อมูลจำเพาะ Unicode ที่ใช้อยู่ ซึ่งหมายความว่าการเข้าถึงค่าด้วยดัชนีไม่ใช่การดำเนินการที่มีเวลาคงที่อีกต่อไปเนื่องจากข้อมูลจำเพาะ UTF ต้องถูกเรียกใช้บนข้อมูลเพื่อกำหนดตำแหน่งที่ถูกต้องในสตริง ดัชนีเหล่านี้จะไม่สอดคล้องกับค่าที่สร้างโดย NSString หากคุณเชื่อมโยงกับดัชนีหรือดัชนีลงในสเกลาร์ UTF ที่อยู่ภายใต้ นักพัฒนา Caveat