Skip to content

Instantly share code, notes, and snippets.

@norio-nomura
Last active April 28, 2017 11:14
Show Gist options
  • Save norio-nomura/118eeccf9d8c5c05d303e3c8b767d393 to your computer and use it in GitHub Desktop.
Save norio-nomura/118eeccf9d8c5c05d303e3c8b767d393 to your computer and use it in GitHub Desktop.
Swift のパラメータで参照カウントがどうなっているのかチェックするコード
➜ 12:20:40 TOOLCHAINS=com.apple.dt.toolchain.Swift_2_3 swift -Onone ./TestReference2.3.swift
./TestReference2.3.swift:19:10: warning: 'var' parameters are deprecated and will be removed in Swift 3
func buz(var s: S) -> Bool {
^~~
true
false
true
true
true
false
➜ 12:20:44 TOOLCHAINS=com.apple.dt.toolchain.Swift_2_3 swift -O ./TestReference2.3.swift
./TestReference2.3.swift:19:10: warning: 'var' parameters are deprecated and will be removed in Swift 3
func buz(var s: S) -> Bool {
^~~
true
true
true
true
true
true
➜ 12:20:49 swift -Onone ./TestReference3.swift
true
false
true
true
➜ 12:20:54 swift -O ./TestReference3.swift
true
true
true
true
class C {}
struct S {
var c = C()
mutating func checkReference() -> Bool {
return isUniquelyReferencedNonObjC(&c)
}
}
func foo(s: S) -> Bool {
var s = s
return s.checkReference()
}
func bar(inout s: S) -> Bool {
return s.checkReference()
}
func buz(var s: S) -> Bool {
return s.checkReference()
}
var s = S()
// -Onone -O
print(s.checkReference()) // true true
print(foo(s)) // false true
print(s.checkReference()) // true true
print(bar(&s)) // true true
print(s.checkReference()) // true true
print(buz(s)) // false true
class C {}
struct S {
var c = C()
mutating func checkReference() -> Bool {
return isKnownUniquelyReferenced(&c)
}
}
func foo(_ s: S) -> Bool {
var s = s
return s.checkReference()
}
func bar(_ s: inout S) -> Bool {
return s.checkReference()
}
// func buz(_ var s: S) -> Bool {
// return s.checkReference()
// }
var s = S()
// -Onone -O
print(s.checkReference()) // true true
print(foo(s)) // false true
print(s.checkReference()) // true true
print(bar(&s)) // true true
// print(s.checkReference()) // true true
// print(buz(s)) // false true
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment