2016-01-23 15 views
21

明らかにANDまたはORブール値にする必要があります。Swift Error:2つの 'Bool'オペランドに2進演算子 '&&'を適用できません

私はこのような関数を記述しようとすると、このエラーを取得しています...

func isLocationWithinView(location: CGPoint, view: UIView) { 
    //  return (location.x >= CGRectGetMinX(view.frame)) && (location.x <= CGRectGetMaxX(view.frame)) && (location.y >= CGRectGetMinY(view.frame)) && (location.y <= CGRectGetMaxY(view.frame)) 
    var a = true 
    var b = false 
    return a && b // Error: Binary operator '&&' cannot be applied to two 'Bool' operands 
} 

これに対する解決策は何ですか?

+9

あなたの関数シグネチャに戻り型 '... - > Bool'がありません。 (エラーはやや誤解を招きますが、戻り値の型が指定されていなければ、関数は戻り値の型 '()'(空のタプル)を返します。 – dfri

答えて

51

エラーが紛らわしいです:コアは、あなたがそれゆえ、関数は期待していない、明示的な戻り値の型で(空のタプル型()にブール値を割り当てるにしようと、あなたの関数のシグネチャで戻り値の型... -> Boolを逃しているということです空のタプルタイプ()に戻る)

ブール値を論理値のない型に代入しようとすると、この誤解を招くエラーが再現できます。ブール値は、論理式AND/OR式が無効な割り当てと同じ式で実行された結果です。

var a :() = (true && false) /* same error */ 
var b : Int = (true && false) /* same error */ 
var c :() = (true || false) /* same error (for binary op. '||') */ 

あなたが閉鎖であなたのAND/OR演算を包むか、単に中間のブール変数に割り当てる場合のに対し、あなたは難読化されたエラーメッセージを失うと、実際のエラーが提示されます。あなたはこの誤解を招くようなエラーを与えている理由として

var d :() = { _ -> Bool in return (true && false) }() 
    /* Cannot convert call result type 'Bool' to expected type '()' */ 
var e = true && false 
var f :() = e 
    /* Cannot convert value of type 'Bool' to expected type '()' */ 

rhsを遅延だけ場合に左側を評価することができるように、論理演算子&&||両方が(lhs)、それらの右辺式(rhs)の条件評価で実装されtrue/false&&/||ためのオペレータと評価それぞれ、

/* e.g. the AND '&&' logical binary infix operator */ 
func &&(lhs: BooleanType, @autoclosure rhs:() -> BooleanType) -> Bool { 
    return lhs.boolValue ? rhs().boolValue : false 
} 

lhs自体は、以下の割り当てのために無効であるので、おそらく怠惰な閉鎖rhs()Boolタイプから「外部」無効な割り当てによって被ったエラーをスローしますが、エラーがスローされた(「バイナリOP '&&'を適用することはできません... ")は、&&コールの失敗の実際の原因ではありません。確認するには

、我々は、我々自身の非怠惰AND演算子を実装&&&を言う、そして、予想通り、我々は同じ難読化エラー受けていないことができます。他の答えは実際にいくつかありますが

infix operator &&& { 
    associativity right 
    precedence 120 
} 
func &&&(lhs: BooleanType, rhs: BooleanType) -> Bool { 
    return lhs.boolValue ? rhs.boolValue : false 
} 
var g :() = false &&& true 
/* Cannot convert value of type 'Bool' to expected type '()' */ 
+3

この回答は受け入れられるべきです。このエラーメッセージは 'Swift 2 'で誤解を招きます。誤解を招くブロック関連のエラーのように、将来のバージョンで修正されることを願っています。 –

+3

Swift 3でも同じです –

2

を興味深い点は、この特定のケースでは、戻り値の型を関数に追加することでそれを解決します。

func isLocationWithinView(location: CGPoint, view: UIView) -> Bool { 
    let a = true 
    let b = false 
    return a && b // Error: Binary operator '&&' cannot be applied to two 'Bool' operands 
} 

これが本当だったtruea場合は戻ってくる、とされていない場合、それはb(遅延評価)になります。

関連する問題