皆様、お世話になっております。
Swiftにて変数の宣言の仕方について基本的な構文で理解に苦しんでおります。どなたか下記点をご教授頂けますでしょうか。
疑問点とコード
●疑問1:Returnで値を返却するが「式」ではない変数の宣言
対象となっている変数宣言の記載が下記になります。
Swift
1var Message:String { 2 return "Hello" 3} 4Message
上記はReturn文で変数Message内の値を返しているように見受けられます。{}ブロックを使用していることからクロージャー式の省略した記載方法なのかと考えました。
いわゆる下記のような形です。
Swift
1var Message2 = {() -> String in 2 return "Hello" 3} 4Message2()
しかしそもそも前者の宣言では変数Message:Stringとして明示的にString型であることが証明されております。
変数を使用する時もMessage()とした場合
Swift
1//エラーコード 2Cannot call value of non-function type 'String'
上記のエラーで関数やクロージャー式でない旨が証明されました。
では前者のような書き方は「変数宣言時に{}ブロック内で返却された値を変数に代入する書き方」として単体で覚えてしまっても
問題ありませんでしょうか?こういった書き方に通称があるのかが気になって質問させていただきました。
●疑問2:構造体でインスタンスプロパティを内部で使用する際の記載
こちらも前述した疑問1に関連する内容になっております。
まず下記のコードについてです。
Swift
1struct letter { 2 var to:String 3// 下記はコンパイルエラー:Cannot use instance member 'to' within property initializer; property initializers run before 'self' is available 4 var message:String = "Hello(to)" 5 6// 下記は問題なくコンパイル可能 7 var message2:String { 8 return "Hello(to)" 9 } 10}
上記ではインスタンスプロパティであるtoを使用した際に違いが出ています。
普通に変数を代入している一回目のやり方と、疑問点1で記載した書き方は何が異なっているのか、
後者だとコンパイル可能になる理由がいまいちわかりません。
インスタンスプロパティであるtoはインスタンス化しないと使えないですよね。
{}ブロック内にtoを書き込むことでどういった変化が起き、なぜ同じ構造体のletterブロック内で使用できるようになるのかが
わかりません。
冗長な文章となってしまい申し訳ございません。
お手数ですが、どなたかご回答いただけますと幸いです。
以上になります。よろしくお願いいたします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/11/12 05:17