func foo<S, A0: CustomStringConvertible, B0: CustomStringConvertible>(_ fn: (S) -> (A0, B0) -> Void) { print(type(of: fn)) } struct Z { func method(_ arg1: Int, _ arg2: Int?) {} } foo(Z.method)