[swift-users] Type checker not accepting subclass(protocol conformance) as a valid type inside a closure in a protocol with constraint where Self: MyClass

Henrique Valcanaia henriqueindalencio at gmail.com
Tue Nov 1 16:48:13 CDT 2016

Hey everyone.

I’m having some trouble with the following code, more precisely I’m getting the error "Cannot convert value of type '([Self]?, Error?) -> Void?' to expected argument type ‘([SomeModel]?, Error?) -> Void?’” when trying to call “find2(withBlock: ([SomeModel]?, Error?) -> Void?)” inside my extension.

Here’s a snippet:

protocol SomeModel { }

func find2(withBlock block: ([SomeModel]?, Error?) -> Void?) {

protocol PersistentModel {
    typealias FindBlock = (_ objs: [Self]?, _ error: Error?) -> Void?
    func find(withBlock block: FindBlock)

extension PersistentModel where Self: SomeModel {
    func find(withBlock block: FindBlock) {
       find2(withBlock: block)

Considering I’m constraining my protocol extension to SomeModel, why do I get the error when trying to call “find(withBlock: ([SomeModel]?, Error?) -> Void?)”? It’s seems to me the type checker is not comparing the parameters' type inside the block and its inheritances/protocol conformances.

Just for testing purposes I created a simple class implementing the protocol and a function with the parameter of the same type, we can see the problem does not occur, being strictly linked to closures.

class MyClass: SomeModel { }

func test(a: SomeModel) { }
test(a: MyClass())

I’m not sure if I’m doing something wrong or if it is just a compiler/language limitation, any thoughts?


- Henrique

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-users/attachments/20161101/79a2d972/attachment.html>

More information about the swift-users mailing list