Bir iOS uygulamasında çerçeveler arasında köprüler nasıl oluşturulur

Uygulamanızın kodu şöyle görünüyorsa…

“Uygulamamın bu bölümünü dışa aktarmak istiyorum, ancak uygulamanın kalanına bir spagetti tabağı gibi bağlı!”

Uygulamanın çok bağımlı olan küçük bir bölümünü dışa aktarmaya çalışıyor

Üzerinde çalıştığım uygulamanın bir bölümünü modüle etmeye başladığımda, bir duvara çarptım.

Bir hizmeti (aslında İzleme servisi idi) ayrı bir çerçeveye ihraç etmek istedim. Sorun, bu hizmetin uygulamaya zorlukla bağlanmasıydı. Uygulamada derinlemesine bağlantılı bir tane daha kullanarak kendini kullanan başka bir servis kullanıyordu.

İzleme hizmetini dışa aktarmak için tüm hizmet kümesini yeniden çerçevelemek ve yeniden düzenlemek zorunda kalacağım!

Fakat gerçek şu ki, bunu yapacak vaktim olmadı ve regresyon testi bir kabus olurdu ve herhangi bir şirkette (işlem, bütçe, son teslim tarihi) sahip olabileceğiniz birçok başka nedenlerden dolayı.
Bu yüzden, uygulamamın bu bölümünü her şeyi yeniden düzenlemeden nasıl dışa aktaracağımı bulmak zorunda kaldım.

Somut bir örnekle başlayalım!

İşte, öğrenmenin ve işlerin nasıl yürüdüğünü anlamanın en iyi yolu pratik yapmak! (Bu yazının sonunda bu örnek için Github deposunu sağlayacağım)
Yani bağlamı belirleyeyim, sadece 2 ekranlı küçük bir uygulamamız var:

  • Bir ana ekran
  • Bir ödeme ekranı (bu ekranı bir çerçeveye vermek istiyoruz)

Ödeme sayfası, bir kart numarası girmek için bir TextField ve bir Ödeme düğmesi içerir. Düğmesine bastığınızda, ödeme başlatılmalıdır.
Fakat ! Zorluk, ödeme yönteminde yatmaktadır. Diyelim ki biraz önce daha önce bildirdiğim nedenlerden dolayı ödeme hizmetini dışa aktaramıyoruz.

Ana ekran ve Ödeme ekranı

Dolayısıyla iki farklı hedefe ilan edilmiş bu iki ekranımız var. Ana ekran ana uygulama hedefinde ve ödeme ekranı PaymentModule adlı başka bir modülde bildirildi. Ayrıca, ana uygulama hedefinde ilan edilen bir PaymentService’e de sahibiz:

Ödeme yöntemi, çok bağımlı olduğu için uygulamadan çıkaramadığımız yöntemdir. Ancak ödeme modülünden kullanmak istiyoruz.

Ödeme modülünde tanımlanmış bir PaymentViewController var, PaymentService'i aramaya çalışırsak, bu hizmet modülde olmadığı için bir hata yapacağız. Ana hedefi bir modül içinde içe aktaramazsınız (bu saçmalık olur)

Peki, bu yöntemi PaymentViewController'dan nasıl kullanacağız?

Modülde bir protokol tanımlayın

Bu bizim köprümüz olacak. Ana uygulama hedefinde ne kullanmak istediğinizi açıklayan bir yöntemle modülde bir protokol tanımlamanız gerekir.

Öyleyse PaymentServiceProtocol adlı bir protokolü bir yöntem ödeme yöntemiyle tanımlayalım:

Protokolün uygulamada uygulanması

Şimdi PaymentService'e bu protokole uymasını söylemeliyiz. Sadece şunu eklememiz gerekiyor:

“Neden protokolde belirtilen yöntem bu uzantıda uygulanmıyor?”

Haklısın, bir protokole uyurken özelliklerini ve yöntemlerini uygulamanız gerekir. Buradaki hile, protokoldeki yöntem adının, biraz daha önce bildirdiğimiz PaymentService'deki yöntem adıyla tamamen aynı olmasıdır. Bu şekilde, sistem protokol yöntemine erişirken PaymentService sınıfında belirtilen yöntem ücretini kullanmak zorunda kalacağını bilecektir.

İki parçanın bağlanması

Şimdi iki kısma birlikte katılmalıyız.
HomeViewController'dan, “Ödeme sayfasına git” düğmesine tıkladığımızda, PaymentViewController'ı başlatıyoruz. O zaman, bunu PaymentService sınıfına referans olarak göndereceğiz, ancak modüldeki ödeme denetleyicisi bunu PaymentServiceProtocol türü olarak görecek.

İşte püf noktası:

PaymentService.self'i geçiyoruz ve modüldeki kod bir PaymentServiceProtocol.Type görüyor.
Artık modülden app tanımlanan ödeme yöntemini kullanabiliriz!

Köprüyü kullanarak

Şimdi yarattığımız köprüyü kullanmak çok kolay:

Ödeme düğmesine her dokunduğunuzda didTapPayButton yöntemi çağrılır (doğru sesler, doğru mu?). 23. satırda kontrol edin: uygulamadan aldığımız protokol referansındaki ödeme yöntemini çağırıyoruz.

PaymentService bu protokole uygun olduğundan, sistem PaymentService.swift içinde tanımlanan yöntem ödeme içindeki kodu uygulayacaktır.

Başka bir deyişle, başlangıçta modülden arayamadığımız yöntemi kullanıyoruz! Köprü şimdi ayarlandı.

İşte ödeme düğmesine dokunduğunuzda nasıl görünüyor.

Ana modüldeki ödeme yöntemini kullanarak ödeme modülünden

Sonuç

Sonuç olarak, uygulamanızın bir bileşenini bir çerçeveye dışa aktarmak istiyorsanız bu köprüleme yöntemi kullanılabilir.

Bu teknik, uygulamanızın bu bölümünü bir çerçeveye dışa aktarmaya zorlandıysanız ancak sahip olabileceğiniz herhangi bir nedenden ötürü, her şeyi dışa aktaramazsanız, erişteyi kaseden kesmenize izin verecektir.

Bunun için zamana sahip olacağınız zaman, çerçevenin içindeki tüm bileşeni çıkarmadan önce, bunun geçici bir çözüm olduğunu düşünüyorum. (Bu senaryoda, bir gün Ödeme yönteminin içindeki ödeme yöntemini dışa aktarmanız gerekecektir)

İdeal bir dünyada, tek boynuzlu atlarla ve süslü şeylerle, böyle bir şey yapmayacağımızı itiraf ediyorum. Tüm bileşeni ihraç etmeyi tercih ediyoruz, ancak söylediğim gibi, bu her zaman mümkün değildir.

Bu projenin Github deposunu burada bulabilirsiniz, köprünün nasıl yapıldığını kontrol etmek ve kendiniz denemek için tereddüt etmeyin.
Umarım bu yazı yardımcı olabilir, aklınızdaki herhangi bir soruyu sormaktan çekinmeyin!

Bu hikaye, Orta’nın en büyük girişimcilik yayını olan Startup’ta ve ardından +442.678 kişi tarafından yayınlandı.

En iyi hikayelerimizi buradan almak için abone olun.