Miembros estáticos
Parte de la sección Programación orientada a objetos del Journey de Swift de Coddy. Lección 14 de 57.
Una propiedad static pertenece al tipo en sí, no a ninguna instancia. Hay exactamente una copia, a la que se accede mediante el nombre del tipo:
struct Temperature {
static let freezing = 0.0
static let boiling = 100.0
var celsius: Double
}
print(Temperature.boiling - Temperature.freezing)Salida:
100.0Una static var puede cambiar, lo que la hace útil para datos compartidos por todas las instancias, como un contador de cuántas se han creado:
class Ticket {
static var issued = 0
let number: Int
init() {
Ticket.issued += 1
number = Ticket.issued
}
}
let a = Ticket()
let b = Ticket()
print(a.number)
print(b.number)
print(Ticket.issued)Salida:
1
2
2Una static func se llama en el tipo. No tiene ninguna instancia de self con la que trabajar, así que solo utiliza sus argumentos y otros miembros estáticos. Es un buen lugar para ayudantes y para formas con nombre de crear instancias:
struct Color {
var red: Int
var green: Int
var blue: Int
static func gray(_ level: Int) -> Color {
Color(red: level, green: level, blue: level)
}
}
let c = Color.gray(128)
print(c.red + c.green + c.blue)Salida:
384Dentro del tipo, Self es otra forma de nombrar el tipo, por lo que los miembros estáticos pueden escribirse como Self.issued. Los métodos de instancia pueden leer miembros estáticos, pero un método estático no puede leer propiedades de instancia, porque no se llama sobre una instancia.
struct Level {
static let maximum = 10
var current = 1
func isMax() -> Bool { current == Self.maximum } // instancia lee static
static func describe() -> String { "levels 1-\(maximum)" } // static lee static
}Desafío
FácilCompleta la clase Order. Una propiedad estática nextId comienza en 1, y cada nuevo pedido toma el nextId actual como su id y lo incrementa. Una constante estática taxPercent es 10. El método de instancia total() devuelve el subtotal más el impuesto (redondeado hacia abajo), y el método estático summary(of:) recibe un arreglo de pedidos y devuelve 3 orders, 660 total.
El código proporcionado lee un subtotal por línea, crea un pedido para cada uno, imprime #1: 110 para cada pedido y, finalmente, imprime el resumen.
Tu código va en Order.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) }
var orders: [Order] = []
for line in input {
let order = Order(subtotal: Int(line)!)
orders.append(order)
print("#\(order.id): \(order.total())")
}
print(Order.summary(of: orders))
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 libros3Propiedades en profundidad
Propiedades calculadasObservadores de propiedadesMiembros estáticosEnumeraciones con métodosRepaso - Registro de temperaturaPractica por tu cuenta: Playground de Swift