I have a protocol P that returns a copy of the object:
protocol P { func copy() -> Self }
and a class C that implements P:
With Swift 2, we can use protocol extensions for this.
protocol Copyable { init(copy:Self) } extension Copyable { func copy() -> Self { return Self.init(copy: self) } }