晚上好可爱的社区,
这是我的第一篇文章,如果我做错了,请怜悯。
我知道这里有一些类似的问题,但我不了解它
也许我理解,如果有人在我的代码上解释它。
//这些是我的两个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
}
答案 0 :(得分:12)
如果您查看Int
的初始值设定项的声明,其String
,?
后init
可以看到它返回一个可选的:< / p>
convenience init?(_ description: String)
这意味着你必须先解开它才能用它做大部分事情(==
是一个例外,因为Optional
类型对该运算符有重载。)
解开您的期权有四种主要方式:
if let goalOne = Int(someString) {
// do something with goalOne
}
guard let goalOne = Int(someString) else {
// either return or throw an error
}
// do something with goalOne
map
和/或flatMap
let someValue = Int(someString).map { goalOne in
// do something with goalOne and return a value
}
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
}