我想为NSObject子类提供一个可失败的初始化器,用于没有参数的初始化。我的总体目标是返回零,这个类在小于8.0的操作系统版本上初始化。
我的尝试如下:
class MyObject: NSObject {
override init?() {
super.init()
if floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_7_1 {
return nil
}
}
}但是,此代码将导致以下编译器错误。
Failable initializer 'init()' cannot override a non-failable initializer是否可以重写init()以在子类中提供可故障实现?还是有更好的方法来实现这一目标?
发布于 2014-11-09 22:19:56
当您正在子类NSObject时,您不能有一个可失败的无参数初始化器,因为NSObject的无参数初始化项是不可失败的。
您可以创建一个类工厂方法,根据iOS版本返回实例或零。
发布于 2014-11-09 22:28:58
鉴于此:
您可以使用不可失败的初始化程序覆盖可故障初始化程序,但不能用相反的方式。
和
可故障初始化器也可以委托给不可失败的初始化器。如果需要将潜在的故障状态添加到现有的初始化进程,否则不会失败,请使用此方法。
(摘自可失效的初始化器)
考虑到NSObject没有无参数的可故障初始化器,则不能用可故障初始化器覆盖不可失败的初始化器。
我看到的唯一选项是创建一个带有虚拟参数的初始化器,如下所示:
class MyObject: NSObject {
init?(_ ignore: Bool) {
super.init()
if floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_7_1 {
return nil
}
}
}然后把它用作:
var myObj = MyObject(true)或
var myObj = MyObject(false)更有趣的是,为虚拟参数分配默认值似乎做得很好:
class MyObject: NSObject {
init?(_ ignore: Bool = false) {
super.init()
if floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_7_1 {
return nil
}
}
}
var myObj = MyObject()发布于 2018-09-24 18:22:21
如果不想传递“虚拟”参数,则可以传递一个inout错误。这样,您就可以避免使用虚拟参数来污染代码,并且更多地了解初始化失败的原因(如果这很重要)。
final class FailableFoo: NSObject {
let foo: String
enum FailableFooInitializationError: LocalizedError {
case somethingWentWrong
}
required init?(error: inout Error?) {
foo = "Foo"
let somethingWentWrong = true
if somethingWentWrong {
error = FailableFooInitializationError.somethingWentWrong
return nil
} else {
super.init()
}
}
}
final class Bar: NSObject {
let foo: FailibleFoo?
override init() {
var fooInitializationError: Error? = nil
foo = FailableFoo(error: &fooInitializationError)
if let fooInitializationError = fooInitializationError {
// handle init error
}
super.init()
}
}https://stackoverflow.com/questions/26833845
复制相似问题