Semántica de valores
Parte de la sección Programación orientada a objetos del Journey de Swift de Coddy. Lección 8 de 57.
Las estructuras son tipos de valor: asignar una estructura a otra variable la copia. Cambiar la copia deja el original sin cambios, a diferencia de una clase:
struct Point {
var x: Int
}
var a = Point(x: 1)
var b = a
b.x = 99
print(a.x)
print(b.x)Salida:
1
99La misma comparación con una clase muestra la diferencia: ambas variables hacen referencia a un 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)Salida:
99Pasar una estructura a una función también pasa una copia. El parámetro es una constante, así que, para devolver una versión modificada, la función crea una copia local y la devuelve:
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)Salida:
1
5Los arrays de estructuras contienen valores independientes. Cambiar un elemento mediante su índice cambia únicamente ese elemento, y copiar el 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)Salida:
1
50Desafío
FácilCompleta tryDiscount(_:percent:). Recibe una estructura Price y devuelve una copia con descuento: los centavos reducidos según el porcentaje, redondeados hacia abajo. El código proporcionado imprime el precio original y el precio con descuento, por lo que el original debe permanecer sin cambios.
El código proporcionado lee un precio en centavos y un porcentaje por línea, e imprime was 1000, now 900 para cada uno.
Tu código debe estar en Price.swift y Functions.swift. main.swift contiene el código proporcionado de entrada/salida y no se puede editar.
Pruébalo tú mismo
// Código de entrada/salida suministrado: déjalo tal 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 lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Programación orientada a objetos
1Clases y objetos
Trabajar con archivosDefinir clasesMétodos y selfInicializadoresLas clases son referenciasRepaso: tarjeta de biblioteca4Encapsulación
Control de accesoSolo lectura desde fueraProtección del estadoInicializadores que pueden fallarRepaso - Cuenta bancaria7Polimorfismo y genéricos
PolimorfismoConversión de tiposFunciones genéricasTipos genéricosRepaso - Calculadora de formas2Structs y tipos por valor
StructsSemántica de valoresMétodos mutablesStruct o claseRepaso - elemento del inventario5Herencia
SubclasesSobrescritura de métodosInicializadores y superfinal y jerarquíasRepaso: jerarquía de empleados8Protocolos estándar
CustomStringConvertibleEquatableComparableHashableRepaso - Ordenamiento personalizado11Proyecto: Gestión de bibliotecas
Libros y miembrosPréstamo de librosPractica por tu cuenta: Playground de Swift