gpt4 book ai didi

ios - Objective C const float * 和 Float 元组转换为 Swift

转载 作者:可可西里 更新时间:2023-11-01 02:17:09 24 4
gpt4 key购买 nike

昨晚我尝试将一些代码从 ObjC 移植到 Swift,结果我对 Swift 的等价物应该是什么不太熟悉。

主要问题是如何表示 const float *在 swift 。基于文档 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

swift

func renderWithModelViewProjectionMatrix(modelViewMatrix: UnsafeMutablePointer<Float>)

但是当试图传入 modelViewMatrix 时argument 我发现它被定义为 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> 不兼容.

renderWithModelViewProjectionMatrix应该是什么?考虑到传入的 Float 元组,方法签名在 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)

关于ios - Objective C const float * 和 Float 元组转换为 Swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36602910/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com