Swift闭合符合typealias,包括任何

Swift闭合符合typealias,包括任何,swift,Swift,我有两个typealias声明 typealias QueryClosure = ((UInt?,UInt?)->([URLQueryItem])?)? typealias SearchClosure = ((String?,UInt?)->([URLQueryItem])?)? 我为这些创建了闭包 var queryFunc: (QueryClosure)? = ( {a,b in return [URLQueryItem(name: "limit", value: "\

我有两个typealias声明

typealias QueryClosure = ((UInt?,UInt?)->([URLQueryItem])?)?
typealias SearchClosure = ((String?,UInt?)->([URLQueryItem])?)?
我为这些创建了闭包

var queryFunc: (QueryClosure)? = ( {a,b in
    return [URLQueryItem(name: "limit", value: "\(a ?? defaultPageSize)"), URLQueryItem(name: "offset", value: "\( (b ?? defaultPageIndex) * (a ?? defaultPageSize) )")]
})

var searchFunc: (SearchClosure)? = ( {query,b in
    return [URLQueryItem(name: "q", value: query), URLQueryItem(name: "page", value: "\(b ?? defaultPageIndex)")]
    }
)
现在我不想传递查询或搜索闭包,我想传递一般闭包

所以我创建了一个新的typealias

typealias VariableClosure = ((Any?, Any?)->([URLQueryItem]))?
但是我不能转换成这种类型

let search : (VariableClosure) = ( {query,b in
    return [URLQueryItem(name: "q", value: query), URLQueryItem(name: "page", value: "\(b ?? defaultPageIndex)")]
    }
)
这给了我一个错误

Cannot convert value of type '(String?, _) -> [URLQueryItem]' to specified type 'VariableClosure' (aka 'Optional<(Optional<Any>, Optional<Any>) -> Array<URLQueryItem>>')
无法将类型为“(String?,\)->[URLQueryItem]”的值转换为指定的类型“VariableClosure”(也称为“可选数组>”)

如何创建符合typealias variableclosure的闭包(或更好的两个闭包),或者以其他方式创建一种我可以将闭包传递给的通用typealias。

因为
URLQueryItem
接受
字符串,而您传递的
查询
变量属于
任何
类型,在使用它之前,必须先将
typecast
query
转换为
String

变量
b
也是如此。在使用之前,必须将
typecast
转换为
Int

let search: VariableClosure = {query,b in
    if let query = query as? Int, let b = b as? Int {
        return [URLQueryItem(name: "limit", value: "\(query ?? 10)"), URLQueryItem(name: "offset", value: "\( (b ?? 10) * (query ?? 10) )")]
    } else if let query = query as? String, let b = b as? Int {
        return [URLQueryItem(name: "q", value: query), URLQueryItem(name: "page", value: "\(b ?? 1)")]
    }
    return nil
}

在上述情况下,如果您还需要其他类型的
query
b
,则必须手动处理它们

类型系统不应该像这样工作。您的意思是,任何人都可以将
任何
内容传递到名为
搜索的
变量闭包
,但实际上您只接受字符串和整数。@Sweeper-您的建议是什么?我想有一个通用的关闭,可以传递-任何提示?