2

NSCache次のコードは完全にうまく機能しますが、オブジェクトのキーと値が必要で、s を必要としないと思っていたので、私は驚いていますCGFloat。誰かが私に何が起こっているのか説明できますか?

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

1 に答える 1

2

「Using Swift with Cocoa and Objective-C」ドキュメントの「Working with Cocoa Data Types 」から:

数字

Int Swift は、やなどの特定のネイティブの数値型を に自動的にブリッジFloatNSNumberます。
...また、 type の値を、たとえば . を期待する引数
に渡すこともできます。IntNSNumber

Intドキュメントでは、UIntFloatDouble、 にBool 自動的にブリッジされるタイプとして言及されていますNSNumberが、明らかにこれはCGFloat同様に機能します (「Foundation」がインポートされている場合)。だから

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

rとの両方thetaがインスタンスにラップされてから、 type の 2 つのパラメーターを受け取るメソッドにNSNumber渡されます。setObject()AnyObject

逆方向のブリッジングもありますが、あまり文書化されていません (または、見つけられませんでした)。のインスタンスをNSNumberto CGFloat(またはInt, Float, ...)にキャストできます

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

doubleValue結果は、 number インスタンスで(または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ます。それ以外の場合、オプションのバインドは失敗します。

于 2015-11-02T18:36:10.147 に答える