Help us understand the problem. What is going on with this article?

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

More than 5 years have passed since last update.

そろそろネタが尽き気味の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

tototti
仙台でプログラマー会社員をやっています。仙台iOS勉強会(SWWDC)をやったり、iOSアプリを開発したりしています。
http://lablog.tototti.com/
nanairo
仙台・宮城の伝統工芸の活性化や継承を目的としたオンラインクラフトショップ運営やアプリ開発を行う IT x クリエイティブ企業
https://nanairo-inc.jp
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away