関数はこちらにまとめました。
インスタンス変数・メソッド
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 {
...
}
}