Prashant Tukadiya
Prashant Tukadiya

Reputation: 16436

DidSet not working in init function swift 3

I have already seen

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

for me it is not working..

I am working in project where I have created class below

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

   }

 }

did set method is not calling of fileCategory

NOTE: I don't want to give default value , I want to pass it runtime from init method

Tries

1) defer

use of self in method called $defer before all stored property are initialised

2) Create custom method that will assign that value and call it from init

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

Use of method call setCategory before stored property ...

I know that all stored property should be initialised before instance created. Till that instance will not been created so i won't call methods (using self) may be that why above solution not working

Please help me if any one have idea

Upvotes: 0

Views: 1481

Answers (2)

Štefan Ľupták
Štefan Ľupták

Reputation: 126

For me, using the defer is better readable.

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

Upvotes: 5

dr_barto
dr_barto

Reputation: 6075

One way to solve this is to extract the didSet logic into a separate method and call this method from both didSet and init:

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 
    }
  }
}

Upvotes: 0

Related Questions