()
はイニシャライザの呼び出し、[]
はサブスクリプトの呼び出しです
しかし、そもそも仮引数に値を入れて初期化する場合には文法上以下の記法と理解しております。
Impression(3)
またはImpression(Int: 3)
このように構造体等において、仮引数に代入する値を代入する場合struct()ではなくstruct[]とするのは
このあたりに誤解があるのではないかと思います。
このImpression
構造体を、Impression(3)
や、Impression(int: 3)
として作成することはできません。引数が合致するイニシャライザ(他の言語ではコンストラクタとも呼びます)がないからです。
一方で、Impression[3]
はできます。subscript
を定義してあるからです。Impression[3]
はImpression.subscript(3)
と同じです。これはインスタンス化ではなく、(サブスクリプトというちょっと特殊なものですが)タイプメソッドの呼び出しにすぎません。
()
はイニシャライザの呼び出しで、[]
はサブスクリプトの呼び出しです。
サブスクリプトがそういうものである、というのはozwkさんの回答の通りです。
また、subscript
の中身の解釈についてはy_waiwaiさんの回答のとおりで、["a","b","c","d","e"]
という配列の、添え字にsubscriptの引数を使っているだけです。ここでポイントなのはインスタンスの情報を一切使っていないという点です。タイプメソッドなので、インスタンスの情報にはアクセスできません。
Impression[3]
は、3という数値をもったImpression
構造体のインスタンスを作成しているのではないのです。
イニシャライザについて
Impression
構造体をImpression(int: 3)
として作成できるようにするには、イニシャライザを用意してあげる必要があります。
swift
1struct Impression {
2 var value: Int
3 init(int: Int) {
4 value = int
5 }
6}
あるいは、以下の様にプロパティを用意するだけでも良いです。
swift
1struct Impression {
2 var int: Int
3}
プロパティの定義だけでよいのは、Swiftが自動的にメンバワイズイニシャライザと呼ばれるイニシャライザを作ってくれるからです。つまり、以下のように書いたのと同じと解釈されているからで、イニシャライザがないのではありません。
swift
1struct Impression {
2 var int: Int
3 init(int: Int) {
4 self.int = int
5 }
6}
(細かい話ですが、メンバワイズイニシャライザでは、引数名とプロパティ名が同じになるので、プロパティ名をint
にしてあげないと、引数名をint
にはできません。)
この状態でも、Impression(3)
とするとエラーになります。
Impression(3)として使うには、別のイニシャライザが要ります。
swift
1struct Impression {
2 init(_ parameter: Int) { ... }
3}
引数名のないイニシャライザを定義してあげないと、引数名なしでインスタンス化させることはできません。
もし、Impression(3)
でもImpression(int: 3)
でも良いようにしたかったら、両方のイニシャライザを定義しなくてはなりません。
swift
1struct Impression {
2 var int: Int
3 init(_ int: Int) {
4 self.int = int
5 }
6 init(int: Int) {
7 self.int = int
8 }
9}
なお、メンバワイズイニシャライザは、他にイニシャライザ定義がないときだけ作成されるのでご注意ください。
※当初イニシャライザをコンストラクタと呼んでいましたがSwiftの言語仕様ではイニシャライザが正しいので、修正しました。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/05 13:07
2020/09/06 00:49
2020/09/06 17:23