2014-09-22 3 views
6

Я создаю приложение с Swift, и я бы хотел использовать LRU Cache в своем приложении. Я реализовал простой LRUCache<K: Hashable, V> в Swift, но потом понял, что, поскольку он уже поставляется с коллекциями Dictionary и Array, возможно, у меня отсутствует лучший родной вариант.Стандартная реализация LRU Cache

Я проверил документы и другие вопросы и не нашел ничего подходящего.

Итак, мой quesiton: корабль Swift с LRUCache? Если это так, как мне его использовать, если это не так: могу ли я использовать версию ObjectiveC и сохранять свою безопасность типа Swift?

ответ

6

Обертка NSCache (для ограничения типа) не так тяжелая работа.

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"] 
)) 

результат:

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

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

1

Существует не стандартная реализация LRUCache в Swift основных библиотеках, ни есть один в рамках как (основной) фонд.

+0

Но есть NSOrderedSet что очень близко. – gnasher729

+0

Его можно использовать для обеспечения ограниченного пространства, но не в последнюю очередь - используемого ограниченного пространства, которое является проблемой. Но да, ваш ответ имеет другие структуры данных, которые могут быть полезны для реализации кеша LRU. – AlBlue

2

Вы можете использовать HanekeSwift, это хорошая общая библиотека кеширования, написанная в Swift.

+0

Я не ищу библиотеки, извините. Я уже написал один, с которым согласен, и хотел удостовериться, что я не просто делаю лишнюю работу. –

0

Вы можете использовать NSOrderedSet, который объединяет NSArray и NSSet для запуска; создание кеша LRU из этого довольно тривиально. Или для многих целей вы можете использовать NSCache.

0

Взгляните на SwiftlyLRU на GitHub, это чистая реализация Swift. Время: O (1), Пространство: O (1), которое не принимает коллизий во внутреннюю хэш-таблицу и является единственным файлом, который перетаскивается в целевой проект.

https://github.com/justinmfischer/SwiftlyLRU

Смежные вопросы