查找数组中特定类型的项

2023-12-01

我想要一个数组扩展,您可以在其中找到某种类型的项目。

我尝试这样:

  func findItem<U: Type>(itemToFind: U) -> AnyObject? {
    for item in self {
        if let obj = item as? itemToFind {
            return obj
        }
    }
    return nil
}

所以我检查它是否是相同的类型,然后我想返回 obj。

我得到的错误是:

从非协议、非类“类型”继承。

我怎样才能解决这个问题,我可以传递给函数ViewController.self如果没有找到或数组中的视图控制器,我会返回 nil 吗?


语法<U: Type>在这种情况下意味着您正在声明一个新的通用占位符U在你的函数签名中,它继承自(在类的情况下),或符合(在协议的情况下)Type.

As Type既不是协议也不是类,我假设您真正想要的是一个不受约束的通用占位符,而是希望将给定类型作为参数传递给函数,该函数将定义U.

在这种情况下,您需要使用metatype U.Type作为函数输入类型(以及U?对于函数返回类型 - 因为返回类型将是您传递给函数的任何类型的可选类型)。例如:

extension Array {
    func firstElement<U>(ofType _: U.Type) -> U? {
        for element in self {
            if let element = element as? U {
                return element
            }
        }
        return nil
    }
}

let array : [Any] = [2, "bar", 3, "foo"]
print(array.firstElement(ofType: String.self)) // Optional("bar")

作为旁注,这可以通过使用稍微简化模式匹配 in the for loop:

func firstElement<U>(ofType _: U.Type) -> U? {
    for case let element as U in self {
        return element
    }
    return nil
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

查找数组中特定类型的项 的相关文章

随机推荐