问题

Apple's docs指定:

首次初始化属性时,不会调用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
    }
}

我创建了方法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声明为类型:AnyObject!(隐式 解包(可选),则允许Self完全初始化,而不需要 正在设置someProperty.当你打电话给 setSomeProperty(someProperty)你打的电话相当于 self.setSomeProperty(someProperty).通常你不能 这样做是因为Self尚未完全初始化.因为 someProperty不需要初始化,而您正在调用 方法依赖于自身,SWIFT离开初始化上下文并 didSet将运行.

Ios相关问答推荐

Jenkins node 无法运行fastlane命令-未找到命令

UIAlertController的空子类是否可以与`appearance(whenContainedInInstancesOf:)`一起安全使用

由于已存在同名项目,因此无法将Mapbox.xcframework-ios.sign复制到Signature中

如何在HStack中将sfsymbol与Text视图对齐?

mapView swift 导致警告有网格错误

在 SwiftUI 中以编程方式插入内嵌图像

在iOS中使用Swift,即时更改应用语言后,立即改变外观会出现问题

Strange UIView.animate更改UIButton标题 colored颜色 的行为

ionic 4 - 编译 ios - 来自项目Pods的目标GoogleDataTransport中的问题

@MainActor 类的扩展是主要演员吗?

如何擦除 Swift 中的 Core Graphics Context 绘图?

具有线性渐变的 SVG textPath 在 Safari 中损坏

错误:无法根据成员environmentObject推断上下文基础

通过函数使用 Gesture 时,键入任何视图不能符合视图

Flutter:无法构建 iOS 应用程序ARCHIVE FAILED,为设备归档时遇到错误

在 UICollectionView 上动态设置布局导致莫名其妙的 contentOffset 变化

Select UITableViewCell 时 UIView backgroundColor 消失

如何更新推送通知服务证书

由于 GoogleSignIn、AdMob 提交应用程序时 iOS 10 GM 发布错误应用程序try 在没有使用说明的情况下访问隐私敏感数据

/usr/bin/codedesign 失败,退出代码为 1