2014年07月12日
Posted by 屋台ブルー at
2014年07月12日00:00 Comment(0)
Swiftで遊ぼう! - 4 Arrayのコピーがおかしい?(β3)
-----2014年8月9日
Xode6β5で確認したところ。以下の問題は修正されていました。配列型(Array)の値をコピーすると、リファレンス型ではなく実数のコピーができるという記述通りの振る舞いになりました。
a[0] = 42
println(a[0])
// 42
println(b[0])
// 1
println(c[0])
// 1
とちゃんとオリジナルだけ変更されました(^^)/
-----2014年7月12日のオリジナルポスト
Arrayのアイテムに対して値を割り当てた時の挙動が、The Swift Programming Languageに記載されている内容と異なる。なぜだろう?
使っているplaygorundsはXcode6-beat3(なんだけど、また良くわからない部分が出てきた。
以下のような記述があったんで、そのままXcode6-beta3(2014年7月7日リリース、タイムリーだよね)のplaygroundsに書き込んだんですよ。
-----
var a = [1, 2, 3]
var b = a
var c = a
You can retrieve the first value in the array with subscript syntax on either a, b, or c:
println(a[0])
// 1
println(b[0])
// 1
println(c[0])
// 1
If you set an item in the array to a new value with subscript syntax, all three of a, b, and c will return the new value. Note that the array is not copied when you set a new value with subscript syntax, because setting a single value with subscript syntax does not have the potential to change the array’s length:
a[0] = 42
println(a[0])
// 42
println(b[0])
// 42
println(c[0])
// 42
However, if you append a new item to a, you do modify the array’s length. This prompts Swift to create a new copy of the array at the point that you append the new value. Henceforth, a is a separate, independent copy of the array.
抜粋:: Apple Inc. “The Swift Programming Language”。 iBooks. https://itun.es/jp/jEUH0.l
ところが!!! 最後のprintln(b[0])とprintln(c[0])の値は「1」のまま!!! Array aのアイテムを増やしても減らしてもないのに独立コピーされてるじゃん!
どういうことです?
Xode6β5で確認したところ。以下の問題は修正されていました。配列型(Array)の値をコピーすると、リファレンス型ではなく実数のコピーができるという記述通りの振る舞いになりました。
a[0] = 42
println(a[0])
// 42
println(b[0])
// 1
println(c[0])
// 1
とちゃんとオリジナルだけ変更されました(^^)/
-----2014年7月12日のオリジナルポスト
Arrayのアイテムに対して値を割り当てた時の挙動が、The Swift Programming Languageに記載されている内容と異なる。なぜだろう?
使っているplaygorundsはXcode6-beat3(なんだけど、また良くわからない部分が出てきた。
以下のような記述があったんで、そのままXcode6-beta3(2014年7月7日リリース、タイムリーだよね)のplaygroundsに書き込んだんですよ。
-----
var a = [1, 2, 3]
var b = a
var c = a
You can retrieve the first value in the array with subscript syntax on either a, b, or c:
println(a[0])
// 1
println(b[0])
// 1
println(c[0])
// 1
If you set an item in the array to a new value with subscript syntax, all three of a, b, and c will return the new value. Note that the array is not copied when you set a new value with subscript syntax, because setting a single value with subscript syntax does not have the potential to change the array’s length:
a[0] = 42
println(a[0])
// 42
println(b[0])
// 42
println(c[0])
// 42
However, if you append a new item to a, you do modify the array’s length. This prompts Swift to create a new copy of the array at the point that you append the new value. Henceforth, a is a separate, independent copy of the array.
抜粋:: Apple Inc. “The Swift Programming Language”。 iBooks. https://itun.es/jp/jEUH0.l
ところが!!! 最後のprintln(b[0])とprintln(c[0])の値は「1」のまま!!! Array aのアイテムを増やしても減らしてもないのに独立コピーされてるじゃん!
どういうことです?