Instance&Type Methods, Static&Class Functions— Swift

Ahmet Bekir Bakkal
DigiGeek
Published in
3 min readDec 15, 2022

Merhabalar,

Static ve class fonksiyonları sıklıkla kullanırız. Bu tanımlamaların özelliklerini, farklarını ve ihtiyaca göre doğru bir şekilde nasıl kullanıldığını bu yazıda kısaca anlatmaya çalışacağım.

Hepimizin bildiği gibi fonksiyonlar; belirli bir işlemi gerçekleştiren ve o işlemin tekrar tekrar kullanılabilir olmasını sağlayan bağımsız kod parçacıklarıdır. Aslında; nesne yönelimli programlamanın (OOP) da kapsülleme(encapsulation) ilkesini güçlendirirler.

Aşağıdaki örnekte addStar() ve deleteStar(_ value: Int) fonksiyon olarak tanımlanan kod parçacıklarıdır.

class MilkywayGalaxy {
var starCount = 0

func addStar() {
starCount += 1
}

func deleteStar(_ value: Int) {
starCount += value
}
}

Instance Methods

Konuyu detaylara boğmadan bir örnek üzerinden açıklamaya çalışalım. Uygulamalarımızdaki verileri depolamayı, paylaşmayı ve yönetmeyi sağlamak için Instance Method’lar kullanılır.

Aşağıdaki örnekte bir “çalışan” instance’ı görüyoruz. Burada tanımladığımız fonksiyonlar bir şirketteki çalışanın bilgilerini yönetmemizi sağlıyor.

class Employee {
var name: String
var yearOfBirth: Int
var department: String

init(name: String, yearOfBirth: Int, department: String) {
self.name = name
self.yearOfBirth = yearOfBirth
self.department = department
}

func changeDepartment(newDepartment: String) {
department = newDepartment
}

func getAge() -> Int {
let now = Date()
let ageComponents = Calendar.current.dateComponents([.year], from: yearOfBirth, to: now)
return ageComponents.year!
}
}


let veli = Employee(name: "Veli", yearOfBirth: 1994, department: "Software")
let age = veli.getAge()
print(age) // 28
print(veli.department) // Software
veli.changeDepartment(newDepartment: "Security")
print(veli.department) // Security

Type Methods

Instance’ların kendi içlerindeki özelliklerini yönetirken Static ve Class tiplerinde fonksiyonlar kullanabiliriz. Bu şekilde kullanılan fonksiyonlara “type methods” denir.

Şimdi Static ve Class fonksiyonlarının nasıl kullanıldığını ve major farklılıklarını yine bir örnek üzerinde açıklayalım.

Static Functions vs Class Functions


class Instance {
init() { }
class func first() { print("Instance class - first()") }
class var variableFirst: String { return "Instance class variable" }

static func staticFunction() { print("Instance staticFunction()") }
static var staticVariable = "Instance static variable"

final func finalFunction() { print("Instance finalFunction()") }
final class func finalClassFunction() { print("Instance finalClassFunction()") }
}

class SubInstance: Instance {
override class func first() { print("SubInstance - first()") }
override class var variableFirst: String { return "SubInstance class variable" }

// ERROR: Cannot override static method
override static func staticFunction() { }
// ERROR: Method does not override any method from its superclass
override final func yesFinal() { }
}

Yukarıdaki örnekte içinde static ve class tipinde nesneler olan bir Instance sınıfı oluşturduk. Aynı zamanda bu Instance sınıfından türeyen bir SubInstance sınıfı oluşturduk.

Buradaki örnekte gördüğümüz gibi; class tipinde oluşturduğunuz nesneleri SubInstance sınıfında override edip kullanabildik fakat static nesneleri override edemedik ve compile time’da hata aldık.

SubInstance üzerinden eriştiğimiz değerlerin sonuçları da şöyle:

SubInstance.first() // "SubInstance - first()"
SubInstance.variableFirst // "SubInstance class variable"
SubInstance.staticFunction() // "Instance staticFunction()"
SubInstance.staticVariable // "Instance static variable"
SubInstance.finalClassFunction() // "Instance finalClassFunction()"

Bu sonuçtan yola çıkarak major farklılıklarını ve benzerlikleri aşağıdaki gibi;

  • Her iki tipte de herhangi bir instance oluşturmadan doğrudan nesneye erişebiliriz.
  • Static fonksiyonlar override edilemez fakat class fonksiyonları override edilebilir.
  • Static fonksiyonlar Static Dispatch(Direct Dispatch) yöntemini kullandığı için oldukça performanslıdırlar. Fakat class fonksiyonlar (final class olmadıkları sürece) Dynamic Dispatch kullandıkları için performans açısından çok daha zayıftırlar.

Static Dispatch ve Dynamic Dispatch arasındaki farkları daha iyi anlamak için aşağıdaki yazı incelenebilir :)
https://medium.com/@bakshioye/static-vs-dynamic-dispatch-in-swift-a-decisive-choice-cece1e872d

  • Static fonksiyonlar Static Dispatch oldukları için value type nesnelerde Struct, Enum, Tuple vs. kullanılabilirler.

Sonuç

Bu yazımızda static&class type’ları, major benzerliklerini ve farklarını inceledik.

Bir sonraki yazıda görüşmek üzere. Sağlıkla kalın. :)

--

--