extension MyProto { dynamic func myMethod() { print("Protocol method") } } struct NoOverride: MyProto {} struct HasOverride: MyProto { func myMethod() { print("Struct method") } } func call_generic<T: MyProto>(_ object: T) { object.myMethod() } let defaultObject = NoOverride() defaultObject.myMethod() // "Protocol method" call_generic(defaultObject) // "Protocol method" let object = HasOverride() object.myMethod() // "Struct method" call_generic(object) // "Struct method" <-- This.