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

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

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

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

Q&A

解決済

1回答

262閲覧

【構造体】タイププロパティはその構造体について1つしか存在しない意味

pegy

総合スコア243

Swift

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

0グッド

0クリップ

投稿2020/08/21 13:39

(環境)
xcode:11.3
version 5.1.3

(参考文献)
詳解 Swift 第5版
著者 萩原剛志
発行者 SBクリエイティブジャブ式会社
P082

上記の文献で以下の様な説明がございます。

構造体のタイププロパティは定義の際に先頭にstaticというキーワードを付します。タイププロパティはその構造体について1つしか存在せず、構造体全体に関する情報を表します。(中略)次の例では(中略)DataWithString型のバリエーションでタイププロパティを2つ持っています(後略)。

swift

1struct DataWithString { 2//一部省略 3static let mons = ["Jan","Feb","Mar"] 4static var longFormat= false 5 //一部省略 6}

もう、いきなり突っ込みたくなるのですが、当然、タイププロパティは構造体において1つではなく、直後のコードでも列挙している様に2つ以上も定義して存在できるとおもうのですが、これは誤植でしょうか?それとももっと奥の深い意味があるのでしょうか。。。

どなたか、他の解釈が分かる方がいらっしゃればアドバイスをいただければ幸いです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

タイププロパティ「それぞれ」はその構造体について1つしか存在せず、構造体全体に関する情報を表します。

構造体Tのインスタンスx,yがあって、普通のプロパティpだったらx.pとy.pは別々のものを指しているけど
タイププロパティtpはインスタンスによらず、T.tpの1つだけ存在するよ

ってこと

投稿2020/08/21 13:44

編集2020/08/21 13:44
ozwk

総合スコア13532

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

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

pegy

2020/08/21 14:01

コメントありがとうございます。 言い換えればいくらインスタンスを作っても、タイププロパティは構造体にだけ帰属するプロパティですという感覚でしょうか。  staticで静的プロパティでpを宣言するとそもそもx.pやy.pにはアクセスできないですもんね。 んん、この文脈からではその様には直接読み解けないです・・私の読解力不足なのか、前提の認識不足なのか。。。申し訳ございません、
ozwk

2020/08/21 14:09 編集

「タイププロパティはその構造体について1つしか存在せず」というのを 「タイププロパティは構造体中に1つまでしかコード上書けない」という読み方をしているのだと思いますが 「タイププロパティは(定義したタイププロパティ1項目あたり、それぞれのインスタンスに存在するのではなく)その構造体(の型自体)について1つしか(データとして)存在せず」ということです
pegy

2020/08/22 00:37

コメントありがとうございます。概ね理解することができました。 もう一つ誤解していたのですが、構造体のタイププロパティだけに存在するプロパティということなので、タイププロパティを変更すれば、他のインスタンスにも影響を与えるのかと思っていたのですが、タイププロパティを変更した後のインスタンスにしか影響を与えないのですね。もしかしたら当たり前のことかもしれませんが。 struct sample { var year: Int, month: Int var type: Int static var tf:Bool = false init(year:Int, month:Int) { self.year = year self.month = month type = sample.tf ? self.month : self.year } } var a = sample(year: 2000, month: 10) print(a.type)//2000 sample.tf = true var b = sample(year: 2000, month: 10) print(b.type)//10 print(a.type)//10にはならずに2000のまま この構造体のタイププロパティはデータとしてインスタンスを生成しても一つしか存在しないという特徴が実際にはどの様な意味を有するのか、その特徴を生かして何ができるのか何に注意すべきかはまだピントは来ないのですが、その様なルールであると理解いたしました。 ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問