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

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

詳細はこちら
Swift

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

Q&A

解決済

2回答

422閲覧

Swift オプショナル型の変数に整数リテラル値を代入できるのか。

moriman

総合スコア615

Swift

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

0グッド

0クリップ

投稿2019/12/10 15:53

非常に基本的なことだと心苦しいのですが、
https://docs.swift.org/swift-book/LanguageGuide/TheBasics.html
のnilの部分に

Swift

1var serverResponseCode: Int? = 404

このコードなのですが、変数serverResponseCodeはオプショナルInt型と型注釈されているのですが、この変数に整数リテラルの404を代入するとエラーが出るのではないか、と思ってしまうのですが、実際はエラーが出ません。
なぜエラーが出ないのでしょうか?

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

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

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

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

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

thyda.eiqau

2019/12/10 16:48

質問に質問で返すようで恐縮ですが、出るとしたらどのようなエラーが出るとお考えですか?
moriman

2019/12/10 16:53

コメントを頂きましてありがとうございます。現在の私の認識ですと、 Int?は列挙型、serverResponseCodeは列挙型であるInt?の変数、 404は構造体であるInt型の値。 Int?型の変数にInt型の値を代入しようとしているので、「型が違うので代入できません」 的なエラーが出るはずだ、という認識です。
thyda.eiqau

2019/12/10 17:03

そもそも `Int?` は 列挙型 (enum) ではないし、 `Int` も構造体 (struct) ではないと思いますが、何をもとにそうおっしゃっているのでしょうか?
moriman

2019/12/10 17:19

Int?はOptional<Int>型で列挙型。 数値型、Bool型、String型など標準ライブラリで提供されている多くの方は構造体。 上記はSwift実践入門という書籍にある情報でして、これを基に考えています。
thyda.eiqau

2019/12/10 17:38

そちらの書籍は読んだことがないし手元にもないのですが、なんとなく言いたいことはわかったような、わからないような…… > `Int?` は 列挙型 (enum) ではないし、 `Int` も構造体 (struct) ではない こちらは私の凝り固まった発想から出た嘘でしたので、取り消します。 ちなみにOptionalに対する公式のDocumentはこちらです。Objective-C / Swiftを書いているとAppleの不親切さに結構やられることがありますが、結局Documentに書いていることが正で、書いていないことは不確定要素なので、多少、「飲み込むしかない」というところもあります(まあ、どんな言語でもそうですけど……) https://developer.apple.com/documentation/swift/optional
thyda.eiqau

2019/12/10 17:51

うーん、うまく言語化できないんのですが、やはり解答欄に差し上げたとおり「Int or nilが入る箱にIntが入っている」としか、私の能力ではお伝えしきれないです。非力で申し訳ないですが。
moriman

2019/12/10 17:54

いえいえとんでもございません。 お示し頂いたドキュメントを読んで考えてみようと思います。 ありがとうございました。
guest

回答2

0

ベストアンサー

いわゆるシンタックスシュガーです。

略記をしない場合は

swift

1var serverResponseCode: Optional<Int> = Optional<Int>.some(404)

なのですが、言語規約として

swift

1var serverResponseCode: Int? = 404

と書けば上記とみなして処理されるようになっています。

nilの場合も略記しない場合は

swift

1var serverResponseCode: Optional<Int> = Optional<Int>.none

なのですが

swift

1var serverResponseCode: Int? = nil

でOKになっています。

投稿2019/12/11 01:29

MasakiHori

総合スコア3391

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

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

moriman

2019/12/11 01:40

回答を頂きましてありがとうございます。 もう頂いた回答で覚えれば良いと思うのですが、今回の事項を公式ドキュメントなど公式的なソースで解決したい場合どこを見れば書いてありますでしょうか?
guest

0

Int? は、別の言語っぽく言うと「null許容型」Intです。Intnil を受け入れます。
ご提示のコードにおいて、整数リテラル 404 で生成されるインスタンスの型は Int ですので、 Int を受け入れることができる変数 serverResponseCode は問題なく 404 を受け入れます。

投稿2019/12/10 17:03

thyda.eiqau

総合スコア2982

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問