2014-12-28 35 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