【发布时间】:2018-03-17 20:20:33
【问题描述】:
再次完全重写此问题,希望将重点放在我要解决的问题上。
我们有以下类,由于我们无法控制的外部框架,需要我们实现ObjCProtocolRequiringBla,就像这样......
class FooBase : NSObject, ObjCProtocolRequiringBla {
class var possibleValues:[String] {
// Note: Use preconditionFailure, not fatalError for things like this.
// At runtime, they both halt execution, but precondition(Failure)
// only logs the message for debug builds. Additionally,
// in debug builds it pauses in a debuggable state rather than crash.
preconditionFailure("You must override possibleValues")
}
// This satisfies the objective-c protocol requirement
final func getBla() -> Bla {
let subclassSpecificValues = type(of:self).possibleValues
return Bla(withValues:subclassSpecificValues)
}
}
class FooA : FooBase
override class var possibleValues:[String] {
return [
"Value A1",
"Value A2",
"Value A3"
]
}
}
class FooB : FooBase
override class var possibleValues:[String] {
return [
"Value B1",
"Value B2",
"Value B3",
"Value B4"
]
}
}
如您所见,possibleValues 用于getBla() 的实现。此外,它必须是该特定子类的所有实例所共有的,因此是类变量而不是实例变量。这是因为在代码的另一个地方,我们必须检索所有子类中所有可能的值,就像这样......
static func getAllPossibleValues:[String] {
return [
FooA.possibleValues,
FooB.possibleValues
].flatMap { $0 }
}
如果FooBase 的子类没有实现possibleValues,我想弄清楚如何让编译器抱怨。
换句话说,我们怎样才能让这个报告成为编译时错误:
class FooC : FooBase
// Doesn't override class var possibleValues
}
目前我知道的唯一方法是上述方法,使用preconditionFailure 或类似名称在基类中定义它,但这是运行时检查,而不是编译时,因此它不是最佳解决方案。
【问题讨论】:
标签: swift abstract-class swift4 swift-protocols