Struct ou Classe
Parte da seção Programação Orientada a Objetos do Journey de Swift da Coddy. Lição 10 de 57.
A diretriz do Swift é começar com uma struct e escolher uma classe somente quando você precisar do que apenas as classes oferecem. Structs são mais simples: cada variável possui seu próprio valor, portanto uma alteração em um lugar nunca surpreende o código em outro lugar.
struct Temperature {
var celsius: Double
}
var today = Temperature(celsius: 21)
var yesterday = today
yesterday.celsius = 18
print(today.celsius)Saída:
21.0Escolha uma classe quando um objeto precisar ser compartilhado: várias partes do programa precisam visualizar o mesmo estado mutável, como uma única conta bancária usada por várias telas. As classes também oferecem suporte à herança, ao contrário das structs.
class SharedLog {
var lines: [String] = []
}
let log = SharedLog()
let moduleA = log
let moduleB = log
moduleA.lines.append("A started")
moduleB.lines.append("B started")
print(log.lines.count)Saída:
2As structs podem obter == gratuitamente. Adicione Equatable à declaração, e o Swift compara cada propriedade; já as classes comparam identidade com ===:
struct Point: Equatable {
var x: Int
var y: Int
}
print(Point(x: 1, y: 2) == Point(x: 1, y: 2))
print(Point(x: 1, y: 2) == Point(x: 2, y: 1))Saída:
true
falseUma verificação rápida: se dois itens com os mesmos dados devem contar como a mesma coisa, use uma struct (um ponto, um preço, uma data). Se um item tiver uma identidade que importa mesmo quando seus dados são iguais aos de outro item (uma conta de usuário, um arquivo aberto), use uma classe.
struct Money { var cents: Int } // 500 cents é 500 cents
class UserAccount { // duas contas podem compartilhar um nome
let id: Int
var name: String
init(id: Int, name: String) { self.id = id; self.name = name }
}Desafio
FácilPoint é uma struct que deve ser comparável com ==. Adicione a conformidade e complete countDistinct(_:), que retorna quantos pontos diferentes existem na lista (dois pontos são iguais quando ambas as coordenadas coincidem).
O código fornecido lê um ponto por linha como x,y e imprime distinct: com a contagem.
Seu código deve ficar em Point.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) }
let points = input.map { line -> Point in
let p = line.split(separator: ",").map { Int($0)! }
return Point(x: p[0], y: p[1])
}
print("distinct: \(countDistinct(points))")
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 LivrosPratique por conta própria: Playground de Swift