二元运算符“<”不能应用于两个 'Int?' 操作数

Binary operator '<' cannot be applied to two 'Int?' operands

晚上好可爱的社区,
这是我的第一个post,如果我做错了,请见谅。
我知道这里有一些类似的问题,但我不明白。
也许我明白了,如果有人在我的代码中解释一下。

// 这些是我的两个 TextField 和 "finish"-Button。

@IBOutlet weak var goalPlayerOne: UITextField!
@IBOutlet weak var goalPlayerTwo: UITextField!
@IBOutlet weak var finishedGameButton: UIButton!

// 这是我的函数,它应该告诉我哪个玩家赢了,比如 A < B,所以 B 赢了。

 @IBAction func finishedGameButtonPressed(_ sender: Any) {
    // define UITextField as Integer

let goalPlayerOne = "";
let goalOne = Int(goalPlayerOne);

let goalPlayerTwo = "";
let goalTwo = Int(goalPlayerTwo);

// 问题是:
"Binary operator '<' cannot be applied to two 'Int?' operands"
// 如果我做一个 '==' 就可以了

if goalOne < goalTwo{    
    displayMyAlertMessage(userMessage: "Player Two wins")
    return
}

如果您查看 Int 的初始化程序的声明,它采用 String,您可以通过 init 之后的 ? 看到它 returns一个可选的:

convenience init?(_ description: String)

这意味着您必须先解包它才能用它做大部分事情(== 是个例外,因为 Optional 类型对该运算符有重载)。

有四种主要方法可以解包您的可选项:

1:如果让

if let goalOne = Int(someString) {
    // do something with goalOne
}

2:后卫让

guard let goalOne = Int(someString) else {
    // either return or throw an error
}

// do something with goalOne

3: map and/or flatMap

let someValue = Int(someString).map { goalOne in
    // do something with goalOne and return a value
}

4:提供默认值

let goalOne = Int(someString) ?? 0 // Or whatever the default value should be

如果您打开所有选项,您将能够按预期比较它们。

如果您正在比较尚未实现 Comparable 协议的自定义类型(即:struct 或 class),也会出现此错误。

好吧,通过使用 guard 语句,你可以检查两个值是否不为 nil,并将其转换为 Int 类型

    guard let value_one = Int(goalPlayerOne), let value_two = Int(goalPlayerTwo) else {
        print("Some value is nil")
        return
    }

这样您就可以安全地比较两个值。

    if value_one < value_two {
       //Do something
    }