当前位置: 首页 > 面试题库 >

是否可以允许在Swift初始化期间调用didSet?

蔺弘
2023-03-14
问题内容

苹果的文档指定:

首次初始化属性时,不会调用willSet和didSet观察器。仅当在初始化上下文之外设置属性的值时才调用它们。

是否可以强制在初始化期间调用它们?

为什么?

假设我有这堂课

class SomeClass {
    var someProperty: AnyObject {
        didSet {
            doStuff()
        }
    }

    init(someProperty: AnyObject) {
        self.someProperty = someProperty
        doStuff()
    }

    func doStuff() {
        // do stuff now that someProperty is set
    }
}

我创建了method doStuff,以使处理调用更简洁,但我只想处理didSet函数中的属性。有没有办法在初始化过程中强制此调用?

更新资料

我决定只为我的类删除便捷的初始化器,并强迫您在初始化后设置属性。这使我知道didSet将永远被调用。我还不确定总体上是否更好,但这很适合我的情况。


问题答案:

创建一个自己的set-Method并在init-Method中使用它:

class SomeClass {
    var someProperty: AnyObject! {
        didSet {
            //do some Stuff
        }
    }

    init(someProperty: AnyObject) {
        setSomeProperty(someProperty)
    }

    func setSomeProperty(newValue:AnyObject) {
        self.someProperty = newValue
    }
}

通过声明someProperty为type :(AnyObject!一个隐式解包的可选),可以让self完全初始化而无需
someProperty设置。打电话时, setSomeProperty(someProperty)您叫的等价物
self.setSomeProperty(someProperty)。通常,您将无法执行此操作,因为self尚未完全初始化。由于
someProperty不需要初始化,并且您正在调用依赖于self的方法,因此Swift会离开初始化上下文,并且didSet将运行。




 类似资料:
  • 问题内容: 是否可以在python中使用全1来初始化切片? 蟒蛇: 高朗 有可能做得更好吗? 问题答案: 是的,但是您必须使用其他语法。 它被称为“复合文字” 另外,如果有理由进行迭代(如计算基于循环变量的值等),则可以使用关键字而不是旧式,因为i等于i,小于i ++循环。

  • 在信号量(java.util.concurrent.Semaphore)初始化期间,我没有得到负许可背后的基本原理。 我知道调用release()方法最终可能会使信号量的许可证大于等于1( 然而,我没有得到任何实际的用例,在这种情况下,我将使用负许可初始化信号量。 参考样本代码:

  • 我创建了一个带有和的Android应用程序。我想在 TextView 中显示微调器下拉列表中的选定项。我在 方法中实现了微调器,因此当我运行该程序时,它会在 中显示一个值(在从下拉列表中选择一个项目之前)。 我只想在从下拉列表中选择一个项目后在TextView中显示该值。我该怎么做? 以下是我的代码:

  • 我刚刚偶然发现了GCC和Clang之间关于显式默认constexpr ctor和一些继承的以下差异。。。 GCC立即拒绝代码,而Clang允许实例化这两种类型的非constexpr版本。我的猜测是,叮当声可能是正确的,但我不是百分之百肯定。。。

  • 我正在开发我的第一个 Swing 应用程序,现在提出了一个难题:在静态初始化期间或开始实际执行后执行引导和资源初始化。我是什么意思...我有单例: 因此,方法如下所示 或者,也许我在启动后手动初始化资源,然后运行它。逻辑上正确的方式是什么?

  • 我将firebase添加到我的android项目中,以使用firebase云消息传递。我按照文档进行了操作,但没有找到调用的任何说明。 我的应用程序工作很好,除了有一次它崩溃了以下错误。 当我搜索错误时,给出的解决方案是在启动时调用。 我想知道这是否真的有必要,因为文档没有提到它,我的应用程序在没有它的情况下工作(大部分)很好。 有人知道调用是否真的有必要,还有什么可能导致我上面提到的错误吗? 下