よくあるクロージャーを用いたカウンターのサンプルコードをいじっていてたまたま気づいたのですが、
Swift
1func createCounter(countBy countBy:Int)->()->Int{ 2 var count:Int=0 3 return {()-> Int in 4 count += countBy 5 return count 6 } 7} 8 9var counter2=createCounter(countBy: 10) //(1) 10print(counter2()) //10 11print(counter2()) //20 12print(counter2()) //30 13print(counter2()) //40 14 15var counter3=counter2 //(2) 16print(counter3()) //50 17print(counter3()) //60 18print(counter3()) //70 19 20counter2=createCounter(countBy:3) //(3) 21print(counter2()) //3 22print(counter2()) //6 23print(counter2()) //9 24print(counter3()) //想定していた結果:12,実際の結果:80 25print(counter3()) //想定していた結果:15,実際の結果:90 26print(counter3()) //想定していた結果:18,実際の結果:100
上記コードで最後の3行より前の部分は全く問題ないのですが、
最後の3行が予想と違う結果が出ました。
https://docs.swift.org/swift-book/LanguageGuide/Closures.html
上記ページに「クロージャーは参照型です」のような説明があるのですが、「参照型」の定義自体のはっきりした説明がなく、結局参照型とは何を意味しているのかいまいちよくわかりません。
javascriptなどの他のプログラミング言語の知識を用いて考えた時、最後の3行はどう考えても
12
15
18
という結果になるんじゃないのかなあ、という感じで、しかし実際の結果は違うので混乱しています。
参照型なので変数counter3は変数counter2と同じものを指すので、counter2に別のカウンター(3ずつ数えるカウンター)をセットしたら、counter3も3ずつ数えるカウンターを指すのではないのでしょうか?
counter2=createCounter(countBy:3) の後に
counter3=counter2を書いてみてください
回答2件
あなたの回答
tips
プレビュー