構造体、列挙型、タプル (1/3)
作成:2014-10-11 11:05
更新:2014-10-11 11:05
更新:2014-10-11 11:05
■構造体とは?
Swiftでは、クラスや配列といったものの他にも複雑な性質を持った値があります。それらについてまとめておきましょう。まずは「構造体」からです。
構造体は、値を保管するプロパティと、処理を実装するメソッドからなります。構造体を利用するには、まずその定義を用意し、それをもとにインスタンスを作成します。――というと、「あれ? クラスと同じじゃないの?」と思うかもしれませんね。
確かに、基本的な構造や仕組みはクラスとほとんど同じで、プロパティやメソッドの扱いはまったく違いはないのです。が、細かな点で違いがあります。
・定義はstructを使う
クラスの定義は、「class 名前」という形で記述しますが、構造体の場合は「struct 名前」になります。すなわち、こうなります。なおプロパティやメソッドの書き方は、クラスとまったく同じです。
・継承しない
構造体はクラスのようなオブジェクト指向の仕組みを持っていません。あくまで「値と処理を一つにまとめるためのもの」であり、継承して新しい構造体を作ったりすることはできません。
・イニシャライザが不要
クラスでは、引数を持たないデフォルトイニシャライザは自動的に用意されましたが、プロパティの値を引数に持ったイニシャライザなどは自分で用意しないといけませんでした。が、構造体では、プロパティを用意すると、それらの値を引数に持つイニシャライザが自動生成されます。
・参照ではない!
これは重要です。クラスの場合、インスタンスを作成すると、その参照が変数に代入されました。インスタンスはメモリ内の何処かに保管され、その場所を示す値(参照)を変数に入れて操作しました。ですから、インスタンスの入った変数を別の変数に代入した場合も、参照がコピーされるだけなので、どちらの変数も同じインスタンスを参照しました。
が、構造体は参照を使いません。このため、インスタンスを代入した変数を、更に別の変数に代入すると、構造体そのものがコピーされ、2つの変数はそれぞれ別のインスタンスを持つようになります。この違いは、しっかり理解しておいてください。
下のリスト欄に、簡単な構造体の利用例をあげておきました。ここではMyData構造体を作り、そのインスタンスを作って利用しています。インスタンス作成は、MyData(age: 99, name: "Taro")としていますが、そのためのイニシャライザはありません。Swiftが自動的にイニシャライザを用意してくれているのがわかりますね。
また、作成したインスタンスdataをそのままdata2に代入していますが、プロパティの値を変更して出力させてみると、両者がそれぞれ別々のインスタンスを保持していることがよくわかります。
構造体は、値を保管するプロパティと、処理を実装するメソッドからなります。構造体を利用するには、まずその定義を用意し、それをもとにインスタンスを作成します。――というと、「あれ? クラスと同じじゃないの?」と思うかもしれませんね。
確かに、基本的な構造や仕組みはクラスとほとんど同じで、プロパティやメソッドの扱いはまったく違いはないのです。が、細かな点で違いがあります。
・定義はstructを使う
クラスの定義は、「class 名前」という形で記述しますが、構造体の場合は「struct 名前」になります。すなわち、こうなります。なおプロパティやメソッドの書き方は、クラスとまったく同じです。
struct 名前 {
……プロパティ、メソッドの記述……
}
・継承しない
構造体はクラスのようなオブジェクト指向の仕組みを持っていません。あくまで「値と処理を一つにまとめるためのもの」であり、継承して新しい構造体を作ったりすることはできません。
・イニシャライザが不要
クラスでは、引数を持たないデフォルトイニシャライザは自動的に用意されましたが、プロパティの値を引数に持ったイニシャライザなどは自分で用意しないといけませんでした。が、構造体では、プロパティを用意すると、それらの値を引数に持つイニシャライザが自動生成されます。
・参照ではない!
これは重要です。クラスの場合、インスタンスを作成すると、その参照が変数に代入されました。インスタンスはメモリ内の何処かに保管され、その場所を示す値(参照)を変数に入れて操作しました。ですから、インスタンスの入った変数を別の変数に代入した場合も、参照がコピーされるだけなので、どちらの変数も同じインスタンスを参照しました。
が、構造体は参照を使いません。このため、インスタンスを代入した変数を、更に別の変数に代入すると、構造体そのものがコピーされ、2つの変数はそれぞれ別のインスタンスを持つようになります。この違いは、しっかり理解しておいてください。
下のリスト欄に、簡単な構造体の利用例をあげておきました。ここではMyData構造体を作り、そのインスタンスを作って利用しています。インスタンス作成は、MyData(age: 99, name: "Taro")としていますが、そのためのイニシャライザはありません。Swiftが自動的にイニシャライザを用意してくれているのがわかりますね。
また、作成したインスタンスdataをそのままdata2に代入していますが、プロパティの値を変更して出力させてみると、両者がそれぞれ別々のインスタンスを保持していることがよくわかります。
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。
●プログラム・リスト●
struct MyData { var age:Int var name:String func getData() ->String { return "[\(name)(\(age))]" } } var data = MyData(age: 99, name: "Taro") var data2 = data data2.name = "Hanako" data2.age = 24 println(data.getData()) println(data2.getData())
※関連コンテンツ