【问题标题】:Objective C const float * and Float tuple conversion to SwiftObjective C const float * 和 Float 元组转换为 Swift
【发布时间】:2019-01-03 16:23:16
【问题描述】:

昨晚我尝试将一些代码从 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&lt;Float&gt;

这里是glUniformMatrix4fv方法签名供参考:

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

似乎在 ObjC 中 Float 元组可以表示为 const float *,但在 Swift 中它与 UnsafePointer&lt;Float&gt; 不兼容。

考虑到传入的 Float 元组,renderWithModelViewProjectionMatrix 方法签名在 Swift 中应该是什么样子?它如何处理对 glUniformMatrix4fv 的调用,它期望传入 UnsafeMutablePointer?

有没有从(Float, Float, Float...)UnsafeMutablePointer&lt;Float&gt; 的简单转换?

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

【问题讨论】:

  • 为什么不直接传递_GLKMatrix4?
  • 传入的是 _GLKMatrix4 的 m 值。虽然可以传入整个矩阵,但问题是如何将 m 值从 Float 元组转换到一个 UnsafeMutablePointer 预期作为 glUniformMatrix4fv 的参数。有什么想法吗?
  • 我倾向于在 iOS 中坚持使用 obj-c/swift,所以我并没有真正亲自处理过这个问题,但如果你正在使用 c++ 进行交互,你最好还是坚持使用 Objective-C现在。我的看法是它或多或少地被意外支持,他们可能会在以后的版本中做更多的工作。请参阅:github.com/apple/swift-evolution -> 超出范围
  • 你也可以用 c++ -> Objective-C -> Swift 让事情变得更容易处理。

标签: ios swift


【解决方案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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-22
    • 2013-05-30
    • 1970-01-01
    • 1970-01-01
    • 2014-06-28
    • 1970-01-01
    • 1970-01-01
    • 2019-12-04
    相关资源
    最近更新 更多