对不起标题…不知道该叫什么名字。
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
}
}
我得到的错误是:
无法将表达式的类型“box”转换为类型“[t:jsondecodable]”
有人能解释一下我为什么不能这样做,以及我如何解决它吗?
谢谢
最佳答案
您正在声明函数返回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]>
。