2015-06-11 63 views
3

我想創建一個帶有WallType(請參閱下面的代碼)的SKSpriteNodes,並且只有當WallType.Corner時,纔會爲其方向傳遞一個Side值。 枚舉具有原始值,因爲我需要將它們加載爲plist中的數字,並且能夠隨機創建它們。Swift Enum與原始類型+ case參數的變通方法?

enum Side: Int { 
    case Left = 0, Right 
} 

enum WallType: Int { 
    case Straight = 0 
    case Corner(orientation: Side) 
} 

我得到的錯誤:「枚舉與原始類型不能有例參數」

有一種解決方法,我可以通過SKSpriteNode一個值,其方向只有當它的WallType.Corner ? 目前,我每次都用方向值初始化它,即使它沒有必要,因爲它的WallType.Straight

我想我可以使Side可選,但後來我不得不改變很多其他代碼,我使用Side以及。 然後,我仍然必須通過nil

我想初始化牆這樣的:

let wall = Wall(ofType type: WallType) 

關於它的定位應該是WallType內的信息,但只有當它是.Corner。 有沒有辦法延長WallType以適應我的需求?

在這個線程做並沒有真正似乎在我的情況下適用的建議: Can associated values and raw values coexist in Swift enumeration?

或者,如果我決定從WallType枚舉帶走的原始值,我將如何去加載它形成一個plist?

我希望有道理!感謝您的任何建議!

+0

因爲你只有兩個方面,你有沒有考慮具有用於左角和右角另一個枚舉值枚舉值? – zneak

+0

謝謝zneak,這當然是一種解決方法!我寧願將WallType枚舉與2個案例保持一致,因爲我在其他地方也使用它,但如果沒有合理的其他解決方案,我會這樣做。 – nontomatic

回答

0

你可以這樣做,讓你把Side enum留給Int的子類,但是你想把這個枚舉傳遞給Wall,所以確保它的rawValue或index和side作爲創建Wall的參數。

這樣的事情,

enum Side: Int { 
    case Left = 0, Right 
} 

enum Wall { 
    case Straight(Int) 
    case Corner(Int,Side) 
} 

let straight = Wall.Straight(0) 
let corner = Wall.Corner(1, .Left) 

switch straight { 
    case .Straight(let index): 
     print("Value is \(index)") 
    case .Corner(let index, let side): 
     print("Index is: \(index), Side is: \(side)") 
} 
+0

非常感謝您的幫助!如果我誤解了,請原諒我,但是我是否仍然需要通過我的類實例牆才能在wallType的頂端輸入參數?因爲這是我想避免的。在你的例子中是否是「直接切換」的錯字? – nontomatic

+0

那麼即使上面的代碼可以工作,你也必須這麼做嗎?無論如何,如果你想讓牆擁有Side,那麼爲什麼在構建Wall的時候避免通過Side的實例呢?筆直不是錯字。我只想告訴你,你如何測試你的牆的實例.Corner或.Straight類型。 – Sandeep

+0

好的,我明白了。我只注意到我自己的代碼示例中有一個錯字。這個枚舉的名字是「WallType」,正如我的文本中提到的那樣,而不是「Wall」。抱歉!我試圖初始化需要上述「WallType」作爲參數的類「Wall」的實例「wall」。我希望我不需要用WallType以外的任何東西來初始化那個牆,這樣Side的信息就已經包含在那個WallType中了。感謝您解釋您的代碼,我會在早上嘗試一下,然後回到這裏。 – nontomatic