Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Swift“扫描器”卡在无限循环中_Ios_Swift - Fatal编程技术网

Ios Swift“扫描器”卡在无限循环中

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

我有一个类似于此的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(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
    }
}

谢谢你。我的一些价值观是可选的,所以这会引起问题,但是你的建议让我想到了这个,我现在已经开始工作了。