Swift: Property Wrapper

Property wrapper, bir değer tanımladığımızda, o değer ile otomatik olarak ek işlemler yapmamızı sağlayan bir yapıdır.

Can Balkaya
TurkishKit
2 min readJul 28, 2020

--

Merhaba TurkishKit okuyucuları! 🖖🏻 Bu yazımızda Swift 5.1 ile gelen property wrapper yapısının ne olduğunu ve nasıl kullanabileceğimizi keşfedeceğiz. Hiç vakit kaybetmeden başlayalım! 🤘

Yazı Önerisi 😎

Swift serimizin “Completion Handler” yazısını aşağıdaki linke tıklayarak okuyabilirsiniz.

Property Wrapper Nedir?

Her şeyden önce property wrapper yapısının tam olarak ne olduğunu öğrenelim. Property wrapper, bir değer tanımladığımızda, o değer ile otomatik olarak ek işlemler yapmamızı sağlayan bir yapıdır. Bir sınıfın başına “@propertyWrapper” yazarak o sınıfı bir property wrapper sınıfına çevirebiliriz.

Az önce söylediğimiz gibi bir değerde property wrapper elemanı kullandığımız zaman o değer ile belli işlemler yapabiliriz. Bunun sonucunda da değerimiz değişikliğe uğrar. Bu değer değişikliğini yansıtabilmek için property wrapper elemanımızın içerisinde “wrappedValue” adında bir değişken tanımlamamız gerekmektedir.

Property Wrapper Kullanımı

Örneğin property wrapper kullanarak bir String değerinin bütün karakterlerini küçültebilmek için böyle bir sınıf oluşturabiliriz.

@propertyWrapper
struct Lowercased {
var wrappedValue: String {
didSet { wrappedValue = wrappedValue.lowercased() }
}
init(wrappedValue: String) {
self.wrappedValue = wrappedValue.lowercased()
}
}

Bu tanımlanılan property wrapper sınıfı ile bir değer tanımlamak için o tanımlanacak değeri illa bir sınıfın içerisinde tanımlamamız gerekmektedir.

struct User {
@Lowercased var firstName: String
@Lowercased var secondName: String
}

Bu sınıfın içerisindeki değerleri kullanmak oldukça basittir. 😉

let user = User(firstName: "CAN", secondName: "BALKAYA")
print(user.firstName)

Özelliğin Özellikleri

Bir property wrapper elemanının içerisinde birden fazla özellik kullanabiliriz. Örnek olarak, property wrapper ile tanımlanmış bir değişken tanımlayarak UserDefaults içerisinde veri kaydetmek istediğinizi varsayalım. Burada “wrappedValue” değerinin yanı sıra kullanmanız gereken üç değer vardır: anahtar isim (verinin nereye kaydedileceğini belirtmek için), varsayılan değer ve depolama.

Fark edeceksiniz ki bu sınıfta Generic bir yapı kullanılmıştır. Bunun sebebi UserDefaults içerisinde farklı farklı türlerden (Int, String, …) veriler kaydetmek mümkün olmasıdır.

@propertyWrapper
struct UserDefaultsBacked<Value> {
let key: String
let defaultValue: Value
var storage: UserDefaults = .standard
var wrappedValue: Value {
get {
let value = storage.value(forKey: key) as? Value
return value ?? defaultValue
}
set {
storage.setValue(newValue, forKey: key)
}
}
}

Bu tanımlanan property wrapper sınıfı ile aşağıdaki gibi yeni değerler tanımlayabiliriz.

struct SportViewModel {
@UserDefaultsBacked(key: "is-maximum", defaultValue: true) var isMaximum: Bool
@UserDefaultsBacked(key: "step-count", defaultValue: 20) var stepCount: Int
}

Bir makalemizin daha sonuna geldik. Bu makalemizde property wrapper yapsının ne olduğunu ve nasıl kullanıldıklarını öğrendik. İyi kod yazmalar! 🖥

Bizi daha yakından takip etmek istiyorsanız, sosyal medya hesaplarımıza aşağıdan ulaşabilirsiniz.

Twitter | Instagram | Facebook

--

--