質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
Swift

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

Q&A

解決済

1回答

238閲覧

構造体(クラス)の初期化の方法について

makkuro

総合スコア57

Swift

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

0グッド

0クリップ

投稿2018/11/09 01:26

Swiftを勉強中なのですが、構造体やクラスの初期化時の方法について下記2つの方法の違いがわかりません。
プロトコルではコンピューテッドプロパティが必須なことは分かりましたが、そのプロパティに準拠した構造体ではコンピューテッドプロパティの他に、イニシャライザでの初期化が可能であると気づきました。
2つの初期化の方法の違い、使い分け等あれば教えていただきたいです。

Swift

1protocol SomeProtocol { 2 var value: Int { get } 3} 4 5// コンピューテッドプロパティで初期化 6struct SomeStruct1: SomeProtocol { 7 var value: Int { return 1 } 8} 9 10// イニシャライザで初期化 11struct SomeStruct2: SomeProtocol { 12 var value: Int 13 init() { 14 value = 1 15 } 16} 17 18var someStruct1 = SomeStruct1() 19someStruct1.value // 1 20 21var someStruct2 = SomeStruct2() 22someStruct2.value // 1

よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

swift

1protocol SomeProtocol { 2 var value: Int { get } 3}

は「コンピューテッドプロパティが必須なこと」を示しているわけではありません。
(SomeStruct2はコンピューテッドプロパティが無いのにコンパイル通っていますよね)

「読み取り可能なvalueという名前のプロパティが必須なことを示している」、と言ったほうがいいかもしれません。

下のようにletでも通ります。

swift

1struct SomeStruct3: SomeProtocol { 2 let value: Int = 1 3}

使い分けは、ケースバイケースとしか言いようがありませんが、強いて言えば
定数ならletでいいでしょうし、
あとから変えたいならストアドプロパティでいいでしょうし、
何らかの計算や分岐が必要ならコンピューテッドプロパティになるでしょう。

投稿2018/11/09 02:19

takabosoft

総合スコア8356

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

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

makkuro

2018/11/09 02:52

簡潔で分かりやすい回答ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問