Menu
Coddy logo textTech

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
99

La 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:

99

Pasar 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
5

Los 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
50
challenge icon

Desafío

Fácil

Completa 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)")
}
quiz iconPonte a prueba

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

Practica por tu cuenta: Playground de Swift