プロパティ宣言

class Wine {
    // nilを許可しない
    var name: String
    // nilを許可
    var vintage: Int?
    // nilを許可
    var area: String?

    init(name: String) {
        // nilを許可しないものはinitで初期化
        self.name = name
    }
}

nilを許可しないOptional型は、nilで初期化されます。

class Wine {
    // initではなく、ここで初期化してもよい
    var name: String = "Default name"

privateプロパティ

クラス外部からアクセスされたくないプロパティはprivate宣言します。

// 先頭にprivateをつける
private var code: String

クラス外部からは読み取りのみ(readonly)にしたい場合はprivate(set)で宣言します。

private(set) var code: String

この2つのprivateは微妙に意味が違うことに注意です。前者はアクセスレベルをprivateにする宣言で、後者はアクセスレベルは既存のinternalのまま、setterのアクセスレベルのみprivateにするという意味です。後者はこう書くのと同じ意味になります。

internal private(set) var code: String

ここでアクセスレベルについても話すと長くなるので別の記事で説明します。

実体は変数ではないプロパティ

nameをtoRubyメソッドを通じてふりがなにして返したものがrubyプロパティとなる

var ruby: String {
    // getしかないのでreadonlyプロパティである
    get {
        return toRuby(name)
    }
}

nameをセットした時にrubyもセットし、rubyはreadonlyにする方法。こちらのほうがrubyにアクセスするたびにtoRubyを呼ばないのでパフォーマンスは良いはずです。

var name: String {
    didSet {
        ruby = toRuby(name)
    }
}
private(set) var ruby: String

定数

class Wine {
    let MaxVintage = 2035
}

ただし、これはインスタンス定数なのでクラスメソッドでは使えない。

クラス定数もどき。現状、これが一番現実的な案ではないでしょうか。

class var MaxVintage: Int {
    get { return 2035 }
}

これらは残念ながらコンパイルエラー。

static let MaxVintage = 2035
class let MaxVintage = 2035

このようにクラスの外で宣言することもできる。ファイル内でprivateな定数となる。逆に言うと他のファイルから参照できない欠点がある。

private let MaxVintage = 2035
class Wine {