告诉通用函数其类型而不传递该类型的示例

我正在创建一个通用函数来处理Firebase快照,并且发现该通用函数不知道要使用哪种类型,除非您通过在参数中输入它来明确告知该类型。

因此,我采用了一种非常丑陋的方法,即仅创建一个空白,例如User()并将其输入到此函数中,然后再也不要触摸它。

有什么更好的方法?

   func handleSnapshot<T: FirebaseType>(snapshot: FDataSnapshot?, forType type: T) -> [T]? {
      guard let snapshot = snapshot, dictionaries = snapshot.value as? [NSObject: AnyObject] else { return nil }
      var objects = [T]()
      for (uid, dictionary) in dictionaries {
         let theUID = uid as? String ?? "No UID"
         guard let dictionary = dictionary as? [NSObject: AnyObject] else { return nil }

         let object = T(fromDictionary: dictionary, andUID: theUID)
         objects.append(object)
      }
      return objects
   }
抢马约夫

传递类型对象而不是类型的实例。另外,andUID:是不好的风格。

func handleSnapshot<T: FirebaseType>(snapshot: FDataSnapshot?, forType type: T.Type) -> [T]? {
    guard let snapshot = snapshot, dictionaries = snapshot.value as? [NSObject: AnyObject] else { return nil }
    var objects = [T]()
    for (uid, dictionary) in dictionaries {
        let theUID = uid as? String ?? "No UID"
        guard let dictionary = dictionary as? [NSObject: AnyObject] else { return nil }

        if let object = T(fromDictionary: dictionary, uid: theUID) {
            objects.append(object)
        }
    }
    return objects
}

使用:

// Explicit type declaration is unnecessary but included for clarity.
let doodads: [Doodad]? = handleSnapshot(snapshot, forType: Doodad.self)

更新

另一种方法:将方法添加到FirebaseType协议扩展中:

extension FirebaseType {
    func arrayFromSnapshot(snapshot: FDataSnapshot?) -> [Self]? {
        guard let snapshot = snapshot, dictionaries = snapshot.value as? [NSObject: AnyObject] else { return nil }
        var objects = [Self]()
        for (uid, dictionary) in dictionaries {
            let theUID = uid as? String ?? "No UID"
            guard let dictionary = dictionary as? [NSObject: AnyObject] else { return nil }

            if let object = Self(fromDictionary: dictionary, uid: theUID) {
                objects.append(object)
            }
        }
        return objects
    }
}

使用:

let doodads = Doodad.arrayFromSnapshot(snapshot)

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

通用高阶函数的不兼容流类型

来自分类Dev

是否可以创建其字段是具有通用参数的函数的记录类型,而在创建记录时不指定类型?

来自分类Dev

是否可以创建其字段是具有通用参数的函数的记录类型,而在创建记录时不指定类型?

来自分类Dev

在C ++中将函数作为模板类型传递并推导其类型

来自分类Dev

Swift - 检查对象是否属于给定类型(该类型已作为函数参数传递)

来自分类Dev

为什么控件不采用为该类型控件定义的通用样式

来自分类Dev

通用类型不兼容

来自分类Dev

从传递的函数的返回值推断函数通用类型U

来自分类Dev

将参数传递给通用Class类型的构造函数

来自分类Dev

函数返回基本接口的通用类-类型不匹配

来自分类Dev

类内通用递归函数的Kotlin类型不匹配

来自分类Dev

通用的基于类型的函数可根据其类型对数字求和

来自分类Dev

编译器如何知道所使用的类是通用类,尽管该类已被编译并且其类型已擦除为通用代码

来自分类Dev

定义类型和使用该类型作为模板参数的函数

来自分类Dev

将通用类型传递给通用接口

来自分类Dev

Java:在不更改其类型的情况下乘以通用编号

来自分类Dev

Java:在不更改其类型的情况下乘以通用编号

来自分类Dev

Scala通用函数假设类型

来自分类Dev

通用函数类型别名

来自分类Dev

通用函数中的属性类型

来自分类Dev

传递和访问已传递到需要其超类型的类构造函数中的子类型的值和函数

来自分类Dev

将通用类型传递给采用通用类型的方法

来自分类Dev

如何获得通用属性却忽略其类型?

来自分类Dev

如何键入参数化不直接使用该类型的结构?

来自分类Dev

传递给通用函数包装器(如_.debounce)的函数的类型推断

来自分类Dev

.Net反射使用通用参数调用函数-如何将类型传递给函数

来自分类Dev

返回相同函数类型的通用记忆函数

来自分类Dev

Unity 3:该类型没有可访问的构造函数

来自分类Dev

以类作为参数并返回该类实例的函数的类型

Related 相关文章

  1. 1

    通用高阶函数的不兼容流类型

  2. 2

    是否可以创建其字段是具有通用参数的函数的记录类型,而在创建记录时不指定类型?

  3. 3

    是否可以创建其字段是具有通用参数的函数的记录类型,而在创建记录时不指定类型?

  4. 4

    在C ++中将函数作为模板类型传递并推导其类型

  5. 5

    Swift - 检查对象是否属于给定类型(该类型已作为函数参数传递)

  6. 6

    为什么控件不采用为该类型控件定义的通用样式

  7. 7

    通用类型不兼容

  8. 8

    从传递的函数的返回值推断函数通用类型U

  9. 9

    将参数传递给通用Class类型的构造函数

  10. 10

    函数返回基本接口的通用类-类型不匹配

  11. 11

    类内通用递归函数的Kotlin类型不匹配

  12. 12

    通用的基于类型的函数可根据其类型对数字求和

  13. 13

    编译器如何知道所使用的类是通用类,尽管该类已被编译并且其类型已擦除为通用代码

  14. 14

    定义类型和使用该类型作为模板参数的函数

  15. 15

    将通用类型传递给通用接口

  16. 16

    Java:在不更改其类型的情况下乘以通用编号

  17. 17

    Java:在不更改其类型的情况下乘以通用编号

  18. 18

    Scala通用函数假设类型

  19. 19

    通用函数类型别名

  20. 20

    通用函数中的属性类型

  21. 21

    传递和访问已传递到需要其超类型的类构造函数中的子类型的值和函数

  22. 22

    将通用类型传递给采用通用类型的方法

  23. 23

    如何获得通用属性却忽略其类型?

  24. 24

    如何键入参数化不直接使用该类型的结构?

  25. 25

    传递给通用函数包装器(如_.debounce)的函数的类型推断

  26. 26

    .Net反射使用通用参数调用函数-如何将类型传递给函数

  27. 27

    返回相同函数类型的通用记忆函数

  28. 28

    Unity 3:该类型没有可访问的构造函数

  29. 29

    以类作为参数并返回该类实例的函数的类型

热门标签

归档