Swift 5.2 ile Gelen Yenilikler
Swift 5.2'nin ilk beta sürümü Xcode 11.4 beta ile yayınlandı. Kod boyutu ve bellek kullanımındaki azalmanın yanı sıra dil değişiklikleri ve hataların daha hızlı teşhis edilmesine yardımcı olacak yeni bir hata tespit mimarisi içeriyor.
Bu incelemede, yapılan değişiklikleri bazı örneklerle inceleyeceğiz, yeniliklerin ne amaçla geliştirildiğini daha iyi anlamaya çalışacağız.
Fonksiyon olarak Key Path Expressions
SE-0249 ile keypath'leri bazı özel koşullarda kullanmamızı sağlayacak yararlı bir kısayol tanıtıldı.
Yeni kısayol şu kalıpla açıklanıyor:
“\Root.value wherever functions of (Root) -> Value are allowed”
Örnek üzerinden daha iyi anlayacağımızı düşünüyorum. Öncelikle 3 değişkeni ve 1 metodu bulunan User struct'ını oluşturalım.
Bu struct'ı kullanarak 3 adet obje oluşturalım ve bunları users array'ine dahil edelim.
Yeni Keypath'in Kullanalım: Tüm kullanıcıların name değerinden oluşan bir dizi elde etmek isterseniz, aşağıdaki key path'i kullanarak bunu gerçekleştirebilirsiniz.
Önceden name alanını elde etmek için aşağıdaki şekilde closure yazmak gerekiyordu.
Aynı yaklaşım filtrelemede de kullanılabiliyor. canVote metoduna true dönen tüm kullanıcıların listesi aşağıdaki şekilde elde edilebiliyor.
compactMap ile kullanımda da bestFriend değişkenine sahip kullanıcıların listesi çekilebilir.
Kullanıcı tanımlı nominal tiplerin çağrılabilir değerleri: callAsFunction()
SE-0253 ile Swift'e eklenen statik çağrılabilir değerler (callable values) tanıtıldı. Özetle bir objeye callAsFunction() adında bir metod implement edilirse obje çağırıldığı her noktada bu metod otomatik olarak çalıştırılıyor ve istenilen formatta data dönüşü sağlayabiliyor.
Tekrar örnek üzerinden gidelim. Örneğin, lowerBound ve upperBound değişkenlerine sahip bir Dice struct'ı oluşturalım. Ardından callAsFunction() metodunu ekleyelim. Böylece her zar değeri çağırıldığında random bir sayı elde ederiz:
Aslında aşağıdaki şekilde callAsFunction() metodunu kullanmakla aynı işlemi gerçekleştirdik. Ancak metodu yazmamıza gerek kalmadan !
Swift, callAsFunction() metodunuzun tanım şekline göre otomatik olarak dönüş değerinin cast edileceği değeri tespit eder. Örneğin, istediğimiz kadar parametre ekleyebiliriz, dönüş değerini kontrol edebiliriz.
Örnek olarak, bir kişinin ne kadar yürüdüğünü rakip eden ve 10.000 adımlık hedefe ulaşıp ulaşmadığını bildiren bir StepCounter struct'ı oluşturalım:
Daha gelişmiş kullanımlar için callAsFunction() hem fırlatma (throws) hem de geri alma (rethrows) işlemlerini destekler. Tek bir türde birden fazla callAsFunction() metodu bile tanımlanabilir. Swift, overloading gibi call site'a göre doğru olanı seçer.
Subscript'lerin Default Arguments Döndürebilmesi
Örnek üzerinden gidecek olursak, aşağıdaki şekilde PoliceForce adında bir struct oluşturduğumuzu düşünelim. Bu sınıf içinde officer'ları dönen custom bir subscript oluşturalım.
Gelen yenilikle birlikte artık bu subscript'den default parametresi dönebiliyoruz. Bu örnekte officers array'inden index'i dışında bir kayıt okunmak istendiğinde hata oluşturmak yerine default parametresini geri yolladık.
Çıktı olarak ilk satırda (force) "Amy" sonrasında (force) "Unknown" yazdırılacaktır. Çünkü index 5'de bir item mevcut değil.
Hata durumunda dönecek default parametresi, item'a aşağıdaki şekilde erişilirken de belirtilebilir.
Yeni ve Geliştirilmiş Hata Yakalama Mimarisi
Swift 5.2 ile birlikte, bir kodlama hatası yapıldığında Xcode tarafından verilen hata mesajlarının kalitesini ve hassasiyetini artırmayı amaçlayan yeni bir hata yakalama mimarisi geliştirildi. Yeni yapı özellikle SwiftUI ile çalışırken alınan false positive hata mesajlarını hedef alıyor.
Aşağıdaki örnek üzerinden bir senaryoyu anlamaya çalışalım.
Örnekte TextField'ın view'ına invalid bir integer @State property bağlanmaya çalışılıyor.
Swift 5.1'de bu durumda frame() modifier aşağıdaki hata mesajıyla bir hata oluşturuyor:
'Int' is not convertible to 'CGFloat?’
Ancak Swift 5.2 ile birlikte bu hata daha doğru şekilde $name binding ile hatayı aşağıdaki şekilde adresliyor:
Cannot convert value of type 'Binding' to expected argument type 'Binding’
Yeni diagnostic mimariyle ilgili daha detaylı bilgiye buradan erişebilirsiniz.
Yazının orjinali için: https://www.hackingwithswift.com/articles/212/whats-new-in-swift-5-2
#swift #swift5 #callAsFunction