Menu
Coddy logo textTech

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.0

Escolha 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:

2

As 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
false

Uma 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 }
}
challenge icon

Desafio

Fácil

Point é 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))")
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