簡體   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