Ios 在函数中用作参数时,结构值类型前面需要关键字var

Ios 在函数中用作参数时,结构值类型前面需要关键字var,ios,swift,struct,var,Ios,Swift,Struct,Var,在函数中使用时,为什么在结构的值类型参数前面需要关键字var struct MyValueType { var name:String var assignment:String var grade:Int } class MyReferenceType{ var name:String var assignment:String var grade:Int init(name:String,assignment:String,grade

在函数中使用时,为什么在结构的值类型参数前面需要关键字var

struct MyValueType {
    var name:String
    var assignment:String
    var grade:Int
}

class MyReferenceType{
    var name:String
    var assignment:String
    var grade:Int
    init(name:String,assignment:String,grade:Int){
        self.name = name
        self.assignment = assignment
        self.grade = grade
    }
}

var myRef = MyReferenceType(name:"Jon",assignment:"Math Test 1",grade:90)

print(myRef.assignment)
func extraCreditReferenceType(ref:MyReferenceType,extraCredit:Int){
    ref.grade += extraCredit
}

func extraCreditValueType(var val:MyValueType,extraCredit:Int){
    val.grade += extraCredit
}

var ref = MyReferenceType(name:"Jon",assignment:"Math Test 1",grade:90)

print(ref.grade)
extraCreditReferenceType(ref,extraCredit:5)
print("Reference: \(ref.name) - \(ref.grade)")



var val = MyValueType(name:"Jon",assignment:"Math Test 1",grade:90)
extraCreditValueType(val,extraCredit:5)
print("Value: \(val.name) - \(val.grade)")
所讨论的行是以下函数:

func extraCreditValueType(var val:MyValueType,extraCredit:Int){
    val.grade += extraCredit
}

通过删除关键字var,代码将不会编译。

因为作为参数的结构在默认情况下是
let
类型,并且因为您正在函数中更改结构,所以它必须是
var

swift 3.0中似乎不允许参数中的
var
,因此最终必须将其删除


另外,您的
extraCreditValueType
func不会像您认为的那样执行操作,因为结构是按值传递的,所以参数
val
与函数外部的
val
不同,因此在函数中对其进行更改不会对函数外部产生影响。您应该将
MyValueType
设置为一个类(并更改名称),或者从函数返回
val
,以便在函数外部使用。。。或者将其设置为一个
inout
参数。啊,叶,忘记了在Swift 3.0中,参数前面的“var”不仅仅是“不需要”,它是不允许的。参数始终是常量。如果愿意,您可以在函数的第一行中写入“var param=param”,这将创建一个与参数具有相同名称和值的变量。您的func ExtraCreditValue类型可能没有执行您认为它所做的操作。它不会修改调用方中的val。