Üçüncü Parti kütüphaneleri projeden bağımlılıklarını gizleyerek kullanma
Mobil projelerimizde çoğunlukla üçüncü parti kütüphaneler kullanmaktayız. Her ne kadar projede kendi kodlarımızı yazsak da bazı kısımlarda güvenilir üçüncü parti kütüphaneler kullanmak proje sürecini hızlandırmaktadır. Ancak swift sürümünde güncellemelerde bu kütüphanelerin de güncellenmesi gerekebilmektedir. Bu durumu da göz önünde bulundurmak fayda vardır.
Üçüncü Parti kütüphaneleri projeden bağımlılıklarını 2 yöntem ile yapılabilmektedir.
1.Extension'ları kullanma
Direk örnek vererek ilerleyeceğim. Projede fotoğrafları çekmek için bir kütüphane kullandığımızı varsayalım ancak kütüphane desteğini çektiğini duyurdu yada ihtiyaçları karşılamadığı için değişikliğe gidilmek istenildi. Bu durumda tüm projede değişiklik yapmak gerekecektir ve bu oldukça eforlu bir iş haline gelebilir.
Peki nasıl bir kullanım yapılabilir ? Burada yöntemlerden birisi olan Extension
'lar kullanılabilir. Kingfisher
bu kütüphanelerden birisidir ve görselleri set eden bir kod eklemek istersek, aşağıdaki ornek kodda UIImageView
'e bir setImage fonksiyonu verilerek bağımlılıklarını gizleyebiliriz.
import UIKit
import Kingfisher
extension UIImageView {
func setImage(from url: URL) {
kf.setImage(with: url)
}
}
2.Protocol'ları kullanma
Üçüncü parti kütüphanesinin projeden bağımlılıklarını gizlemek için kullanılabilecek bir diğer yöntemdir. Yine bir örnek üzerinden gitmek gerekirse KeychainSwift
örnek verebilir.
Normalde aşağıdaki gibi kullanılmaktadır.
let keychain = KeychainSwift()
keychain.set("hello world", forKey: "my key")
keychain.get("my key") // Returns "hello world"
Ancak bu şekilde kullanmak istemiyoruz. Protocol ile birlikte bir KeychainSwift
nesnesine uyumlu hale getirilerek AuthenticationService
içerisinde tanımlanarak kullanılmak isteniyor. Aşağıda bir servis isteginden dönen token'ların keychain de tutulmasına ornek gösterilmiştir.
Protocol - TokenStore
protocol TokenStore {
var accessToken: String { get set }
var refreshToken: String { get set }
}
Extension - KeychainSwift
extension KeychainSwift: TokenStore {
private enum Keys {
static let accessToken = "accessToken"
static let refreshToken = "refreshToken"
}
var accessToken: String {
get { return get(Keys.accessToken) }
set { set(newValue, forKey: Keys.accessToken) }
}
var refreshToken: String {
get { return get(Keys.refreshToken) }
set { set(newValue, forKey: Keys.refreshToken)}
}
}
Class - AuthenticationService
class AuthenticationService {
private let tokenStore: TokenStore
init(tokenStore: TokenStore) {
self.tokenStore = tokenStore
}
func fetchToken(for credentials: Credentials) {
// Save tokens here
// tokenStore.accessToken =
// tokenStore.refreshToken =
}
}