我想要一个数组的扩展,你可以在其中找到某种类型的项目.
我试过这样的:
  func findItem<U: Type>(itemToFind: U) -> AnyObject? {
    for item in self {
        if let obj = item as? itemToFind {
            return obj
        }
    }
    return nil
}
所以我检查它是否是相同的类型,然后我想返回obj.
我得到的错误是:
从非协议,非类'Type'继承.
我怎么能解决这个问题,我可以传递给函数ViewController.self,如果找不到则返回nil或者数组中的viewcontroller?
Ham*_*ish 13
<U: Type>此上下文中的语法意味着您U在函数签名中声明了一个新的通用占位符,它继承自(在类的情况下)或符合(在协议的情况下)Type.
由于Type既不是协议也不是类,我假设您真正想要的是一个不受约束的通用占位符,而是希望将给定类型作为参数传递给函数,该函数将定义类型U.
在这种情况下,您将要使用元类型 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")
作为旁注,通过在循环中使用模式匹配可以略微简化for:
func firstElement<U>(ofType _: U.Type) -> U? {
    for case let element as U in self {
        return element
    }
    return nil
}
| 归档时间: | 
 | 
| 查看次数: | 13723 次 | 
| 最近记录: |