我想创建一个带有2个参数并更改其值的函数。例如:
var geometricSprite = SKSpriteNode()
var geoTouched = true
removeTouch(sprite: geometricSprite, bool: getTouched)
func removeTouch(sprite: SKSpriteNode, bool: Bool) {
sprite.size = 0
bool = false
//HERE I GET THE ERROR "Cannot assign to value: 'bool' is a 'let' constant"
}
所以再次bool = false
给出错误,因为'bool'是一个let常量。我从未宣布bool为let,所以我不知道如何解决这个错误。
答案 0 :(得分:1)
由于您希望传递和参数函数和修改传递的值,您需要将该参数定义为inout
:
func removeTouch(sprite: SKSpriteNode, bool: inout Bool)
这也会改变调用网站,以便在传递
值之前需要&
removeTouch(sprite: geometricSprite, bool: &getTouched)
那就是说,根据您对传递给函数的值的处理方式,最好还是返回新值。
func removeTouch(sprite: SKSpriteNode, bool: Bool) -> Bool
答案 1 :(得分:1)
除非您将函数参数指定为inout
,否则您可能 mutate 。
SKSpriteNode()
属于class
类型,它是一种引用类型:不标记inout
表示您可能不会改变引用本身,而您可能但是,改变引用类型的可变(可访问)成员(可通过非可变引用访问)。
bool
是一种值类型,这意味着在将其作为参数提供时,您不能改变它,除非您明确将其标记为inout
。
一个充满希望的指导性示例:
class MyReferenceType {
var valueTypeMember: Int = 0
}
struct MyValueType {
var valueTypeMember: Int = 0
}
func mutateMyReferenceAndValueInstances(
_ ref: MyReferenceType, _ val: inout MyValueType) {
ref.valueTypeMember = 42
val.valueTypeMember = 43
}
let ref = MyReferenceType()
var val = MyValueType()
print(ref.valueTypeMember, val.valueTypeMember) // 0 0
mutateMyReferenceAndValueInstances(ref, &val)
print(ref.valueTypeMember, val.valueTypeMember) // 42 43
参见例如the Language Guide - Functions了解有关输入输出参数的详细信息。