【问题标题】:Can't use SKShapeNode in inout function不能在 inout 函数中使用 SKShapeNode
【发布时间】:2018-04-30 17:51:29
【问题描述】:

所以,就像我的SKSpriteNodes 一样,我正在尝试创建一个函数来使我成为默认物理体。

这是我创建的DefaultBody.swift

import Foundation
import SpriteKit

enum Type {
    case rectangle
    case circle
}

// Create new default physics body
func createPhysicsBodySprite(for body: inout SKSpriteNode, type: Type) {

    // Create new physics body
    switch type {
    case .rectangle:
        body.physicsBody = SKPhysicsBody(edgeLoopFrom: body.frame)
    case .circle:
        body.physicsBody = SKPhysicsBody(circleOfRadius: body.frame.width / 2)
    }
    body.physicsBody?.isDynamic = false
    body.physicsBody?.allowsRotation = false
    body.physicsBody?.pinned = false
    body.physicsBody?.affectedByGravity = false
    body.physicsBody?.friction = 0
    body.physicsBody?.restitution = 0
    body.physicsBody?.linearDamping = 0
    body.physicsBody?.angularDamping = 0

}

func createPhysicsBodyShape(for body: inout SKShapeNode, type: Type) {

    // Create new physics body
    switch type {
    case .rectangle:
        body.physicsBody = SKPhysicsBody(edgeLoopFrom: body.frame)
    case .circle:
        body.physicsBody = SKPhysicsBody(circleOfRadius: body.frame.width / 2)
    }
    body.physicsBody?.isDynamic = false
    body.physicsBody?.allowsRotation = false
    body.physicsBody?.pinned = false
    body.physicsBody?.affectedByGravity = false
    body.physicsBody?.friction = 0
    body.physicsBody?.restitution = 0
    body.physicsBody?.linearDamping = 0
    body.physicsBody?.angularDamping = 0

}

这里我可以轻松调用 Sprite 版本:

但是,虽然我可以使用 SKSpriteNode 来做到这一点,但我的 SKShapeNode 函数不起作用,因为我收到了这个错误:

这不起作用,所以如果我去掉函数中的 inout 并将其添加为返回值,它现在可以工作(使用上图中注释掉的调用)

这有什么原因吗,我该如何使用inout 而不是返回SKShapeNode

注意:PhysicsBody 可以设置为SKShapeNode

两者都是var 而不是let,如此处所示,因此应该是可变的:

【问题讨论】:

    标签: ios swift return skshapenode inout


    【解决方案1】:

    首先,要传递一个inout参数,你必须添加&

    createPhyscisBodyShape(for: &topBar, type: .rectangle)
    

    您使用&ball 完成了此操作。我想知道你为什么第二次忘记了&

    无论如何,你首先不需要inoutSKSpriteNodeSKShapeNode 是类。这意味着只要您不使用赋值语句将body 设置为其他值,您对body 所做的更改就会反映在您传递的参数中。

    移除输入输出,它应该可以正常工作。

    【讨论】:

    • 我的代码确实有 & 符号 (&),但由于某种原因,我没有正确复制和粘贴,哎呀。我现在尽量不要使用inout
    • @George_E_2 你确定这是复制和粘贴错误吗?我没有在图片中看到 &。
    • 我很惊讶它的工作原理!我现在明白我不需要输入输出了。谢谢!
    • 当我在测试时它不起作用,我复制并粘贴了注释版本并摆脱了没有留下 & 的变量赋值
    【解决方案2】:

    将值传递给inout参数的函数,我们应该使用&

    createPhyscisBodyShape(for: &topBar , type: .rectangle)

    查看此链接https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#ID545

    【讨论】:

      猜你喜欢
      • 2021-12-15
      • 2019-08-01
      • 1970-01-01
      • 2015-02-16
      • 2021-01-25
      • 2021-05-12
      • 2014-08-24
      • 1970-01-01
      • 2014-10-30
      相关资源
      最近更新 更多