水夫と戯れて

Appleの開発言語Swiftのことを書く。公開されている範囲内で書いています。文章に「?」が含まれているところはよく理解していないところ。

初期化

目次>

ストアされたプロパティの初期値のセット

イニシャライザ

デフォルトのプロパティ値

初期化のカスタマイズ

パラメータの初期化

ローカルと外部パラメータ名

オプションのプロパティタイプ

初期化で固定されたプロパティを修正する

デフォルトのイニシャライザ

バリュータイプのデリゲーションの初期化

クラス継承と初期化

指名のイニシャライザとコンビニエンスイニシャライザ

初期化チェーン

二段階初期化

イニシャライザの継承とオーバーライド

指名のイニシャライザとコンビニエンスイニシャライザの文法

指名のイニシャライザとコンビニエンスイニシャライザの動作

クロージャーや関数でデフォルトのプロパティ値をセットする

エクステンションで新しい初期化方法の定義ができる

継承

目次>

サブクラス化

SomeSuperclassクラスを継承してSomeClassを作成する場合

class SomeClass: SomeSuperclass {
    // class definition goes here
}

初期化メソッドなど、上書きする場合は、superの初期化メソッドを呼び出してから

class Bicycle: Vehicle {
    init() {
        super.init()
        numberOfWheels = 2
    }
}

SwiftからObjective-Cクラスを使う - 水夫と戯れて

メソッドのオーバーライド

overrideキーワードを使う

class Car: Vehicle {
    var speed: Double = 0.0
    init() {
        super.init()
        maxPassengers = 5
        numberOfWheels = 4
    }
    override func description() -> String {
        return super.description() + "; "
            + "traveling at \(speed) mph"
    }
}
スーパークラスメソッドやプロパティ、サブスクリプトへのアクセス

super.someMethod() super.someProperty super[someIndex]

プロパティのオーバーライド
プロパティのゲッター・セッターのオーバーライド
class SpeedLimitedCar: Car {
    override var speed: Double  {
    get {
        return super.speed
    }
    set {
        super.speed = min(newValue, 40.0)
    }
    }
}
プロパティ監視のオーバーライド
class AutomaticCar: Car {
    var gear = 1
    override var speed: Double {
    didSet {
        gear = Int(speed / 10.0) + 1
    }
    }
    override func description() -> String {
        return super.description() + " in gear \(gear)"
    }
}
オーバーライドの前に

サブスクリプト

目次>

クラス、構造体、列挙はサブスクリプトを定義できる コレクション、リスト、シーケンスの要素にアクセスしやすくするためのもの

subscript(index: Int) -> Int {
    get {
        // return an appropriate subscript value here
    }
    set(newValue) {
        // perform a suitable setting action here
    }
}
使用法
サブスクリプトのオプション

メソッド

目次>

書き方は関数と同じ

インスタンスメソッド
class Counter {
    var count = 0
    func increment() {
        count++
    }
    func incrementBy(amount: Int) {
        count += amount
    }
    func reset() {
        count = 0
    }
}
メソッドのローカル、外部パラメータ名
インスタンスメソッドから修正されたバリュータイプ
タイプメソッド

クラスメソッドみたいなもん?

mutating func advanceToLevel(level: Int) -> Bool {  }

クラス

目次>

クラス名は大文字で始まる class クラス名 {}

初期化するときは var instance = ClassName()

ストラクチャ・クラスの定義
struct Resolution {
    var width = 0
    var height = 0
}

class SomeClass {
    // class definition goes here
}
プロパティの定義

循環参照防止のために weak が必要な場合あり

weak var resolution = Resolution()

weak参照はオプショナル値

class VideoMode {
    var resolution = Resolution()
    var interlaced = false
    var frameRate = 0.0
    var name: String?
}
インスタンスの作成
let someVideoMode = VideoMode()
プロパティへのアクセス
println("The width of someVideoMode is \(someVideoMode.resolution.width)")
バリュータイプ
参照タイプ
ID比較

同一かどうか (===) 同一でないかどうか (!==)

ポインタ
Strong Reference

強参照 強参照を使う場合オーナーがオブジェクトを保持する 使用する前に初期化が必要

Weak Reference

弱参照 弱参照を使う場合、ライフタイムで独立 使用する前に初期化が必要

Unowned Reference

Unowned参照を使う場合同じライフタイムでオブジェクトは保持される 使用する前に初期化が必要

Unowned Referenceを使う let holder = card.holder card.older.charge(2.19)

クラスの初期化

ifの中にだけ入っていたりする場合、ifの中に入らない場合は初期化されていない状態になるのでダメ

イニシャライザはインスタンスのすべての初期化を行う init(luckyNumber: Int, message: String){...}

ストラクチャの初期化

struct Color{ let red, green , blue: Double init(grayScale: Double) { red = grayScale green = grayScale
blue = grayScale } }

mutating ?