Swift闭合符合typealias,包括任何
我有两个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 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-您的建议是什么?我想有一个通用的关闭,可以传递-任何提示?