目标 C 常量浮点数 * 和浮点元组转换为 Swift



昨晚我尝试将一些代码从 ObjC 移植到 Swift 上,结果我对 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 中,Float 元组可以表示为const float *但在 Swift 中它与 UnsafePointer<Float> 不兼容。

给定传入的 Float 元组,renderWithModelViewProjectionMatrix 方法签名在 Swift 中应该是什么样子?它如何与glUniformMatrix4fv的调用一起工作,它期望传入 UnsafeMutablePointer 的位置?

(Float, Float, Float...)UnsafeMutablePointer<Float>的转换是否容易?

为了更好地了解 ObjC 的完整来源,我正在从 看看 https://github.com/googlesamples/cardboard-ios/blob/master/CardboardSamples/TreasureHunt/TreasureHuntRenderer.m#L564

似乎从元组转换为数组可以修复编译错误。不确定解决方案是否正确。

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)

最新更新