こんばんは素敵なコミュニティ、
これが私の最初の投稿です。何か間違ったことをした場合は、ご容赦ください。
同様の質問がいくつかあることは知っていますが、理解できません。
誰かが私のコードでそれを説明すれば、たぶん私は理解しています。
//これらは私の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
}
Int
を受け取るString
の初期化子の宣言を見ると、?
の後にinit
を追加すると、オプションが返されます。
convenience init?(_ description: String)
つまり、ほとんどのことを実行する前に、ラップを解除する必要があります(==
は例外です。Optional
タイプにはその演算子のオーバーロードがあるためです)。
オプションをアンラップするには、主に4つの方法があります。
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
すべてのオプションを展開すると、期待どおりに比較できます。
このエラーは、 Comparable プロトコルを実装していないカスタムタイプ(構造体またはクラス)を比較する場合にも発生する可能性があります。