这是我写的一个小代码来解释这个问题:
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.
}
答案 0 :(得分:3)
使用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()
(请注意,我们需要将返回的变量指定为Bus?
,以便getVehicle
可以推断T
。)
答案 1 :(得分:2)
你可以这样写:
func getVehicle<T>(type:T)-> [T]{
return myVehicles.filter{ $0 is T }.map{$0 as! T }
}
答案 2 :(得分:0)
您也可以使用:
func getVehicle<T>(type: T.Type) -> T? {
return myVehicles.filter { type(of: $0) == type }.first as? T
}
用法:
getVehicle(type: Bus.self)
答案 3 :(得分:0)
您还可以使用此:
let a = array.flatMap({ $0 as? MyTypeClass })
// a == [MyTypeClass] no optional