不能在 inout 函数中使用 SKShapeNode
Can't use SKShapeNode in inout function
所以,就像我的 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
}
这里我可以轻松调用精灵版:
然而,虽然我可以用 SKSpriteNode
做到这一点,但我的 SKShapeNode
函数不起作用,因为我得到这个错误:
这不起作用,所以如果我去掉函数中的 inout
并将其添加为 return,它现在可以工作(使用上图中注释掉的调用)
这有什么原因吗,我如何使用 inout
而不是 returning SKShapeNode
?
注:一个PhysicsBody
可以设置为一个SKShapeNode
两者都是 var
而不是此处显示的 let
,因此 应该 是可变的:
首先,要传递一个inout参数,你必须添加&
:
createPhyscisBodyShape(for: &topBar, type: .rectangle)
您使用 &ball
完成了此操作。我不知道你为什么第二次忘记了&
。
无论如何,首先您不需要 inout
。 SKSpriteNode
和 SKShapeNode
是 类。这意味着只要您不使用赋值语句将 body
设置为其他内容,您对 body
所做的更改将反映在您传递的参数中。
删除输入输出,它应该可以正常工作。
将值传递给 inout
params 的函数,我们应该使用 &
createPhyscisBodyShape(用于:&topBar,类型:.rectangle)
检查这个 link https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#ID545
所以,就像我的 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
}
这里我可以轻松调用精灵版:
然而,虽然我可以用 SKSpriteNode
做到这一点,但我的 SKShapeNode
函数不起作用,因为我得到这个错误:
这不起作用,所以如果我去掉函数中的 inout
并将其添加为 return,它现在可以工作(使用上图中注释掉的调用)
这有什么原因吗,我如何使用 inout
而不是 returning SKShapeNode
?
注:一个PhysicsBody
可以设置为一个SKShapeNode
两者都是 var
而不是此处显示的 let
,因此 应该 是可变的:
首先,要传递一个inout参数,你必须添加&
:
createPhyscisBodyShape(for: &topBar, type: .rectangle)
您使用 &ball
完成了此操作。我不知道你为什么第二次忘记了&
。
无论如何,首先您不需要 inout
。 SKSpriteNode
和 SKShapeNode
是 类。这意味着只要您不使用赋值语句将 body
设置为其他内容,您对 body
所做的更改将反映在您传递的参数中。
删除输入输出,它应该可以正常工作。
将值传递给 inout
params 的函数,我们应该使用 &
createPhyscisBodyShape(用于:&topBar,类型:.rectangle)
检查这个 link https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#ID545