解开整数字符串输入的惯用法

时间:2016-11-17 04:44:30

标签: swift

很抱歉,如果这是一个基本问题,但我正在学习Swift,我不明白如何从readLine()打开输入。

例如,我希望这个

let n: Int = Int(readLine(strippingNewline: true) ?? -1)

工作,但事实并非如此。也不会将-1替换为"-1"以匹配类型。

let n: Int = Int(readLine(strippingNewline: true) ?? "-1")

这样做的“正确”方法是什么?当有人解开选项并将它们用作Int之类的构造函数的参数时,有人能解释一下Swift究竟在做什么吗?

选项的整个概念对我来说有点陌生(Python程序员);在Python中你处理无效的输入“贫民窟的方式”,只有在它们发生之后才发射:

try:
    n = int(input())
except ValueError:
    n = None

但我认为Swift中的范例是不同的。

1 个答案:

答案 0 :(得分:1)

这里有两个选项。

首先,readLine(strippingNewline: true)是可选的。如果在收到nilEnd of File)字符之前没有收到任何输入,则可以返回EOF。它必须在被传递到Int()

之前解开

其次,Int()是可选的,因为它给出的String可能不是数字的有效字符串表示。

不要在Swift中使用-1来表示“没有价值”。这被称为哨兵值,它正是阻止发明的选项。如何区分-1含义“无/无效输入”和-1意思是“用户的输入是-1

以下是我编写此代码的方法:

guard let userInput = readLine(strippingNewline: true) else {
    // If we got to here, readLine(strippingNewLine:) returned nil
    fatalError("Received EOF before any input was given")
}

// If we got to here, then userInput is not nil

if let n = Int(userInput) {
    // If we got to here, then userInput contained a valid
    // String representation of an Int
    print("The user entered the Int \(n)")
}
else {
    // If we got to here, then userInput did not contain a
    // valid String representation of an Int.
    print("That is not a valid Int.")
}