昨晚我刺殺了一些從ObjC到Swift的代碼,到了一個我並不熟悉Swift等價物的地步。目標C const float *和Float元組轉換爲Swift
主要問題是如何在Swift中表示const float *
。基於文檔https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/InteractingWithCAPIs.html#//apple_ref/doc/uid/TP40014216-CH8-ID23我認爲使用UnsafeMutablePointer<Float>
聽起來像可接受的轉換。
ObjC
- (void)renderWithModelViewProjectionMatrix:(const float *)model_view_matrix
斯威夫特
func renderWithModelViewProjectionMatrix(modelViewMatrix: UnsafeMutablePointer<Float>)
但是,試圖在modelViewMatrix
說法我發現它被定義爲一個Float
元組m
如下圖所示
public struct _GLKMatrix4 {
public var m: (Float, Float, Float, Float, Float, Float, Float, Float, Float, Float, Float, Float, Float, Float, Float, Float)
public init(m: (Float, Float, Float, Float, Float, Float, Float, Float, Float, Float, Float, Float, Float, Float, Float, Float))
public init()
}
改變方法簽名
func renderWithModelViewProjectionMatrix(modelViewMatrix: (Float, Float, Float, Float, Float, Float, Float, Float, Float, Float, Float, Float, Float, Float, Float, Float))
(雖然凌亂)似乎解決了最初的問題。
隨後在嘗試在方法內部使用該參數時會出現問題。
glUniformMatrix4fv(cubeMVPMatrix, 1, 0, modelViewMatrix)
導致錯誤Cannot convert value of type (Float, Float, Float...) to expected argument type UnsafePointer<Float>
下面是參考glUniformMatrix4fv
方法簽名:
public func glUniformMatrix4fv(location: GLint, _ count: GLsizei, _ transpose: GLboolean, _ value: UnsafePointer<GLfloat>)
看來,在ObjC浮動元組可以表示爲一個const float *
但在Swift與UnsafePointer<Float>
不兼容。
給定Float元組被傳入時,Swift中renderWithModelViewProjectionMatrix
方法簽名應該是什麼樣子?它怎麼能與glUniformMatrix4fv
的調用,它期望一個UnsafeMutablePointer被傳入?
是否有從(Float, Float, Float...)
到UnsafeMutablePointer<Float>
的簡易轉換?
爲了更好地理解ObjC的全部源代碼,我從看一看轉換的https://github.com/googlesamples/cardboard-ios/blob/master/CardboardSamples/TreasureHunt/TreasureHuntRenderer.m#L564
爲什麼不直接傳遞_GLKMatrix4? – PeejWeej
這是正在傳入的_GLKMatrix4的'm'值。雖然有可能傳入整個矩陣,但問題是如何將'm'值從Float元組轉換爲預期作爲glUniformMatrix4fv參數的UnsafeMutablePointer。有什麼想法嗎? –
ae14
我傾向於在iOS中堅持使用obj-c/swift,所以我沒有真正處理過這個問題,但是如果你使用C++接口,現在可能會更好地堅持使用Objective-C。我的看法是或多或少得到了意外的支持,他們可能會在以後的版本中做更多的工作。請參閱:https://github.com/apple/swift-evolution - >超出範圍 – PeejWeej