Menu
Coddy logo textTech

Struktura czy klasa

Część sekcji Programowanie obiektowe ścieżki Swift w Coddy. Lekcja 10 z 57.

Wytyczna w Swift brzmi: zacznij od struktury i wybierz klasę tylko wtedy, gdy potrzebujesz czegoś, co oferują wyłącznie klasy. Struktury są prostsze: każda zmienna ma własną wartość, więc zmiana w jednym miejscu nigdy nie zaskoczy kodu w innym miejscu.

struct Temperature {
    var celsius: Double
}

var today = Temperature(celsius: 21)
var yesterday = today
yesterday.celsius = 18
print(today.celsius)

Wynik:

21.0

Wybierz klasę, gdy jeden obiekt musi być współdzielony: kilka części programu musi widzieć ten sam zmieniający się stan, na przykład jedno konto bankowe używane przez wiele ekranów. Klasy obsługują też dziedziczenie, którego struktury nie obsługują.

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)

Wynik:

2

Struktury mogą bezpłatnie obsługiwać operator ==. Dodaj Equatable do deklaracji, a Swift porówna każdą właściwość; klasy porównują tożsamość za pomocą ===:

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))

Wynik:

true
false

Szybki test: jeśli dwa elementy z takimi samymi danymi powinny być uznawane za tę samą rzecz, użyj struktury (punktu, ceny, daty). Jeśli element ma tożsamość, która ma znaczenie nawet wtedy, gdy jego dane są takie same jak dane innego elementu (konto użytkownika, otwarty plik), użyj klasy.

struct Money { var cents: Int }          // 500 centów to 500 centów
class UserAccount {                      // dwa konta mogą mieć tę samą nazwę
    let id: Int
    var name: String
    init(id: Int, name: String) { self.id = id; self.name = name }
}
challenge icon

Wyzwanie

Łatwy

Point to struktura, która powinna być porównywalna za pomocą ==. Dodaj zgodność i uzupełnij countDistinct(_:), która zwraca liczbę różnych punktów na liście (dwa punkty są takie same, gdy obie współrzędne się zgadzają).

Dostarczony kod odczytuje jeden punkt w każdym wierszu w formacie x,y i wypisuje distinct: wraz z liczbą.

Twój kod umieść w plikach Point.swift i Functions.swift. main.swift zawiera dostarczony kod wejścia/wyjścia i nie można go edytować.

Spróbuj swoich sił

// Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian
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 iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Edytor online Swift