generics - Why doesn't this Swift code type-check? -
the following swift code:
class workflow<itemclass: hashable> { var block: (itemclass -> int)? init() {} } protocol protocolx { typealias itemclass func foo(x: itemclass) -> int } func test<y: protocolx, itemclass: hashable>(protx: y, x: itemclass) { let workflow = workflow<itemclass>() workflow.block = { (x: itemclass) in return protx.foo(x) } }
fails compiler error:
cannot invoke 'foo' argument list of type '(itemclass)': expected argument list of type '(self.itemclass)'
in code snippet return protx.foo(x)
.
this may seem contrived example, it's reduced real-world problem i'm having.
if try following advice in error message, get:
'self' available in protocol or result of method in class; did mean 'test'?
how can type-check?
you have given compiler no reason believe workflow.itemclass
same type protocolx.itemclass
within function test(_:x:)
. if mean require itemclass
type parameter test
function same protocolx.itemclass
within function, can tell compiler require it, this:
func test<y: protocolx, itemclass: hashable y.itemclass == itemclass>(protx: y, x: itemclass) { let workflow = workflow<itemclass>() workflow.block = { (x: itemclass) in return protx.foo(x) } }
but can eliminate separate itemclass
parameter entirely:
func test<y: protocolx y.itemclass: hashable>(protx: y, x: y.itemclass) { let workflow = workflow<y.itemclass>() workflow.block = { (x: y.itemclass) in return protx.foo(x) } }
Comments
Post a Comment