【问题标题】:Subclass NSCoder - failable initializer or not?子类 NSCoder - 可失败的初始化程序与否?
【发布时间】:2015-11-19 09:51:01
【问题描述】:

我正在使用 Xcode 7.2 测试版。 我正在尝试制作一个符合 NSCoding 的类模型。

class Person: NSObject, NSCoding { 

Xcode 希望我为此提供实现:

required init?(coder aDecoder: NSCoder) 

我看到我可以删除“?”,没有人抱怨。我还在 swift 编程语言文档中找到了这个:

“您通常定义一个可失败的初始化程序,它通过在 init 关键字 (init?) 之后放置一个问号来创建适当类型的可选实例。或者,您可以定义一个可失败的初始化程序,该初始化程序创建一个隐式展开的可选实例适当的类型。通过在 init 关键字 (init!) 之后放置一个感叹号而不是问号来做到这一点。

你可以从 init 委托?初始化!反之亦然,你可以覆盖init?用初始化!反之亦然。你也可以从 init 委托给 init!,尽管这样做会触发一个断言,如果 init!初始化程序导致初始化失败。”

我的代码可以使用或不使用“?” - 我相信因为这个失败的初始化程序,所以用途广泛。谁能给我解释一下?

我已经为我的初始化器提供了这个:

  required init?(coder aDecoder: NSCoder) {
    super.init()
    name = aDecoder.decodeObjectForKey(Keys.Name) as! String
    id = aDecoder.decodeObjectForKey(Keys.ID) as! Int
    imagePath = aDecoder.decodeObjectForKey(Keys.ProfilePath) as! String
    movies = aDecoder.decodeObjectForKey(Keys.Movies) as! [Movie]
}

如果实现 init 没有失败应该有什么不同吗?

required init(coder aDecoder: NSCoder)

我已经完成了 encodeWithCoder impl,因此不需要在初始化程序中进行 nil 检查:

 func encodeWithCoder(aCoder: NSCoder) {
    aCoder.encodeObject(title, forKey: Keys.Title)
    aCoder.encodeObject(id, forKey: TheMovieDB.Keys.ID)
    aCoder.encodeObject(posterPath, forKey: Keys.PosterPath)
    aCoder.encodeObject(releaseDate, forKey: Keys.ReleaseDate)
}

你会推荐哪一个来使用 NSKeyedArchiver/NSKeyedUnarchiver?

【问题讨论】:

    标签: swift init nscoder


    【解决方案1】:

    您的类/对象能否将init 函数中的任何项目处理为nil?您没有将它们声明为可选,所以我假设答案是否定的。

    如果这些项目中的任何一个最终无法加载/无法归档,您将使用可失败的初始化程序。在这种情况下,您将返回 nil,这是一个失败案例。

    有关可失败初始化程序的更多信息可以在in this Apple Swift blog post 找到,我刚刚在看。

    【讨论】:

    • 好的。这很有帮助。你能解释一下为什么我在这里也可以使用可失败或不可失败的吗?因为两者似乎都有可能。谢谢
    • 您似乎可以选择其中一个,但如果是我的代码,我可能更喜欢可失败的初始化方法,因为我想通知任何试图实例化我的对象的潜在失败案例,而不是尝试继续处理一些可能没有完全正确设置的对象。
    【解决方案2】:

    这实际上很有趣,我不知道您可以将可失败的初始化程序实现为不可失败的,并且仍然能够使用 Xcode 编译并抱怨不符合协议。

    您使用哪个初始化程序完全取决于您要表达的意图。考虑一下您离开很久之后出现的开发人员的情况。如果他们看到init?,他们会立即知道初始化程序要么成功,要么返回nil,而init 承诺它总是 成功。在这种情况下,最好完全按照指定的协议遵守协议,因为可以安全地假设 Apple 有充分的理由使初始化程序失败。

    【讨论】:

    • 谢谢。但是为什么你认为有可能同时拥有它呢? (我已经读到你到现在才知道)你猜到了吗?
    • 我总是选择文档建议的任何选项。在这种情况下,它是可失败的初始化程序,因为它使事情保持一致。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-13
    • 1970-01-01
    • 1970-01-01
    • 2016-10-23
    • 1970-01-01
    相关资源
    最近更新 更多