2015-11-02 59 views
1

以下代碼工作得非常好,但我很驚訝,因爲我認爲NSCache將需要對象鍵值&值,並且不會採用CGFloat s。有人可以向我解釋發生了什麼事嗎?非對象類型的NSCache行爲

class A 
    var cachedPoints = NSCache() 

    func rAt(theta theta: CGFloat) -> CGFloat {   
     if let r = self.cachedPoints.objectForKey(theta) as? CGFloat { 
      return r 
     } 
     // do some very expensive maths here... 
     let r = self.veryExpensiveFunction(theta) 
     self.cachedPoints.setObject(r, forKey: theta) 
     return r 
    } 
} 
+0

你在問題中提到了CGPoint,但是這在代碼中沒有發生。你的意思是CGFloat? –

+0

哎呀,是的。將編輯。 – Grimxn

回答

2

Working with Cocoa Data Types 「使用夫特與可可和Objective-C」 文檔:

編號

夫特自動橋接某些天然數類型,如IntFloat,至NSNumber
...
它還允許您將類型爲Int的值傳遞給期望NSNumber的參數。

說明文檔中提到IntUIntFloatDoubleBool 作爲自動橋接NSNumber,但顯然 這個工程的CGFloat以及(若 「基金」 是進口的)類型。 所以在

self.cachedPoints.setObject(r, forKey: theta) 

rtheta被包裹成NSNumber實例 ,然後傳遞到所述setObject()方法,該方法有兩個參數AnyObject類型的 。

還有一個反向橋接,但這是 較少記錄(或我無法找到它)。您都可以投射NSNumber的 實例CGFloat(或IntFloat,...)

let num : NSNumber = ... 
let x = num as CGFloat 

,結果是一樣的,如果你叫doubleValue(或floatValue,取決於架構)上的數字實例。 在

let obj : AnyObject = ... 
let y = obj as? CGFloat // CGFloat? 

對象任選轉換爲NSNumber和 - 如果這是成功 - 轉換爲CGFloat如前面的例子英寸

和在

if let r = self.cachedPoints.objectForKey(theta) as? CGFloat { ... } 

會發生什麼。如果從objectForKey()返回值是一個NSNumber然後 它轉化爲CGFloat並分配給r。否則, 可選綁定失敗。

+0

非常感謝!我最初使用NSNumber,但它看起來如此笨重,比我剛決定嘗試的'Dictionary'用法更笨拙。看起來我需要重新閱讀這些書! – Grimxn

相關問題