Struct mı Class mı
Coddy'nin Swift Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 10 / 57.
Swift'in yönergesi, bir struct ile başlamayı ve yalnızca sınıfların sunduğu bir şeye ihtiyaç duyduğunuzda class seçmeyi önerir. Struct'lar daha basittir: her değişken kendi değerine sahiptir, bu nedenle bir yerde yapılan değişiklik başka bir yerdeki kodu asla şaşırtmaz.
struct Temperature {
var celsius: Double
}
var today = Temperature(celsius: 21)
var yesterday = today
yesterday.celsius = 18
print(today.celsius)Çıktı:
21.0Bir nesnenin paylaşılması gerektiğinde sınıfı tercih edin: bankacılık uygulamasında birçok ekranın kullandığı tek bir banka hesabı gibi, programın çeşitli bölümlerinin aynı değişen durumu görmesi gerekir. Sınıflar ayrıca struct'ların desteklemediği kalıtımı de destekler.
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)Çıktı:
2Struct'lar == operatörünü ücretsiz olarak edinebilir. Bildirime Equatable eklediğinizde Swift her özelliği karşılaştırır; sınıflar ise bunun yerine === ile kimliklerini karşılaştırır:
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))Çıktı:
true
falseKısa bir kontrol: aynı verilere sahip iki öğe aynı şey olarak sayılmalıysa bir struct (bir nokta, bir fiyat, bir tarih) kullanın. Bir öğe, verileri başka bir öğeninkiyle aynı olsa bile önemli olan bir kimliğe sahipse (bir kullanıcı hesabı, açık bir dosya), bir class kullanın.
struct Money { var cents: Int } // 500 cents, 500 cents'tir
class UserAccount { // iki hesap bir ismi paylaşabilir
let id: Int
var name: String
init(id: Int, name: String) { self.id = id; self.name = name }
}Görev
KolayPoint, == ile karşılaştırılabilir olması gereken bir struct'tır. Uyumluluğu ekleyin ve listedeki kaç farklı nokta olduğunu döndüren countDistinct(_:) işlevini tamamlayın (iki nokta, her iki koordinat da eşleştiğinde aynıdır).
Sağlanan kod, satır başına bir noktayı x,y olarak okur ve sayıyla birlikte distinct: yazdırır.
Kodunuz Point.swift ve Functions.swift dosyalarına gitmelidir. 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 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))")
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