2015-09-07 70 views
0

我在Swift中有一個枚舉。這有點像按類型快速訪問枚舉

enum LegalArgs { 
    case AsString(String) 
    case AsBool(Bool) 
    ... etc 
} 

我想通過類型有條件訪問此枚舉。所以如果我有LegalArgs的實例,我可以通過T並獲得T?如果實例是那種類型的話。否則,我將不得不爲一些不同的情況重複一堆代碼。

我當前的代碼看起來有點像這樣:

String? maybeAsString(arg: LegalArgs) { 
    switch arg { 
    case .AsString(let str): 
     return str; 
    default: 
     return nil; 
    } 
} 

的問題是,我必須重複此功能在枚舉所有情況。

+0

你想的'init'這需要'Any',使一個'enum'爲根據實際類型相關聯的價值?所以'LegalArgs(「你好」)'會導致'LegalArgs.AsString(「你好」)'? – Qbyte

+0

不,反過來 - 我有LegalArgs.AsString(「你好」),我需要一個字符串?。這對於特定的成員來說很簡單,但當我需要在所有不同類型的案例中共享相同的邏輯時,這個問題會更加棘手。 – Puppy

回答

1

您可以使用一個通用的asType功能:

enum LegalArgs { 
    case AsString(String) 
    case AsBool(Bool) 
    case AsNumber(Int) 

    func asType<T>(type: T.Type) -> T? { 
     switch self { 
     case AsString(let str): return str as? T 
     case AsBool(let bol): return bol as? T 
     case AsNumber(let num): return num as? T 
     } 
    } 
} 

// usage 
LegalArgs.AsBool(true).asType(Bool.self) // true 
LegalArgs.AsBool(true).asType(String.self) // nil 
+0

這並不能完全解決我的問題......但它幾乎肯定足夠接近。我將在下一次在此代碼庫上工作時嘗試此操作。 – Puppy

+0

@Puppy爲了解決問題應該改變什麼? – Qbyte

+0

那麼,我仍然需要手動保持asType 與底層枚舉同步,並且對於每個需要此函數的枚舉,我都需要自己重寫它,而不是使用語言工具來完成它。我的意思是,該工具可能不存在,所以這是最好的解決方案,但它的原理並不像原來那麼好。 – Puppy