二进制运算符'<'不能应用于两个'Int?' 操作数

Mik*_*B24 3 operator-keyword swift4

晚上好可爱的社区,
这是我的第一篇文章,请怜悯,如果我做错了什么.
我知道这里有一些类似的问题,但我不明白.
也许我理解,如果有人在我的代码上解释它.

//这些是我的两个TextFields和"finish"-Button.

@IBOutlet weak var goalPlayerOne: UITextField!
@IBOutlet weak var goalPlayerTwo: UITextField!
@IBOutlet weak var finishedGameButton: UIButton!
Run Code Online (Sandbox Code Playgroud)

//这是我的功能,它应该告诉我,哪个玩家赢了像A <B,所以B赢了.

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

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

let goalPlayerTwo = "";
let goalTwo = Int(goalPlayerTwo);
Run Code Online (Sandbox Code Playgroud)

//这里是问题:
"二元运算符'<'不能应用于两个'Int?' 操作数"
//如果我做'=='它有效

if goalOne < goalTwo{    
    displayMyAlertMessage(userMessage: "Player Two wins")
    return
}
Run Code Online (Sandbox Code Playgroud)

Cha*_*tka 18

如果你查看Int带有a的初始化程序的声明String,你可以在?之后init看到它返回一个可选的:

convenience init?(_ description: String)
Run Code Online (Sandbox Code Playgroud)

这意味着你必须在用它做大部分事情之前解开它(这==是一个例外,因为该Optional类型对该运算符有重载).

打开您的选项有四种主要方式:

1:如果让

if let goalOne = Int(someString) {
    // do something with goalOne
}
Run Code Online (Sandbox Code Playgroud)

2:警卫让

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

// do something with goalOne
Run Code Online (Sandbox Code Playgroud)

3:map和/或flatMap

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

4:提供默认值

let goalOne = Int(someString) ?? 0 // Or whatever the default value should be
Run Code Online (Sandbox Code Playgroud)

如果您打开所有选项,您将能够按预期进行比较.