Swift String.firstIndex(of:“\n”)返回nil,即使字符串具有\n

9wbgstp7  于 2023-05-21  发布在  Swift
关注(0)|答案(1)|浏览(157)

我对这里发生的事情感到困惑。这应该很简单。我正在检查换行符的第一个索引,但它返回nil。我已经在调试器中检查了字符串,它在字符串的末尾有\r\n
rfidstring = {String} "900083000020758\r\n"

if rfidstring.firstIndex(of: "\n") != nil {
    print("rfid string has \\n")
}

我是不是犯了什么愚蠢的错误而完全错过了?当我调用contains(“\n”)时,它可以正常工作并返回true。所以当我调用contains()时,它知道字符串中有一个\n,但当我调用firstIndex(of:)时,它不认为有一个?

// but ...
rfidstring.contains("\n") // returns true

当我从RFID读取器读取数据时,我从输入流接收数据,读取器每行发送一个RFID。因此,为了确保我已经读取了整个rfid(有时它会以两个数据块的形式发送),我需要读取到行尾。这就是为什么我试图找到新的一行。
更新:这对我来说很奇怪:

rfidstring.firstIndex(of: "\r\n") // returns valid index: 15[utf8]

rfidstring.firstIndex(of: "\r") // returns nil
rfidstring.firstIndex(of: "\n") // returns nil
ztigrdn8

ztigrdn81#

看这个问题:Difference between \n and \r?
TL;DR:\r\n是Windows上的换行符,由于Swift字符串以人类感知的方式计算字符,而不是以单个字节计算,因此您需要搜索组合字符。或者任何使用 predicate 的换行符:rfidstring.firstIndex(where: \.isNewline)

相关问题