stephencelis/SQLite.swift

createFunction not working with functions with 3 or 4 arguments

Open

#1.010 aberto em 28 de jun. de 2020

Ver no GitHub
 (3 comments) (0 reactions) (0 assignees)Swift (1.618 forks)batch import
enhancementhelp wanted

Métricas do repositório

Stars
 (10.145 stars)
Métricas de merge de PR
 (Mesclagem média 6d 17h) (4 fundiu PRs em 30d)

Description

sqlite.swift version: 0.11.6 - from ChangeLog.md, 0.12.2 from info.plist bundle version (downloaded Feb 20/2020) XCode version: 11.3.1 (11C504) macOS 10.14.6 sqlite.swift was integrated with the project manually

With the following code:

    func distance(num1: Int) -> Int {
        return 1
    }
    func distance(num1: Int, den1: Int) -> Int {
        return 2
    }
    func distance(num1: Int, den1: Int, num3: Int) -> Int {
        return 3
    }
            let test1: (Expression<Int>) -> Expression<Int> = (
                try db3!.createFunction("test1", deterministic: true) { anumer in
                    return self.distance(num1: anumer )
                }
            )
            let test2: (Expression<Int>, Expression<Int>) -> Expression<Int> = (
                try db3!.createFunction("test2", deterministic: true) { anumer, adenom in
                    return self.distance(num1: anumer, den1: adenom )
                }
            )
            let test3: (Expression<Int>, Expression<Int>, Expression<Int>) -> Expression<Int> = (
                try db3!.createFunction("test3", deterministic: true) { anumer, adenom, anum3 in
                    return self.distance(num1: anumer, den1: adenom, num3: anum3 )
                }
            )


The code compiles except that the definition of test3 reports an error at the beginning of "{ anumer". It seems to be that createFunction works with 1 or 2 parameters, but not with 3 (nor 4, I've tried). The error is: "Contextual type for closure argument list expects 1 argument, which cannot be implicitly ignored".

When I observe the expression lookup as I type in "db3.createFunction" it looks like there are an awful lot of typed definitions of createFunction. I am wondering if the multiple definitions are confusing the compiler, giving the error. This may be specific to certain XCode versions [speculation].

This has been questioned on stackoverflow awhile back: https://stackoverflow.com/questions/57383494/how-to-properly-define-closure-for-custom-function-in-sqlite

And to add an example with 4 parameters:

let dbdistance: (Expression<Int>, Expression<Int>, Expression<Int>, Expression<Int>) -> Expression<Int> = (
                try db3!.createFunction("dbdistance", argumentCount: UInt(4), deterministic: true) {num1, den1, num2, den2 in
                    return distance(num1: num1, den1: den1, num2: num2, den2: den2)
                }
            )

This returns a compile error of: "Contextual closure type '([Binding?]) -> Binding?' expects 1 argument, but 4 were used in closure body"

Guia do colaborador