无法在inout函数

时间:2018-04-30 17:51:29

标签: ios swift return skshapenode inout

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

这是我创建的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版本:

enter image description here

但是,虽然我可以使用SKSpriteNode执行此操作,但我的SKShapeNode函数不起作用,因为我收到此错误:

enter image description here

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

这有什么理由,我如何使用inout而不是返回SKShapeNode

注意: PhysicsBody可设置为SKShapeNode

这两个都是var而不是let,因此 应该是可变的:

enter image description here

2 个答案:

答案 0 :(得分:1)

首先,要传递inout参数,您必须添加&

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

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

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

删除inout,它应该可以正常工作。

答案 1 :(得分:0)

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

createPhyscisBodyShape(用于:&topBar,键入:.rectangle)

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

检查