Completion Metotlarının Vazgeçilmezi: Result Type’lar

Cem Kazım
2 min readJun 26, 2021

Herkese merhaba. Uzun bir zamandan sonra güzel bir yazıyla daha karşınızdayım. Bu yazımda sizlere success ya da failure case’lerini handle ettiğimiz completion bloklarında result type’ların kod okunabilirliği açısından ne kadar hayat kurtarıcı ve sağlam yapılar olduğundan bahsedeceğim. Önce bir completion handler nedir ona bir bakalım.

Completion Handler

Completion handler, bir metodun tüm kod satırları tamamlandığı anı dinlememize yarayan metotlardır. Aşağıdaki örnekle bunu konuyu daha iyi kavrayalım.

Gördüğümüz üzere handleEvent adında bir metodumuz var. Bu metodu 20.satırdan sonra ne yapacağına karar vermek için 14.satırda bir completion tetikleyerek 15.satırdaki print metodunun çalışmasını sağlıyorum. Bu yöntem bazen classlar arasında metotları uç uca bağlamada oldukça işe yarayan, hatta kritik birçok konuyu iyi handle eden bir yöntemdir. Detaylarına maalesef girmeyeceğim çünkü asıl konumuz Result Type’lar. Şimdi onlara gelelim.

Result Type

Result Type’ların şöyle bir yapısı var:

Result<T, E>

T: Success case’i için üretilen model

E: Failure case’i için üretilen model

Bu modelleri şöyle bir örnekle inceleyelim. Completion bloğumuzda diyelim ki bir web service request’i yapmak istedik. Ardından bu request’in sonucunu dinleyerek akışımızı handle etmek istiyoruz. Bu noktada Apple’ın bize sunmuş olduğu Result Type yöntemi kod okunabilirliğini oldukça iyi ölçüde artırmış oluyor. Hadi gelin örneğine bir göz atalım.

Öncelikle modellerimizi hazırlayalım.

Burada handleRequest metodumuzu yazdık. Görüldüğü üzere argument olarak completion’ımızı ekledik. Şimdi bu completion’ı modellerimizle beraber özelleştirelim.

Burada dikkat edilirse “Result<BaseResponse, BaseError>” ibaresi bulunmakta. ‘BaseResponse’ dediğimiz noktada success, ‘BaseError’ dediğimiz durumda da failure case’ini belirtiyoruz.

Bu tanımlamayı yaptığımız için de 25.satırdaki blokta bir event beklentisi oluşuyor. Ben success case’ini örnek olması için ekledim ve içerisine de BaseResponse modelini init ederek dahil ettim.

Şimdi bu metodu çağıralım.

Completion’ın bize dönmüş olduğu bir result type’ı bulunmakta. Şimdi bunu bir switch case oluşturarak handle edelim.

Success ve failure olarak iki case’imiz bulunduğu için sadece case’leri eklememiz yeterli. 37.satırda success case’ini tetiklediğimiz için akışın 26.satırın print etmesini bekliyoruz… yani “Successful!” :).

Okuduğunuz için teşekkürler.

--

--