Swift Temel Operatörler #10

Bir işleme yol açan ve o işlem sonucunda bir değer üretilmesini sağlayan atomlara operatör denir. Swift’teki temel operatörler C, C++, Java ve C# dillerindeki operatörlere çok benzemektedir.

Swift’te operatörlerin kullanımı konusunda birkaç önemli ayrıntı vardır:

1) İki operandlı operatörlerin her iki tarafında en az bir boşuk karakteri bulundurulur, ya da her iki tarafında boşluk karakteri bulundurulmaz. Örneğin:

c = a + b // geçerli

c = a+ b // error!

c = a +b // error!

2) Tek operandlı operatörlerle operand’ları bitişik yazılmak zorundadır. Ayrıca tek operandlı önek operatörlerin sol tarafında en az bir boşluk karakterinin tek operandlı sonek operatörlerin de sağ tarafında en az bir boşluk karakterinin bulundurulması gerekir. Örneğin:

b = ! a // error! tek operandlı operatör ile operandı arasında boşluk yok
 c = a &&!b // error! tek operandlı önek operatörlerin sol tarafında en az bir boşluk karakteri gerekir

c=a && !b //geçerli

d = a ++ // error! tek operandlı operatörler operandlarıyla bitişik yazılmak zorundadır
 d = a++* b // error ++’nın sağında boşluk karakteri yok!

a = !!b // error!
 a = !(!b) // geçerli

Swift’te Operatör Öncelikleri

Bilindiği gibi operatörler paralel işleme sokulmaz. Belli bir sırada yapılırlar. Her operatörün çıktısı diğerine girdi yapılmaktadır. Örneğin:

a=b+c*d

İ1: c * d İ2: b + İ1 İ3: a = İ2

Derleyici de bu işlemleri yacak makina komutlarını bu sırada oluşturmaktadır. Swift’teki operatörlerin çoğu zaten diğer yaygın dillerdekilerle aynıdır. Fakat operatör öncelikleri bakımından Swift ile diğerleri arasında bazı önemli farklılıklar vardır.

Görüldüğü gibi Swift’te bit operatörlerinin önceliği C, C++, Java ve C#’a benzememektedir. Swift’te bu operatörler oldukça önceliklidir. Ayrıca Soldan-Sağa ve Sağdan-Sola (associativity) dışında tabloda bir de “Yok” ibaresi vardır. Yok ibaresi bulunan satırlardaki operatörler birlikte kombine edilemezler. Örneğin:

a=b>>2<❤ //error!

Swift’te operatörler konusundaki bazı ayrıntılar şunlardır:

- Karşılaştırma operatörleri Bool türden sonuç üretmektedir.

- Mantıksal operatörlerin operandalı Bool türden olmak zorundadır.

- Mantıksal && ve || operatörlerinin yine Swift’te de kısa devre (short circuit) özelliği vardır. Bunların sol tarafı önce yapılır. Duruma göre sağ tarafları hiç yapılmayabilir.

- Bilindiği gibi bir işlem sonucunda elde edilen değerin sonucun ilişkin olduğu türün sınırları içerisinde kalmaması durumuna “taşma (overflow)” denilmektedir. Taşma yukarıdan ya da aşağıdan olabilir. (Aşağıdan taşmalara “underflow” denilse de yalnızca “overflow” sözcüğü de her ikisini kapsar biçimde kullanılmaktadır.) Aritmetik operatörlerde taşma durumunda exception oluşmaktadır. İşte taşma durumunda exception oluşmadan sayının yüksek anlamlı byte’larının atılarak işleme devam edilmesi isteniyorsa +, -, *, / ve % operatörlerinin &+, &-, &*, &/ ve &% biçimindeki versiyonları kullanılmalıdır. Örneğin:

var a: Int8 = 100, b: Int8 = 100, c: Int8 c = a &+ b

print(c) // -56
 Yukarıdaki örnekte biz &+ yerine normal + operatörünü kullansaydık taşma nedeniyle exception oluşup

programımız çökecekti.

- Swift’te … (ellipsis) operatörüne kapalı aralık (closed interval), ..< operatörüne ise yarı açık aralık operatörü denilmektedir. Bu operatörler iki operandlı araek operatörlerdir. Bunların opereandları tamsayı türlerine ilişkin olabilir. (Aslında ForwardIndexType iismli protokolü destekleyen herhangi bir tür türünden olabilir.) a … b işlemi ya da a ..< işlemi aslında Range<T> türünden bir nesnenin oluşturulmasına yol açar. Yani örneğin:

var x = 1…10

bildirim ile:

var y: Range<Int> = Range(start: 1, end: 11)

eşdeğerdir. a…b ifadesi a’dan b’ye (b dahil olmak üzere) değerlerden oluşan bir collection nesne gibi düşünülmelidir. a..<b ifadesi ise a’dan b’ye (b dahil değil) değerlerden oluşan bir collection nesne gibi düşünülebilir.

..< operatöründen sağ tarafdaki değer aralığa dail değildir. Örneğin:

var x = 1…10

for i in x { print(i)

}

Aralık nesneleri başta for-in döngüsü olmak üzere pek çok yerde kullanılmaktadır. Örneğin switch deyiminde de case bölümlerinde aralıklar kullanılabilir.

?? operatörüne İngilizce “nil coalescing operator” denilmektedir. Bu operatör seçeneksel ifadelerde kullanılır. a ?? b ifadesi aşağıdaki ile eşdeğerdir:

a != nil ? a! : b

Burada a T? türünden b de T türünden olmak zorundadır. a eğer nil ise operatör bize b değerini verir, fakat a nil değilse a’nın içerisindeki değeri verir. Örneğin:

var a, b: Int?

a = 10
 b = a ?? 100 print(b)

a = nil
 b = a ?? 100 print(b)

// 10

// 100

Görüldüğü gibi ?? operatörü sol taraftaki operand nil olsa bile bize nil olmayan sağdaki değeri vermektedir.

- Koşul operatörünün (?:) kullanımı diğer dillerle aynı biçimdedir.

- ++ ve — operatörlerinin kullanımı da diğer dillerde olduğu gibidir. Yani bunlar tek operandlı hem önek hem de sonek olarak kullanılabilen operatörlerdir. Sonek kullanımda sonraki işleme artırılmamış ya da eksiltilmemiş değer girer. Örneğin:

var a, b:Int

a=3
 b = ++a * 2
 print(“a = \(a), b = \(b)”)

a=3
 b = a++ * 2
 print(“a = \(a), b = \(b)”)

// a = 4, b = 8

// a = 4, b = 6

- % operatörü C# ve Java’daki gibidir. Bu operatör sol taraftaki operandın sağ taraftaki operanda bölümünden elde edilen kalan değerini üretir. Operand’lar gerçek sayı türlerine ilişkin olabilir. Negatif değerin pozitif değere bölümünden elde edilen kalan negatiftir.

- Swift’te == ve ===, != ve !== operatörleri arasında küçük bir farklılık vardır. == operatörü overload edilebilir. Bu durumda iki nesnenin içinde aynı değerler var mı diye bakar. Halbuki === operatörü operandı olan referansların aynı nesneyi gösterip göstermediğine bakmaktadır. (Dolayısıyla yapılar zaten farklı nesnelerdir. İki yapı değişkeni için === operatörü zaten false verir). == ve === operatörlerinin kullanımı ileride örneklerle ele alınacaktır.

Like what you read? Give Özcan Akkoca a round of applause.

From a quick cheer to a standing ovation, clap to show how much you enjoyed this story.