我有点好奇为什么这个闭包赋值可以在Swift 4.1中工作(还没有在Swift 4.2中测试,但这两个片段在Swift <= 4.0中都不能工作):
func intArrayFunc(_ policy: Int = 0, completion: (([Int]?, Error?) -> Void)? = nil) {
print("policy = '\(policy)'")
completion?([policy + 2], nil)
}
typealias anyArrayClosure = (Int, (([Any]?, Error?) -> Void)?) -> Void
let a: anyArrayClosure = intArrayFunc(_:completion:)
a(1) { (results, error) in
results?.forEach({ (result) in
if let oneResult = result as? Int {
print("\(oneResult) (Should be 3)")
}
})
}然而,这并不是:
func t1(_ int: Int = 0, array: [Any]? = nil) {
print("t1")
}
func t3(_ int: Int = 0, array: [Int]? = nil) {
print("t3")
}
typealias function = (Int, [Any]?) -> Void
let t2: function = t1
let t4: function = t3或者这只是4.1编译器中的一个bug?
发布于 2018-09-22 17:00:25
观察1
func t1(_ int: Int = 0, array: [Any]? = nil, completion: ((Int) -> ())) {
print("t1")
}
func t3(_ int: Int = 0, array: [Any]? = nil, completion: ((Int) -> ())) {
print("t3")
}
typealias function = (Int, [Int]?, ((Any) -> ())) -> Void
let t2: function = t1
let t4: function = t3这个可以工作,因为t2和t4将接受与Int和Any中的代码兼容的代码参数,但是如果相反,它就不会,因为Int不能接受Any值。
观察2
现在闭包再次收到一个参数。因此,如果将Int参数传递给Any,则它是有效的,但如果将Any传递给Int,则它是无效的。
所以,这个不能工作,。
func t1(_ int: Int = 0, array: [Any]? = nil, completion: ((Int) -> ())) {
print("t1")
}
func t3(_ int: Int = 0, array: [Any]? = nil, completion: ((Any) -> ())) {
print("t3")
}
typealias function = (Int, [Int]?, ((Int) -> ())) -> Void
let t2: function = t1
let t4: function = t3所以最终,它归结为一个简单的事实,无论您传递给变量的是什么,都应该与它的类型兼容。您可以将和Int传递给Any,但反之亦然。
https://stackoverflow.com/questions/52455050
复制相似问题