gpt4 book ai didi

ios - 为什么 Swift 数组包含(_ :) method accept nil argument when it must be non-optional?

转载 作者:行者123 更新时间:2023-12-01 15:57:28 28 4
gpt4 key购买 nike

我尽可能地简化了我的代码,使它仍然是一个可重现的例子。
当我使用 contains像这样在一系列调用中它确实编译、工作和 contains接受 nil当它不应该的时候,我想。

let array = [1, 2, 3, 4, 5].filter { _ in
[1, 2, 3].map { smallNumber in
"\(smallNumber)"
}
.contains(nil)
}

但是当我分配 map结果到一个变量,然后调用 containsnil值代码甚至无法编译。
let array = [1, 2, 3, 4, 5].filter { _ in
let mappedNumbers = [1, 2, 3].map { smallNumber in
"\(smallNumber)"
}
return mappedNumbers.contains(nil)
}

Xcode 提示 'nil' is not compatible with expected argument type 'String' ,没错。

我希望在第一个示例中出现相同的错误。

最佳答案

如果上下文需要,编译器可以自动将值包装到可选项中。这就是使简单的任务像

let value: Int? = 123

可能的。在您的第一个示例中,闭包的返回类型被推断为 String?从上下文中,使 map返回 [String?] , 和 .contains(nil)可以应用于它。 IE。编译器将代码理解为
let array = [1, 2, 3, 4, 5].filter { _ in
[1, 2, 3].map { smallNumber -> String? in
"\(smallNumber)"
}
.contains(nil)
}

在第二个例子中,编译器没有那个上下文, mappedNumbers类型为 [String] .你可以通过指定闭包返回类型 String?来编译它。明确:
let array = [1, 2, 3, 4, 5].filter { _ in
let mappedNumbers = [1, 2, 3].map { smallNumber -> String? in
"\(smallNumber)"
}
return mappedNumbers.contains(nil)
}

关于ios - 为什么 Swift 数组包含(_ :) method accept nil argument when it must be non-optional?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59084236/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com