ottijp blog

XCode6+Swiftでif条件式中の比較演算がエラーになる

  • 2026-09-22

環境

  • Xcode 6.0.1(ベータ版でも発生してた)
  • Swift

現象

ifの条件式中でオブジェクトのnil比較をしようとすると以下のようなコンパイルエラーになる。

8項目にオブジェクトのnil比較
var nilobjs: [AnyObject!] = [AnyObject]()
for _ in 0..<10 {
    nilobjs.append(nil)
}

if nilobjs[0] != nil && nilobjs[1] != nil && nilobjs[2] != nil && nilobjs[3] != nil && nilobjs[4] != nil && nilobjs[5] != nil && nilobjs[6] != nil && nilobjs[7] != nil {
    println("hoge")
}
エラーメッセージ
Cannot invoke '&&' with an argument list of type '($T64, $T68)'

原因

そのまんまだけど、8項目にオブジェクトの比較式があるとエラーになる。上記の&& nilobjs[7] != nilを消せば通る。 Bool型の比較に関しても同じようなエラーが発生し、Bool型の場合は次の条件のいづれかを満たす場合に出るっぽい。

  • 条件1

    • 9項目にBool変数の比較演算がある
    • 10項以上ある
  • 条件2

    • 10項目以降にBool変数の比較演算がある
エラー(条件1)
var ifs = [Bool](count: 10, repeatedValue: true)
        
if ifs[0] && ifs[1] && ifs[2] && ifs[3] && ifs[4] && ifs[5] && ifs[6] && ifs[7] == true && ifs[8] == true && ifs[9] {
    println("all true")
}
エラー(条件2)
var ifs = [Bool](count: 10, repeatedValue: true)
        
if ifs[0] && ifs[1] && ifs[2] && ifs[3] && ifs[4] && ifs[5] && ifs[6] && ifs[7] == true && ifs[8] && ifs[9] == true {
    println("all true")
}

10項以上あっても、比較演算子がなければ通る

通る
var ifs = [Bool](count: 10, repeatedValue: true)
        
if ifs[0] && ifs[1] && ifs[2] && ifs[3] && ifs[4] && ifs[5] && ifs[6] && ifs[7] == true && ifs[8] && ifs[9]{
    println("all true")
}

また、Boolの比較でなければこれも通る

通る
var ifs = [Bool](count: 10, repeatedValue: true)
var hoge:Int = 3
        
if ifs[0] && ifs[1] && ifs[2] && ifs[3] && ifs[4] && ifs[5] && ifs[6] && ifs[7] == true && ifs[8] && hoge == 3 {
    println("all true")
}

まあBool型を== trueとは書かないだろうけど、オブジェクトのnil比較は明示的に!= nilとするようになったのだから発生し得る問題なのかな、と思いますが、エラーメッセージからは理由が分かりづらいので注意です。

多数のオブジェクトのnilチェックをする場合はどのように書くのが望ましいんでしょう?


ottijp
都内でアプリケーションエンジニアをしています
© 2026, ottijp