任何类型的Init类(通用函数)

时间:2017-11-03 19:44:44

标签: swift class type-inference

我在这里敲我的头......我想做这样的事......

func serialize(into object: Any) -> [Object]{
    var temp = [Object]()
    if object is Project{
        temp = [Project]()
        for (_,j): (String,JSON) in self {
            temp.append(Project(json: j))
        }
    }
    if object is Evaluation{
        temp = [Evaluation]()
        for (_,j): (String,JSON) in self {
            temp.append(Evaluation(json: j))
        }
    }
    return temp
}

在编译时,它不会返回任何值。 if object is ...都没有得到满足。我尝试过我理解为仿制药的变体吗?但我不完全理解他们。

func serialize<T>(into object: T.Type) -> (T){ }

我希望能够将此扩展名用于init已调用并返回的特定类。我尝试使用的所有类都由领域Object类继承。我目前正在调用这个函数(这显然是一个扩展)

let projects = json["projectList"].serialize(into: Project.self) as! [Project]

2 个答案:

答案 0 :(得分:0)

我认为它无法正常工作,因为您在发送类型时正在比较实例。

你能试试吗?

Swift 3

因为你发送:

serialize(into: Project.self)

您需要使用这种比较:

if b.isKind(of: YourSpecificCalss.self) {...}

这应该是你想要进行比较的方法。

答案 1 :(得分:0)

你做的不是它应该工作的方式,事实上你需要指定将由你的所有Object类继承的协议。它会说我可以解析模型实现的JSON。所以我们可以做类似的事情:

enum JSONError: Error {
  case couldNotParse
}

protocol JSONable {
  static func toJSON(json: JSON) throws -> Self
}

final class Project {
//  required field
}

extension Project: JSONable {
  static func toJSON(json: JSON) throws -> Project {
    //  guard required field check else { throw JSONError.couldNotParse }

    let project = Project()
    return project
  }
}