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

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

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

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

Q&A

解決済

3回答

1091閲覧

変数宣言における型にクラス指定の意味がわかりません

pegy

総合スコア243

Swift

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

1グッド

2クリップ

投稿2020/03/24 11:45

調べ方がわからずにお尋ねさせてください。

(環境)
xcode:11.3
version 5.1.3

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

参考文献によれば
例えば変数の宣言において、型を指定する場合、以下の様な記法が掲載されています。

Swift

1var age:Int 2let name:String

他の言語を使用していて、この様な記法は、直感的に理解はできるのですが

例えば、 以下の2つのパターンの様に型にクラス(?)を指定する様な記法について「Swift 変数 型 クラス」などで検索しても該当する様な物を見つけることができず、また同じ参考文献にもこれが文法的にどの様なことなのかを見つけることができませんでした。参考文献にも型はInt、String、Bool等がありますが、特にClassを指定する場合など、言及がありませんでした。

Swift

1//A 2@IBOutlet weak var inputText: UITextField! 3//B 4func textFieldShouldReturn(_ textField: UITextField) -> Bool { 5}

おそらく、非常に初歩的なことかと思うのですが、
これが文法的にどの様な意味であるのか(型の指定?)
また型の指定であればクラスを指定するのはどういう意味なのか
をご教示願えますでしょうか?
また、入門者向けにこの様な記法の変数宣言が平易に説明されている記事等でももちろん構いません。

誠に恐れ入りますが、よろしくお願い申しあげます。

kazutana👍を押しています

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

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

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

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

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

guest

回答3

0

ベストアンサー

私はまだ定義、特に言葉遣いなどには理解が及んでいないところもありますから、ご指摘大歓迎です。

参考文献のp.2に、まずこのような記述があります。

Swiftでは、クラスから作られた実体のほか、整数、構造体などのデータ型を含め、型の実体をすべてインスタンス(instance)と総称します。

クラスに限らず、数値の1"Swift"という文字列もまた、それぞれInt型やString型の具体的な実体ですから、これらもインスタンスです。

次に、 p.4「変数と定数」で次のように書かれています。

Swiftにおいて、インスタンスを格納しておく変数には2つの種類があります。

このことからつまり、クラスから作られた実体はインスタンスであり、またインスタンスを格納するには変数、もしくは定数を使う、ということになります。

一方、変数や定数の宣言については、p.4やp.5 にて次のように説明してあります(本文の網掛けは再現不可能なので省略)。

swift

1var 変数名 :=2let 定数名 :=

ここで、式を省略する場合には、それぞれの変数、定数にどのような実体(インスタンス)を格納するのかを定義する必要があるため、「型」は省略することができません(その逆が「型推論」)。

つまり、

swift

1//A 2@IBOutlet weak var inputText: UITextField!

という表現は、行頭の@IBOutlet weakを除けば、UTTextFieldクラスのインスタンスを格納するinputTextという変数を定義したことになるわけです。ここで、「型 = UITextField」ということになるわけです。

したがって、

また型の指定であればクラスを指定するのはどういう意味なのか

というのは、クラスを指定するのは、その変数、ないし定数に指定したクラスのインスタンスを代入する、と言う意味になります。

一方、

swift

1//B 2func textFieldShouldReturn(_ textField: UITextField) -> Bool { 3}

におけるtextField: UITextFieldは仮引数とその型の定義ということになります(p.38)。仮引数は定数の宣言と等しいので(letが省略されているとみなせる。p.45「引数の値は関数内では変更できない」参照)、考え方としてはAの例と同じ、つまりtextFieldという定数はUITextField型のインスタンスを格納できる、という意味となります。

ちなみに、SwiftではInt型などは構造体(Struct)として定義してあります。細かい点において振る舞いが異なるところもありますが、クラス(Class)と共通するところもあります。

そのように考えると、今すぐはピンとこないかもしれませんが、いくつかサンプルを動かしていると Int型(のインスタンス)も任意のクラスや構造体のインスタンスも同じだ、ということに気づかれるのではないでしょうか。

投稿2020/03/24 12:27

TsukubaDepot

総合スコア5086

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

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

pegy

2020/03/24 13:58 編集

