İOS Swift

Swift Sınıf ve Structure Yapısı

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 🙂

Yorum Yap