Swift の ! は、Bool を反転する前置演算子です。普段は !isValid のように書きますが、演算子を丸括弧で囲むと関数値として束縛できます。
let not = (!)
let isValid = false
if not(isValid) {
print("invalid")
}
この例で not(isValid) は !isValid と同じく true です。(!) が新しい構文や独自の NOT 演算子になるわけではなく、既存の ! を関数として参照しているだけです。
ふだんの ! と何が違うか
条件式では、通常の記法のほうが短く、読む人がすぐ意味を追えます。
if !isValid {
print("invalid")
}
一方で、Bool を受け取る関数を渡したい場面では、名前を付けると意図を表せます。
let not = (!)
let validationResults = [true, false]
let invalidResults = validationResults.map(not)
print(invalidResults) // [false, true]
map(not) は各 Bool を反転する、と読めます。map(!) のように演算子をそのまま渡すより、関数値であることが明示されます。
使うときの制約
not は Bool を受け取り Bool を返す関数です。String や数値を「空でない」「0 でない」と解釈する変換はしません。判定を先に Bool にしてから渡します。
let name = ""
let isEmpty = name.isEmpty
if !isEmpty {
print("名前があります")
}
このような単発の条件では !isEmpty のほうが自然です。not という別名が有効なのは、反転処理を高階関数に渡す、または判定の意図に名前を付けることで読みやすくなる場合に限られます。チーム内で見慣れない記法なら、通常の ! を優先するほうが保守しやすいでしょう。
検証したコード
let not = (!)
let isValid = false
let validationResults = [true, false]
print(not(isValid))
print(!isValid)
print(validationResults.map(not))
2026-09-06 に Swift 6.3.3 で実行した出力は次のとおりでした。
true
true
[false, true]