🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

2回答

413閲覧

代入する際にカッコで括る場合と括らない場合の違いについて

ruuuu

総合スコア176

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

1クリップ

投稿2019/12/30 12:44

編集2019/12/30 13:05

以下のコードについて、分からない部分があり質問させて貰いました。

if userProfileImageView.image != nil{ userProfileImageData = (userProfileImageView.image?.jpegData(compressionQuality: 0.01))! }

こちらのコードでは、userProfileImageDataへ代入する際に、(userProfileImageView.image?.jpegData(compressionQuality: 0.01))こちらの部分をカッコ()で括っているのですが、カッコで括る場合と括らない場合の違いはなんなのでしょうか?
どなたか教えて頂けましたら幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

検証コードを作成してみました。以下を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があるので最初のアンラップの失敗は起こりませんが、式としては発生し得るため、式の評価結果はnilDataの2種類があることになり、最終的にData?型になるようです。

?と!は演算子ではないそうで、単純な式のように見えても内部では複雑な事をしているようですね。
UIImage?型であるuserProfileImageView.image?がnilである場合と、Data?をアンラップしたData型とが組み合わされてData?になるのは驚きました。もしかしたら、何か私が誤解しているのかもしれません。解釈が間違っていたら、どなたかご指摘いただけると幸いです。

投稿2019/12/31 08:27

編集2020/01/01 12:39
eytyet

総合スコア803

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ruuuu

2019/12/31 08:45 編集

ご回答ありがとうございます。 いつもご回答頂き助かります。 > この括弧の中には、二つオプショナルがあるので、どっちもまとめて強制的にアンラップする そういった意味合いで明示的に、カッコをつける必要があったということかもしれないですね。 たまに、xcodeの補完機能で、自動でカッコが補完されたりすることがあったので、ちょっと何故だろうと疑問に思うことがあったんですよね。
eytyet

2019/12/31 09:34 編集

コメントありがとうございました。おかげさまで、間違いに気づく事ができました。 確認の仕方が悪く、当初違いはないという回答をしてしまいました。申し訳ありませんでした。括弧の有無で戻り値の型が違っていたので、そのように回答を修正しました。惑わせてしまい申し訳ありませんでした。 ?と!の優先順位はあいまいなので、括弧をつけていく方が防衛的で良いと言う事かと思います。おかげさまでこちらの方が勉強させてもらっています。こちらこそ、ありがとうございます。
ruuuu

2020/01/01 04:32 編集

いえいえ... いつもご回答助かっております。 低評価はご訂正頂く前のものですかね...? 自分ではよく分からないのですが、取り敢えず、もう少しだけ待って見まして、その後ベストアンサーとさせて頂ければと思っております。
eytyet

2020/01/01 11:47

低評価がいつ着いたのかはわからないようで(通知もこないです)、間違いを指摘してくれていたのかもしれませんが、もはや分かりませんね。真逆の回答を訂正でしてしまったのが、Teratail的には間違いで、別の回答を起こすべきだったのかもしれません。訂正履歴が残り公開されているので、経過は追えるのと、間違った情報を公開したままにして情報ソースとしての価値を下げるのは運営意図に合わないだろうと思って訂正したんですが。ヘルプには明記がないようでちょっと分かりません。 今の回答が間違っていない事を明確にする事は大事だと思うので、検証コードをさらに拡充させて、今度は間違っていないという事を明確にしておこうと思います。ご迷惑をおかけしてすいません。
ruuuu

2020/01/01 11:59

いえ... 自分もきちんと頂いたご回答を元に、検証できるような質問だったら良かったのかもしれません... こちらこそ、申し訳ないです。 取り敢えず、間違っているとしても、コメントがないですし、あれから結構時間も経っています為、ベストアンサーとさせて頂こうと思います。 今回は、ご回答、ありがとうございました。
eytyet

2020/01/01 12:58

今ふと思い出しましたが、Swiftの括弧にはタプルという機能もあります。この点でも間違っていたので、そこで誰かがマイナスしてくれたのかもしれません。いずれにしても、最初からすっきり回答できていて当たり前だと思いますので、今回はスッキリしなくてすいませんでした。またよろしくお願いいたします。
ruuuu

2020/01/01 13:58

ご回答の方、補足頂きありがとうございます。 大変分かりやすく、swift初心者の自分でも理解することができました。 今後ともよろしくお願いいたします。
guest

0

全体をカッコ()で括っているのですが、

右辺全体をくくる括弧は無いですが。
最後の!の見落としでしょうか。

投稿2019/12/30 13:03

otn

総合スコア85893

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ruuuu

2019/12/30 13:05 編集

>最後の!の見落としでしょうか。 あ...はい。該当の部分は「(userProfileImageView.image?.jpegData(compressionQuality: 0.01))」こちらの部分のカッコで括っている部分になります
aae_11

2019/12/30 13:21 編集

横から失礼します。 こちらのご回答は流石に情報追記修正依頼に記載するべき内容な気がします...
otn

2019/12/30 13:23

> aae_11さん 質問修正前の回答ですので。
aae_11

2019/12/30 13:30

うーん、というかそもそも回答というか質問ですし、追記修正依頼に記載するべきではなかったのかなぁと...
otn

2019/12/30 14:25

質問の前提が間違っていて、質問が無意味という指摘は、回答だと思っています。それで解決するので。 (あくまで修正前の質問の話です)
aae_11

2019/12/30 23:33

指摘という点ではまずは「最後の!の見落としでしょうか。」こちらの質問を修正依頼で確かめるべきなのではなかったのかなと思います
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問