Static ve class özellikleri, örneklere değil, tiplere ait özelliklerdir. Tarihsel olarak, tüm örnekler için genel bir bilgi depolama ihtiyacını (örneğin, sayaçlar, yapılandırmalar, fabrikalar) çözmek amacıyla ortaya çıkmıştır. Swift'de static, tüm tiplerde (class, struct, enum) kullanılabilirken, class yalnızca sınıflarda ve yalnızca hesaplanan özellikler için kullanılabilir, miras alanlarda geçersiz kılma olanağı sağlar.
Sorun: Statik özelliklerin yanlış kullanımı, yarış durumlarına ve farklı thread'lerden erişim hatalarına yol açabilir. Ayrıca static ve class'ı karıştırmak ve miras alanlarda geçersiz kılma mekanizmasını yanlış seçmek de kolaydır.
Çözüm:
Örnek kod:
class Counter { static var count = 0 static let queue = DispatchQueue(label: "counter.queue") static func increment() { queue.sync { count += 1 } } class var typeDescription: String { return "Generic Counter" } } class NamedCounter: Counter { override class var typeDescription: String { return "Named Counter" } }
Anahtar özellikler:
Soru 1: static let özelliğini hesaplanan (computed) bir özellik olarak get ile ilan edebilir miyiz?
Evet, static özelliği hem stored hem de computed olabilir. let özellikleri genellikle bir sabittir, ancak static var kesinlikle hesaplanmış olabilir:
struct Math { static var pi: Double { return 3.1415926 } }
Soru 2: static var varsayılan olarak thread-safe midir?
Hayır, eğer static var farklı thread'lerden değiştiriliyorsa, yarış durumları oluşabilir. read/write işlemleri manuel olarak senkronize edilmelidir.
Soru 3: class var'ı stored özellikler için kullanabilir miyiz?
Hayır, class var her zaman hesaplanan bir özellik olmalıdır (get/optional set içeren özellik), stored özellikler yalnızca static için izin verilmiştir.
Uygulamada kullanıcı giriş sayacı static var'da tutuluyordu ve senkronizasyon olmadan farklı thread'lerden artırılıyordu.
Artılar:
Eksiler:
Küresel yapılandırma nesnesi için static let kullanıldı ve yalnızca okuma için veya yazma için DispatchQueue kullanılarak erişim sağlandı.
Artılar:
Eksiler: