Swift:如何检查反射中的泛型类型?

Swift:如何检查反射中的泛型类型?,swift,Swift,我有以下型号: class BaseClass { ... } class WeakCollection<T: BaseClass> { ... } class Person : BaseClass { ... } class Parent : Person { var children: [Child] ... } class Child : Person { var parents: WeakCollection<Parent>

我有以下型号:

class BaseClass { ... }
class WeakCollection<T: BaseClass> { ... }
class Person : BaseClass { ... }

class Parent : Person { 
    var children: [Child]
    ...
}

class Child : Person { 
    var parents: WeakCollection<Parent>
    ...
}

let aChild = Child()
...
类基类{…}
类WeakCollection{…}
类人:基类{…}
类父:个人{
变量children:[Child]
...
}
类子:个人{
var父对象:WeakCollection
...
}
设aChild=Child()
...
我使用的反射像这样:

let mirrored_object = Mirror(reflecting: aChild)
for attr in mirrored_object.children {
    switch attr.value {
         case is Int:
             ...

         case is String:
             ...

         case is WeakCollection<BaseClass>:
             ...
    }
}
switch attr.value {
    case is String:
        // This is a string
        break
    case let optionalObject as Optional<Any>:
        if case .some(let complexObject) = optionalObject
        {
            if (complexObject is BaseProtocol)
            {
                // This is a "WeakCollection" kind
            }
        }
        break
}
让镜像对象=镜像(反射:aChild)
对于镜像对象中的attr\u object.children{
开关属性值{
案例为Int:
...
大小写为字符串:
...
案例为WeakCollection:
...
}
}

问题是,如果泛型类型不是直接的
基类本身,那么
案例is WeakCollection
中的检查始终为false,也就是说,如果它是它的一些子类,那么此检查将为false。如何检查泛型类型?

一种粗略的方法是让“WeakCollection”从某种协议继承:

protocol BaseProtocol {}
class WeakCollection<T> : BaseProtocol
protocolbaseprotocol{}
类WeakCollection:BaseProtocol
然后在你的开关中,这样做:

let mirrored_object = Mirror(reflecting: aChild)
for attr in mirrored_object.children {
    switch attr.value {
         case is Int:
             ...

         case is String:
             ...

         case is WeakCollection<BaseClass>:
             ...
    }
}
switch attr.value {
    case is String:
        // This is a string
        break
    case let optionalObject as Optional<Any>:
        if case .some(let complexObject) = optionalObject
        {
            if (complexObject is BaseProtocol)
            {
                // This is a "WeakCollection" kind
            }
        }
        break
}
开关属性值{
大小写为字符串:
//这是一根绳子
打破
case let optionalObject作为可选:
如果case.some(让complexObject)=optionalObject
{
if(complexObject是BaseProtocol)
{
//这是一种“弱收集”
}
}
打破
}

这有点粗糙,但它给出了您想要的输出。

非常感谢,我甚至尝试了
case is BaseProtocol
,对泛型类型进行了一些约束,这也很有效。有趣的是,这是多么容易。谢谢你给出了正确的想法。我面临另一个问题,如果协议包含关联类型,我如何才能强制转换到协议?这给了我一个错误:协议“BaseProtocol”只能用作泛型约束,因为它具有自身或关联的类型要求“access”是什么意思?我要做的是从该协议创建一个扩展,然后将“typealias”添加到关联的类型中以使用它们