【问题标题】:Alternatives to pointers in Swift?Swift 中指针的替代方案?
【发布时间】:2015-06-07 19:24:09
【问题描述】:

我正在使用 SpriteKit 制作游戏。当特定类型的两个精灵发生碰撞时,我想记下其中一个精灵,然后在游戏后期更新该精灵。

使用指针,我基本上会做以下事情。当两个对象发生碰撞时,我会设置一些全局指针,指向我想要跟踪的精灵的地址。稍后,当调用修改函数时,它会修改指向该地址的任何内容,本质上是修改碰撞的精灵。

我宁愿不使用指针,因为 Swift 不鼓励直接访问内存。我不能通过引用修改函数来传递精灵,因为我的代码没有调用修改函数 (didSimulatePhysics)。

谢谢!

【问题讨论】:

  • “我不能通过引用修改函数来传递精灵,因为我的代码没有调用修改函数 (didSimulatePhysics)”——这似乎与您有指向您的指针的事实正交无论如何都是对象(Objective-C 互操作 需要)。所以只需声明一个适当类型的变量——它实际上是一个指针。另外,请尝试在没有全局变量的情况下执行此操作。如果您认为全局变量可以解决您的问题,那么总会有更好的方法来解决它。
  • @TheParamagneticCroissant 对不起,我有点困惑。你是什​​么意思我有指向我的对象的指针?我没有任何“UnsafePointers”——这不是 Swift 所说的指针吗? “声明适当类型的变量将是引擎盖下的指针”是什么意思?所有对象实际上都是指针吗?抱歉,我没有使用 Objective-C 的经验,所以我有点困惑。
  • 是的,所有 Objective-C 对象都是指针。 “不安全”指针不是唯一的指针类型。
  • SpriteKit 的主要接口是 Objective-C。它用 Objective-C 编写的(也许也是用 C++ 编写的)。
  • 你调用它的“copy”方法。

标签: ios swift pointers sprite-kit


【解决方案1】:

您可以像这样使用.unshare().copy()

var valueA = [1,2,3,4]
var valueB = valueA

现在如果你改变 valueA,valueB 也会改变:

valueA[1] = 4 // valueA and valueB are now equal to [1,4,3,4]

但是如果我们使用.unshare()方法:

valueB.unshare()

那么 valueB 是非共享的,所以如果我们改变 valueA,valueB 不会改变:

valueA[1] = 2 \\ valueA == [1,2,3,4] && valueB == [1,4,3,4]

或者你可以使用.copy()方法:

var valueC = valueA.copy()

同理:

var valueC = valueA
valueC.unshare()

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2015-08-25
  • 1970-01-01
  • 2014-07-31
  • 1970-01-01
  • 2010-09-15
  • 1970-01-01
  • 2018-10-16
  • 2017-12-04
相关资源
最近更新 更多