Swift NSCache Singleton
Aug 31 2020
Я хочу обернуть NSCache в Singleton, чтобы использовать инъекцию зависимостей в моем коде. Это привело, к сожалению, к передаче типа через параметр функции, и мне даже нужны два макета для успеха и неудачи, поскольку это одноэлементный экземпляр.
Я думаю, что может быть лучший способ, но любые комментарии приветствуются!
ImageCache и протокол
protocol ImageCacheProtocol {
static var shared: Self { get }
func getCache() -> NSCache<AnyObject, UIImage>
}
final class ImageCache: ImageCacheProtocol {
var cache: NSCache<AnyObject, UIImage> = NSCache<AnyObject, UIImage>()
public static let shared = ImageCache()
private init() {}
func getCache() -> NSCache<AnyObject, UIImage> {
return cache
}
}
MockImageCache и MockImageCacheFailure
final class MockImageCache: ImageCacheProtocol {
var cache: NSCache<AnyObject, UIImage> = MockNSCache(shouldReturnImage: true)
public static let shared = MockImageCache()
private init() {}
func getCache() -> NSCache<AnyObject, UIImage> {
return cache
}
}
final class MockImageCacheFailure: ImageCacheProtocol {
var cache: NSCache<AnyObject, UIImage> = MockNSCache(shouldReturnImage: false)
public static let shared = MockImageCacheFailure()
private init() {}
func getCache() -> NSCache<AnyObject, UIImage> {
return cache
}
}
Создание экземпляра моей модели представления (фрагмент)
class ViewModel<U: ImageCacheProtocol> {
private var cache: U.Type
init<T: NetworkManagerProtocol>(networkManager: T, data: DisplayContent, imageCache: U.Type) {
self.networkManager = AnyNetworkManager(manager: networkManager)
cache = imageCache
Ответы
WishIHadThreeGuns Sep 02 2020 at 14:29
Да, это не канонический путь. Мое решение - не использовать, Selfа вместо этого сосредоточиться на общем доступе.
Это:
protocol ImageCacheProtocol {
func getCache() -> NSCache<AnyObject, UIImage>
}
final class ImageCache: ImageCacheProtocol {
var cache: NSCache<AnyObject, UIImage> = NSCache<AnyObject, UIImage>()
static var shared = ImageCache()
private init() {}
func getCache() -> NSCache<AnyObject, UIImage> {
return cache
}
}
Затем макеты можно изменить:
final class MockImageCache: ImageCacheProtocol {
var cache: NSCache<AnyObject, UIImage> = MockNSCache(shouldReturnImage: true)
public static var shared: ImageCacheProtocol! = MockImageCache()
func getCache() -> NSCache<AnyObject, UIImage> {
return cache
}
}