2014-11-24 65 views
1

對不起,標題...不知道該怎麼命名它。斯威夫特泛型和枚舉與拳擊

typealias JSON = AnyObject 
typealias JSONArray = Array<AnyObject> 

protocol JSONDecodable { 
    class func decode(json: JSON) -> Self? 
} 

final class Box<T> { 
    let value: T 

    init(_ value: T) { 
     self.value = value 
    } 
} 

enum Result<A> { 

    case Success(Box<A>) 
    case Error(NSError) 

    init(_ error: NSError?, _ value: A) { 
     if let err = error { 
      self = .Error(err) 
     } else { 
      self = .Success(Box(value)) 
     } 
    } 
} 

func decode<T: JSONDecodable>(jsonArray: JSONArray?) -> Result<[T: JSONDecodable]> { 
    if let jsonArray = jsonArray { 
     var resultArray = [JSONDecodable]() 
     for json: JSON in jsonArray { 
      let decodedObject: JSONDecodable? = T.decode(json) 
      if let decodedObject = decodedObject { 
       resultArray.append(decodedObject) 
      } else { 
       return Result.Error(NSError()) //excuse this for now 
      } 
     } 
     return Result.Success(Box(resultArray)) // THE ERROR IS HERE !!!! 
    } else { 
     return Result.Error(NSError()) //excuse this for now 
    } 
} 

我得到的錯誤是:

不能轉換表達式的類型「框中爲鍵入 '[T:JSONDecodable]'

可能有人請解釋爲什麼我不能做到這一點,以及我如何解決它。

感謝

+0

你的問題的標題把我嚇壞了:我還以爲你找打:) – 2014-11-24 12:06:00

回答

3

您在聲明函數爲返回Result<[T: JSONDecodable]>,其中泛型類型爲[T: JSONDecodable],即一本字典。

這裏:

return Result.Success(Box(resultArray)) // THE ERROR IS HERE !!!! 

您提供Box<Array>Result.Success,但按照函數聲明,它需要一個Box<Dictionary>

我不知道錯誤是在函數聲明或resultArray型,順便說一句,我發現最快的解決方法是改變函數聲明:

func decode<T: JSONDecodable>(jsonArray: JSONArray?) -> Result<[JSONDecodable]> 

返回Result<[JSONDecodable]>而不是Result<[T: JSONDecodable]>

+0

LOL ...!不能相信這是我最後一個問題的錯誤!也許我需要另一杯咖啡...我需要開始付錢給你。再次感謝。 – bandejapaisa 2014-11-24 12:15:30

+0

LOL我現在意識到這是同一個錯誤,我認爲這是一個真正的字典這一次;-) – Antonio 2014-11-24 12:18:42

0

這是解決我的方法失敗:

func decode<T: JSONDecodable>(jsonArray: JSONArray?) -> Result<[T]> { 
    if let jsonArray = jsonArray { 
    var resultArray = [T]() 
    for json: JSON in jsonArray { 
     let decodedObject: T? = T.decode(json) 
     if let decodedObject = decodedObject { 
      resultArray.append(decodedObject) 
     } else { 
      return Result.Error(NSError()) //excuse this for now 
     } 
    } 
    return Result.Success(Box(resultArray)) 
    } else { 
    return Result.Error(NSError()) //excuse this for now 
    } 
}