我已经看过了
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 set方法没有调用fileCategory
注意:我不想给出默认值,我想从init
方法传递运行时
尝试次数
1)defer
在初始化所有存储属性之前,在名为$ defer的方法中使用self
2)创建自定义方法,该方法将分配该值并从init
调用它 private func setCategory(with category:FileCategory) {
self.fileCategory = category
}
在存储属性之前使用方法调用setCategory ...
我知道应该在创建实例之前初始化所有存储的属性。直到该实例不会被创建所以我不会调用方法(使用self)可能是为什么上面的解决方案无法正常工作
如果有任何想法,请帮助我
答案 0 :(得分:4)
对我来说,使用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
答案 1 :(得分:0)
解决此问题的一种方法是将events
逻辑提取到单独的方法中,并从td
和didSet
调用此方法:
didSet