Swift从包含类元素的数组中返回类型的对象

agyaoht7  于 2023-04-19  发布在  Swift
关注(0)|答案(4)|浏览(145)

下面是我写的一段小代码来解释这个问题:

class Vehicle{
    var name:String = ""
    var tyres: Int = 0

}

class Bus:Vehicle{
    var make:String = "Leyland"
}

class Car: Vehicle{
    var model:String = "Polo"
}

let myVehicles:[Vehicle] = [
    Vehicle(),
    Car(),
    Bus()
]

for aVehicle in myVehicles{
    if(aVehicle is Bus){
        print("Bus found")
    }
}

从代码中,我可以循环并获取Bus类型的对象。然而,我需要一个函数来做同样的事情,并返回该类型的元素(如果可用)。我尝试使用泛型,但它不起作用。我需要这样的东西:

func getVehicle(type:T.type)->T?{
 // loop through the array, find if the object is of the given type.
 // Return that type object.
}
6qqygrtg

6qqygrtg1#

使用foo as? T尝试将foo转换为类型T

for aVehicle in myVehicles{
    if let bus = aVehicle as? Bus {
        print("Bus found", bus.make)
    }
}

因此,getVehicle可以写成:

func getVehicle<T>() -> T? {
    for aVehicle in myVehicles {
        if let v = aVehicle as? T {
            return v
        }
    }
    return nil
}

let bus: Bus? = getVehicle()

或功能上:

func getVehicle<T>() -> T? {
    return myVehicles.lazy.flatMap { $0 as? T }.first
}
let bus: Bus? = getVehicle()

(Note我们需要将返回的变量指定为Bus?,以便getVehicle可以推断T

juzqafwq

juzqafwq2#

你可以这样写:

func getVehicle<T>(type:T)-> [T]{
    return myVehicles.filter{ $0 is T }.map{$0 as! T }
 }
px9o7tmv

px9o7tmv3#

你也可以使用这个:

let a = array.compactMap({ $0 as? MyTypeClass })
// a == [MyTypeClass] no optional
kgqe7b3p

kgqe7b3p4#

你也可以使用这个:

func getVehicle<T>(type: T.Type) -> T? {
  return myVehicles.filter { Swift.type(of: $0) == type }.first as? T
}

使用方法:

getVehicle(type: Bus.self)

相关问题