2014-09-22 14 views
6

Sto costruendo un'applicazione con Swift e mi piacerebbe utilizzare una cache LRU nella mia applicazione. Ho implementato un semplice LRUCache<K: Hashable, V> in Swift ma poi ho pensato che dal momento che già viene fornito con le raccolte di dizionari e array, potrebbe mancare una migliore opzione nativa.Implementazione standard di una cache LRU

Ho controllato i documenti e altre domande e non ho trovato nulla di rilevante.

Quindi il mio quesiton è: Swift spedisce con un LRUCache? Se lo fa, come lo uso, se non lo fa: Posso utilizzare una versione di ObjectiveC e mantenere ancora il mio tipo di sicurezza Swift?

risposta

6

Il wrapping NSCache (per il tipo di vincolo) non è un lavoro così difficile.

struct LRUCache<K:AnyObject, V:AnyObject> { 

    private let _cache = NSCache() 

    var countLimit:Int { 
     get { 
      return _cache.countLimit 
     } 
     nonmutating set(countLimit) { 
      _cache.countLimit = countLimit 
     } 
    } 
    subscript(key:K!) -> V? { 
     get { 
      let obj:AnyObject? = _cache.objectForKey(key) 
      return obj as V? 
     } 
     nonmutating set(obj) { 
      if(obj == nil) { 
       _cache.removeObjectForKey(key) 
      } 
      else { 
       _cache.setObject(obj!, forKey: key) 
      } 
     } 
    } 
} 

let cache = LRUCache<NSString, NSString>() 
cache.countLimit = 3 
cache["key1"] = "val1" 
cache["key2"] = "val2" 
cache["key3"] = "val3" 
cache["key4"] = "val4" 
cache["key5"] = "val5" 
let val3 = cache["key3"] 
cache["key6"] = "val6" 

println((
    cache["key1"], 
    cache["key2"], 
    cache["key3"], 
    cache["key4"], 
    cache["key5"], 
    cache["key6"] 
)) 

risultato:

(nil, nil, Optional(val3), nil, Optional(val5), Optional(val6)) 
+2

NSCache * non è * LRU https://github.com/apple/swift-corelibs-foundation/blob/master/Foundation/NSCache.swift – kean

1

Non esiste un'implementazione standard di LRUCache nelle librerie principali Swift, né v'è uno in framework come (Core) Fondazione.

+0

Ma c'è NSOrderedSet che è terribilmente vicino. – gnasher729

+0

Potrebbe essere utilizzato per fornire lo spazio limitato ma non per ultimo lo spazio limitato utilizzato di recente, che è il problema. Ma sì, la tua risposta ha altre strutture dati che potrebbero essere utili per implementare una cache LRU. – AlBlue

2

È possibile utilizzare HanekeSwift, è una bella libreria cache generica scritta in Swift.

+0

Non sto cercando biblioteche, mi dispiace. Ne ho già scritto uno con cui sono contento e volevo assicurarmi che non stavo solo facendo un lavoro eccessivo. –

0

È possibile utilizzare NSOrderedSet che combina NSArray e NSSet per l'avvio; creare una cache LRU da questo è abbastanza banale. O per molti usi, puoi usare NSCache.

0

Dai un'occhiata a SwiftlyLRU su GitHub, è una pura implementazione di Swift. Tempo: O (1), Spazio: O (1) che non presuppone collisioni nella tabella hash interna ed è un singolo file da trascinare nel progetto di destinazione.

https://github.com/justinmfischer/SwiftlyLRU

Problemi correlati