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
逻辑提取到一个单独的方法中,并从didSet
和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
【讨论】:
以上是关于DidSet在init函数swift 3中不起作用的主要内容,如果未能解决你的问题,请参考以下文章
NSKeyedArchiver 在 Swift 3 (Xcode 8) 中不起作用
setNavigationBarHidden 在其他类中不起作用(Swift 3.0)