web-dev-qa-db-ja.com

'の結果値? : '式のタイプが一致しません'() 'と'ブール '

Doubleの配列と、押すと配列を空にするボタンがあります。配列の数がゼロより大きい場合にのみボタンを有効にしたい。コードは次のとおりです。

var numbers: [Double] = [] //At some point I add some numbers here

numbers.count > 0 ? deleteAllNumbersButton.isEnabled = true : deleteAllNumbersButton.isEnabled = false

コンパイラは文句を言います:

'の結果値? : '式のタイプが一致しません'() 'と'ブール '

if statementに入れると、問題なく動作します。ここで問題が理解できません。誰かがこれを見たことがありますか? XCode8.2.1とSwift 3)を使用しています。

8
TheoK

注:Swiftはわかりませんが、これはSwift固有の問題ではないようです。正確なエラーについては説明できませんが、正しく記述する方法を説明できます。 。

三項式は、変数に何かを割り当てたり、値を返したりする必要があり、正確に 2つのオプションから選択する必要がある場合にほぼ排他的に使用されます。

これはあなたがやろうとしていることですが、コンパイラを混乱させる可能性のある複雑な方法でそれを書いています。

式では:

numbers.count > 0 ? deleteAllNumbersButton.isEnabled = true
                  : deleteAllNumbersButton.isEnabled = false

「then」式と「else」式の両方に割り当てが含まれているため、ユニット(())/ "void"。これがあなたに怒鳴っている理由だと思います。ユニットを返すために3進数を使用することは決して意味がありません(実際には、コメントに記載されているように、演算子の優先順位がエラーの本当の理由です)。

あなたがおそらく意味したのは:

deleteAllNumbersButton.isEnabled = numbers.count > 0 ? true : false

三項で割り当てる代わりに、三項の結果がどのように割り当てられるかに注意してください。これ以上単純化できない場合(以下を参照)、これが3値の使用方法です。

ただし、この新しいフォームは危険信号を発するはずです。なぜ三元が真/偽と評価されるのですか?それはほとんどの場合コードの臭いです。条件がすでにブール値に評価されていることを考えると、これは冗長です。

次のように減らしてください。

deleteAllNumbersButton.isEnabled = numbers.count > 0
24
Carcigenicate