Swift Değişken ve Sabitler
Swift bilinen bir çok programlama dilinde olduğu gibi Int, String, boolean, Double, Float, dizi değişken tiplerini içerisinde barındırır. Bu değişken tiplerinin yanında Dictionary değişkenini de yenilik olarak sunmaktadır.
Swift değişken tanımlamaya olanak sunduğu gibi değişmeden kalan değerler için de tanımlama imkanı sunmaktadır. Değişmeden kalanlar için yazının ilerleyen kısımlarında “sabit” kelimesini kullanacağım. Sabitler kod boyunca değişemediği için güvenli bir şekilde her kullanımda aynı değer için sonuç almayı garanti etmektedirler.
Bilinen tip tanımlamalarının yanında swift bizlere “tuple” olarak isimlendirilen tip tanımlamasını da sunmaktadır. Tuple 0 ve daha fazla değerin bir değermiş gibi barındırılması anlamına gelmektedir. Bu bileşik yapı sayesinde fonksiyonlardan çoklu değer döndürme işlemi yapılabilmektedir. Bir yeni tip olarak karşımıza “Optionals” çıkmaktadır. Objective-C kullanıcılarının “nil” olarak bildiği bu tip iki farklı değere sahip olabilir ve bu değerler ile beraber bize “bir değer olup neye eşit olduğunu” veya “bir değer bulunmadığını” gösterir. Kodlama aşamasında çıktı aldıktan sonra bazı değişkenlerde bu ifadeye rastlayacağız. Optionals’ın sağladığı uyarı ile beraber güvenli bir kod yazma imkanını kendimiz elde edip, input’ların varlığını kontrol eden yapılar kullanacağız.
Değişkenler ve Sabitler
Giriş kısmında kısaca bahsetmiş olduğum sabit ve değişkenler konusuna biraz daha detaylı olarak bakalım. Öncelikle sabitlerin program boyunca değiştirilemeyeceğini kesinlikle bilmemiz gerekmektedir, aksi takdirde aldığınız hatanın neden kaynaklandığını anlamadan dakikalarınızı çıldırarak geçirebilirsiniz.
Sabit tanımlarken “let” anahtar kelimesini, değişken tanımlarken ise “var” anahtar kelimesini kullanırız.
1 2 3 4 5 6 |
var baris = 23 let uyar = “soyad” |
Aynı zamanda tek bir anahtar kelime içerisinde birden fazla değişken de tanımlanabilmektedir.
1 2 3 4 5 |
var baris = 23, boy = 183, memleket = “Burdur” |
Yukarıda verilen örneklerde oluşturduğumuz değişkenlerin veya sabitin tiplerini belirtmedik ve bu işlemi swift’e bıraktık. Kendimiz tip belirtme işlemi yapacak olsaydık “:” ifadesi ve yanında istediğimiz tipin adını girmemiz yeterli olacaktı.
1 2 3 4 5 |
var baris: Int = 23 |
Değişken veya sabitin çıktı olarak alınması için de aşağıdaki kullanım bir örnek olmaktadır.
1 2 3 4 5 |
print(uyar) |
Print fonksiyonu ile aynı zamanda daha kompleks çıktılar da alabiliriz.
1 2 3 4 5 |
print(“Barış (baris) yaşında”) |
Integer
Integer kesirli yapıda olmayan, işaretli (pozitif, sıfır, negatif) veya işaretli (sıfır, pozitif) sayılar için kullanılır. 8, 16, 32 ve 64 bit formu destekleri mevcuttur. İşaretsiz 8 bit form için UInt8 anahtar kelimesi kullanılır.
Aralıklar
Integer değerlerin aralığına erişmek mümkündür.
1 2 3 4 5 6 7 8 |
let min = UInt16.min let max = UInt16.max print(min, max) |
Yukarıdaki işlemlerin sonucunda min=0 ve max=65535 değerlerini elde edeceğiz.
Float
Kesirli sayılar için kullanacağımız veri tipi bilinen “Float” veri tip olacaktır. Kesirli sayılarında tanımlaması yapılabileceğinden aralık olarak Integer’dan çok daha büyük olacağı ortadadır. Float 32-bit formunda iş görmektedir eğer çok daha büyük sayılar ile işlem yapılacaksa 64-bit formuna sahip “Double” veri tipi kullanılmalıdır.
Sayısal Terimler
Aşağıda aynı sayının sırasıyla farklı tabanlarda nasıl tanımlandığına bakacağız.
1 2 3 4 5 6 7 8 |
let ikilik = 0b10111 //İkilik taban let sekizlik = 0o27 //Sekizlik taban let onluk = 23 //Onluk taban let onAltilik = 0x17 //Onaltılık taban |
10’lu kuvvetler için exponent (e) işlemi yapılmaktadır. Yani bir sayıyı 10 ve katları ile çarpmak veya bölmek istersek başvuracağımız bir yöntemdir. Kullanımı aşağıda verilmiştir.
1 2 3 4 5 6 |
let a = 12e3 let b = 1e-3 |
Bu örneklerde “a” sabiti 10’un 3. kuvveti ile çarpılıyor, “b” değişkeni ise 10’un -3. kuvveti ile çarpılıyor yani 10’un 3. kuvvetine bölünüyor.
Bu işlemi onaltılık taban için yapacak olursak “p” anahtarını kullanmamız gerekecekti.
Bu noktada alıştırma olması açısından onaltılık taban için siz de deneyebilirsiniz.
Değişken tanımlarken okunulabilirlik açısından “-” işaretini kullanmamıza olanak sunulmaktadır.
1 2 3 4 5 6 7 |
let c = 1_000_000 let d = 1000000 |
Yukarıda tanımlanan iki sabitin değer olarak hiçbir farkları bulunmamaktadır.
Çevirmeler
Bir tipten diğer tipe çevirme işlemi yaparken sayı aralıklarına ve tanımlarına çok dikkat etmemiz gereklidir. Örneğin float bir değeri Int’e çevirdiğimiz zaman kesirli kısımları kalıcı olarak kaybedebileceğimizi unutmamalıyız. Tavsiye olarak daima küçük->büyük yönünde veri tipi değişikliği yapılması gerektiğini belirtmek isterim. Aksi bir dönüşüm yapılacaksa da eski değerin bir tutucu değişkende depolanması yararınıza olacaktır.
1 2 3 4 5 6 7 |
let un: UInt16 = 5 let seker: UInt8 = 3 let unSeker = un + UInt16(seker) |
Yukarıdaki örnekte küçükten büyüğe doğru bir dönüşüm işlemi görülmektedir.
Tiplere Takma Ad Verme
Tiplere takma ad vermek ve kodlamanın geri kalanında yaratılacak değişken veya sabitlerin o takma ad ile yaratılması mümkündür bunun için “typealias” anahtar kelimesini kullanırız.
1 2 3 4 5 6 |
typealias baris = Int let c: baris = 3 |
Yukarıdaki örnekte Int veri tipine “baris” takma adını verdikten sonra “baris” = Int tipinde değişken tanımladık.
Boolean
Genel programlamada olduğu gibi Swift’te de bazı kontroller için kullanılacak boolean veri tipi mevcuttur.
1 2 3 4 5 6 7 8 9 10 11 12 |
let baris = true if baris { print(“Merhaba ben Barış”) } else{ print(“Beni tanımıyorsunuz.”) } |
Yukarıdaki kod parçasında if else yapısının kontrolünü tanımlamış olduğum “baris” adlı bool verisi ile gerçekleştirdim. True değer verdiğim için if kod bloğu çalıştı.
Boolean veri tipini örnek olarak ileride geliştireceğimiz oyunların bitme, devam etme gibi durumlarında kullanacağız.
Tuples
Genel programlama dillerinde mevcut olan veri tiplerinden sonra Swift’in sunduğu yeniliklere ‘tuple’ ile başlıyoruz.
Tuple 0 ve daha fazla değerin bir değermiş gibi barındırılması anlamına gelmektedir. Bu bileşik yapı sayesinde fonksiyonlardan çoklu değer döndürme işlemi yapılabilmektedir.
Programlama geleneği olan “Hello World” çıktısı alma işlemini burada gerçekleştirelim.
1 2 3 4 5 6 7 |
var gelenek = ("Hello", "World") print(gelenek.0 + " " + gelenek.1) |
Diziyi andıran tanımlama ve erişim şekliyle beraber tuple yapısını diziden bağımsız kılan özelliğine bakalım, farklı tiplerin bir arada kullanımı!
1 2 3 4 5 |
let ben = ("Barış", "Uyar", 23) |
Tanımlanan bir tuple değişkeninin elemanlarını farklı değişkenlere atamak ta mümkündür.
1 2 3 4 5 6 7 |
let ben = ("Barış", "Uyar", 23) let isim = ben.0 let (ad, soyad, yas) = ben |
Yukarıdaki kod bloğunun 2. satırında klasik dizilerde bir elemanın başka değişkene atılması işlemini gerçekleştirdim. 3. satırda ise tuple yapısının bütün elemanlarının başka değişkenlere atılması işlemini sizlere sundum.
1 2 3 4 5 |
let (ad, _, yas) = ben |
Eğer istemediğimiz özellikler için yeni bir değişken yaratmak istemiyorsak, tuple içindeki bu özelliği ” _” işareti ile yok sayabiliriz.
Tuple yaratılırken aynı zamanda özelliklerin isimleri de verilip sonrasında erişilmek istenen özelliğe (0, 1, .. ) olarak değil özellik ismiyle erişmek mümkün olabilmektedir.
1 2 3 4 5 6 |
let ben = (ad: "Baris", soyad: "Uyar", yas: 23) print(ben.ad) |
Optional
Optional bir değişkenin değerinin var olup olmadığı kodlama esnasında bilinmeyen durumlarda kullanılmaktadır.
1 2 3 4 5 6 |
let numara = "123" let Cnumara = numara.toInt() |
1 2 3 4 5 6 |
let numara = "Hello World" let Cnumara = numara.toInt() |
Yukarıdaki iki örnek için konuşmak gerekirse, ilk örnekte öncesinde String olarak girilen ifadeyi daha sonra Int tipine değiştirmek istiyoruz. Bu örnekte String olarak girilen ifade 123 olduğu için bir sayısal değere sahiptir ve Int tipine dönüştürme işlemi gerçekleştirilebilir. Ancak ikinci örnekte ise “Hello World” ifadesinin açık bir sayısal değeri olmadığı için çevirme işlemi mantık olarak hatalı olacaktır. Swift bu durumda dönüştürme işlemi sonunda oluşan değerlere Optional tip tanımlamaktadır.
1 2 3 4 5 |
let url = URL(string: "http://www.ntvhava.com/konum/” + sehir + "") |
Yukarıdaki başka bir örnekte ise ilerleyen konularda değineceğim URL konusuna gönderme yapıyorum. Burada “url” sabitine bir URL tipi atamak istiyorum fakat öncesinde bu URL’in varlığı, doğruluğu kesin olmadığı için Swift yine Optional tip olarak gösterecektir.
Optional Değerlerin If ile Kontrolü
Eğer yukarıdakiler ve benzer şekilde sabit veya değişken kullanımları gerektiren programlar yazacaksak (ki kesin yazılması gerekecek) Optional tipteki değişken veya sabitin bir değeri olup olmadığını if yapısı ile kontrol etmemiz mümkün olacaktır. Örneğin yukarıdaki URL örneğinin kodlarımdaki gerçek aşağıdaki gibidir.
1 2 3 4 5 6 7 |
if let url = URL(string: "http://www.ntvhava.com/konum/” + sehir + "") //Bu yapı aynı zamanda Optional Binding adıyla bilinir. |
Bu kontrol sayesinde eğer url sabiti bir değere sahipse artık Optional tipten kurtulmuş olacak ve kendi tipinde işlev gösterebilecektir.
1 2 3 4 5 |
var sehir = sehirIsim.text! |
If yapısı kullanmadan da optional yapıyı sorgulamak mümkündür. Yukarıdaki örnekte dışarıdan alınan şehir ismi bilgisini “!” işareti ile varlık elde etmesi için zorluyoruz.
Nil
“nil” değersizlerin değeri olarak tanımlanabilir.
“nil” yalnızca Optional tipteki değişkenlere atanabilmektedir. Aşağıdaki örnekte bu ayrımı göreceğiz.
1 2 3 4 5 6 |
var c: Int? = 3 c = nil |
Burada c değişkenine kesin şekilde Int tipi atamadığımız için alttaki c=nil komutları düzgün çalışacaktır.
1 2 3 4 5 6 |
var c: Int = 3 c = nil |
Şimdi ise c değişkenini kesin olarak Int tipinde yarattığımız için c=nil komutu için
1 2 3 4 5 |
Nil cannot be assigned to type “Int” |
hatası alacağız.
Ayrıca bir Optional değişken veya sabit yaratıp, değer vermezsek otomatik olarak “nil” değeri alacaktır.
Dolaylı Olarak Optional Kontrolü
Bu konuyu aslında yukarıda
1 2 3 4 5 |
var sehir = sehirIsim.text! |
kod satırı ile göstermiştim fakat biraz daha açıklamak istiyorum. Dolaylı olarak Optional kontrolünün amacı bir Optional tipteki değişken veya sabitin Optional kontrolünü yalnızca bir kere yapmaktır. If ile kontrolünü gerçekleştirdiğimiz değişken veya sabitler yalnızca o If bloğu için non-Optional davranacaktır.
Dolaylı olarak kontrolünü Optional kontrolünü sağladığımız değişken veya sabitler arka tarafta Optional olarak görülmesine rağmen, programcıya non-Optional kullanım imkanı sunar. Buna Optional gibi kullanma izni verildi diyebiliriz.
Değişken veya sabit tanımlarken de dolaylı Optional kontrolü yapabilir.
1 2 3 4 5 6 |
var kontrolsüz: String? = "Barış" var kontrollü: String! = "Barış" |
Eğer kontrollü olarak yaratılan ama değer verilmeyen değişken veya sabite erişilmek istenirse run-time error alınacaktır. Kontrol yapılmayan değişken veya sabite erişilmek istenirse ise hata alınmayacak, “nil” değeri elde edilecektir. Bu sebepten dolaylı kontrol ile değişken veya sabit yaratırken değer vermeye veya büyük projelerde If yapısıyla kontrol işlemi yapmaya özen gösterilmelidir.
Devam Yazısı: