Swift・iOS

Swiftを中心に学んだことを記録に残すブログです。技術に関係ない記事もたまに書いています。

【SwiftUI】EnvironmentValuesに独自のEnvironmentValueを追加する

 

はじめに

EnvironmentValuesを拡張して独自のEnvironmentValueを追加する方法について試したので記事に残しておきます。

 

開発環境

 

実装

【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から画像を読み込む実装について記事にします。

 

参考