如果文字中包含表情符号,则范围为零

pis*_*ffe 1 swift

文字“欢迎我的申请.. ??” NSRangeRange测试期间没有任何意义。如果?? 包含在内,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)

Mar*_*n R 5

“?” 是单个“扩展字素簇”,但有两个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)