Ios Swift“扫描器”卡在无限循环中
我有一个类似于此的CSV格式Ios Swift“扫描器”卡在无限循环中,ios,swift,Ios,Swift,我有一个类似于此的CSV格式 "1.0","remainder1", "2.0","remainder2", "3.0","remainder3", "4.0","remainder4", "5.0","remainder5" 我希望通过以下方式扫描和打印这些值: var textScanner: Scanner = Scanner(string: textToScan) textScanner.charactersToBeSkipped = CharacterSet(char
"1.0","remainder1",
"2.0","remainder2",
"3.0","remainder3",
"4.0","remainder4",
"5.0","remainder5"
我希望通过以下方式扫描和打印这些值:
var textScanner: Scanner = Scanner(string: textToScan)
textScanner.charactersToBeSkipped = CharacterSet(charactersIn: "\",")
var value: Double = 0.0
var remainder: NSString?
while !textScanner.isAtEnd {
textScanner.scanDouble(&value)
textScanner.scanUpTo("\n", into: &remainder)
print("value \(value)")
print("remainder \(remainder)")
print("\n newline \n")
}
它正确地识别出值是双精度的,余数是字符串。但它陷入了一个无限循环,不断重复打印相同的结果
如果我将双精度扫描更改为字符串,则它将向前移动并正确完成:
textScanner.scanUpTo(",", into: &value)
但是我真的想把第一个值直接扫描成一个double而不是一个字符串,然后出于特定的原因将其转换回double
在我第一次实现这项功能时,我缺少了什么
谢谢 一些评论:
始终检查扫描的返回值。。。可以肯定的是,它确实扫描了你的想法。
scanUpTo不包括要扫描到的字符串。因此,扫描器向左指向换行符,而不是换行符后的字符。
只在需要的地方声明变量。
您的代码应该更像这样:
var textScanner: Scanner = Scanner(string: csv)
textScanner.charactersToBeSkipped = CharacterSet(charactersIn: "\",")
var cnt = 0 // for testing only
while !textScanner.isAtEnd {
var value: Double = 0.0
var remainder: NSString?
if textScanner.scanDouble(&value) && textScanner.scanUpTo("\n", into: &remainder) {
// Ignore the newline
textScanner.scanString("\n", into: nil)
print("value \(value)")
print("remainder \(remainder)")
print("\n newline \n")
} else {
print("oops")
}
// For testing to avoid infinite loop
cnt += 1
if cnt > 10 {
break
}
}
谢谢你。我的一些价值观是可选的,所以这会引起问题,但是你的建议让我想到了这个,我现在已经开始工作了。