【问题标题】:Adding value to Swift dictionary with enum key使用枚举键向 Swift 字典添加值
【发布时间】:2015-02-24 20:50:24
【问题描述】:

我在 Swift 中定义了 Dictionary,其中 enum 为 key,struct 为 value。在运行时,我想为给定的枚举键向字典添加值,但是我收到以下错误:

'@lvalue $T9' 与 '(MyEnum, MyData)' 不同

enum MyEnum {
    case A, B, C
}

struct MyData {

    var x : Int
    var y : Int

    init(x:Int, y: Int) {
        self.x = x
        self.y = y
    }
} 

class Tester {

    let myDictionary = [MyEnum : MyData]()

    func dummy() {
        self.myDictionary[MyEnum.A] = MyData(x: 1, y: 2) // <-- error in this line
    }
}

知道如何正确地做到这一点吗?

【问题讨论】:

  • 不是那个问题的副本,它是关于一个具有关联类型的枚举,因此不能自动散列
  • 我检查了这个,它没有演示如何在运行时向字典中添加新条目

标签: swift dictionary enums key add


【解决方案1】:

问题是你用let而不是var声明了myDictionary。将其切换为var,您的代码将按预期工作。

字典是结构体,是一种“值”类型。这意味着当您使用let 声明它们时,它们将永远被分配给它们的值冻结。您不能调用更改其值的方法,包括通过下标 ([ ]) 分配给它们。

不幸的是,错误消息并不是很有帮助。理想情况下,它应该是“尝试修改不可变值 myDictionary”之类的内容。

不要让这让您对使用 let 感到厌烦 - 默认情况下使用 let 是一个很好的做法,除非您知道需要更改值。但在这种情况下,您需要使用var

【讨论】:

  • 谢谢。很好的答案。有用。顺便说一句,据我所知,没有办法让枚举具有属性(例如在 Java 中),否则我不必定义这个额外的字典,并且可以结合枚举及其相关的结构数据。我说的对吗?
  • 枚举可以有原始的底层类型和关联的值。评论中提到的可能与您的问题重复的链接是关于具有关联值的枚举如何不能自动散列,请看一下,或者您可以阅读the Swift book中的枚举章节@
  • 我阅读了有关原始值的说明,但是它看起来与在 Java 中可以定义具有固定值的枚举不同,例如下页中的示例 3:javarevisited.blogspot.co.il/2011/08/…
  • 不确定示例 3 中的确切含义,但这与我认为您的意思相同:enum Currency: Int { case Penny = 1 case Nickle = 5 case Dime = 10 case Quarter = 25 }; let coin = Currency(rawValue: 25)
  • 是的,这就是我的意思,但是你写的和java例子不完全一样......根据这个例子,我想写let coin = Currency.Quarter。而且 Quarter 还可以包含其他一些属性...
猜你喜欢
  • 1970-01-01
  • 2017-11-27
  • 2019-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-25
相关资源
最近更新 更多