import Foundation
func address(of object: UnsafeRawPointer) -> String {
let addr = Int(bitPattern: object)
return String(format: "%p", addr)
}
func printLine(_ line: Int = #line) {
print("#L\(line)")
}
print("--- Clousure: Int ---\n")
do {
var value = 10
let closure1 = {
print("- value = \(value) (\(address(of: &value)))") // valueは参照渡し
}
let closure2 = { [value] in
print("- value = \(value) ← 値渡しなので影響を受けない") // valueは値渡し
}
let closure3 = {
value += 10
print("- value = \(value) (\(address(of: &value)))") // valueは参照渡し
}
printLine()
print("- value = \(value) (\(address(of: &value)))") // value = 10
printLine()
closure1() // value = 10
printLine()
value = 20
print("- value = \(value) (\(address(of: &value)))")
closure1() // value = 20 (参照渡しなので反映されている)
printLine()
closure2() // value = 10 (値渡しなので反映されていない)
printLine()
closure3() // value = 30
printLine()
print("- value = \(value) (\(address(of: &value)))") // value = 30 (closure3での変更が反映されている)
}
print("\n--- Clousure: [Int] ---\n")
do {
var values = [10]
let closure1 = {
print("- values = \(values) (\(address(of: &values)))") // valueは参照渡し
}
let closure2 = { [values] in
print("- values = \(values) ← 値渡しなので影響を受けない") // valueは値渡し
}
let closure3 = {
values.append(values.last! + 10) // CoW
print("- values = \(values) (\(address(of: &values))) ← CoWによりバッファへのポインタが変更されていることが確認できる") // valueは参照渡し
}
printLine()
print("- values = \(values) (\(address(of: &values)))")
printLine()
closure1() // values = [10]
printLine()
values.append(20) // CoW
print("- values = \(values) (\(address(of: &values))) ← CoWによりバッファへのポインタが変更されていることが確認できる") // values = [10, 20]
closure1() // values = [10, 20] (参照渡しなので反映されている)
printLine()
closure2() // values = [10] (値渡しなので反映されていない)
printLine()
closure3() // value = [10, 20, 30]
printLine()
print("- values = \(values) (\(address(of: &values)))") // value = [10, 20, 30] (closure3での変更が反映)
}
print("\n--- Function: Int ---\n")
do {
var value = 10
func function1(_ value: inout Int) {
print("- value = \(value) (\(address(of: &value)))") // valueは参照渡し
}
func function2( _ value: Int) {
print("- value = \(value) ← 値渡しなので影響を受けない") // valueは値渡し
}
func function3(_ value: inout Int) {
value += 10
print("- value = \(value) (\(address(of: &value)))") // valueは参照渡し
}
printLine()
print("- value = \(value) (\(address(of: &value)))") // value = 10
printLine()
function1(&value) // value = 10
printLine()
value = 20
print("- value = \(value) (\(address(of: &value)))") // value = 20
printLine()
function3(&value) // value = 30
printLine()
print("- value = \(value) (\(address(of: &value)))") // value = 30 (function3での変更が反映されている)
}
print("\n--- Function: [Int] ---\n")
do {
var values = [10]
func function1(_ values: inout [Int]) {
print("- values = \(values) (\(address(of: &values)))") // valuesは参照渡し
}
func function2( _ values: [Int]) {
print("- values = \(values) ← 値渡しなので影響を受けない") // valuesは値渡し
}
func function3(_ values: inout [Int]) {
values.append(values.last! + 10) // CoW
print("- values = \(values) (\(address(of: &values))) ← CoWによりバッファへのポインタが変更されていることが確認できる") // valuesは参照渡し
}
printLine()
print("- values = \(values) (\(address(of: &values)))") // values = [10]
printLine()
function1(&values) // values = [10]
printLine()
values.append(20) // CoW
print("- values = \(values) (\(address(of: &values))) ← CoWによりバッファへのポインタが変更されていることが確認できる") // values = [10, 20]
printLine()
function3(&values) // value = [10, 20, 30]
printLine()
print("- values = \(values) (\(address(of: &values)))") // values = [10, 20, 30] (function3での変更が反映)
}