如何在 Swift 泛型函数中创建正确类型的新对象?

大卫帕特森

我有以下 Swift 通用方法:

  static func getRecords<T>(_ which: Which, from table: Table, completionHandler: @escaping ([T]) -> Void)
  {
    let url: String = DatabaseInterface.getUrl(which, from: table)
    Http.get(url: url)
    {
      response, error in
      if nil != error
      {
        print("get\(table.rawValue)() failed; error = \(error!)")
        return
      }

      var objects: [T] = []
      let formatter = DateFormatter()
      formatter.dateFormat = "yyyy-MM-dd" // Matches PHP's "Y-m-d" \Date format.

      let records = (response!["records"])!
      for record in (records as! [NSDictionary])
      {
        // This line fails with the error
        // 'T' cannot be constructed because it has no accessible initializers
        objects.append(T(fromDictionary: record as! [String: Any]))
      }
      DispatchQueue.main.async
      {
        completionHandler(objects)
      }
    }
  }

Http.get() 方法从服务器检索记录并将 JSON 解码为字典数组。

objects.append() 行失败并显示以下错误:

无法构造“T”,因为它没有可访问的初始值设定项

我的第一个问题:是否可以在泛型函数中创建由类型占位符指定的类型的新实例?

我的第二个问题:如果可能的话,这样做的正确语法是什么?

亚历山大

编译器不知道 T 有初始值设定项。您需要将其限制为包含 init(fromDictionary:) 的协议或类

protocol JSONInitializable {
    init(fromDictionary: [String: Any])
}

static func getRecords<T: JSONInitializable>(
    _ which: Which,
    from table: Table,
    completionHandler: @escaping ([T]) -> Void
    ) {
    let url = DatabaseInterface.getUrl(which, from: table)
    Http.get(url: url) { _response, error in
    guard let response = _response as? [String: [[String: Any]]],
        error == nil else {
        print("get\(table.rawValue)() failed; error = \(error!)")
        return
    }

    guard let objects = response["records"]?.map(T.init(fromDictionary:)) {
        fatalError("`response` doesn't have a value for the key \"records\".")
    }

    DispatchQueue.main.async { completionHandler(objects) }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在Swift中调用歧义泛型函数?

来自分类Dev

如何编写枚举类型的Swift泛型函数?

来自分类Dev

如何使用协议关联类型在Swift中编写泛型函数

来自分类Dev

如何在Swift 5.1(Xcode 11 Playground)中实现对可选函数的泛型和非泛型函数签名的重载?

来自分类Dev

如何从Swift泛型函数捕获参数

来自分类Dev

如何在Kotlin中创建泛型函数

来自分类Dev

Swift 中的泛型函数

来自分类Dev

如何在Swift中使用函数参数消除对该泛型函数的调用的歧义?

来自分类Dev

如何在 Swift 中创建高阶函数?

来自分类Dev

在Swift中从非泛型函数调用泛型函数

来自分类Dev

在Swift中从非泛型函数调用泛型函数

来自分类Dev

Swift:检查泛型函数的返回类型

来自分类Dev

如何在 Swift 4.2 中创建数据类型泛型

来自分类Dev

如何使用 Swift 3 在泛型函数中获得计算变量的子类版本?

来自分类Dev

在Swift中,返回相同类型的函数的泛型函数使我“无法显式专门化泛型函数”

来自分类Dev

iOS如何在Swift中获取对象的属性类型?

来自分类Dev

iOS如何在Swift中获取对象的属性类型?

来自分类Dev

如何在Swift中定义新的对象通用列表?

来自分类Dev

如何在Swift中确定变量的类型

来自分类Dev

如何在Swift中引用类型本身

来自分类Dev

如何在Swift中制作新的指针?

来自分类Dev

如何在Swift中创建一个返回可解码类型的函数?

来自分类Dev

如何在Objective-C中创建Swift对象?

来自分类Dev

如何在Swift中根据字符串创建对象?

来自分类Dev

如何在Swift中创建设置对象

来自分类Dev

如何在Swift中防止对象构造

来自分类Dev

如何在Swift中遍历对象数组?

来自分类Dev

如何在Swift中附加CoreData对象?

来自分类Dev

如何在Swift中创建圆形按钮?

Related 相关文章

  1. 1

    如何在Swift中调用歧义泛型函数?

  2. 2

    如何编写枚举类型的Swift泛型函数?

  3. 3

    如何使用协议关联类型在Swift中编写泛型函数

  4. 4

    如何在Swift 5.1(Xcode 11 Playground)中实现对可选函数的泛型和非泛型函数签名的重载?

  5. 5

    如何从Swift泛型函数捕获参数

  6. 6

    如何在Kotlin中创建泛型函数

  7. 7

    Swift 中的泛型函数

  8. 8

    如何在Swift中使用函数参数消除对该泛型函数的调用的歧义?

  9. 9

    如何在 Swift 中创建高阶函数?

  10. 10

    在Swift中从非泛型函数调用泛型函数

  11. 11

    在Swift中从非泛型函数调用泛型函数

  12. 12

    Swift:检查泛型函数的返回类型

  13. 13

    如何在 Swift 4.2 中创建数据类型泛型

  14. 14

    如何使用 Swift 3 在泛型函数中获得计算变量的子类版本?

  15. 15

    在Swift中,返回相同类型的函数的泛型函数使我“无法显式专门化泛型函数”

  16. 16

    iOS如何在Swift中获取对象的属性类型?

  17. 17

    iOS如何在Swift中获取对象的属性类型?

  18. 18

    如何在Swift中定义新的对象通用列表?

  19. 19

    如何在Swift中确定变量的类型

  20. 20

    如何在Swift中引用类型本身

  21. 21

    如何在Swift中制作新的指针?

  22. 22

    如何在Swift中创建一个返回可解码类型的函数?

  23. 23

    如何在Objective-C中创建Swift对象?

  24. 24

    如何在Swift中根据字符串创建对象?

  25. 25

    如何在Swift中创建设置对象

  26. 26

    如何在Swift中防止对象构造

  27. 27

    如何在Swift中遍历对象数组?

  28. 28

    如何在Swift中附加CoreData对象?

  29. 29

    如何在Swift中创建圆形按钮?

热门标签

归档