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.
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
Hiç yorum yok:
Yorum Gönder
Yorumunuz için teşekkür ederim.