簡體   English   中英

Swift:如何在反射中檢查泛型類型?

[英]Swift: How to check for generic type in a reflection?

我有以下型號:

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()
...

我正在使用這樣的反射:

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>:
             ...
    }
}

問題是在case is WeakCollection<BaseClass>的檢查總是假如果泛型類型不是直接BaseClass本身,也就是說,如果它是它的一些子類,則此檢查將是假的。 如何檢查泛型類型?

一個粗略的方法是讓你的“WeakCollection”從某種協議繼承:

protocol BaseProtocol {}
class WeakCollection<T> : BaseProtocol

然后在您的交換機中這樣做:

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
}

這有點粗糙,但它給出了你想要的輸出。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM