2017-03-12 18 views
5

1つのクラスのすべてのサブクラスのリストを返すことはできますか?たとえば:あるクラスのすべてのサブクラスを一覧表示する

class Mother { 

} 

class ChildFoo: Mother { 

} 

class ChildBar: Mother { 

} 

let motherSubclasses = ... // TODO 
print(motherSubclasses) // should to return [ChildFoo.self, ChildBar.self] 
+1

私はObj-Cランタイムを掘り下げなければこれが可能ではないとは思いません - [このQ&A](http://stackoverflow.com/questions/7923586/objective-c-get-list-of-subclasses- from-superclass)はおそらく良いスタート地点になります。私は*なぜ*正確にあなたはこれをしたいのですか? – Hamish

答えて

5

は、驚くべきことにObjective-Cランタイム関数は、彼らがNSObjectからサブクラス化していない場合でも、スウィフトのクラスと同じようにうまくいきます。さらに、SwiftのすべてのクラスはSwiftObjectから派生しているようです。 SwiftObject自体にはスーパークラスがありません。

まず、にObjCランタイム機能を処理するためのラッパー構造:

import Foundation 

struct ClassInfo : CustomStringConvertible, Equatable { 
    let classObject: AnyClass 
    let className: String 

    init?(_ classObject: AnyClass?) { 
     guard classObject != nil else { return nil } 

     self.classObject = classObject! 

     let cName = class_getName(classObject)! 
     self.className = String(cString: cName) 
    } 

    var superclassInfo: ClassInfo? { 
     let superclassObject: AnyClass? = class_getSuperclass(self.classObject) 
     return ClassInfo(superclassObject) 
    } 

    var description: String { 
     return self.className 
    } 

    static func ==(lhs: ClassInfo, rhs: ClassInfo) -> Bool { 
     return lhs.className == rhs.className 
    } 
} 

は、ここではそれを使用することができます方法は次のとおりです。

class Mother { } 
class ChildFoo: Mother { } 
class ChildBar: Mother { } 

class AnIrrelevantClass { } 

let motherClassInfo = ClassInfo(Mother.self)! 
var subclassList = [ClassInfo]() 

var count = UInt32(0) 
let classList = objc_copyClassList(&count)! 

for i in 0..<Int(count) { 
    if let classInfo = ClassInfo(classList[i]), 
     let superclassInfo = classInfo.superclassInfo, 
     superclassInfo == motherClassInfo 
    { 
     subclassList.append(classInfo) 
    } 
} 

print(subclassList) 

それはスイープアップしませんので、これが唯一の浅い検索を行い、孫の授業はありますが、あなたはその考えを得ます。

+0

'SwiftObject'は' NSObject'から継承しませんが、 'NSObjectProtocol'に準拠しているため、Obj-Cランタイムで利用できます。 – Hamish

+0

Objective-Cランタイム関数の使い方は?私はいくつかのエロスを得る(http://i.imgur.com/NN66T3y.png)。私は試しましたが、できませんでした。 – Macabeus

+1

'財団を輸入しましたか? –

関連する問題