ProgramlamaOrta Düzey iOS Geliştirici

Swift'te operator fonksiyonları (fonksiyonlar olarak operator aşırı yükleme) nasıl çalışır? Aşırı yüklemelerde hangi kısıtlamalar vardır ve özel operatorler oluşturmak mümkün müdür?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap.

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:

  • Operatorler yalnızca kullanıcı tanımlı türler veya standart ve kullanıcı tanımlı türlerin kombinasyonları için aşırı yüklenebilir.
  • Kendi operatorlerinizi yalnızca Swift'te operatorler için izin verilen sembollerden oluşturabilirsiniz (+*-/&|^%~!=<>.?).
  • Yeni operatorlerin oluşturulmasında aşırıya kaçmamak, kodun okunabilirliğini düşürmemek için önemlidir.

Kandırmaca soru.

Ö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 }

Konuyla ilgili bilgi eksikliğinden kaynaklanan gerçek hatalar için örnekler.


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ı.