当用作函数中的参数时,在struct value类型前面需要关键字var

时间:2016-07-15 03:54:31

标签: 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: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,代码不会编译。

1 个答案:

答案 0 :(得分:2)

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

似乎参数中的var不会在swift 3.0中被允许,所以无论如何最终都要删除它

你的extraCreditValueType func也不会按照你的想法去做,因为结构是按值传递的,参数val与外面的val不一样函数的功能,因此在函数中对它进行更改不会对函数产生影响。你应该让MyValueType成为一个类(并且更改名称)或者从函数外部使用函数返回val