Semântica de Valor
Parte da seção Programação Orientada a Objetos do Journey de Swift da Coddy. Lição 8 de 57.
Structs são tipos por valor: atribuir uma struct a outra variável faz uma cópia dela. Alterar a cópia não modifica a original, ao contrário de uma classe:
struct Point {
var x: Int
}
var a = Point(x: 1)
var b = a
b.x = 99
print(a.x)
print(b.x)Saída:
1
99A mesma comparação com uma classe mostra a diferença: ambas as variáveis fazem referência a um único objeto.
class PointRef {
var x: Int
init(x: Int) { self.x = x }
}
let a = PointRef(x: 1)
let b = a
b.x = 99
print(a.x)Saída:
99Passar uma struct para uma função também passa uma cópia. O parâmetro é uma constante; portanto, para retornar uma versão modificada, a função cria uma cópia local e a retorna:
struct Point {
var x: Int
}
func shifted(_ p: Point, by dx: Int) -> Point {
var copy = p
copy.x += dx
return copy
}
let start = Point(x: 1)
let moved = shifted(start, by: 4)
print(start.x)
print(moved.x)Saída:
1
5Arrays de structs contêm valores independentes. Alterar um elemento por meio do seu índice altera apenas esse elemento, e copiar o array copia cada valor:
struct Score {
var points: Int
}
var round1 = [Score(points: 1), Score(points: 2)]
var round2 = round1
round2[0].points = 50
print(round1[0].points)
print(round2[0].points)Saída:
1
50Desafio
FácilComplete tryDiscount(_:percent:). Ele recebe uma struct Price e retorna uma cópia com desconto: os centavos reduzidos pela porcentagem, arredondados para baixo. O código fornecido imprime o preço original e o preço com desconto, portanto o original deve permanecer inalterado.
O código fornecido lê um preço em centavos e uma porcentagem por linha, e imprime was 1000, now 900 para cada um.
Seu código deve estar em Price.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 original = Price(cents: Int(input[0])!)
for line in input.dropFirst() {
let cheaper = tryDiscount(original, percent: Int(line)!)
print("was \(original.cents), now \(cheaper.cents)")
}
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