作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
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/
我是一名优秀的程序员,十分优秀!