Created
June 20, 2017 11:25
-
-
Save takasek/5eba86698150b59470adb1d087bac8eb to your computer and use it in GitHub Desktop.
protocolと参照型の生存期間について確認コード #CodePiece
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import Foundation | |
protocol P { | |
var name: String { get } | |
} | |
class C: P { | |
var name: String | |
init(name: String) { | |
self.name = name | |
} | |
} | |
struct S: P { | |
let name: String | |
init(_ p: P) { | |
name = p.name | |
} | |
} | |
final class Holder: CustomStringConvertible { | |
let text: String | |
var `protocol`: P? = nil | |
weak var `class`: C? = nil | |
init(_ text: String) { | |
self.text = text | |
} | |
func set(protocol p: P) { | |
self.protocol = p | |
} | |
func set<T: P>(generic: T) { | |
self.protocol = generic | |
} | |
var description: String { | |
return String(format: "%@\nc: %@ \np: %@\n", | |
text, | |
self.class.debugDescription, | |
self.protocol.debugDescription) | |
} | |
} | |
do { | |
let holder = Holder("weak参照で持たせる。スコープを抜けたらcは死ぬ") | |
do { | |
let c = C(name: "name") | |
holder.class = c | |
} | |
print(holder) | |
} | |
do { | |
let holder = Holder("protocolプロパティに持たせるので弱参照にできない。cは死なない") | |
do { | |
let c = C(name: "name") | |
holder.class = c | |
holder.protocol = c | |
} | |
print(holder) | |
} | |
do { | |
let holder = Holder("Generic funcに通してprotocolプロパティに持たせる。やはりcは死なない") | |
do { | |
let c = C(name: "name") | |
holder.class = c | |
holder.set(generic: c) | |
} | |
print(holder) | |
} | |
do { | |
let holder = Holder("P型の引数に通す。struct化される?と思ったけどそんなことはなかった。これでもcは死なない") | |
do { | |
let c = C(name: "name") | |
holder.class = c | |
holder.set(protocol: c) | |
} | |
print(holder) | |
} | |
do { | |
let holder = Holder("structへと詰め替える。cはスコープ抜けると死ぬ") | |
do { | |
let c = C(name: "name") | |
holder.class = c | |
holder.protocol = S(c) | |
} | |
print(holder) | |
} | |
/* | |
ログ | |
weak参照で持たせる。スコープを抜けたらcは死ぬ | |
c: nil | |
p: nil | |
protocolプロパティに持たせるので弱参照にできない。cは死なない | |
c: Optional(__lldb_expr_110.C) | |
p: Optional(__lldb_expr_110.C) | |
Generic funcに通してprotocolプロパティに持たせる。やはりcは死なない | |
c: Optional(__lldb_expr_110.C) | |
p: Optional(__lldb_expr_110.C) | |
P型の引数に通す。struct化される?と思ったけどそんなことはなかった。これでもcは死なない | |
c: Optional(__lldb_expr_110.C) | |
p: Optional(__lldb_expr_110.C) | |
structへと詰め替える。cはスコープ抜けると死ぬ | |
c: nil | |
p: Optional(__lldb_expr_110.S(name: "name")) | |
*/ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment