Swift泛型和枚举和拳击

时间:2014-11-24 12:02:56

标签: generics swift

对不起标题......不知道该怎么命名。

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;

有人可以解释为什么我不能这样做,以及我如何解决它。

由于

2 个答案:

答案 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
  }
}