2016-09-19 28 views
6

Rất nhiều dev muốn mở rộng NSCache để làm cho nó tương thích với các bảng con sử dụng một đoạn mã như ở đây, nhưng điều này đã ngừng hoạt động trong Swift 3. Hiện tại, lỗi đang được theo dõi here on Swift.org. Trong khi chờ đợi, có ai tìm thấy một cách khác để có được kết quả tương tự? Tôi không muốn thay đổi toàn bộ cơ sở mã của tôi, nhưng tôi cũng không biết làm thế nào sớm lỗi này sẽ được giải quyếtTruy cập NSCache thông qua subscript trong 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

Bất kỳ bản cập nhật kể từ Tháng Chín? –

+0

Không phải là tôi biết. – Erik

Trả lời

2

cách giải quyết có thể xảy ra cho đến khi SR-2104 là cố định:

Lựa chọn 1

Khi bạn có thể thay thế đối tượng bộ nhớ cache bằng lớp tùy ý, không được kế thừa từ NSCache, thì bạn có thể bọc NSCache trong vùng chứa chung và chuyển tiếp các phương thức cần thiết:

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) 
      } 
     } 
    } 
} 

Bạn có thể lấy đi giá trị bên trong cache, nếu bạn phải.

Lựa chọn 2

Khi bạn phải tham khảo NSCache, và có số lượng hạn chế của các loại bộ nhớ cache cụ thể, bạn có thể chuyên họ, với mỗi người có thực hiện subscript riêng của mình:

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) 
      } 
     } 
    } 
} 
Các vấn đề liên quan