はじめに
EnvironmentValuesを拡張して独自のEnvironmentValueを追加する方法について試したので記事に残しておきます。
開発環境
- macOS Big Sur 11.3.1
- Xcode 12.5
- Swift 5.4
実装
【Swift】NSCacheを使って画像をキャッシュする - Swift・iOSで記載した構造体DefaultImageCacheのインスタンスを、EnvironmentValuesの仕組みを使ってアプリのビューに公開できるようにする。
import UIKit import SwiftUI protocol ImageCache { var cache: NSCache<AnyObject, UIImage> { get set } subscript(key: AnyObject) -> UIImage? { get set } } struct DefaultImageCache: ImageCache { var cache = NSCache<AnyObject, UIImage>() subscript(key: AnyObject) -> UIImage? { get { cache.object(forKey: key) } set(image) { cache.setObject(image!, forKey: key) } } } struct ImageCacheKey: EnvironmentKey { static let defaultValue: ImageCache = DefaultImageCache() } extension EnvironmentValues { var imageCache: ImageCache { get { self[ImageCacheKey.self] } set(image) { self[ImageCacheKey.self] = image } } }
以下のようにEnvironmentプロパティラッパーを使うことで、EnvironmentValuesにアクセスできる。
@Environment(\.imageCache) var cache: ImageCache
おわりに
次回はCombineを使って画像URLから画像を読み込む実装について記事にします。