Enums com Métodos
Parte da seção Programação Orientada a Objetos do Journey de Swift da Coddy. Lição 15 de 57.
Um enum define um tipo com um conjunto fixo de casos. Os valores são escritos com um ponto, e switch deve tratar todos os casos; assim, adicionar um caso posteriormente mostra todos os lugares que precisam ser atualizados:
enum Direction {
case north, east, south, west
}
let heading = Direction.east
switch heading {
case .north: print("up")
case .east: print("right")
case .south: print("down")
case .west: print("left")
}Saída:
rightEnums podem ter métodos e propriedades computadas. Dentro deles, self é o caso atual:
enum Direction {
case north, east, south, west
var turnedRight: Direction {
switch self {
case .north: return .east
case .east: return .south
case .south: return .west
case .west: return .north
}
}
}
print(Direction.north.turnedRight)
print(Direction.west.turnedRight.turnedRight)Saída:
east
eastUm raw value associa um valor fixo de um tipo a cada caso. init(rawValue:) faz o caminho inverso e retorna nil quando nenhum caso corresponde:
enum Size: String {
case small = "S", medium = "M", large = "L"
}
print(Size.medium.rawValue)
print(Size(rawValue: "L") == .large)
print(Size(rawValue: "XL") == nil)Saída:
M
true
trueValores associados permitem que cada caso carregue seus próprios dados, e é assim que um tipo pode conter valores com formatos diferentes. switch vincula os dados com let:
enum Payment {
case cash(amount: Int)
case card(number: String, amount: Int)
var amount: Int {
switch self {
case .cash(let amount): return amount
case .card(_, let amount): return amount
}
}
}
let payments: [Payment] = [.cash(amount: 20), .card(number: "4242", amount: 55)]
print(payments.map { $0.amount })Saída:
[20, 55]Desafio
FácilComplete o enum Command com os casos forward, back, left e right, baseados nos valores brutos F, B, L e R. Adicione uma propriedade computada step que retorne a mudança na posição: forward 1, back -1, left e right 0. Em seguida, complete run(_:), que transforma cada caractere em um comando com init(rawValue:) (ignorando caracteres desconhecidos) e retorna position 2, turns 1, skipped 1.
O código fornecido lê uma linha de letras de comando e imprime o resultado de run(_:).
Seu código deve ficar em Command.swift e Functions.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) }
print(run(input[0]))
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