Swift

Swiftまとめ - struct(構造体)-

More than 3 years have passed since last update.

用途

クラスと同じようにプロパティ、メソッドを定義できる。

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は継承できない