我想要一个数组扩展,您可以在其中找到某种类型的项目。
我尝试这样:
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(使用前将#替换为@)