2016-09-19 11 views
6

Wielu programistów lubi rozszerzać NSCache, aby był kompatybilny z indeksami dolnymi, używając czegoś takiego jak fragment kodu tutaj, ale to przestało działać w Swift 3. Jest to obecnie znany błąd śledzony here on Swift.org. W międzyczasie, czy ktoś znalazł inny sposób na uzyskanie tego samego wyniku? Nie chcę, aby zmienić całe moje bazę kodu, ale ja też nie wiem, jak szybko ten błąd zostanie skierowanaUzyskiwanie dostępu do NSCache za pośrednictwem indeksu podrzędnego w Swift 3

// Allows using subscripts on NSCache, like a dictionary 
extension NSCache { 
subscript(key: AnyObject) -> AnyObject? { 
    get { 
     return object(forKey: key as! KeyType) 
    } 
    set { 
     if let value: AnyObject = newValue { 
      setObject(value as! ObjectType, forKey: key as! KeyType) 
     } else { 
      removeObject(forKey: key as! KeyType) 
     } 
    } 
} 
+0

każdej aktualizacji od Wrzesień? –

+0

Nie jestem tego świadomy. – Erik

Odpowiedz

2

Możliwe obejścia aż SR-2104 jest stała:

Opcja 1

Kiedy można zastąpić przedmiotów cache z dowolną klasę, nie odziedziczonym NSCache, wtedy mógłby zawinąć NSCache w ogólnej pojemnika i przekazuje niezbędne metody:

class WrappedCache<Key, Value> where Key: AnyObject, Value: AnyObject { 

    let cache = NSCache<Key, Value>() 

    subscript(key: Key) -> Value? { 
     get { 
      return cache.object(forKey: key) 
     } 
     set { 
      if let newValue = newValue { 
       cache.setObject(newValue, forKey: key) 
      } 
      else { 
       cache.removeObject(forKey: key) 
      } 
     } 
    } 
} 

Możesz odejść przekazując wewnętrzną wartość cache, jeśli musisz.

Opcja 2

Kiedy trzeba odwołać NSCache i mają ograniczoną liczbę konkretnych typów skrytek, można je specjalizować, z których każdy posiada własną implementację indeksie:

class NumberCache : NSCache<NSString, NSNumber> { 

    subscript(key: NSString) -> NSNumber? { 
     get { 
      return object(forKey: key) 
     } 
     set { 
      if let newValue = newValue { 
       setObject(newValue, forKey: key) 
      } 
      else { 
       removeObject(forKey: key) 
      } 
     } 
    } 
} 
Powiązane problemy