Equatable
Coddy'nin Swift Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 38 / 57.
Equatable bir türe == ve != operatörlerini kazandırır. Özelliklerinin tümü Equatable olan struct ve enum'lar için uyumluluğu bildirmek yeterlidir; Swift her özelliği karşılaştırır:
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"))Çıktı:
true
trueYalnızca bazı özellikleri karşılaştırmak için static func == işlevini kendiniz yazın. Burada iki kullanıcı, adları ne olursa olsun kimlikleri eşleştiğinde eşittir:
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"))Çıktı:
true
falseEquatable, tüm diziler üzerinde contains(_:), firstIndex(of:) ve == gibi karşılaştırma gerektiren standart yöntemlerin kullanılmasını sağlar:
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)])Çıktı:
true
1
trueSınıflar == operatörünü kendiliğinden edinmez: kimlik karşılaştırmasını === ile yaparlar. Değere göre karşılaştırılması gereken bir sınıf, == operatörünü kendisi uygulamalıdır:
class Color: Equatable {
let hex: String
init(hex: String) { self.hex = hex }
static func == (lhs: Color, rhs: Color) -> Bool { lhs.hex == rhs.hex }
}Görev
KolayProduct, sku, name ve price alanlarına sahiptir. Diğer alanların değerleri ne olursa olsun, sku değerleri eşleştiğinde iki ürün aynıdır. Product'ı özel bir == ile Equatable'a uygun hâle getirin, ardından her ürünün ilk oluşumunu ( contains kullanarak) tutan ve sku name price satırlarını, ardından removed: 2 satırını döndüren mergeCatalog(_:) işlevini tamamlayın.
Sağlanan kod, ürünleri sku,name,price satırları olarak okur ve döndürülen her satırı yazdırır.
Kodunuz Product.swift ve Functions.swift dosyalarına yazılmalıdır. main.swift, sağlanan girdi/çıktı kodunu içerir ve düzenlenemez.
Kendin dene
// Sağlanan girdi/çıktı kodu: olduğu gibi bırakın
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) }
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Nesne Yönelimli Programlama bölümündeki tüm dersler
1Sınıflar ve Nesneler
Dosyalarla ÇalışmaSınıfları TanımlamaMetotlar ve selfBaşlatıcılarSınıflar ReferanstırTekrar - Kütüphane Kartı4Kapsülleme
Erişim DenetimiDışarıdan Salt OkunurDurumu KorumaBaşarısız Olabilen BaşlatıcılarTekrar - Banka Hesabı7Polimorfizm ve Generic'ler
PolimorfizmTür DönüşümüGeneric FonksiyonlarGeneric TürlerTekrar - Şekil Hesaplayıcı2Struct Yapıları ve Değer Türleri
Struct YapılarıDeğer SemantiğiDeğiştirici MetotlarStruct mı Class mıTekrar - Envanter Öğesi5Kalıtım
Alt sınıflarMetotları Geçersiz KılmaBaşlatıcılar ve superfinal ve HiyerarşilerTekrar - Çalışan Hiyerarşisi11Proje: Kütüphane Yönetimi
Kitaplar ve ÜyelerKitap Ödünç AlmaKendi başına pratik yap: Swift playground