SwiftのInt型をC言語風に評価する方法(0以外の値をtrueとみなす)

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
広告
広告