在Objective-C中有一种方法可以询问类是否存在任何子类实现.
我有一个Base类,它有多个子类.我想循环遍历所有子类并在每个子类上执行类选择器.
编辑:
我有一组可以处理某些类型数据的类.每个处理器都对一个基类进行子类化,该基类提供每个处理器所需的方法.
每个类都知道它可以处理哪些数据,而某些类可以比其他类更好地处理某些类型的数据.
我想在每个类上都有一个类方法,它会向工厂类提供一个响应,表示我可以处理该数据,并指出它可以处理它的程度.
然后工厂根据哪个类说它可以最好地处理数据来决定实例化哪个类.
我也从2009年发现了这个问题(我在发布之前进行了搜索,但没有发现任何内容)在Obj-C中发现给定类的子类.
编辑2:
该+ (void)load方法看起来是我正在寻找的完美解决方案.所以我现在有以下内容:
+ (void)registerSubclass:(Class)subclass {
NSLog(@"Registered %@", subclass);
}
Run Code Online (Sandbox Code Playgroud)
在我的基类中,这是我的潜艇.
+(void)load {
[BaseSwitch registerSubclass:[self class]];
}
Run Code Online (Sandbox Code Playgroud)
现在,这将显示每个子类的调试消息.
我的下一个问题是(可能是一个愚蠢的问题),如何存储在registerSubclass方法中注册的类.有没有办法让我可以在以后阅读的类变量?
编辑3:
在这里找到一些示例代码Cocoa中一个简单,可扩展的HTTP服务器
这给我留下了以下内容,看起来很简单,看起来很简单.但我想我会把它放在这里供将来参考.
@implementation BaseSwitch
static NSMutableArray *registeredSubclasses;
+ (void)registerSubclass:(Class)subclass {
if (registeredSubclasses == nil) {
registeredSubclasses = [[NSMutableArray alloc] init];
}
[registeredSubclasses addObject:subclass];
NSLog(@"Registered %@", subclass);
}
+ (void)logSubclasses {
for (int i = 0; i < [registeredSubclasses count]; i++) {
NSLog(@"%@", [registeredSubclasses objectAtIndex:i]); …Run Code Online (Sandbox Code Playgroud) 更新到 iOS 13.4 / XCode 11.4 后
这段代码
func getSubclassInfos() -> [ClassInfo] {
let superObject = CityModel.self
let superClassInfo = ClassInfo(superObject)
var subclassList = [ClassInfo]()
var count = UInt32(0)
guard let classList = objc_copyClassList(&count) else {
return subclassList
}
for i in 0..<Int(count) {
let clazz = classList[i] // Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)
if let classInfo = ClassInfo(classList[i]),
let superclassInfo = classInfo.superclassInfo,
superclassInfo == superClassInfo
{
subclassList.append(classInfo)
}
}
return subclassList
}
Run Code Online (Sandbox Code Playgroud)
崩溃的线let clazz = classList[i]与EXC_BAD_INSTRUCTION …
我有这个视图控制器,用于以通用方式呈现模型对象的详细信息:
class APIModelDetailsVC<T where T: APIModel>: UIViewController {...}
Run Code Online (Sandbox Code Playgroud)
我希望我的故事板能够使用这个课程.我可以在Interface Builder中分配它:
我在tableview的didSelect方法中准备了这个ViewController(包括指定通用占位符的类型):
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
print("didSelectRowAtIndexPath \(indexPath.row)")
if let vc = UIStoryboard(name: "APIModelDetailsVC", bundle: nil).instantiateInitialViewController() as? APIModelDetailsVC<StarWarsPerson> {
vc.model = data[indexPath.row]
self.navigationController?.pushViewController(vc, animated: true)
}
}
Run Code Online (Sandbox Code Playgroud)
当我尝试导航到此视图控制器时,出现以下控制台错误:
Unknown class _TtC14api_collection17APIModelDetailsVC in Interface Builder file.
Run Code Online (Sandbox Code Playgroud)
这是故事板的记录限制吗?有没有一种方法可以/应该指定通用,以便故事板可以链接到它?