文字“欢迎我的申请.. ??” NSRange和Range测试期间没有任何意义。如果?? 包含在内,Range作为返回nil,我想知道为什么。
func testA() {
let testStr = "Welcome my application..??"
let range = NSRange(location: 0, length: testStr.count)
let wrapRange = Range(range, in: testStr)
let testStrB = "Welcome my application.."
let rangeB = NSRange(location: 0, length: testStrB.count)
let wrapRangeB = Range(rangeB, in: testStrB)
print("wrapRange: \(wrapRange) wrapRangeB: \(wrapRangeB)")
}
Run Code Online (Sandbox Code Playgroud)
结果:
wrapRange: nil wrapRangeB: Optional(Range(Swift.String.Index(_rawBits: 1)..<Swift.String.Index(_rawBits: 1572864)))
Run Code Online (Sandbox Code Playgroud)
“?” 是单个“扩展字素簇”,但有两个UTF-16代码单元:
print("??".count) // 1
print("??".utf16.count) // 2
Run Code Online (Sandbox Code Playgroud)
NSRange计算UTF-16代码单元(是中的“字符” NSString),因此创建NSRange包含完整Swift字符串范围的的正确方法是
let range = NSRange(location: 0, length: testStr.utf16.count)
Run Code Online (Sandbox Code Playgroud)
或更高(自Swift 4起):
let range = NSRange(testStr.startIndex..., in: testStr)
Run Code Online (Sandbox Code Playgroud)
说明:在您的代码中(此处简化)
let testStr = "??"
let range = NSRange(location: 0, length: testStr.count)
print(range) // {0, 1}
Run Code Online (Sandbox Code Playgroud)
创建一个NSRange描述单个UTF-16代码单元的代码。无法将其转换为Range<String.Index>in,testStr因为其第一个Character包含两个 UTF-16代码单元:
let wrapRange = Range(range, in: testStr)
print(wrapRange) // nil
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
50 次 |
| 最近记录: |