首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Swift闭包、闭包签名和闭包等价

Swift闭包、闭包签名和闭包等价
EN

Stack Overflow用户
提问于 2018-09-22 16:51:10
回答 1查看 127关注 0票数 0

我有点好奇为什么这个闭包赋值可以在Swift 4.1中工作(还没有在Swift 4.2中测试,但这两个片段在Swift <= 4.0中都不能工作):

代码语言:javascript
复制
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)")
        }
    })
}

然而,这并不是:

代码语言:javascript
复制
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?

EN

回答 1

Stack Overflow用户

发布于 2018-09-22 17:00:25

观察1

代码语言:javascript
复制
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

这个可以工作,因为t2t4将接受与IntAny中的代码兼容的代码参数,但是如果相反,它就不会,因为Int不能接受Any值。

观察2

现在闭包再次收到一个参数。因此,如果将Int参数传递给Any,则它是有效的,但如果将Any传递给Int,则它是无效的。

所以,这个不能工作,。

代码语言:javascript
复制
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,但反之亦然。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52455050

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档