C言語やJavaScriptのIF文では、0以外の値をtrue式として評価してくれますが、SwiftやJavaでは== 0
や!= 0
のような比較式を明示的に記述する必要があって面倒ですよね。
C言語やJavaScriptの書き方
int a = 9;
if ( val) { puts("0以外の値です"); }
if (!val) { puts("0です"); }
SwiftやJavaの書き方
let a = 9
if val =! 0 { puts("0以外の値です") }
if val == 0 { puts("0です") }
if val {} // error: type 'Int' does not conform to protocol 'BooleanType'
if !val {} // error: type 'Int' does not conform to protocol 'BooleanType'
C言語や軽量言語に慣れているとどうしても比較処理を記述するのが面倒に思えてしまいます。
BooleanTypeプロトコルを実装する
この場合、Int型に対してBooleanTypeプロトコルを適用してあげれば、C言語風の挙動を実現することができます。これによってC++で言うところの「explicit operator bool」が実現されます。
extension Int : BooleanType {
public var boolValue: Bool {
return self != 0
}
}
動作イメージ
let val:Int = 9
if val { 1 } else { 0 } // 1
if !val { 1 } else { 0 } // 0
if val - 8 { 1 } else { 0 } // 1
if val - 9 { 1 } else { 0 } // 0
if val == 9 { 1 } else { 0 } // 1
if !val == false { 1 } else { 0 } // 1
if val == true { 1 } else { 0 } // error! "Binary operator '==' cannot be applied to operands of type 'Int' and 'Bool'"
let x = val ?1:0 // 1 (三項演算子でも有効)
let y = val // 9 (Bool型への型変換は行われない)
let z = !val // false(明示的にBoolへ変換したため)
/* Boolとの比較を行いたい場合 */
func ==(lhs: Int, rhs: Bool) -> Bool {
return lhs.boolValue == rhs
}
if val == true { 1 } else { 0 } // 1