繁体   English   中英

为什么 Swift Array contains(_:) 方法在必须是非可选参数时接受 nil 参数?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM