【发布时间】:2019-05-24 14:08:39
【问题描述】:
我有两个 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 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>>')
我如何创建一个符合 typealias 变量闭包的闭包(或更好的两个),或者以其他方式拥有一种我可以将我的闭包传递给的通用类型别名。
【问题讨论】:
-
类型系统不应该像这样工作。您的意思是,任何人都可以将
Anything 传递给名为search的VariableClosure,但实际上您只接受字符串和整数。 -
@Sweeper - 你有什么建议?我想要一个可以传递的通用闭包 - 有什么提示吗?
标签: swift