ご回答誠にありがとうございます。 非常にご説明がわかりやすかったです。 整理としては、例えば var str : String = "Swift" 「String」 → 型(構造体) 「"Swift"」 → String型(構造体)に基づく実体(インスタンス) ここで、型は構造体の場合もクラスの場合もある。いずれであっても、それらから生み出された実体はインスタンスであり、どの様な特徴を持つかはその型によって定義づけられる。と理解しました。 ちなみにですが例えばString型という構造体がクラスに近い振る舞いをしているとして、具体的にその中身を見てみたいと思った場合、debug画面などで出力してみることなどができるのでしょうか? なんとなくイメージなのですが下記の様にString型の特徴などがその中身には含まれているのかな?という想像をしていたりするのですが、もし方法があればご教示願えますでしょうか? struct String { //同じ型通しの物を+すると結合する 例えば "Swift" + "難しい"は結果文字列の結合になる等 } 重ねてで恐縮ですが、よろしくお願い申しあげます。
TsukubaDepot

2020/03/24 13:58

String型の特徴、というかプロパティやメソッドなどを調べてみるのに一番簡単なのは、Xcodeの自動保管機能を使いことだと思います。 たとえば、 var s: String = "abc" と入力し、次の行で s. とドットまで打ち込むとメソッドやプロパティの候補が出てきます。それがpegyさんがおっしゃる「振る舞い」などに相当するものです。 出てきた表示の先頭に「V」と言う表示があれぱプロパティ(変数や定数)ですし、「M」とあればメソッドです。 英語ですが、それらの簡単な説明も表示されます。 一方、演算子「+」については56ページからの解説が参考になると思いますが、定義を調べるだけであれば、同じようにXcodeで Option を押しながら調べたい演算子の上でクリックするれば、ポップアップで解説を見ることができます。
pegy

2020/03/24 14:22

ありがとうございます! なるほど、ドット演算子でautocompleteで実際にクラスの中のプロパティとメソッドを見てみればいいということですね、、たくさん出てきました。中には斜線がかかっていて、使用できないものもある様です。 また、最後になりますが、quick helpで見たのですが static func + (lhs: String, rhs: String) -> String となっておりました。左辺と右辺がString型であれば結果はStringだよという意味かと思いますが、こんなことまで簡単に解説を見ることができるなんて初めて知りました!!!! また、試しにInt型でオプションで見ると ちゃんと前後を判断してstatic func + (lhs: Int, rhs: Int) -> Int と文脈に合わせた演算子の説明をしてくれました。。。 ご質問できてよかったです。 御礼申し上げます!
guest

0

単に型の指定です。
変数の型にIntを指定すればInt構造体のインスタンスを、Stringを指定すればString構造体のインスタンスを、何らかのクラスを指定すればそのクラスのインスタンスを格納するための変数ということになります。

投稿2020/03/24 12:25

ozwk

総合スコア13521

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

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

pegy

2020/03/24 14:12

コメントお寄せいただきありがとうございます。 構造体という概念を初めて知りました。また上記に掲げた参考文献のp68をみるとクラスとの違うが言及されており、 “(前略)構造体のデータに実体は、常にプログラムの内のどこか一箇所から参照されているだけです。複数箇所から同じ実態を参照する必要のあるデータ構造を作る目的には後述のクラスを使います(後略)” とあり、少しこの表現では私自身が咀嚼できないので具体的には他の情報源から、 参照型か値型そして継承できるか否かの違いがあるとということがわかりました。 一つ大きな勉強になりました、ありがとうございます!
guest

0

逆に何がどう疑問なのでしょうか。クラスも型の1種です。

投稿2020/03/24 12:25

maisumakun

総合スコア145183

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

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

pegy

2020/03/24 13:56

コメントいただきありがとうございます。 クラスも型の一種という、ともすれば当たり前の感覚をまだ持ち合わせていないため、わかりづらい質問で申し訳ございません。型に対して緩い言語しかまだ学んだことがないため ”var str : StringはなんとなくstrはString型を指定しています”程度に単純に考えていたのですが、そこに構造体という概念や、構造体にもインスタンス化という概念が存在することを初めて知りました。 例えば、String型どうしを加算演算すると文字列の結合になりますね、なぜならString型だから程度に思っていたため、そもそもクラスを型に指定するとはなんてことだ?? そもそもクラスは class piyo{ func hoge (arg) { // } } let test = piyo() piyo.hoge(fuga) といった様に使うもので型として使うってどういう意味だ???と思ってしまった次第です。 しかしながら今にして思えば、let test = piyo()という行為はtestにpiyoクラスの型を指定していることとおんなじ事なのか(let test : piyo!)とも思ったりしています。 本当に初心者で取り止めもなく申し訳ございませんが、よろしくお願い申しあげます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問