对不起标题......不知道该怎么命名。
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
}
}
我得到的错误是:
无法转换表达式&#39; Box&#39;输入&#39; [T:JSONDecodable]&#39;
有人可以解释为什么我不能这样做,以及我如何解决它。
由于
答案 0 :(得分: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]>
。
答案 1 :(得分: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
}
}