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

标签 arrays swift dictionary syntax

我想使用 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/

相关文章:

ios - 使用 NSPredicate 根据作为 NSDictionary 的属性过滤对象的 NSArray

swift - 如何暂停 DispatchQueue 调度的任务

PHP 数据数组 href

javascript - 无需硬编码即可创建数组

Swift 将变量转换为变量类

python - 如何检查python对象列表中是否存在值

python - 将字典附加到字典

java - 如何从左下角开始在java中计数?

c# - c#中如何获取Marshal的值

c++ - std::map operator [] - 未定义的行为?