Menu
Coddy logo textTech

Classes são Referências

Parte da seção Programação Orientada a Objetos do Journey de Swift da Coddy. Lição 5 de 57.

Uma classe é um tipo de referência: uma variável contém uma referência ao objeto, não uma cópia dele. Atribuir uma instância a outra variável fornece um segundo nome para o mesmo objeto:

class Wallet {
    var coins = 10
}

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

Saída:

25

=== verifica se duas referências apontam para a mesma instância. Duas instâncias separadas são objetos diferentes, mesmo quando todas as suas propriedades correspondem:

class Wallet {
    var coins = 10
}

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

Saída:

true
false

Uma função que recebe uma instância atua sobre o objeto do chamador, portanto as alterações feitas dentro da função continuam visíveis depois:

class Wallet {
    var coins = 10
}

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

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

Saída:

4

let fixa a referência, não o objeto. Uma constante que contém uma instância de classe não pode apontar para outra instância, mas as propriedades var da instância ainda podem mudar. Arrays de instâncias também contêm referências:

class Wallet {
    var coins = 10
}

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

Saída:

99
99
challenge icon

Desafio

Fácil

Uma equipe compartilha um Budget. Complete spend(_:amount:), uma função que recebe um orçamento e subtrai o valor somente se houver o suficiente restante, retornando true quando o gasto for permitido. Em seguida, complete runTeam(start:purchases:): crie um orçamento, deixe cada compra gastar desse mesmo orçamento e retorne uma linha por compra (ok 30 ou denied 80), seguida por left 20.

O código fornecido lê o orçamento inicial e as compras como uma linha separada por vírgulas e imprime cada linha retornada.

Seu código deve ficar em Budget.swift e Functions.swift. main.swift contém o código fornecido de entrada/saída e não pode ser editado.

Experimente você mesmo

// Código de entrada/saída fornecido: mantenha-o como está
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 iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Programação Orientada a Objetos

Pratique por conta própria: Playground de Swift