Learn Swift / 第12章 構造体
このコーナーでは、Swift による、Mac OS X アプリケーションの作成方法を、説明しています。
構造体
構造体 (struct) は、クラスと同じように、複数のプロパティと、複数のメソッドを持てます。ただし、クラスと違って、継承することは、できません。
import Cocoa struct Window { var title:String = "Window" var width:Int = 300 var height:Int = 200 func show() { print ("タイトル:\(title)、幅:\(width)、高さ:\(height)") } } var window = Window() window.show()構造体は、クラスと同じように、まず定義し、そしてインスタンスを作って、使用します。一つの定義から、複数のインスタンスを作ることができます。インスタンスのプロパティやメソッドに、アクセスする場合も、クラスと同じように、. (dot、ドット) を使います。
import Cocoa struct Window { var title:String = "Window" var width:Int = 300 var height:Int = 200 } let window = Window() print ("タイトル:\(window.title)、幅:\(window.width)、高さ:\(window.height)")
値の変更
インスタンスのプロパティの値を変更するには、そのインスタンスが、 var で定義された変数に、設定されている必要があります。
import Cocoa struct Window { var title:String = "Window" var width:Int = 600 var height:Int = 400 } var window = Window() window.title = "ウィンドウ" window.width = 400 window.height = 300 print ("タイトル:\(window.title)、幅:\(window.width)、高さ:\(window.height)")クラスのインスタンスは、参照 (データまでの地図) ですが、構造体のインスタンスは、値 (データ) そのものです。
このことは、次のリストのように、クラスと構造体のインスタンスを作り、さらに、そのインスタンスの、コピー (copy、複製) を作成すると、よく分かります。
import Cocoa class ABC { var words = "Hello" } struct XYZ { var words = "Hello" } var abc = ABC() var xyz = XYZ() var abcCopy = abc var xyzCopy = xyz abcCopy.words = "Bye" xyzConpy.words = "Bye" print("abc.words=\(abc.words)、xyz.words=\(xyz.words)")このリストを実行すると、デバッグエリアに、次のように表示されます。
abc.words=Bye、xyz.words=Hello代入演算子「=」は、右辺の値を、左辺に移動しているのではありません。右辺の値の複製 (copy) を、左辺に設定しているのです。
クラス abc と、その複製 abcCopy は同じ参照 (地図) を示しています。そして、その参照が、指し示している words プロパティは同じものです。したがって、abcCopy の words プロパティを変更すると、abc の words プロパティも変更されます。
一方、構造体 xyz と、その複製 xyzCopyは、値そのものを保持しています。xyz が複製された時点で、xyz と xyzCopy の値は別のデータとなります。
イニシャライザ
クラスでは、プロパティの定義時に、初期値を設定していない場合は、必ず init() メソッドで、初期値を設定しなければなりませんでした。
いっぽう構造体では、プロパティの定義時に、初期値を設定していない場合でも、init() メソッドを定義する必要はありません。そのかわりに、インスタンス作成時、初期値を引数として渡します。
※なお、構造体に、init() メソッドを定義しても問題はありません。
import Cocoa class ABC { var name:String var age:Int init() { name = "Steave" age = 56 } func say() { print("名前は \(name)、年は\(age)です") } } struct XYZ { var name:String var age:Int func say() { print("名前は \(name)、年は\(age)です") } } let abc = ABC() abc.say() var xyz = XYZ(name: "Bill", age: 60) xyz.say()このリストの実行結果は、
名前は Steave、年は56ですと、表示されます。
名前は Bill、年は60です
お疲れ様でした。
次章では、列挙体を学習します。
無断転載禁止 Copyright 2016. vivacocoa.jp All right reserved.