That’s a nice one, Erica.

Does this mean there’s nothing ready-made for this in the standard library?

P.S. No need for the builder dictionary. A simple static function (T->U) would 
be more enough for my use-case.

R+

> On 28 Dec 2015, at 20:26, Erica Sadun <er...@ericasadun.com> wrote:
> 
> Maybe something like this?
> 
> struct KeyedLazyCache<T: Hashable, U> {
>     var backingDictionary: Dictionary<T, U>
>     var builderDictionary: Dictionary<T, () -> U>
>     mutating func clear() {backingDictionary.removeAll()}
>     mutating func valueForKey(key: T) -> U? {
>         if let value = backingDictionary[key] {return value}
>         if let builder = builderDictionary[key] {
>             let value = builder()
>             backingDictionary[key] = value
>             return value
>         }
>         return nil
>     }
> }
> 
> -- E
> 
>> On Dec 28, 2015, at 11:36 AM, Rudolf Adamkovič via swift-users 
>> <swift-users@swift.org <mailto:swift-users@swift.org>> wrote:
>> 
>> Hi there!
>> 
>> In my app, I have a very simple class that serves as a key-value cache. The 
>> whole thing is basically a lazily populated [String: AVAudioPCMBuffer] 
>> dictionary with a String -> AVAudioPCMBuffer function that generates values 
>> as needed:
>> 
>> final class PlayerAudioCache {
>>     
>>     // MARK: Retrieving audio buffers
>>     
>>     func audioBufferForAssetWithName(name: String) -> AVAudioPCMBuffer? {
>>         addAudioBufferForAssetWithNameIfNeeded(name)
>>         return cachedAudioBuffers[name]
>>     }
>>     
>>     // MARK: Adding audio buffers
>>     
>>     func addAudioBufferForAssetWithNameIfNeeded(name: String) {
>>         guard cachedAudioBuffers[name] == nil else { return }
>>         addAudioBufferForAssetWithName(name)
>>     }
>>     
>>     private func addAudioBufferForAssetWithName(name: String) {
>>         guard let dataAsset = NSDataAsset(name: name) else { fatalError() }
>>         cachedAudioBuffers[name] = dataAsset.map { URL -> AVAudioPCMBuffer in
>>             AVAudioPCMBuffer(contentsOfURL: URL)!
>>         }
>>     }
>>     
>>     private var cachedAudioBuffers: [String: AVAudioPCMBuffer] = [:]
>>     
>> }
>> 
>> I feel like there is a pre-made type in Swift’s standard library for what 
>> I’m doing here. Am I right?
>> 
>> Ideas? Pointers?
>> 
>> Thank you!
>> 
>> R+
>> 
>> _______________________________________________
>> swift-users mailing list
>> swift-users@swift.org <mailto:swift-users@swift.org>
>> https://lists.swift.org/mailman/listinfo/swift-users
> 

_______________________________________________
swift-users mailing list
swift-users@swift.org
https://lists.swift.org/mailman/listinfo/swift-users

Reply via email to