2015-09-11 45 views
0

我試圖挽救2個字典進入迅速一個陣列,但我得到的錯誤,因爲他們有不同的類型,是一種方法,只需添加泛型類型,這裏是我的代碼添加兩個字典到同一陣列迅速

 var resolved = Dictionary<String,T -> Void>() 
     resolved = [ "fulfill": fulfill] 

     var rejectDic = Dictionary<String,NSError -> Void>() 
     rejectDic = [ "reject": reject] 

     var test = [resolved,rejectDic] 
+0

你從哪裏得到泛型參數'T'? – Qbyte

回答

-1

您可以使用任何類型。當然,當你將它們從陣列中取出時,你將不得不將它們的字典恢復到正確的類型。

var resolved = Dictionary<String,T -> Void>() 
resolved = [ "fulfill": fulfill] 

var rejectDic = Dictionary<String,NSError -> Void>() 
rejectDic = [ "reject": reject] 

var test: [Any] = [resolved,rejectDic] 

下面是將字典從數組中取出時進行轉換的示例。

for dict in test { 
    if let resolved = dict as? Dictionary<String,T -> Void> { 
     // Do something 
    } 
    else if let rejectDic = dict as? Dictionary<String,NSError -> Void> { 
     // Do something else 
    } 
} 
2

這樣做的一個非常好的和Swift-y的方式是使用枚舉。如果您仔細考慮它,它會很有意義:您希望測試數組包含任何類型的字典,這正是枚舉所做的。你可以像這樣把它聲明:

enum AcceptanceDict<T> { 
    case Resolved([String : T -> Void]) 
    case Rejected([String : ErrorType -> Void]) 
} 

而且你的代碼看起來可能是這樣的:

class Test<T> { 
    func fulfill(t: T) { print("Fulfilled: \(t)") } 
    func reject(error: ErrorType) { print("Rejected: \(error)") } 

    var test : [AcceptanceDict<T>] = [] 

    func testSet() { 
     let resolved = [ "fulfill" : fulfill ] 
     let rejected = [ "reject" : reject ] 

     test = [ 
      .Resolved(resolved), 
      .Rejected(rejected) 
     ] 
    } 

    func testGet() { 
     for dict in test { 
      switch dict { 
      case .Resolved(let resolved): break 
       // resolved is of type [String : T -> Void] 
      case .Rejected(let rejected): break 
       // rejected is of type [String : ErrorType -> Void] 
      } 
     } 
    } 
} 
+0

只是打開一個操場來創建一個這樣的例子與枚舉,但你打我1 + – nPn

+0

@nPn赫赫,我也經常檢查其他人發佈這樣的答案:P – Kametrixom

0

您好我能夠做到這一點更簡單的方式是這樣

var promiseDic = Dictionary<String,Any>() 
promiseDic = [ "fulfill": fulfill,"reject":reject] 
self.request.updateValue(promiseDic, forKey: uuid) 

但當我從字典中取出函數時,是否需要特別注意某些事情。這裏是我從代碼中取出的代碼

var dictionary:Dictionary<String,Any> = self.request[id] as! Dictionary 
    if((error?.isEmpty) == nil){ 
        let fun = dictionary["fulfill"] 
        fun(true) 
       }else{ 
        let rej = dictionary["reject"] 
        rej(NSError()) 
       }