首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSObject子类的无参数可失效初始化器

NSObject子类的无参数可失效初始化器
EN

Stack Overflow用户
提问于 2014-11-09 22:03:08
回答 3查看 1.5K关注 0票数 11

我想为NSObject子类提供一个可失败的初始化器,用于没有参数的初始化。我的总体目标是返回零,这个类在小于8.0的操作系统版本上初始化。

我的尝试如下:

代码语言:javascript
复制
class MyObject: NSObject {
    override init?() {
        super.init()
        if floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_7_1 {
            return nil
        }

    }
}

但是,此代码将导致以下编译器错误。

代码语言:javascript
复制
Failable initializer 'init()' cannot override a non-failable initializer

是否可以重写init()以在子类中提供可故障实现?还是有更好的方法来实现这一目标?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-11-09 22:19:56

当您正在子类NSObject时,您不能有一个可失败的无参数初始化器,因为NSObject的无参数初始化项是不可失败的。

您可以创建一个类工厂方法,根据iOS版本返回实例或零。

票数 5
EN

Stack Overflow用户

发布于 2014-11-09 22:28:58

鉴于此:

您可以使用不可失败的初始化程序覆盖可故障初始化程序,但不能用相反的方式。

可故障初始化器也可以委托给不可失败的初始化器。如果需要将潜在的故障状态添加到现有的初始化进程,否则不会失败,请使用此方法。

(摘自可失效的初始化器)

考虑到NSObject没有无参数的可故障初始化器,则不能用可故障初始化器覆盖不可失败的初始化器。

我看到的唯一选项是创建一个带有虚拟参数的初始化器,如下所示:

代码语言:javascript
复制
class MyObject: NSObject {
    init?(_ ignore: Bool) {
        super.init()
        if floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_7_1 {
            return nil
        }
    }
}

然后把它用作:

代码语言:javascript
复制
var myObj = MyObject(true)

代码语言:javascript
复制
var myObj = MyObject(false)

更有趣的是,为虚拟参数分配默认值似乎做得很好:

代码语言:javascript
复制
class MyObject: NSObject {
    init?(_ ignore: Bool = false) {
        super.init()
        if floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_7_1 {
            return nil
        }
    }
}

var myObj = MyObject()
票数 4
EN

Stack Overflow用户

发布于 2018-09-24 18:22:21

如果不想传递“虚拟”参数,则可以传递一个inout错误。这样,您就可以避免使用虚拟参数来污染代码,并且更多地了解初始化失败的原因(如果这很重要)。

代码语言:javascript
复制
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()
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26833845

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档