2016-04-13 12 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>) 

しかし、私は

下に示すように、それは Floatタプル mとして定義されていたことを発見し modelViewMatrix引数に渡ししようとしています
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)) 

(汚いが)にメソッドシグネチャを変更するという最初の問題を解決すると思われます。

この問題は、後でその引数をメソッド内部で使用しようとすると発生します。ここでエラーにCannot convert value of type (Float, Float, Float...) to expected argument type UnsafePointer<Float>

を得

glUniformMatrix4fv(cubeMVPMatrix, 1, 0, modelViewMatrix)

参照用glUniformMatrix4fvメソッドシグネチャである:

public func glUniformMatrix4fv(location: GLint, _ count: GLsizei, _ transpose: GLboolean, _ value: UnsafePointer<GLfloat>) 

それにObjCフロートタプルがconst float *としてではなくで表すことができると思われますSwiftはUnsafePointer<Float>と互換性がありません。

フロートタプルが渡されたときに、Swiftのメソッドシグネチャはどうなるべきですか?そして、それがUnsafeMutablePointerが渡されることを期待しているglUniformMatrix4fvへの呼び出しでどう動くことができますか?

(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'値です。可能であれば、行列全体を渡すことは可能ですが、問題はfloutタプルの 'm'値を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) 
関連する問題