2016-04-13 46 views
2

昨晚我刺殺了一些從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

+0

爲什麼不直接傳遞_GLKMatrix4? – PeejWeej

+0

這是正在傳入的_GLKMatrix4的'm'值。雖然有可能傳入整個矩陣,但問題是如何將'm'值從Float元組轉換爲預期作爲glUniformMatrix4fv參數的UnsafeMutablePointer 。有什麼想法嗎? – ae14

+0

我傾向於在iOS中堅持使用obj-c/swift,所以我沒有真正處理過這個問題,但是如果你使用C++接口,現在可能會更好地堅持使用Objective-C。我的看法是或多或少得到了意外的支持,他們可能會在以後的版本中做更多的工作。請參閱:https://github.com/apple/swift-evolution - >超出範圍 – PeejWeej

回答

1

它好像從數組轉換到一個數組修復編譯錯誤。不知道解決方案有多正確。

typealias Matrix4Type = (Float, Float, Float, Float, Float, Float, Float, Float, Float, Float, Float, Float, Float, Float, Float, Float) 

func arrayForTuple(tuple: Matrix4Type) -> [Float] { 
    let reflection = Mirror(reflecting: tuple) 
    var arr : [Float] = [] 
    reflection.children.forEach({ (label, value) in 
     if let value = value as? Float { 
      arr.append(value) 
     } 
    }) 
    return arr 
} 

,然後裏面renderWithModelViewProjectionMatrix

let modelViewMatrix = arrayForTuple(modelViewMatrixTuple) 
glUniformMatrix4fv(cubeMVPMatrix, 1, 0, modelViewMatrix)