![](/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.