如何在Objective-C中使“Class”类型安全?

时间:2015-10-01 19:06:01

标签: objective-c class oop

我需要编写一个返回类的方法。

@implementation MyFactory

- (Class)defaultViewClass {
  return [MyView class];
}

@end

返回的类不是类型安全的。你可以把它投射到任何随机类。您也可以在没有编译器错误的情况下调用任何随机初始化方法。

MyFactory *factory = [MyFactory new];
Class viewClass = [factory defaultViewClass];
RandomView *view = [[viewClass alloc] initWithRandomStuff];

如何重新定义我的方法以返回特定类型的类?我想做这样的事情,但编译器抱怨它不能返回特定的类类型。

- (AbstractViewClass)defaultViewClass {
    return [ConcreteViewClass class];
}

我需要处理类而不是对象指针的原因是因为我需要以多态方式调用静态函数。

1 个答案:

答案 0 :(得分:0)

由于语言的动态特性,在Objective-C中使用Class对象时,您将无法获得编译时类型检查的好处。但是,您可以使用严格类型的语言(如Swift)强制执行此类约束。

protocol AbstractView {
    init(parameter: Int)
}

class ConcreteView: AbstractView {
    required init(parameter: Int) { }
}

class ViewFactory {
    func defaultViewClass() -> AbstractView.Type {
        return ConcreteView.self
    }
}

let factory = ViewFactory()
let viewClass = factory.defaultViewClass()
let view = viewClass.init(parameter: 0)

print("\(view.self)", terminator: "") // Prints "ConcreteView"

AbstractView是一个协议,因为在Swift中没有抽象类的概念,尽管它可以很容易地成为一个类。