ProgramlamaiOS geliştirici

Swift'te operatör aşırı yüklemesi nasıl çalışır, kullanırken dikkate alınması gereken noktalar nelerdir?

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

Cevap.

Operator overloading — kullanıcı türleri için standart (ve kendi) operatörlerin davranışını tanımlama veya yeniden tanıma yeteneğidir. Bu, yapılarınıza ve sınıflarınıza işlemleri daha ifade edici bir şekilde yazmanıza olanak tanır.

Özellikler:

  • Operatörler, global kapsamda zorunlu operator modifikasyonu ile static func anahtar kelimesiyle tanımlanır.
  • Karşılaştırma yapmak için protokollere (Equatable, Comparable vb.) uymak gereklidir.
  • infix, prefix, postfix gibi kendi operatörlerinizi oluşturabilirsiniz; bunları ilgili anahtar kelimeleri kullanarak belirtebilirsiniz.
  • Kodun okunabilirliği açısından, belirgin bir gereksinim olmaksızın aşırı operatör aşırı yüklemesinden kaçınılmalıdır.

Örnek:

struct Vector2D { var x: Double var y: Double static func +(lhs: Vector2D, rhs: Vector2D) -> Vector2D { return Vector2D(x: lhs.x + rhs.x, y: lhs.y + rhs.y) } } let a = Vector2D(x: 1, y: 2) let b = Vector2D(x: 3, y: 4) let sum = a + b // Vector2D(x: 4, y: 6)

Nuanuslar:

  • Mantıksal operatörlerin aşırı yüklemesi belirli protokollere (ExpressibleByBooleanLiteral, BooleanType) uyulmasını gerektirir.
  • Yeni operatörler için precedence group alanını belirtmek gerekir.
  • Yeniden tanımlanmış operatörlerin birden fazla protokolle uyumlu türlerle kullanılması durumunda ifade belirsizliği ile karşılaşılabilir.

Aldatıcı soru.

Standart operatörleri, örneğin +, sınıf nesneleri ile çalışacak şekilde aşırı yükleyebilir miyiz? Ve kendi yapılarınızı == ile karşılaştırmak için ne gereklidir?

Cevap: Evet, standart operatörler (örneğin, +, ==, <) kullanıcı yapı ve sınıfları için aşırı yüklenebilir. Yapıların/sınıfların == ile karşılaştırılabilmesi için türün Equatable protokolüne uyması ve eşitlik için statik bir işlev gerçekleştirmesi gerekir:

Örnek:

struct Point: Equatable { let x: Int let y: Int static func ==(lhs: Point, rhs: Point) -> Bool { return lhs.x == rhs.x && lhs.y == rhs.y } }

Bu konunun inceliklerini bilmemekten kaynaklanan gerçek hatalar örnekleri.


Hikaye

Set veya sözlükte anahtar olarak bu türü kullanırken hash(into:) işlevini uygulamadan yapılmış == operatörünü yeniden tanımlamak. Sonuç olarak, aynı öğeler iki kez kümeye düşmeli ya da bulunmamalıdır; zira standart Hashable mekanizması ihlal edilmiştir.


Hikaye

precedence group belirtilmeden kendi infix operatörü oluşturmak. Operatör, karmaşık ifadelerde hatalara neden olan mantıksız bağlam kurallarına göre beklenmedik bir şekilde çalıştı.


Hikaye

Projede modellerin birleştirilmesi için | operatörü tanıtıldı, ancak yeni başlayanlar bunu bit düzeyindeki OR işlemi ile sıkça karıştırdılar; bu da veri yönetiminde kafa karışıklığına ve yanlış işlenmelere neden oldu.