検証コードを作成してみました。以下をplaygroundで実行すると、それぞれの型が確認できます。
swift
1let image: UIImage? = UIImage(systemName: "icloud")
2let a = (image?.jpegData(compressionQuality: 1))!
3let b = image?.jpegData(compressionQuality: 1)!
4print("Type of a =", type(of: a)) // Type of a = Data
5print("Type of b =", type(of: b)) // Type of b = Optional<Data>
ということで、
(userProfileImageView.image?.jpegData(compressionQuality: 0.01))!
の型はData型です。
userProfileImageView.image?.jpegData(compressionQuality: 0.01)!
の型は、Data?型です。
括弧をつけるかつけないかで、式の評価結果が異なります。
前者の括弧をつけた方は、!が一番最後に適用されます。まずuserProfileImageView.image?が評価されます。これがnilでない事はif文で保証されているので成功します。そしてその後ろが評価されて、jpegData()関数が呼ばれ、戻り値であるData?型が得られます。つまり括弧の中の評価結果はData?です。これに対して、!で強制アンラップが実行されます。nilだったら強制終了します。nilじゃなかったら、Dataが結果になります。したがって、式の結果はData型です。
後者の括弧をつけない場合、!がjpegData()の戻り値に対してだけ適用されます。
userProfileImageView.image?のアンラップに失敗したら評価結果はnilになり、そこで終了です。その後ろは評価されません。しかし、if文のおかげでここでは成功するので、その後ろが評価されてjpegData()関数が呼ばれ、その戻り値はData?です。これが強制アンラップされて、nilなら強制終了し、nilでないならDataになります。
ifがあるので最初のアンラップの失敗は起こりませんが、式としては発生し得るため、式の評価結果はnilとDataの2種類があることになり、最終的にData?型になるようです。
?と!は演算子ではないそうで、単純な式のように見えても内部では複雑な事をしているようですね。
UIImage?型であるuserProfileImageView.image?がnilである場合と、Data?をアンラップしたData型とが組み合わされてData?になるのは驚きました。もしかしたら、何か私が誤解しているのかもしれません。解釈が間違っていたら、どなたかご指摘いただけると幸いです。
2019/12/31 08:45 編集
2019/12/31 09:34 編集
2020/01/01 04:32 編集
2020/01/01 11:47
2020/01/01 11:59
2020/01/01 12:58
2020/01/01 13:58