Sınıf Yapısı
Sınıflar, programlarımızı yazmak için kullandığımız ve bunu yaparken de değişkenleri, sabitleri, metodları vs. tanımladığımız yapılara verilen genel isimdir.
Objective C ‘deki sınıf mantığı Swift programlama dili ile değişti. Bu yazımda bahsettiğim interface ve implementation kısımlarının ayrı ayrı kullanıldığı yapı kalkıyor ve yerine artık tek bir dosya ile bunu halledebildiğimiz yapı geliyor.
Sınıf ve Structure Yapılarının Karşılaştırılması
Sınıf ve Structure yapıları, bir çok özellik yönünden benzerlik göstermektedir. Bu iki yapıdada bulunan özellikler şunlardır:
- Veri tutmak için property tanımlama
- Fonksiyonellik için metodlar tanımlama
- Subscript tanımlama
- İlk değer için initializer tanımlama
- Fonksiyonaliteyi artırmak için default yapıyı genişletebilme
- Belirli türlerde standart fonksiyonaliteyi sağlamak için protokollere uyumlu olmak
Bunların yanı sıra, Sınıf’da olupda Structure’da olmayan aşağıdaki özellikler mevcuttur:
- Inheritance
- Çalışma esnasında bir sınıf instannce’ının tipini yorumlama ve kontrol etme
- Bir instance’ı release edip yerini boşaltabile
- Bir’den fazla referansın bir sınıf instance’ını işaret edebilmesi
Tanımlama Syntax’ı
Sınıflar ve structure’lar benzer tanımlama syntax’ına sahiptir. Sınıfları tanımlarken class, structureları tanımlarken struct keywordünü kullanırız.
class ClassName { //Sınıf tanımlaması burada yapılır. } struct StructName { //Structure tanımlaması burada yapılır. }
Apple’ın “The Swift Programming Language” kitabındaki örnek üzerinden konuyu daha ayrıntılı inceleyelim.
Sınıf ve Structure Tanımlama
struct Resolution { var width = 0 var height = 0 } class VideoMode { var resolution = Resolution() var interlaced = false var frameRate = 0.0 var name: String? }
Örneğimizde VideoMode isminde bir sınıf tanımladık. Bu sınıf içerisinde resolution, interclased, frameRate ve name isimlerinde 4 adet property var.
Yeni Bir Instance Türetme
Oluşturduğumuz sınıf ve structure’dan someVideoMode ve someStructure isimlerinde instance türetelim.
let someResolution = Resolution () let someVideoMode = VideoMode()
Propertylere Erişme
println("someResolution'ın genişliği: (someResolution.width)") //Konsola "someResolution'ın genişliği: 0" yazdıracaktır. println("someVideoMod'un genişliği: (someVideoMode.resolution.width)") //Konsola "someVideoMod'un genişliği: 0" yazdıracaktır. someVideoMode.resolution.width = 1280 println("someVideoMod'un şu anki genişliği: (someVideoMode.resolution.width)") //Konsola "someVideoMod'un şu anki genişliği: 1280" yazdıracaktır. let hd = Resolution(width:1920, height:1080) var cinema = hd //hd adında bir resolution tanımladık. Daha sonra cinema değişkenine bunu atadık. //Bu durumda hd ve cinema değişkenlerinin ikisi de aynı width ve height değerlerine sahip cinema.width = 2048 println("cinema'nın genişliği : (cinema.width) px") //konsola "cinema'nın genişliği : 2048 px" yazacaktır. println("hd genişliği ise hala : (cinema.width) px") //konsola "hd genişliği ise hala : 1920px" yazacaktır.
Sınıflarda Referans
let tenEighty = VideoMode() tenEighty.resolution = hd tenEighty.interlaced = true tenEighty.name = "1080i" tenEighty.frameRate = 25.0 let alsoTenEighty = tenEighty alsoTenEighty.frameRate = 30.0 println("tenEight'nin yeni frameRate değeri: (tenEighty.frameRate)") //Konsola "tenEight'nin yeni frameRate değeri: 30" yazacaktır.
Üstteki örnekte tekEighty isminde VideoMode instance’ı türettik. Property’lerinin değerlerini atadık. Daha sonra alsoTenEighty diye bir değişkene tenEighty’i atadık.
Fark ettiğiniz üzere, biz alsoTenEight’nin frameRate değerini değiştirdiğimiz halde, tenEighty’nin de frameRate değeri değişti.
Bunun sebebi, tenEighty ve alsoTenEight’nin değişken(variable) değil sabit(constant) olması. Bu iki değer VideoMode instance’ını tutmuyor. Biz bir değer değiştirdiğimiz zaman, onların referans gösterdiği arkadaki VideoMode instance ı değişiyor 🙂