Operatör Fonksiyonları


Operatör Fonksiyonları

Operatör fonksiyonları (Operator Overloading) diye bilinen bu mekanizmalar, mevcut operatörlerin davranışlarının değiştirilebilmesini sağlar. Bu sayede temel türlere ilişkin olmayan yani programcı tarafından sınıf veya yapılar bildirilerek üretilen özgü türlere ilişkin değişken veya sabitler toplama, çıkartma gibi işlemlere sokulabilir.
Swift’te operatör fonksiyonlarının yazılması ile ilgili kurallar:
  • Operatöre ait sembolün, fonksiyonun ismi olması gerekir.
  • Operatör fonksiyonları global olmalıdır. Yani bir sınıfın veya yapının üyesi olamazlar.
  • Fonksiyonun parametrik yapısı, söz konusu operatörün operand sayısı ile uyumlu olmalıdır.

Örnek:
class Kompleks{
var real: Int, imag: Int
init(real: Int, imag: Int) {
self.real = real
self.imag = imag
} }
var a = Kompleks(real:3 , imag: 5)
var b: Kompleks = Kompleks(real:2, imag:3)
print(a+b) //Hata
Operatör fonksiyonu, global faaliyet alanında yazılacak olursa hata ortadan kalkar.
func +(c1:Kompleks, c2: Komplex) -> String {
var r = c1.real + c2.real
var img = c1.imag + c2.imag
return String(r) + “+” + String(img) + “i” }
func ==(c1:Kompleks, c2:Kompleks) -> Bool {
return (c1.real == c2.real) &&(c1.iamg == c2.imag) }
Swift’te sadece mevcut olan operatörlerin davranışlarının değiştirilmesi değil, aynı zamanda tümüyle özgün operatörlerin yaratılabilmesi de mümkündür. Bu noktada birinci farklılık; “operator” anahtar sözcüğünün kullanılmasıdır. İkincisi; yeni yaratılacak olan operatörün prefix (ön ek), infix (ara ek) ya da postfix (son ek) olması tamamen kullanılacak olan aynı isimli anahtar sözcüklere bağlıdır. Önce bu anahtar sözcükler kullanılarak bir bildirim yapılmalı, daha sonra da bir fonksiyon ile operatör overloading gerçekleştirilmelidir.
Şayet normalde operatör olmayan bir sembol için bir operatör fonksiyonu yazılacaksa, operatör bildirimi ile onun ön ek mi, ara ek mi, son ek mi olduğunu, önceliğini (precedence) ve soldan-sağa, sağdan-sola olma durumu (associativity) mutlaka belirtilmelidir.
<(infix | prefix |postfix)> operatör <sembol>
{
precedence <öncelik>
associativity <left, right, none>
}
Not: None, o operatörün başka bir operatörle kombine edilemeyeceğini ifade etmektedir.
Örnek: “**” sembolü ile, iki operandlı ve araek(infix) bir kuvvet alma operatörü yazalım:
//Bildirim
infix operatör **
//Overloading
func **(sayi: Double, kuvvet: Double) -> Double
{ return pow(sayi, kuvvet) }
var sonuç = 2 ** 3 //8.0