[swift-users] Lazily populated dictionary

Rudolf Adamkovič salutis at me.com
Mon Dec 28 13:35:49 CST 2015


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 <erica at 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 at swift.org <mailto:swift-users at 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 at swift.org <mailto:swift-users at swift.org>
>> https://lists.swift.org/mailman/listinfo/swift-users
> 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-users/attachments/20151228/ea838d72/attachment.html>


More information about the swift-users mailing list