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
falseUma 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:
4let 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
99Desafio
FácilUma 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) }
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
1Classes e Objetos
Trabalhando com ArquivosDefinindo ClassesMétodos e selfInicializadoresClasses são ReferênciasRevisão - Cartão da Biblioteca4Encapsulamento
Controle de AcessoSomente Leitura ExternaProtegendo o EstadoInicializadores que Podem FalharRevisão - Conta Bancária7Polimorfismo e Genéricos
PolimorfismoConversão de TiposFunções GenéricasTipos GenéricosRevisão - Calculadora de Formas2Structs e Tipos de Valor
StructsSemântica de ValorMétodos MutáveisStruct ou ClasseRecapitulação - Item de Inventário5Herança
SubclassesSobrescrita de métodosInicializadores e superfinal e hierarquiasRecapitulação - Hierarquia de funcionários8Protocolos Padrão
CustomStringConvertibleEquatableComparableHashableRecapitulação - Ordenação Personalizada11Projeto: Gerenciamento de Biblioteca
Livros e MembrosEmpréstimo de LivrosPratique por conta própria: Playground de Swift