我想要一个数组的扩展,你可以在其中找到某种类型的项目.
我试过这样的:
func findItem<U: Type>(itemToFind: U) -> AnyObject? {
for item in self {
if let obj = item as? itemToFind {
return obj
}
}
return nil
}
Run Code Online (Sandbox Code Playgroud)
所以我检查它是否是相同的类型,然后我想返回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
}
}
Run Code Online (Sandbox Code Playgroud)
let array : [Any] = [2, "bar", 3, "foo"]
print(array.firstElement(ofType: String.self)) // Optional("bar")
Run Code Online (Sandbox Code Playgroud)
作为旁注,通过在循环中使用模式匹配可以略微简化for:
func firstElement<U>(ofType _: U.Type) -> U? {
for case let element as U in self {
return element
}
return nil
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13723 次 |
| 最近记录: |