【问题标题】:Init class of any type (Generic function)任何类型的初始化类(通用函数)
【发布时间】:2017-11-03 19:44:43
【问题描述】:

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

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]

【问题讨论】:

  • @matt 它不像“它根本不起作用”那样起作用。我认为我正在尝试做的事情很明显......我会编辑。
  • @matt 编辑反映。
  • @matt 是的,是的。

标签: swift class type-inference


【解决方案1】:

你做的不是它应该工作的方式,事实上你需要指定将被所有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
  }
}

【讨论】:

    【解决方案2】:

    我认为它不起作用,因为您在发送类型时正在比较实例。

    你可以试试这个吗?

    斯威夫特 3

    因为您要发送:

    serialize(into: Project.self)
    

    您需要使用这种比较:

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

    这应该是进行您想要的比较的方式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-19
      • 1970-01-01
      相关资源
      最近更新 更多