web-dev-qa-db-ja.com

二項演算子「<」は2つの「Int?」に適用できませんオペランド

こんばんは素敵なコミュニティ、
これが私の最初の投稿です。何か間違ったことをした場合は、ご容赦ください。
同様の質問がいくつかあることは知っていますが、理解できません。
誰かが私のコードでそれを説明すれば、たぶん私は理解しています。

//これらは私の2つのTextFieldと「finish」ボタンです。

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

//ここに私の関数があります。A<Bのようにどちらのプレイヤーが勝ったかがわかります。

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

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

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

//ここに問題があります:
"二項演算子 '<'は2つの 'Int?'に適用できませんオペランド」
//「==」を作成すると機能します

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

Intを受け取るStringの初期化子の宣言を見ると、?の後にinitを追加すると、オプションが返されます。

convenience init?(_ description: String)

つまり、ほとんどのことを実行する前に、ラップを解除する必要があります(==は例外です。Optionalタイプにはその演算子のオーバーロードがあるためです)。

オプションをアンラップするには、主に4つの方法があります。

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

すべてのオプションを展開すると、期待どおりに比較できます。

21
Charles Srstka

このエラーは、 Comparable プロトコルを実装していないカスタムタイプ(構造体またはクラス)を比較する場合にも発生する可能性があります。

1
ScottyBlades