Menu
Coddy logo textTech

クラスは参照

CoddyのSwiftジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 5/57。

クラスは参照型です。変数にはオブジェクトのコピーではなく、オブジェクトへの参照が保持されます。インスタンスを別の変数に代入すると、同じオブジェクトに対する2つ目の名前が作成されます。

class Wallet {
    var coins = 10
}

let mine = Wallet()
let alias = mine
alias.coins = 25
print(mine.coins)

出力:

25

=== は、2つの参照が同じインスタンスを指しているかどうかを確認します。すべてのプロパティが一致していても、別々のインスタンスは異なるオブジェクトです。

class Wallet {
    var coins = 10
}

let a = Wallet()
let b = a
let c = Wallet()
print(a === b)
print(a === c)

出力:

true
false

インスタンスを受け取る関数は呼び出し元のオブジェクトに対して動作するため、関数内で行われた変更はその後も確認できます:

class Wallet {
    var coins = 10
}

func payFee(_ wallet: Wallet) {
    wallet.coins -= 3
}

let w = Wallet()
payFee(w)
payFee(w)
print(w.coins)

出力:

4

letはオブジェクトではなく参照を固定します。クラスインスタンスを保持する定数は別のインスタンスを指すことはできませんが、インスタンスのvarプロパティは変更できます。インスタンスの配列も参照を保持します。

class Wallet {
    var coins = 10
}

let shared = Wallet()
let team = [shared, shared]
team[0].coins = 99
print(shared.coins)
print(team[1].coins)

出力:

99
99
challenge icon

チャレンジ

簡単

チームは1つのBudgetを共有します。予算と金額を受け取り、残額が十分にある場合にのみその金額を差し引き、支出が許可されたときにtrueを返す関数、spend(_:amount:)を完成させてください。次にrunTeam(start:purchases:)を完成させます。1つの予算を作成し、すべての購入で同じ予算から支出できるようにし、購入ごとに1行(ok 30またはdenied 80)を返した後、left 20を返してください。

提供されたコードは、開始時の予算と購入項目をカンマ区切りの行として読み取り、返された各行を出力します。

コードはBudget.swiftとFunctions.swiftに記述します。main.swiftには提供された入出力コードが含まれており、編集できません。

自分で試してみよう

// 提供された入出力コード: そのままにしておく
var input: [String] = []
while let line = readLine() { input.append(line) }
let purchases = input[1].split(separator: ",").map { Int($0)! }
for line in runTeam(start: Int(input[0])!, purchases: purchases) { print(line) }
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

オブジェクト指向プログラミングのすべてのレッスン

自分で練習してみよう: Swiftプレイグラウンド