Equatable
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Swift di Coddy. Pelajaran 38 dari 57.
Equatable memberikan operator == dan != pada suatu tipe. Untuk struct dan enum yang semua property-nya bertipe Equatable, cukup nyatakan konformansinya, lalu Swift akan membandingkan setiap property:
struct Card: Equatable {
let rank: Int
let suit: String
}
let a = Card(rank: 10, suit: "hearts")
let b = Card(rank: 10, suit: "hearts")
print(a == b)
print(a != Card(rank: 2, suit: "hearts"))Output:
true
trueUntuk membandingkan hanya beberapa property, tulis sendiri static func ==. Di sini, dua pengguna dianggap sama jika id mereka cocok, apa pun nama mereka:
struct User: Equatable {
let id: Int
var name: String
static func == (lhs: User, rhs: User) -> Bool {
lhs.id == rhs.id
}
}
print(User(id: 1, name: "Ada") == User(id: 1, name: "Ada L."))
print(User(id: 1, name: "Ada") == User(id: 2, name: "Ada"))Output:
true
falseEquatable membuka akses ke method standar yang memerlukan perbandingan, seperti contains(_:), firstIndex(of:), dan == pada seluruh array:
struct Point: Equatable {
let x: Int, y: Int
}
let path = [Point(x: 0, y: 0), Point(x: 1, y: 2)]
print(path.contains(Point(x: 1, y: 2)))
print(path.firstIndex(of: Point(x: 1, y: 2))!)
print(path == [Point(x: 0, y: 0), Point(x: 1, y: 2)])Output:
true
1
trueclass tidak mendapatkan == secara otomatis: class membandingkan identitas dengan ===. class yang seharusnya membandingkan nilai harus mengimplementasikan == sendiri:
class Color: Equatable {
let hex: String
init(hex: String) { self.hex = hex }
static func == (lhs: Color, rhs: Color) -> Bool { lhs.hex == rhs.hex }
}Tantangan
MudahProduct memiliki sku, name, dan price. Dua produk dianggap sama jika sku-nya cocok, terlepas dari nilai field lainnya. Buat Product mematuhi Equatable dengan == khusus, lalu lengkapi mergeCatalog(_:), yang mempertahankan kemunculan pertama setiap produk (menggunakan contains) dan mengembalikan baris sku name price, diikuti removed: 2.
Kode yang disediakan membaca produk dalam baris berformat sku,name,price dan mencetak setiap baris yang dikembalikan.
Tulis kodemu di Product.swift dan Functions.swift. main.swift berisi kode input/output yang disediakan dan tidak boleh diedit.
Coba sendiri
// Kode input/output yang disediakan: biarkan apa adanya
var input: [String] = []
while let line = readLine() { input.append(line) }
let products = input.map { line -> Product in
let p = line.split(separator: ",").map(String.init)
return Product(sku: p[0], name: p[1], price: Int(p[2])!)
}
for line in mergeCatalog(products) { print(line) }
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Class dan Object
Bekerja dengan FileMendefinisikan ClassMethod dan selfInitializerClass adalah ReferensiUlasan: Kartu Perpustakaan4Enkapsulasi
Kontrol AksesHanya Bisa Dibaca dari LuarMelindungi StateInitializer yang Bisa GagalRangkuman: Rekening Bank7Polimorfisme dan Generik
PolimorfismeKonversi TipeFungsi GenerikTipe GenerikRangkuman: Kalkulator Bentuk2Struct dan Tipe Nilai
StructSemantik NilaiMethod yang Mengubah NilaiStruct atau classRangkuman, Item Inventaris11Proyek: Manajemen Perpustakaan
Buku dan AnggotaPeminjaman BukuLatihan sendiri: Playground Swift