2016-07-15 8 views
1

関数で使用する場合、構造体の値型パラメータの前にキーワードvarが必要なのはなぜですか?キーワードは関数のパラメータとして使用するときに構造体値型の前に必要です。

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

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)") 

問題の行は次の関数です。

+0

func extraCreditValueTypeは、そう思わないようです。呼び出し元のvalを変更することはありません。 – gnasher729

答えて

2

パラメータは、デフォルトではlet種類があり、そしてあなたが関数内の構造体への変更を行っているので、それはvar

それはパラメータでvarを思わなければならないであろうと、構造体があることを行っていないのでSWIFT 3.0で許可され、その最終的

また、あなたのextraCreditValueType funcはあなたが構造体は値渡しなので、それは、ないと思う何をするつもりはないとにかくそれを削除する必要があります、パラメータvalval上と同じではありません関数の外側にあるので、関数内でそれに変更を加えると、efはありません機能の外に邪魔する。 MyValueTypeをクラスに変更して(またはprobで名前を変更する)、関数の外で使用する関数からvalを返します。

+3

...または 'inout'パラメータにします。 –

+0

ああ、そのことを忘れた – Fonix

+1

Swift 3.0では、パラメータの前にある "var"は単に "必須ではない"だけではありません。パラメータは常に_定数です。もしあなたが好きなら、関数の最初の行に "var param = param"と書くことができます。これは、パラメータと同じ名前と値を持つ変数を作成します。 – gnasher729

関連する問題