2014-12-28 76 views
0

我在Swift中定义了Dictionary,其中枚举作为键和结构作为值。在运行时,我希望值添加到字典中对于给定的枚举密钥,但是我得到以下错误:使用枚举键为Swift字典添加值

“@lvalue $ T9”不等同于“(MyEnum,迈德特)”

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 
    } 
} 

任何想法如何正确地做到这一点?

+0

可能重复:http://stackoverflow.com/questions/24562357/how-can-i-use-a-swift-enum-as-a-dictionary-key-conforming-to-equatable –

+0

不是重复的该问题是关于与关联类型的枚举,因此不能自动排除 –

+0

我检查了这一个,它没有演示如何在运行时向字典添加新条目 – Tamir

回答

2

问题是,您宣布myDictionarylet而不是var。切换到var,您的代码将按预期工作。

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

不幸的是,错误消息并不是非常有帮助。理想情况下,它会读取“尝试修改不可变值myDictionary”。

尽管如此,不要让这使用let - 除非您知道需要更改值,否则默认使用let是一种很好的做法。但在这种情况下,你需要使用var

+0

谢谢。很好的答案。有用。顺便说一句,据我所知,有没有办法让属性枚举(例如在Java中),否则我不必定义这个额外的字典,并可以结合枚举和其相关的结构数据。我对吗 ? – Tamir

+0

枚举可以同时具有原始基础类型和关联值。在评论中提到的链接可能与您的问题重复,是关于具有关联值的枚举如何不能自动散列,请看一下,或者您可以阅读[Swift书]中的枚举章节(https:// developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Enumerations.html#//apple_ref/doc/uid/TP40014097-CH12-ID145) –

+0

我读了关于原始值的解释,但它没有看起来和Java一样,你可以使用固定值来定义enum,比如下面的例子3:http://javarevisited.blogspot.co.il/2011/08/enum-in-java-example-tutorial .html – Tamir