Help us understand the problem. What is going on with this article?

SwiftのClassを勉強しました

More than 5 years have passed since last update.

swiftのclassについて勉強したので書く。

class宣言

class クラス名 {
  // ここに実装
}

getter, setter

宣言したプロパティを以下の用に修正する。

getter、setterを実装する場合は型を省略できないっぽい。

// ただ宣言しただけ
var name: String

// getter, setterあり
var name: String {
  get {
    // getter
  }

  set(newValue) {
    // setter
  }
}

以下例。

setterのnewValueは省略可能。 またset(hoge)と変数名を付けることも可能。

class Person {
  var firstName = "Naoto"
  var lastName = "Yamaguchi"
  var fullName: String {
    get {
      return firstName + " " + lastName  
    }
    set {
      var compArray: Array = newValue.componentsSeparatedByString(" ")
      let newFirstName = compArray[0] as String
      let newLastName = compArray[1] as String
      self.firstName = newFirstName
      self.lastName = newLastName
    }
  }
}

// getter
var person = Person()
println(person.fullName) // Naoto Yamaguchi

// setter
person.fullName = "Tarou Suzuki"
println(person.firstName + " " + person.lastName) // "Tarou Suzuki"

メソッド

イニシャライザと通常メソッドの例を以下に書く。
メソッドの場合は第1引数名が省略される。

class Square {
  var width: CGFloat
  var height: CGFloat

  init(width: CGFloat, height: CGFloat) {
    self.width = width
    self.height = height
  }

  func setWithWidth(width: CGFloat, height: CGFloat) {
    self.width = width
    self.height = height
  }
}

// init
var square = Square(width: 20.f, height: 20.f)

// method
squre.setWithWidth(30.f, height: 40.f)

外部名称と内部名称を分けることもできる。
その場合、第1引数は明示される。

func set(width w: CGFloat, height h: CGFloat) {
  self.width = w
  self.height = h
}

squre.set(width: 40, height: 40)

Override

継承の実装。

class クラス名: 親クラス {

}

以下例、Animalクラスを継承して、Dogクラスを実装する。
親クラスのメソッドをオーバーライドする場合は、funcの前にoverrideを宣言する。

// 親クラス
class Animal {
  var speed: CGFloat = 0.0
  var ID: String = "animal"

  func speed(speed: CGFloat) {
    self.speed = speed
  }
}
// 子クラス
class Dog : Animal {
  init(id: String) {
    super.init()
    self.ID = id
  }  

  override func speed(speed: CGFloat) {
    super.speed(speed)
  }
}

Final属性

final属性を宣言することで、オーバーライドを禁止できる。
final属性のメソッドをオーバライドしようとするとエラーがでる。

class SampleFinal {
  var test = "test"

  func method1() {
    self.test = "method1"
  }

  final func method2() {
    self.test = "method2"
  }  
}

class ChildFinal: SampleFinal {
  override func method1() {
    super.method1()
  }

  // ここでエラーがでます
  override func method2 () {
    super.method2()
  }  
}

required属性

// TODO: なんかうまくいかない

convenience属性

convenience属性を付けたイニシャライザは、同じクラスのイニシャライザしか呼べません。
通常のイニシャライザの場合は継承元のイニシャライザしか呼べません。

class SampleInit {
  var hello = "Hello"

  init (say: String) {
    self.hello = say
  }
  // 同じクラスのイニシャライザを呼ぶ
  convenience init () {
    self.init(say: "こんにちは")
  }
}

class ChildInit: SampleInit {
  var bye = "Bye"
  // 継承元のイニシャライザを呼べる  
  init (say: String, bye: String) {
    super.init(say: say)
    self.bye = bye
  }
  // 同じクラスのイニシャライザを呼ぶ
  convenience init (bye: String) {
    self.init(say: "こんにちは", bye: bye)
  }
}

Lazy属性

右辺の式の処理を遅延することができる。
アクセスした時に初めて評価される。

class SampleLazy {
}

class SampleClass {
  lazy var sampleLazy = SampleLazy()
}

var sample = SampleClass()
sample.sampleLazy // ここで初めて式が評価される

Deinit

インスタンスの破棄時に呼ばれる、デイニシャライザがある。
Objective-Cでいうdeallocにあたると思う。
明示的に呼ぶことはできない。

class DeinitSample {
  var sample = 30

  deinit {
    sample = 0
  }
}

Objective-Cより、なんか色々できるなーという印象である

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした