Menu
Coddy logo textTech

Membros Estáticos

Parte da seção Programação Orientada a Objetos do Journey de Swift da Coddy. Lição 14 de 57.

Uma propriedade static pertence ao próprio tipo, não a nenhuma instância. Existe exatamente uma cópia, acessada por meio do nome do tipo:

struct Temperature {
    static let freezing = 0.0
    static let boiling = 100.0
    var celsius: Double
}

print(Temperature.boiling - Temperature.freezing)

Saída:

100.0

Uma static var pode mudar, o que a torna útil para dados compartilhados por todas as instâncias, como um contador de quantas foram criadas:

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)

Saída:

1
2
2

Uma static func é chamada no tipo. Ela não tem uma instância de self com a qual trabalhar, portanto usa apenas seus argumentos e outros membros estáticos. É um bom lugar para auxiliares e para formas nomeadas de criar instâncias:

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)

Saída:

384

Dentro do tipo, Self é outra forma de nomear o tipo, então os membros estáticos podem ser escritos como Self.issued. Os métodos de instância podem ler membros estáticos, mas um método estático não pode ler propriedades de instância, porque não é chamado em uma instância.

struct Level {
    static let maximum = 10
    var current = 1
    func isMax() -> Bool { current == Self.maximum }   // instância lê static
    static func describe() -> String { "levels 1-\(maximum)" } // static lê static
}
challenge icon

Desafio

Fácil

Complete a classe Order. Uma propriedade estática nextId começa em 1, e cada novo pedido usa o nextId atual como seu id e o incrementa. Uma constante estática taxPercent é 10. O método de instância total() retorna o subtotal mais o imposto (arredondado para baixo), e o método estático summary(of:) recebe um array de pedidos e retorna 3 orders, 660 total.

O código fornecido lê um subtotal por linha, cria um pedido para cada um, imprime #1: 110 para cada pedido e, por fim, imprime o resumo.

Seu código deve ser colocado em Order.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) }
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))
quiz iconTeste seus conhecimentos

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

Pratique por conta própria: Playground de Swift