我有一个字典,可以有String
或Int
值,我用compactMapValues
删除了nil值。
其中一个字符串值为capitalized
。
总而言之,我的代码如下所示:
let someOptional: Int? = nil
let test: [AnyHashable: Any] = [
"Some optional" : someOptional,
"Some capitalized string" : "\(true)".capitalized
].compactMapValues { $0 }
当我访问第二个值时:
test["Some capitalized string"]!
我得到这个:(Function)
,而不是True
。
我猜这是因为capitalized
也是一个方法,Dictionary
可能采用方法类型而不是var类型。
但是为什么呢?我怎么才能强迫它接受var
而不是func
呢?
我找到的唯一解决方案是在capitalized
之后添加as String
,但我发现需要这样做很奇怪。
另外奇怪的是,如果我从列表中删除可选条目,它就能工作。或者如果我用"true"
替换"\(true)"
,它也能工作。
1条答案
按热度按时间rjjhvcjd1#
您可以(但不应该)使用KeyPath下标执行此操作:
这样就避免了将属性本身视为函数的可能性。有了它,完整的
Any
解决方案看起来就像这样:复杂的
compactMapValues
是必需的,因为当前的compactMapValues
实际上没有做任何事情:注意“Some optional”在Dictionary中的实际情况吗?它并没有像您所期望的那样被过滤掉,因为它的值是
.some(nil)
。(如果您感兴趣的话,问题在于可选的升级和Any?
的递归特性)。(表达式从“Int?”隐式强制为“Any'),这就是为什么需要as Any
,即使可以通过这种笨拙的方式避免as String
。奇怪的是,你试图在这里使用Any作为你的类型。这总是会导致笨拙的类型解析。当你试图把Optional放在字典里时,就更笨拙了。
如果类型是String或Int,则使用枚举。
对于有条件地插入内容,我的建议是保持简单,只需
if-let
即可:或者,如果
compactMapValues
确实对您有帮助,您仍然可以使用它:不要用任何药物,你会不断地抵抗它。