为什么在函数中使用时,在结构的值类型参数前面需要关键字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,代码不会编译。
答案 0 :(得分:2)
因为作为参数的结构是默认的let
类型,并且因为您正在对函数中的结构进行更改,所以它必须是var
似乎参数中的var
不会在swift 3.0中被允许,所以无论如何最终都要删除它
你的extraCreditValueType
func也不会按照你的想法去做,因为结构是按值传递的,参数val
与外面的val
不一样函数的功能,因此在函数中对它进行更改不会对函数产生影响。你应该让MyValueType
成为一个类(并且更改名称)或者从函数外部使用函数返回val