2017-03-12 20 views
5

क्या मैं एक वर्ग के सभी उप-वर्गों की सूची वापस कर सकता हूं? उदाहरण के लिए:एक वर्ग के सभी सबक्लास सूचीबद्ध करें

class Mother { 

} 

class ChildFoo: Mother { 

} 

class ChildBar: Mother { 

} 

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

मुझे विश्वास नहीं है कि यह ओब्जे-सी रनटाइम में डेल किए बिना संभव होगा - [यह क्यू एंड ए] (http://stackoverflow.com/questions/7923586/objective-c-get-list-of-subclasses- से सुपरक्लास) शायद एक अच्छी शुरुआत जगह होगी। हालांकि मैं सवाल करूंगा * क्यों * बिल्कुल आप यह करना चाहते हैं? – Hamish

उत्तर

5

हैरानी की बात है ऑब्जेक्टिव-सी क्रम कार्यों बस के रूप में अच्छी तरह से स्विफ्ट वर्गों के साथ, काम वे NSObject से उपवर्ग नहीं है, भले ही। इसके अलावा, स्विफ्ट में सभी वर्ग 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

'स्विफ्टऑब्जेक्ट' को 'एनएसओब्जेक्ट' से प्राप्त नहीं किया गया है, लेकिन यह * एनएसओब्जेक्टप्रोटोकॉल 'के अनुरूप है, जो इसे ओबीजे-सी रनटाइम में उपलब्ध होने की अनुमति देता है। – Hamish

+0

लेकिन उद्देश्य-सी रनटाइम फ़ंक्शंस का उपयोग कैसे करें? मैं [कुछ erros प्राप्त करें] (http://i.imgur.com/NN66T3y.png)। मैंने कोशिश की, लेकिन मैं नहीं कर सका। – Macabeus

+1

क्या आपने 'फाउंडेशन आयात किया' था? –

संबंधित मुद्दे