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.0Uma 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
2Uma 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:
384Dentro 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
}Desafio
FácilComplete 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))
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 Livros3Propriedades em Profundidade
Propriedades ComputadasObservadores de PropriedadesMembros EstáticosEnums com MétodosRecapitulação - Registro de TemperaturaPratique por conta própria: Playground de Swift