LoginSignup
10
10

More than 5 years have passed since last update.

Swiftのif文の条件部は、BooleanType準拠の値しか受け付けない模様

Last updated at Posted at 2014-12-05

そろそろネタが尽き気味の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なんですが、詳しく載っています。

Xcode - Swiftで条件式にOptional型が渡せる仕組みを調べた - Qiita

10
10
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
10