我的问题可能很简单,但让我有点困惑:
假设我有一组不同的对象,它们都有一个共同的父类“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 case
和 as
模式来简化:
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/