gpt4 book ai didi

ios - Swift: `["one": nil] as [String: Any]` 有效,为什么?

转载 作者:行者123 更新时间:2023-12-03 07:56:56 26 4
gpt4 key购买 nike

func logEvent(events: [String: Any]) {
print(events);
}

let eventProperties: [String: Any?] = [
"one": nil,
"two": "2"
]

logEvent(events: eventProperties as [String: Any])

如果我将 let eventProperties: [String: Any?] 更改为 let eventProperties: [String: Any] 我会收到有意义的错误。但为什么上面的代码有效呢?

'nil' is not compatible with expected dictionary value type 'Any'
"one": nil,

最佳答案

每种类型都是 Any 的子类型。这包括各种 Optional包括Optional<Any> 。所以你绝对可以转换[String: Any?]进入[String: Any]因为Any?是一种Any .

另一方面,字面量 nil仅适用于Optional ,所以let x: Any = nil无效。 Any不是Optional .

这种困惑是你应该避免的一个关键原因 Any ,你应该强烈避免 Any? 。当与可选提升(类型在分配时可以提升为其自身的可选类型这一事实)结合使用时,任何类型很快就会变成一堆令人困惑的错误和微妙的行为。一个非常常见的问题是最终得到 Any??值如 .some(nil) ,它本身不为零。如果可能的话,请避免这种情况。

对于您的日志记录问题,[String: Any]可能没问题。我自己用过,非常有效。但不要创建[String: Any?]字典。如果您确实需要一个可以包含的 nil 占位符,请这样做:

let anyNil = Any?.none as Any 

let eventProperties: [String: Any] = [
"one": anyNil,
"two": "2"
]

(但如果可以的话,我仍然会避免这种情况。)

关于ios - Swift: `["one": nil] as [String: Any]` 有效,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75842618/

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