Skip to content

Instantly share code, notes, and snippets.

@niwatako
Created May 11, 2016 04:47
Show Gist options
  • Save niwatako/7c3a4bc0b39c8bf2f20dd58b5ba62a19 to your computer and use it in GitHub Desktop.
Save niwatako/7c3a4bc0b39c8bf2f20dd58b5ba62a19 to your computer and use it in GitHub Desktop.
デフォルト引数があるstructのイニシャライザとプロトコルとGenericsが混ざると面倒なの見つけた(・ัω・ั) #CodePiece
struct Hoge {
let name: String
let age: Int
init(name: String, age: Int = 0 ) {
self.name = name
self.age = age
}
}
protocol NameInitializable {
init(name: String)
}
extension Hoge: NameInitializable {
init(name: String) {
self.init(name: name, age: 10)
}
}
class NameHolder<T: NameInitializable> {
let hoge: T
init() {
self.hoge = T(name: "niwatako") // これ、呼ばれるのはどの init??
}
}
// extension Hoge: NameInitializable の init(name: String) が呼ばれた
NameHolder<Hoge>().hoge.age // 10
@niwatako
Copy link
Author

niwatako commented May 11, 2016

NameInitializable の実装が呼ばれるのでまだ分かりやすい。
親子クラスを extension Protocol where Self: 親 extension Protocol where Self: 子 して別の実装をした時、
Protocolとして 扱われている時に実装を呼び出すと 子インスタンスなのに 親にextensionした実装が実行されるみたいなのと合わさるとどっちがどうなってるんだっけか、と混乱してくる。。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment