Swift

Swiftまとめ - クラス -

More than 3 years have passed since last update.

関数はこちらにまとめました。

http://qiita.com/merrill/items/2e143c0e3ecfb04243a2

インスタンス変数・メソッド

class User {
  var name: String
  let number: Int

  // 初期化時に呼ばれる
  init(name: String, number: Int) {
    self.name = name // 引数の変数名とクラスのプロパティを区別するため、selfをつける
    self.number = number // 定数もinitの中なら設定できる
  }

  func hello() -> String {
    return "hello, \(name)"
  }
}

var user: User = User(name: "taro", number: 100)
user.hello()

クラス変数・メソッド

変数・メソッドの宣言前にclassをつける。

class User {
  class var name: String = "taro" // swift1.1では未サポート

  class func hello() -> String {
    return "hello"
  }
}

User.hello()

Getter/Setter

プロパティの参照時にgetブロック、設定時にsetブロックを介してアクセスするプロパティ(swiftではComputedプロパティと呼び、それ以外のプロパティはStoredプロパティと呼ぶ)は、以下のように定義する。

class User {
  var name: String = "太郎"
  var nameSama: String {
    get {
      return name + "様"
    }

    set(name) {
      self.name = name
    }
  }
}

var user: User = User()
user.nameSama // => "太郎様"

user.name = "次郎"
user.nameSama // => "次郎様"

setの引数が省略された場合、newValueという変数に格納される。

また、以下のようにname自身にGetter/Setterメソッドを定義するのは無理らしい。。。

class User {
  var name: String {
    get {
      return self.name + "様"
    }

    set(name) {
      self.name = name
    }
  }
}

var user: User = User()
user.name // エラー

レイジープロパティ

実際にアクセスされるまで初期化されないプロパティ。変数の宣言前にlazyをつける。メモリの節約に。

class User {

}

class AdminUser {
  lazy var user: User = User() 
}

var adminUser: AdminUser = AdminUser() // ここではまだuserは初期化されない
adminUser.user // ここで初期化される

プライベートクラス・変数・メソッド

同一ファイル内からしか参照できない。クラス・変数・メソッドの宣言前にprivateをつける。

private class User {
  private var name: String = "太郎"
  private func hello(){
    print(name)
  }
}

Computedプロパティのsetだけprivateにする場合はこちら。

class User {
  private(set) name: String = "太郎"
}

継承

継承は1つまで。

class User {
  var name: String = "太郎"
  func hello() -> String {
    return "hello, \(name)"
  }
}

// Userを継承
class ChildUser: User {
}

var childUser: ChildUser = ChildUser()
childUser.hello() // => "hello, 太郎"

オーバーライド

class User {
  var name: String = "太郎"
  func hello() -> String {
    return "hello, \(name)"
  }
}

class ChildUser: User {
  override func hello() -> String {
    return "hi, \(name)"
  }
}

var childUser: ChildUser = ChildUser()
childUser.hello() // => "hi, 太郎"

プロトコル(Protocol)

クラスで必ず実装いなければならない変数やメソッドを定義したもの。プロトコルは複数採用できる。

protocol TelevisionProtocol {
    var volume: Int { get set }
    func on()
    func off()
}

プロトコルの実装

class MyTelevision: TelevisionProtocol {
  # プロトコルに定義された変数、メソッドが未実装だとエラーになる
}

拡張(extention)

継承することなく、既存のクラスに独自のメソッドを追加する方法。元になるクラスに対してComputedプロパティとメソッドを追加できる。

  • NSDateを拡張する場合
extension NSDate {
    # 月末の日付を返す
    var lastDay: Int {
       ...
    }
}