【问题标题】:Declare passed parameter to var in Swift在 Swift 中声明传递给 var 的参数
【发布时间】:2017-11-07 17:26:49
【问题描述】:

我想创建一个接受 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,所以我不知道如何修复此错误。

【问题讨论】:

  • 您只是想分配给它,还是希望更改传递给它的getTouched 的值?
  • 我正在尝试将值更改为“false”。但是出现了错误!
  • 你不需要声明它。在 Swift 手册中,“Functions”:“函数参数默认为常量。”

标签: ios swift parameters parameter-passing


【解决方案1】:

由于您希望同时向函数传递和参数修改传入的值,因此您需要将该参数定义为inout

func removeTouch(sprite: SKSpriteNode, bool: inout Bool)

这也将调用站点更改为在传入值之前需要&

removeTouch(sprite: geometricSprite, bool: &getTouched)

也就是说,根据您对传递给函数的值所做的操作,您最好返回新值。

func removeTouch(sprite: SKSpriteNode, bool: Bool) -> Bool

【讨论】:

    【解决方案2】:

    除非你将函数参数指定为inout,否则你不能改变它。

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

    【讨论】:

      猜你喜欢
      • 2023-03-17
      • 2017-10-24
      • 2021-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多