对不起标题…不知道该叫什么名字。

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]>

10-02 02:37