用途
クラスと同じようにプロパティ、メソッドを定義できる。
struct User {
var name: String
func hello(){
print("Hello," + name)
}
}
var user: User = User(name: "太郎")
user.hello() // => "Hello,太郎"
クラスとの違い
- structはinitメソッドがいらない。(書いても良い)
クラスで同じことをする場合は次のようになる。
class User {
var name: String
init(name: String){
self.name = name
}
func hello(){
print("Hello," + name)
}
}
var user: User = User(name: "太郎")
user.hello()
- structは参照型ではない
structをコピーして2つの値を比較してみる。
struct User {
var name: String
}
var user: User = User(name: "太郎")
var user2: User = user
user2.name = "次郎"
println(user.name) // => "太郎"
println(user2.name) // => "次郎"
両方とも違う値が出力される。
次に、クラスで同じことをやってみる。
class User {
var name: String
init(name: String){
self.name = name
}
}
var user: User = User(name: "太郎")
var user2: User = user
user2.name = "次郎"
println(user.name) // => "次郎"
println(user2.name) // => "次郎"
オブジェクトはコピーしても同じ値を参照し続けているので、2つとも同じ値が出力される。
応用として、structは値なので、クラスのインスタンス変数として使用することができる。プロパティをまとめたい、などの場合に組み合わせて使うと便利。
struct Bookshelf {
var width: Int
var height: Int
}
struct Desk {
var width: Int
var height: Int
}
class Room {
var bookshelf: Bookshelf
var desk: Desk
init(bookshelf: Bookshelf, desk: Desk){
self.bookshelf = bookshelf
self.desk = desk
}
}
var bookshelf: Bookshelf = Bookshelf(width: 80, height: 120)
var desk: Desk = Desk(width: 60, height: 70)
var room: Room = Room(bookshelf: bookshelf, desk: desk)
print(room.desk.width) // => 60
- structは継承できない