DidSet 在 init 函数 swift 3 中不起作用

Pra*_*iya 0 initialization ios swift

我已经看过

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

对我来说它不起作用..

我在下面创建类的项目中工作

protocol FileManagerHelper {

    var fileName:String {get}
    var fileCategory:FileCategory {get set}
    var isFileExitsAtPath:Bool {get}
    var filePath:String {get}
    var fileType:FileTypes {get set}

}

class FileManager:FileManagerHelper {
    // Other property 

    //STORED PROPERY INIT WHEN OBJECT WILL CREATED WITH FileCategory OBJECT 
     var fileCategory:FileCategory  {
    didSet {
        switch fileCategory {
        case .XYZ:
            print("Test")


        ... other cases 
         }
     }

    required init(fileCategory:FileCategory,fileType:FileTypes = .Image) {

        self.fileCategory = fileCategory
        self.path = self.folderPath + self.fileName

   }

 }
Run Code Online (Sandbox Code Playgroud)

没有设置方法没有调用 fileCategory

注意:我不想给出默认值,我想从init方法中传递它运行时

尝试

1) defer

在初始化所有存储的属性之前在名为 $defer 的方法中使用 self

2)创建将分配该值并从init调用它的自定义方法

 private func setCategory(with category:FileCategory) {
    self.fileCategory = category
}
Run Code Online (Sandbox Code Playgroud)

在存储属性之前使用方法调用 setCategory ...

我知道所有存储的属性都应该在创建实例之前初始化。直到该实例不会被创建,所以我不会调用方法(使用 self)可能是上述解决方案不起作用的原因

如果有人有想法,请帮助我

Šte*_*ták 5

对我来说,使用defer更好的可读性。

import Foundation

class A {
    var b: String {
        didSet {
            print("didSet called with value: \(b)")
        }
    }

    init(x: String) {
        self.b = x
        defer { self.b = x }
    }
}

let a = A(x: "It's Working!") // didSet called with value: It's Working!
print(a.b) // It's Working
Run Code Online (Sandbox Code Playgroud)

  • 第一次满足编译器,第二次调用`didSet`。 (2认同)