2016-07-24 85 views
-1

我正在使用Swift 2,並且我想將struct類型與enum中的每個個案相關聯。將類型與Swift枚舉類型關聯起來?

目前,我已經通過向枚舉添加一個函數來解決此問題,該函數名爲type,它使用switch語句爲每個案例返回相關類型的實例,但是我想知道是否有必要。我知道你可以將字符串,整數等與Swift枚舉關聯起來,但是也可以關聯一個類型嗎?如果有幫助,所有類型的結構都符合相同的協議。

這就是我現在正在做什麼,但我喜歡這個功能做掉:

public enum Thingy { 

    case FirstThingy 
    case SecondThingy 

    func type() -> ThingyType { 
     switch self { 
     case .FirstThingy: 
      return FirstType() 
     case .SecondThingy: 
      return SecondType() 
     } 
    } 

} 
+1

「這就是我現在正在做的事情,但我很想去除這個功能」爲什麼?你在做什麼使得選擇完美。它將類型與案例聯繫起來!這是一個枚舉方法_for_。我建議你保持你的想法並繼續前進。 – matt

+0

我當然可以,但我知道用一個字符串等,我可以簡單地做'case FirstThingy =「FirstThingy」'。我想知道我們是否有辦法用對象來做到這一點。 – Luke

+1

所以你說你想要這個類型是一個原始值?保持這一點,或更好的是,使其成爲一個計算屬性。然後,你可以使用'thingy.type'而不是'thingy.rawValue'。 – tktsubota

回答

1

我想你說你想要的原始值是ThingyType類型,但這是不可能的。

你可以做的是使type一個計算屬性,以刪除()和只需要訪問它與thingy.type

public enum Thingy { 

    case FirstThingy 
    case SecondThingy 

    var type: ThingyType { 
     switch self { 
     case .FirstThingy: 
      return FirstType() 
     case .SecondThingy: 
      return SecondType() 
     } 
    } 

} 
+0

這不是一個可讀的問題。 ThingyType沒有資格成爲原始價值。我不明白這個答案是如何超越OP的原始代碼的。 – matt

+0

@matt我刪除了可讀性部分,並補充說它不可能是原始值。這比'方式'更好,因爲「類型」通常是屬性。 「Thingy」有一個類型,而不是「Thingy」有一個確定自己類型的方法。 – tktsubota

+0

OP的問題是「我很想取消這個功能」。但是你沒有(也不能)「幹掉」任何東西。計算屬性中的大括號內的東西是一個函數(它是'get'函數,getter函數,除了通過省略單詞'get'來僞裝這個函數)。這是OP表示他希望取消的同一功能!所以這個「答案」不過是一種手法 - 儘管足以滿足OP,我知道...... – matt