![](/img/trans.png)
[英]Xcode NSManagedObject subclass contains optionals when they are marked as non-optional
[英]Why does Swift Array contains(_:) method accept nil argument when it must be non-optional?
我尽可能地简化了我的代码,以使其仍然是一个可重现的示例。 当我在调用链中使用这样的contains
时,它会编译、工作并且contains
在不应该的时候接受nil
,我想。
let array = [1, 2, 3, 4, 5].filter { _ in
[1, 2, 3].map { smallNumber in
"\(smallNumber)"
}
.contains(nil)
}
但是,当我将map
结果分配给一个变量,然后使用nil
值调用contains
时,代码甚至无法编译。
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)
可以应用于它。 即编译器将代码理解为
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)
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.