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

Posted

技术标签:

【中文标题】DidSet在init函数swift 3中不起作用【英文标题】:DidSet not working in init function swift 3 【发布时间】:2017-11-02 10:06:39 【问题描述】:

我已经看过了

Is it possible to allow didSet to be called during initialization in Swift?

对我来说它不起作用..

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

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

   

 

set 方法没有调用fileCategory

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

尝试

1)defer

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

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

 private func setCategory(with category:FileCategory) 
    self.fileCategory = category

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

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

如果有人知道,请帮助我

【问题讨论】:

根据苹果文档-:在调用超类初始化程序之后,在子类初始化程序中设置属性时调用超类属性的 willSet 和 didSet 观察者。在类设置自己的属性时,在调用超类初始化程序之前,不会调用它们。 @TusharSharma 同意!!感谢您的努力,但请检查我添加的链接,该链接在属性使用 defer 关键字调用 didSet 的位置添加,因此看起来可以在 init 方法中的 self 中初始化属性(使用 didSet) 【参考方案1】:

对我来说,使用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

【讨论】:

为什么两次 self.b = x ? 第一次满足编译器,第二次调用didSet【参考方案2】:

解决此问题的一种方法是将didSet 逻辑提取到一个单独的方法中,并从didSetinit 中调用此方法:

class FileManager: FileManagerHelper 

  var fileCategory:FileCategory  
    didSet 
      didSetFileCategory()
    
  

  required init(fileCategory:FileCategory,fileType:FileTypes = .Image) 
    self.fileCategory = fileCategory
    self.path = self.folderPath + self.fileName
    didSetFileCategory()
  

  private func didSetFileCategory() 
    switch fileCategory 
    case .XYZ:
      print("Test")
    //... other cases 
    
  

【讨论】:

以上是关于DidSet在init函数swift 3中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

为啥速记参数名称在这个 Swift 闭包中不起作用?

添加观察在 Swift 4 中不起作用

NSKeyedArchiver 在 Swift 3 (Xcode 8) 中不起作用

setNavigationBarHidden 在其他类中不起作用(Swift 3.0)

TTTAttributedLabel 可点击链接在 Swift 3 中不起作用

Timer.scheduledTimer 在 Swift 3 中不起作用