Swift'te operator fonksiyonları, standart operatorleri (+, -, *, ==, < vb.) uygulamak veya yeniden tanımlamak ve ayrıca özel operatorler (örneğin, %% veya <|>) oluşturmak için bir olasılık sunar. Bunun için fonksiyonun tanımında operator anahtar kelimesi kullanılır. Genellikle, kullanıcı tanımlı türlerle çalışmak için operatorler aşırı yüklenir, böylece sözdizimsel olarak uygun ve sezgisel hale gelir.
Vector2D yapısı için toplama aşırı yüklemesi örneği:
struct Vector2D { var x: Double var y: Double } func + (lhs: Vector2D, rhs: Vector2D) -> Vector2D { return Vector2D(x: lhs.x + rhs.x, y: lhs.y + rhs.y) } let v1 = Vector2D(x: 1, y: 2) let v2 = Vector2D(x: 3, y: 4) let sum = v1 + v2 // Vector2D(x: 4, y: 6)
Kısıtlamalar:
+*-/&|^%~!=<>.?).Örneğin, + operatörünün Int için anlamını değiştirmek üzere standart türler için aşırı yükleme yapılabilir mi?
Cevap: Hayır, Swift'te standart türler için operatorlerin global davranışını yeniden tanımlamak mümkün değildir, yalnızca kendi türleriniz veya spesifik kombinasyonlar için genişletebilirsiniz. Örneğin:
// Hata: Int için aşırı yükleme mevcut semantik +yı değiştirmeyecek func + (lhs: Int, rhs: Int) -> Int { return lhs - rhs // Çalışmaz: mevcut davranışla çelişki }
Hikaye
Projede kendi operatorümüz ** (üst alma) oluşturuldu, ancak dikkatsizlik nedeniyle yanlış öncelik içeriyordu, bu da 2 + 3 ** 2 gibi ifadelerin yanlış hesaplanmasına yol açıyordu. Sonuç: yanlış sonuçlar, hata ayıklaması zor bir hata.
Hikaye
İç API ile ilgili bir modülde kendi türümüz için == aşırı yüklendi, ancak hashleme (Hashable) gerçekleştirilmedi, bu da Set ve Dictionary koleksiyonlarının yanlış çalışmasına neden oldu, burada örnekler mantıksal eşitlikte farklı kabul edildi.
Hikaye
Kendi operatorunu oluştururken kullanıcılar onun anlamını belgelemeyi unuttular. Yeni geliştirici operatorün semantiğini yanlış anladı ve onu uygun olmayan verilere uyguladı, bu da iş mantığında zor tespit edilen mantıksal hatalara yol açtı.