protocol Foo { static func generate() -> Self } extension Foo { init() { self = Self.generate() } } protocol Bar { init() } extension Bar { static func generate() -> Self { return Self() } }