所以,和我的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版本:

但是,尽管我可以使用SKSpriteNode来完成这个任务,但是我的SKShapeNode函数不能工作,因为我得到了以下错误:

这不起作用,所以如果我去掉函数中的inout并将其作为返回添加,它现在就可以工作了(使用上面图像中注释掉的调用)
这有什么原因吗?我如何使用inout而不是返回SKShapeNode?
注意:可以将a PhysicsBody设置为SKShapeNode
正如这里所示,两者都是var而不是let,因此应该是可变的:

发布于 2018-04-30 18:07:19
首先,要传递inout参数,必须添加&
createPhyscisBodyShape(for: &topBar, type: .rectangle)你是用&ball做的。我不知道你为什么第二次忘记了&。
无论如何,您一开始就不需要inout。SKSpriteNode和SKShapeNode是类。这意味着,只要不使用赋值语句将body设置为其他东西,对body所做的更改就会反映在传递的参数中。
移除输入输出,它应该可以正常工作。
发布于 2019-12-17 02:57:48
将值传递给inout参数的函数,应使用&
createPhyscisBodyShape(for:&topBar,type:.rectangle)
使用此链接https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#ID545进行检查
https://stackoverflow.com/questions/50105732
复制相似问题