昨夜、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
の内側理由だけではなく、直接_GLKMatrix4に合格していませんか? – PeejWeej
渡されている_GLKMatrix4の 'm'値です。可能であれば、行列全体を渡すことは可能ですが、問題はfloutタプルの 'm'値をglUniformMatrix4fvの引数としてUnsafeMutablePointerに変換する方法になります。何かご意見は? –
ae14
私はiOSでobj-c/swiftに固執する傾向がありますので、私はこれを本当に扱っていませんでしたが、もしあなたがC++とインターフェイスしているのであれば、今のところObjective-Cを使う方が良いかもしれません。私の認識は、それは多かれ少なかれ偶然にサポートされており、後のバージョンではもっと多くの作業を行う可能性が高いということです。以下を参照してください:https://github.com/apple/swift-evolution->範囲外 – PeejWeej