そろそろネタが尽き気味のtotottiです。
ネタに困っていたところ、ありがたいことに「Advent Calendar執筆のためにもくもく会しましょう!」とお誘いを受けまして、今日も続けることが出来ました。
Swiftの条件式のエラー
もくもく会にのこのこ出席すると、「C言語のコードをSwiftに移植したら、ビルドが通らない」という相談を受けました。以下に、単純化したコードを記載します。
let value1 = 0b00000001
let value2 = 0b00000010
// error Type 'Int' does not conform to protocol 'BooleanType'
if value1 & value2 {
println("something")
}
C言語だと普通のビルドできると思うのですが、Swiftだとダメなようです。
エラーメッセージによると、原因はビット演算「value1 & value2」の結果(Int型)が、BooleanTypeプロトコルに対応していないためのようです。
例えば、以下のように書き直すと動作します。
// 修正案
if value1 & value2 == 0 {
println("something")
}
修正案の場合は、ビット演算の結果(Int型)と0(Int型)を比較演算子で比較した結果として、BooleanTypeプロトコルに対応した値が返るので、ビルドが通るんですね。
Swiftのif文の条件は、C言語系とは違うっぽい
C言語(Objective-C)は、たとえば下記のようなif文も書けます。
// C言語ならok
if ( value1 & value2 ) {
NSLog("TRUE")
}
// C言語ならこういうのもok
if ( 0 ) {
NSLog("TRUE")
} else {
NSLog("FALSE")
}
こういうのに慣れていると、Swiftのif文を使うときにちょっと引っかかるかもしれませんね。
BooleanTypeとは
どうやら「Swiftのif文の条件部は、BooleanTypeに対応してないとダメ」というのがわかったので、では公式のドキュメントで裏を取ろうと思って探したんですが、見つかりませんでした。。(知ってたら教えて下さい)
そのかわり、詳しい解説がQiitaの記事で上がっていましたので、詳しくはこちらを御覧ください。β版時代の記事なので、BooleanTypeではなくLogicValueなんですが、詳しく載っています。