2016-09-19 24 views
6

में सबस्क्रिप्ट के माध्यम से एनएससीएच तक पहुंचने के लिए बहुत सारे देव यहां कोड स्निपेट की तरह कुछ का उपयोग करके सबस्क्रिप्ट के साथ संगत बनाने के लिए एनएससीएच का विस्तार करना चाहते हैं, लेकिन इसने स्विफ्ट 3 में काम करना बंद कर दिया है। वर्तमान में यह एक ज्ञात बग here on Swift.org ट्रैक किया जा रहा है। इस बीच, क्या किसी को भी एक ही परिणाम प्राप्त करने का कोई और तरीका मिला है? मैं अपने पूरे कोड आधार बदलने के लिए नहीं करना चाहते, लेकिन मैं यह भी नहीं जानता कि कितनी जल्दी इस बग को संबोधित किया जाएगास्विफ्ट 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

सभी अपडेट सितंबर? –

+0

ऐसा नहीं है कि मुझे पता है। – Erik

उत्तर

2

संभावित समाधानों जाता है जब तक SR-2104 तय:

विकल्प 1

आप मनमाने ढंग से वर्ग, NSCache से नहीं ली गई साथ कैश वस्तुओं स्थानापन्न कर सकते हैं, तो आप एक सामान्य कंटेनर में NSCache लपेट सकता है, और आगे के लिए आवश्यक तरीके:

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

यदि आपको जरूरी है तो आप आंतरिक cache मान पास कर सकते हैं।

विकल्प 2

आप NSCache संदर्भ होना चाहिए रहे हैं, और विशिष्ट कैश प्रकार की सीमित संख्या है, तो आप उन्हें, विशेषज्ञ कर सकते हैं हर एक का अपना सबस्क्रिप्ट कार्यान्वयन होने के साथ: के बाद से

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