हैरानी की बात है ऑब्जेक्टिव-सी क्रम कार्यों बस के रूप में अच्छी तरह से स्विफ्ट वर्गों के साथ, काम वे 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)
यह केवल एक उथले खोज करता है तो यह ऊपर स्वीप नहीं होंगे पोते वर्गों लेकिन आपको विचार मिलता है।
स्रोत
2017-03-12 15:20:40
मुझे विश्वास नहीं है कि यह ओब्जे-सी रनटाइम में डेल किए बिना संभव होगा - [यह क्यू एंड ए] (http://stackoverflow.com/questions/7923586/objective-c-get-list-of-subclasses- से सुपरक्लास) शायद एक अच्छी शुरुआत जगह होगी। हालांकि मैं सवाल करूंगा * क्यों * बिल्कुल आप यह करना चाहते हैं? – Hamish