Swift: typealias
Typealias sayesinde mevcut eleman tiplerinize takma ad vererek isim karmaşasından kurtulabiliriz.
Merhaba TurkishKit okuyucuları! 👋🏻 Bugünkü yazımızda typealias yapısının ne olduğunu ve nasıl kullanabileceğimizi öğreneceğiz. Bu sayede çok daha okunabilir ve düzgün kodlar yazabileceksiniz.
Typealias Nedir?
Typealias mevcut veri tiplerimiz yerine takma adlar oluşturmamızı sağlayan bir yapıdır. Bir veri türü için takma ad belirlediğimizde program boyunca o veri türünü kullanmak yerine oluşturduğumuz takma adı kullanabiliriz.
Unutmamak gerekir ki typealias yeni bir tip oluşturmaz, mevcut bir tipe referans verir.
Kullanım Alanları
Typealias yapısını veri türünün karmaşık olduğu veya tekrar tekrar aynı veri türünü yazmamız gereken her yerde daha okunabilir ve sade kod yazmak amacıyla kullanabiliriz.
Nasıl typealias Kullanılır?
Typealias yapısını oluşturmak oldukça basit. “typealias” anahtar kelimesini yazdıktan sonra oluşturmak istediğimiz takma adı ve bu takma ada karşılık gelecek olan veri türünü yazıyoruz.
typealias isim = mevcutIsim
Hadi Kodlayalım!
Nasıl kullanıldığını daha iyi anlamak için Double
türünden bir değerin türünü Dolar
adıyla nasıl değiştirebileceğimizi görelim! 🚀
struct Makbuz {
let toplamTutar: Double
}
Yukarıda gördüğünüz gibi “Makbuz” adında bir yapı oluşturduk ve içinde toplamTutar
isimli Double
türünden bir değişken tanımladık. Bu Double
türünün ismini Dolar
olarak değiştirmek için typealias kullanmalıyız:
typealias Dolar = Double
Artık Double
türündeki elemanların türünü Dolar
olarak tanımlayabiliriz.
struct Makbuz {
let toplamTutar: Dolar
}
Bu şekilde, elemanımızın türünü Double
yerine Dolar
yazarak kendisini daha kolay okunabilir hale getirdik. Aslında, arka tarafta hiç bir şey değişmedi. Sadece Double
yerine Dolar
yazabiliyoruz. Yani elemanımız arka tarafta yine Double
türündedir.
Typealias Yeni Bir Tür Mü?
Typealias yeni bir tür değildir. Basitçe, mevcut veri türümüze verdiğimiz bir takma addır. Örneğin yukarıdaki bir önceki örnekteki Dolar
yapımız sadece farklı bir ada sahip Double
türüdür. Bu sebeple Double
kullanmamız gereken her yerde Dolar
yapısını kullanabiliriz.
Aynı zamanda bu durum tam tersi şekilde de olabilir. Bir typealias yapısına extension oluşturursanız, aslında o typealias yapısının altındaki tür için extension oluşturursunuz.
Bunu biraz daha iyi anlamak için hem Dolar
hem de Double
için kullanılabilir olan aşağıdaki euro()
metoduna bakalım.
typealias Dolar = Double
typealias Euro = Doublestruct Makbuz {
let toplamTutar: Dolar
}extension Dolar {
func euro() -> Euro {
return self * 0.896
}
}let makbuz = Makbuz(toplamTutar: 10)
makbuz.toplamTutar.euro() // 8.96let ondalikliSayi: Double = 10
ondalikliSayi.euro() // 8.96
Gördüğünüz üzere “Dolar” ve “Euro” olarak iki tane typealias oluşturduk. Dolar
yapısına euro()
isimli bir metod ekledik ve daha sonra euro()
metodunu hem Double
hem de Dolar
için kullanabildik.
Hazırsanız şimdi biraz daha derine inelim! 😎
Typealias ile Generic Kullanımı
Typealias yapısının bize çok yardımcı olduğu yerlerden biri de generic yapılarıdır. Generic yapılar typealias ile birlikte kullanılabilir. Örneğin, Swift’ dilindeki Result
türünün ismini “ExchangeResult” olarak değiştirebiliriz. Bu okunabilirliğimizi ve sadeliği çok fazla arttıracaktır.
typealias Dolar = Double
typealias Euro = Doublestruct Makbuz {
let toplamTutar: Dolar
}typealias ParaBirimi = Double
typealias ExchangeResult<ParaBirimi> = Result<ParaBirimi, Error>enum ExchangeError: Error {
case invalidInput
}extension Dolar {
func euro() -> ExchangeResult<Euro> {
guard self > 0 else {
return ExchangeResult.failure(ExchangeError.invalidInput)
} return Result.success(self * 0.896)
}
}let makbuz = Makbuz(toplamTutar: 10)
makbuz.toplamTutar.euro() // .success(8.96)let ondalikliSayi: Double = 10
ondalikliSayi.euro() // .success(8.96)
Hadi şimdi burada neler oluyor bakalım.
“ParaBirimi” adında Double
türünde bir typealias oluşturduk.
typealias ParaBirimi = Double
Oluşturduğumuz ParaBirimi
türünü ve Result<Currency, Error>
yapısını kullanan bir generic yapı oluşturduk.
typealias ExchangeResult<ParaBirimi> = Result<ParaBirimi, Error>
“ExchangeError” isimli Error
değeri olan bir enum
yapısı oluşturduk ve içinde “invalidInput” isimli bir case
tanımladık.
enum ExchangeError: Error {
case invalidInput
}
Dolar
yapısına, Euro
değeri bulunduran ExchangeResult
yapısını döndüren euro()
isminde bir metod ekledik.
extension Dolar {
func euro() -> ExchangeResult<Euro> {
guard self > 0 else {
return ExchangeResult.failure(ExchangeError.invalidInput)
} return Result.success(self * 0.896)
}
}
Gördüğünüz üzere oluşturduğumuz euro()
metodunu hem içindeki Dolar
türünden olan toplamTutar
ile hem de Double
ile birlikte kullanabildik.
let makbuz = Makbuz(toplamTutar: 10)
makbuz.toplamTutar.euro() // .success(8.96)let ondalikliSayi: Double = 10
ondalikliSayi.euro() // .success(8.96)
Typealias Yapısının Diğer Kullanım Alanları
Typealias yapısı projelerde sıkça “Completion Handler” yerine de kullanılır:
typealias Completion = () -> Void
Ayrıca birden çok tür bulunduran bir delegate yapısı oluştururken de typealias yapısından yararlanabiliriz:
typealias TransitionDelegate = UIViewController & UIViewControllerTransitioningDelegate
Ya da birden çok yerde kullanacağımız bir Dictionary
türünü veya diğer türleri de typealias ile basitleştirebiliriz:
public typealias TrackingProperties = [String: Any]
CompletionHandler Olarak Typealias
Typealias yapısının en çok kullanıldığı yerlerden biri de “Completion Handler” yapısıdır. Şimdi typealias yapısının “Completion Handler” olarak nasıl kullanıldığını daha yakından inceleyelim.
func getDailyWeather(cityName: String, dailyCompletion: @escaping (CurrentWeather?,Error?) -> Void){
//…}func getWeeklyWeather(cityName: String, weeklyCompletion: @escaping ([CurrentWeather]?, Error?) -> Void){
//…}func getAllWeather(cityName: String, dailyCompletion: @escaping (CurrentWeather?,Error?) -> Void, weeklyCompletion: @escaping ([CurrentWeather]?, Error?) -> Void){
//…
}
Oldukça karmaşık gözüken bu üç fonksiyon aslında typealias kullanarak çok daha okunulabilir hale gelebilir.
typealias CompletionDailyWeather = (CurrentWeather?, Error?) -> Voidtypealias CompletionWeeklyWeather = ([CurrentWeather]?, Error?) -> Voidfunc getDailyWeather(cityName: String, dailyCompletion: @escaping CompletionDailyWeather) {
//…
}func getWeeklyWeather(cityName: String, weeklyCompletion: @escaping CompletionWeeklyWeather) {
//…
}func getAllWeather(cityName: String, dailyCompletion: @escaping CompletionDailyWeather, weeklyCompletion: @escaping CompletionWeeklyWeather) {
//…
}
Görüldüğü üzere bu parametreleri CompletionDailyWeather
ve CompletionWeeklyWeather
olarak iki ayrı typealias yapısına dönüştürdük. Bu sayede çok daha okunaklı ve bir o kadar da sade fonksiyonlar elde ettik.
Bu makalede typealias kullanarak nasıl kodlarımızı daha okunabilir ve sade yapabileceğimizi öğrendik. Umarım bu bilgiler işinize yarar ve kodlarınızı çok daha temiz ve okunabilir hale getirmenizde yardımcı olur. Sonraki makalelerde görüşmek üzere. Bol kodlu günler diliyorum! 💻
Swift Öğrenin. Uygulama Geliştirin. Sınırların Ötesine Geçin.
Hem kod yazmaya yeni başlayanların hem de profesyonellerin rahatlıkla takip edebilecekleri 40 saatlik videolu eğitim ile Swift programlama dilini derinlemesine keşfedin. Eğitim boyunca karşılaşacağınız problemleri birebir online görüşmelerde çözün.