Swift, sözdiziminin temizliğine büyük önem verir ve kendi operatörlerinizi (operator overloading) oluşturmanıza izin verir; yeni semboller ve hatta anahtar kelimeler dahil. Bu, DSL'nin olanaklarını genişletir ve kodu son derece ifadeci hale getirir.
Operatörlerin tanımlama ilkelerini anlamadan, belirsiz, okunması zor ve bakımı güç bir kod elde edilebilir. Yanlış seçilmiş bir öncelik veya eşleştirme, beklenmedik sonuçlara yol açabilir. Derleyici, kısıtlamalar belirtilmediğinde oldukça "tehlikeli" ifadelerin oluşturulmasına izin verir.
Yeni infix, prefix, postfix operatörleri tanımlanabilir, öncelik ve kullanım alanları belirtilebilir. Örnek:
infix operator ~> : AdditionPrecedence func ~> (lhs: Int, rhs: Int) -> Int { return lhs * 10 + rhs } let x = 2 ~> 3 // 23
Özel öncelikler tanımlamak için:
precedencegroup MyPrecedence { associativity: left higherThan: AdditionPrecedence } infix operator *** : MyPrecedence
Anahtar özellikler:
Operatör ve fonksiyonu uygulamak zorunlu mudur?
Evet, operatör tanımlandıysa, ilgili fonksiyonun uygulanması gerekir; aksi takdirde derleyici hatası alırsınız. Fonksiyonlar, operatörle aynı imzaya sahip olmalıdır.
Öncelik grubunu nasıl doğru seçersiniz ve grup hesaplama sırasını nasıl etkiler?
precedencegroup, infix operatörleri için hesaplama önceliğini ve eşleştirmeyi belirler. Yanlış grup seçimi, birden fazla operatör içeren ifadelerde (örneğin, çarpma/toplama ve sizin özel operatörünüz) beklenmedik sonuçlara yol açabilir.
Metin adıyla özel bir operatör tanımlanabilir mi?
Hayır, özel operatörler yalnızca Swift sözdizimi tarafından belirlenen özel semboller veya diziler aracılığıyla elde edilebilir. Metin tabanlı standart adların operatör olarak tanımlanmasına izin verilmez.
Projede, hiçbir öncelik, eşleştirme ve dokümantasyon açıklaması olmadan, koleksiyonların garip dönüşümleri için <<< ve >>> operatörleri tanımlanmıştı. Yeni çalışanlar, ne yaptıklarını ve ifadelerin hangi sırayla hesaplandığını anlamıyorlardı.
Artıları:
Eksileri:
Proje, => özel operatörünü, (örneğin, UI oluşturucusunda) zincirlenebilir bir pipeline'ı deklare etme amacıyla, açıkça tanımlanmış bir öncelikle ve belgelenmiş bir uygulama ile kullanmıştı. Her geliştirici, ne yaptığını ve nasıl kullanıldığını anlıyordu.
Artıları:
Eksileri: