Learn Swift / viva Cocoa


Learn Swift / 第12章  構造体


このコーナーでは、Swift による、Mac OS X アプリケーションの作成方法を、説明しています。

2016年1月20日

home  目次  前へ  次へ  mail


構造体

 構造体 (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です
と、表示されます。


お疲れ様でした。

 次章では、列挙体を学習します。


home  目次  前へ  次へ  mail


無断転載禁止
Copyright 2016. vivacocoa.jp All right reserved.