【问题标题】:SceneKit: equivalent of SCNVector3(0, 0, 0) in Objective CSceneKit:相当于 Objective C 中的 SCNVector3(0, 0, 0)
【发布时间】:2018-02-17 04:54:23
【问题描述】:

这段代码在 Swift 中的等价物:

startNode.scale = SCNVector3(1/100.0, 1/100.0, 1/100.0)

是:

[startNode setScale: SCNVector3Make(1/100.0, 1/100.0, 1/100.0)];

在 Objective-C 中。

SCNVector3 应该被SCNVector3Make 替换似乎很奇怪。这是为什么呢?

谢谢!

【问题讨论】:

  • 那么 SCNVector3 和 SCNVector3Make 在 Swift 中是严格等价的?

标签: objective-c swift scenekit


【解决方案1】:

可以在 Swift 中使用 SCNVector3Make(x, y, z)SCNVector3(x, y, z)

后者在语义上确实很奇怪,但它们相同

【讨论】:

  • 为什么奇怪?它遵循 C 函数 API 到 Swift API 之间转换的所有命名标准。
  • @user28434 查看CGPointCGRect 的初始化程序;它们都有外部参数名称,不像SCNVector3(x, y, z)
  • 确实如此。虽然,SCNVector3 的 Swift 初始化程序也为 Float 提供了参数名称。但我认为 OP 想知道为什么 SCNVector3 在 Objective C 中是 SCNVector3Make,而不是为什么没有参数名称。
【解决方案2】:

两者相同,只是名称不同,都是因为 Apple C/ObjC 框架和 Swift 代码中的命名约定不同。


最好在示例中展示它是如何工作的:

假设我们正在创建框架SomeFrameworkSF 将是命名空间前缀)并且在所述框架中我们将有类型Example,前缀为SFExample

C 的命名约定表明我们的类型 SFExample 的构造函数应称为 SFExampleMake

Swift 的命名约定说构造函数应该是SFExample.init,可以称为SFExample(…)

当您在 Swift 项目中导入 ObjC/C 框架时,会在后台将名称转换为 SFExampleMakeSFExample.initSCNVector3MakeSCNVector3.init

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-05
    • 2017-10-14
    • 2011-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-13
    • 1970-01-01
    相关资源
    最近更新 更多