在Swift中声明传递参数为var

时间:2017-11-07 17:26:49

标签: ios swift parameters parameter-passing

我想创建一个带有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,所以我不知道如何解决这个错误。

2 个答案:

答案 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了解有关输入输出参数的详细信息。