Swift 您能检查一个类型(不是实例)是否是另一个类型的子类吗?

Swift 您能检查一个类型(不是实例)是否是另一个类型的子类吗?,swift,types,casting,Swift,Types,Casting,根据这个代码 class Vehicle{} class Car : Vehicle {} class Honda : Car {} 如何在下面编写函数“findFirst” class TypeManager { var managedTypes:[Any.Type]? func findFirst(_ type:Any.Type) -> Any.Type? { return managedTypes.first{ t in t is type.

根据这个代码

class Vehicle{}

class Car : Vehicle {}

class Honda : Car {}
如何在下面编写函数“findFirst”

class TypeManager {

    var managedTypes:[Any.Type]?

    func findFirst(_ type:Any.Type) -> Any.Type? {
        return managedTypes.first{ t in t is type.Type } // <-- Doesn't like 'type'
    }
}

var typeManager = TypeManager()
typeManager.managedTypes = [
    String.self,
    Int.self,
    Honda.self
]

let firstCarType = typeManager.findFirst(Car.Type)
类类型管理器{
var managedTypes:[任何.Type]?
func findFirst(uType:Any.type)->Any.type{
返回managedTypes.t中的第一个{t是type.type}/要展开,可以进行如下数组扩展:

扩展数组{
func first(of Type:T.Type)->T.Type{
返回第一个{$0是T.Type}作为?T.Type
}
func first(of exacttype:T.type)->T.type{
将第一个{$0作为?Any.Type==Type}返回为?T.Type
}
}
类别车辆{}
车辆类别:车辆{}
本田级:汽车{}
让carTypes=[Honda.self,Vehicle.self,Car.self]//推断类型[Vehicle]
打印(carTypes.first(of type:Car.self)?“不适用”)//打印本田
打印(carTypes.first(of exacttype:Car.self)?“不适用”)//打印汽车

另外,仅供参考,
$0 as?Any.Type==Type
$0 as?Any.Type==T.self
是一样的。任何一个都可以工作。

类是元类型的实例,可以使用
is
as?
进行检查。 您可以使用泛型函数传入所需的类型:

class TypeManager {

    var managedTypes:[Any.Type] = []

    func findFirst<T>(_: T.Type) -> Any.Type? {
        return managedTypes.first { $0 is T.Type }
    }
}
或使用条件绑定和compactMap:

class TypeManager {

    var managedTypes:[Any.Type] = []

    func findFirst<T>(_: T.Type) -> T.Type? {
        return managedTypes.compactMap { $0 as? T.Type }.first
    }
}
类类型管理器{
var managedTypes:[Any.Type]=[]
func findFirst(uux:T.Type)->T.Type{
首先返回managedTypes.compactMap{$0 as?T.Type}
}
}

它的优点是返回的类型是
T.type?
,而不是
Any.type?
(如果列表可能很大并且需要短路,请使用
managedTypes.lazy.compactMap

您能给出一个如何使用它的示例吗?我正在搜索一个类型列表(不是实例)寻找任何符合直接匹配或给定类型的子类要求的对象。在C#中使用
CanAssignFrom
,这很简单。首先
怎么样(其中:{$0是Foo.type})
?我想
是只检查实例。类也是(元类型的)实例.Perfect!从技术上讲@Martin首先得到了它,但他把它放在了评论中,所以我不能接受!哈哈!他确实做到了;问题太好了,太糟糕了!我得收回这一点。让我更新我的问题,补充一点遗漏重要部分的内容。对不起!:/我现在很难将类型传递到函数中,而不是像这样硬编码就在这里。有什么想法吗?投票了!太棒了!!!当你想要精确匹配时,你可以使用传入的值。如果你想要一个子类,你可以使用推断的T。太棒了!我喜欢这样的日子!事实上,我要把答案换回来给你。他有444k。他不会错过10分的!哈哈!aaah!一个通用的!老兄,连这个都没有nk的,但那是它,完美的!(序言为什么你在444k!!!lol)另外,如果我错了,请纠正我,但你实际上没有在这里使用“type”。你只是用它来键入泛型“t”,然后它就被忽略了,对吗?@MarkA.Donohoe:你是对的(因此内部名称
type
实际上是不需要的).编译器根据上下文推断
T
(例如
Car
)这是传递给函数的。出于好奇,如果我想要T上的精确匹配,而不仅仅是子类呢?尝试了“==”和“==”,但都不起作用。我问的原因是,这实际上是字典中的反向键查找,其中一个键可能是值“Car”,但另一个键是值“Honda”。如果我想要r‘车’,而不是‘本田’,我需要一个精确的匹配。
class TypeManager {

    var managedTypes:[Any.Type] = []

    func findFirst<T>(_: T.Type) -> T.Type? {
        return managedTypes.compactMap { $0 as? T.Type }.first
    }
}