Hi, Henrique. This is a correct error message. Consider this use case:

struct Impl: PersistentModel {
  func doTheThing()
}

func callback(_ objs: [Impl]?, _ error: Error?) -> Void? {
  return objs.first?.doTheThing()
}
find2(withBlock: callback) // direct call for clarity

Clearly here the ‘callback’ function isn’t compatible with the type ‘find2’ 
expects—it wants to be able to pass an array of SomeModel to the function, but 
the function only handles Impl instances specifically. Any other conforming 
type would be a problem.

Hope that helps,
Jordan


> On Nov 1, 2016, at 14:48, Henrique Valcanaia via swift-users 
> <swift-users@swift.org> wrote:
> 
> 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?) {
>     print(#function)
> }
> 
> 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?
> 
> Thanks
> 
> - Henrique
> 
> _______________________________________________
> swift-users mailing list
> swift-users@swift.org
> https://lists.swift.org/mailman/listinfo/swift-users

_______________________________________________
swift-users mailing list
swift-users@swift.org
https://lists.swift.org/mailman/listinfo/swift-users

Reply via email to