arrays - Swift 泛型和子类

标签 arrays swift generics

我的问题可能很简单,但让我有点困惑: 假设我有一组不同的对象,它们都有一个共同的父类“MyClass”。

var values = [MyClass]()

但是它们都有自己特定的子类,例如“MyClassSubclass”。

values.append(MyClassSubclass())

我现在想创建一个通用方法,返回此数组中类型为 MyClassSubclass 的第一个对象。我想防止转换对象,而是有一个通用方法,它将子类对象作为 T 参数,并返回我在这个数组中第一次出现的子类 T。

我想到了这样的事情(但肯定行不通):

func getFirst<T: MyClass>(_ ofType : T.Type) -> T?

我想我只是被困住了,我不知道要搜索什么,所以如果有人能帮助我,我将不胜感激。

编辑 基于上述值的示例:

class MyClass {}
class MyClassSubclass : MyClass {}
class MyClassSubclass2 : MyClass{}

var values = [MyClass]()
values.append(MyClassSubclass())
values.append(MyClassSubclass2())

//Return the first class element appearing here as a subclass type
func getFirst<T>(_ ofType : T.Type) -> T?{}

谢谢

最佳答案

一种方法是遍历数组并使用可选绑定(bind) 检查元素是否属于给定类型:

func getFirst<T: MyClass>(ofType: T.Type) -> T? {
    for elem in values {
        if let item = elem as? T {
            return item
        }
    }
    return nil
}

这可以通过使用 for caseas 模式来简化:

func getFirst<T: MyClass>(ofType: T.Type) -> T? {
    for case let item as T in values {
        return item
    }
    return nil
}

另一种方法是使用flatMap 来查找给定的所有项目 输入并返回第一个:

func getFirst<T: MyClass>(ofType: T.Type) -> T? {
    return values.flatMap { $0 as? T }.first
}

如果数组可以很大并且你想避免创建一个 中间数组然后你可以使用 lazy:

func getFirst<T: MyClass>(ofType: T.Type) -> T? {
    return values.lazy.flatMap { $0 as? T }.first
}

作为数组扩展方法,这将是

extension Array {
    func getFirst<T>(ofType: T.Type) -> T? {
        return flatMap { $0 as? T }.first
    }
}

关于arrays - Swift 泛型和子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45629593/

相关文章:

arrays - 将 bash 数组(字符串和特殊字符)写入文件

java - Collections.emptyList() 之谜

java - 生成服务层类

arrays - VBA 中二维数组中的一个数组元素的具体引用

在 C 中创建用户长度定义的数组

objective-c - AnyObject 到 NsDictionery

ios - 大中央调度 : What happens when queues get overloaded?

c# - 无法序列化泛型类型

c - c中的指针和数组

ios - 换行时出现弹跳