Swift中,在初始化时didSet不被调用或无效的解决方法

应用场景:

structNumber {

varvalue:Double= 0

}

classtestClass:NSObject{

varstr :String="abc"{

didSet{

print("This is didSet")

}

willSet{

print("This is willSet")

}

}

overrideinit() {

super.init()

print("enter testClass!!")

//应该赋值完成时调用didSet方法

str="123"

print("curStr =\(str)")

}

}

testClass.init()

完成init方法并赋值完成后,只打印出"enter testClass!!”,然而didSet方法并没有调用

寻找解决方案:

查阅官方文档给出的答案:

在初始化的时候赋值,是不调用didSet方法的。

官方文档没有给出答案,只能另寻方法

解决方案:

但是在有些情况下迫切希望在初始化的时候调用didSet方法,那么可以采用KVC方式给对象初始化,通过KVC方法赋值后,必须添加setValueforUndefinedKey方法做特殊处理,否则运行到KVC方法时程序会报错

上方法:


classtestClass:NSObject{

varstr :String="abc"{

didSet{

print("This is didSet")

}

willSet{

print("This is willSet")

}

}

overrideinit() {

super.init()

print("enter testClass!!")

//应该赋值完成时调用didSet方法

//        str = "123"

//通过KVC方法赋值,这里key只需填任意值, 必须添加setValueforUndefinedKey方法做特殊处理

self.setValue("123", forKey:"abc123")

print("curStr =\(str)")

}

//调用KVC的方法key值错误后调用

overridefuncsetValue(_value:Any?, forUndefinedKey key:String) {

//重新使用value赋值给str属性就可以成功调用didSet方法

guardletnewStr = valueas?Stringelse{

return

}

str= newStr

}

}

testClass.init()

通过调试得出结果:

通过控制台的打印可以看出,didSet方法

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 123.继承 一个类可以从另外一个类继承方法,属性和其他特征。当一个类继承另外一个类时, 继承类叫子类, 被继承的...
    无沣阅读 1,455评论 2 4
  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 1,841评论 0 9
  • 官方文档 初始化 Initialization是为准备使用类,结构体或者枚举实例的一个过程。这个过程涉及了在实例里...
    hrscy阅读 1,157评论 0 1
  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,241评论 30 472
  • 第一篇:《【别让惯性思维害了你】》 北京人才市场 北京找工作 美国康奈尔大学的威克教授曾做过一个实验:他首先把一只...
    96c3d102ed6c阅读 2,120评论 0 0