https://www.swift.org/blog/iuo/
の記事が参考になると思いますが、暗黙的アンラップ型(!
)は、以前はImplicitlyUnwrappedOptional型と定義されていましたが、現在(Swift4.2以降)はImplicitlyUnwrappedOption型は廃止されており、型としてはOptional型と同じもので、そこに特別な属性(必要に応じて自動的にアンラップされる属性)が与えられたものと定義されています。
そして、自動アンラップ属性付きオプショナル型(!
)を使用できる場所は、型を記述するところならどこでも使えるのではなく、使える場所が決まっています。
具体的には、上記の記事の「Using ! on Types Rather Than Declarations」のところに書かれていますが、
でのみ使用できるとされており、
let fn: (Int!) -> Int! = // error: not a function declaration!
上記のようなクロージャの引数や戻り値は関数ではないので使用することはできないと明記されています。
なぜ !
が使用できる場所が限定されているのかは、私自身は深い知見を持ち合わせていませんが、もともと暗黙的アンラップはObjective-Cをベースとして作られたUIKitをうまく使えるようするために作られたのもので、Swiftとしてはあまり推奨しない機能なので、使用できる場面を限定しようとする意図があるのだろうと推測しています。