gpt4 book ai didi

arrays - 在 Swift 2 中定义不可变字典数组的优雅方式是什么?

转载 作者:搜寻专家 更新时间:2023-11-01 07:30:11 24 4
gpt4 key购买 nike

我想使用 Swift 2 可能使用的最简洁、最易读的语法定义字典的静态数组。不幸的是,我不断收到 Type of expression is ambiguous without more context 错误。

例如:

    let items: [[MyEnum:AnyObject]] = [
[ .EnumKey: 1, .AnotherKey: ["cat", "dog", "bird"] ],
[ .EnumKey: 2, .AnotherKey: ["racoon"] ]
]

我用谷歌搜索了答案,但找不到很好的例子。有些人建议使用 var 并每行添加一个值,但我觉得这样很麻烦,因为我知道数组及其项不会改变。感谢您的帮助!

最佳答案

您看到的差异是由您是否导入 Foundation 造成的。

在您的示例中,您将字典键入为:

[MyEnum:AnyObject]

但是,您使用整数和数组来初始化它们。在严格的 Swift 世界中,Int 和 Array 是结构体,不符合 AnyObject。 AnyObject 是一种只有类隐式遵守的协议(protocol)。然而,一旦你导入 Foundation,那么事情就会桥接到 NSNumber、NSString、NSArray 等。这些都是类,显然这会给编译器带来歧义。错误消息是正确的,但在了解幕后发生的事情之前有点难以理解。

我建议将 AnyObject 更改为 Any。

enum MyEnum {
case EnumKey
case AnotherKey
}

let items: [[MyEnum:Any]] = [
[ .EnumKey: 1, .AnotherKey: ["cat", "dog", "bird"] ],
[ .EnumKey: 2, .AnotherKey: ["racoon"] ]
]

这应该可行,并且在技术上更正确。

然而,如果你需要你的字典与 NSDictionary 桥接,那么你将不得不采用另一种方式。在那种情况下,您可以使用 AnyObject,但您必须将值键入为 NSNumber 和 NSArray。此外,我更改了您的枚举,将 String 原始值用作键。

enum MyEnum: String {
case EnumKey
case AnotherKey
}

let items: [[String:AnyObject]] = [
[ MyEnum.EnumKey.rawValue: NSNumber(integer: 1), MyEnum.AnotherKey.rawValue: ["cat", "dog", "bird"] as NSArray ],
[ MyEnum.EnumKey.rawValue: NSNumber(integer: 2), MyEnum.AnotherKey.rawValue: ["racoon"] as NSArray ]
]

有关 AnyObject 怪异行为的更多信息,此博客提供了一些有用的信息: http://www.drewag.me/posts/swift-s-weird-handling-of-basic-value-types-and-anyobject

关于arrays - 在 Swift 2 中定义不可变字典数组的优雅方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32995115/

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