二元运算符'<&#;不能适用于两个' Int?'操作数

时间:2018-01-14 17:10:50

标签: operator-keyword swift4

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

//这些是我的两个TextFields和"完成" -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);

//这是问题所在:
"二元运算符'<'不能适用于两个' Int?'操作数"
//如果我做了一个' =='它的工作原理

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

3 个答案:

答案 0 :(得分:12)

如果您查看Int的初始值设定项的声明,其String?init可以看到它返回一个可选的:< / p>

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和/或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

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

好吧,通过使用Guard语句,您可以检查两个值是否都不为零,并将其转换为Int typ

    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
    }