假设我有一个与类有关的功能:
- (void)doSomethingWithClass:(Class)class
{
[class doSomething];
}
但当然没有为所有类定义方法+ (void)doSomething
。假设它仅为SomeClass
类的子类定义。如何“限制”赋予函数的class
参数的类类型?我希望能够做到这样的事情:
- (void)doSomethingWithClass:(/* type of [SomeClass class] */)class
{
[class doSomething];
}
所以我不必诉诸这样的事情:
- (void)doSomethingWithClass:(Class)class
{
if (![class isSubClassOfClass:[SomeClass class]])
{
// error
}
[class doSomething];
}
在Objective-C中可以做到这一点,做这样的事情甚至是个好主意吗?
答案 0 :(得分:1)
Class
实际上是一个包含有关类类型的元数据的c结构。结构没有继承。
您可以通过传入对象类型的实例而不是Class
结构类型来限制方法。
- (void)doSomethingWithClass:(SomeClass *)sender
{
Class class = [sender class];
[class doSomething];
}
如果您的方法确实必须接受Class
对象作为参数,那么isKindOfClass:
或isSubclassOfClass
就是您的选择。
答案 1 :(得分:1)
您应该使用Protocol,为您的类创建重用接口。如果你的类符合这个协议,那么它将实现doSomething方法。
@protocol ClassProtocol
+ (void)doSomething;
@end
@interface ClassEngine : NSObject
@end
@implementation ClassEngine
- (void)doSomethingWithClass:(Class)class {
if([class conformsToProtocol:@protocol(ClassProtocol)])
[(Class<ClassProtocol>)class doSomething];
}
}
@end
答案 2 :(得分:0)
无法在Objective-C中指定此类型。但它可以在Swift中使用 - SomeClass.Type