首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么didSet不能工作?

为什么didSet不能工作?
EN

Stack Overflow用户
提问于 2016-01-30 01:22:19
回答 5查看 8.3K关注 0票数 6

在我看到的许多didSet示例中,这段代码将返回0,但是,除了原始值之外,我无法让它返回任何其他内容。我做错了什么?

Swift

代码语言:javascript
复制
struct Circle {
    var radius: Double {
        didSet {
            if radius < 0 {
                radius = 0
            }
        }
    }
}

var circ = Circle(radius: -25)

print(circ.radius)

输出

代码语言:javascript
复制
-25
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2016-01-30 01:39:11

初始化时不调用didSet,只在初始化之后调用。如果要在初始化期间验证数据,则初始化程序应执行此操作。

如果你加上:

代码语言:javascript
复制
circ.radius = -50
print(circ.radius)

您将看到它如您所期望的那样工作,输出将是0.0

票数 22
EN

Stack Overflow用户

发布于 2018-01-14 02:59:14

如果将didSet放在defer语句中,则可以确保init中的defer。也可以在deinit中工作。

代码语言:javascript
复制
class Circle {
    var radius: Double {
       didSet {
          if radius < 0 {
             radius = 0
          }
       }
    }

    init(radius: Double) {
        defer { self.radius = radius }
    }
}
票数 13
EN

Stack Overflow用户

发布于 2016-01-30 01:40:44

正如Paul在注释中所写的,在值初始化期间不调用属性观察者didSetwillSet

如果您希望在初始化时也为值调用它们,则可以在初始化器中设置radius属性后添加函数调用,以重新设置该属性:

代码语言:javascript
复制
struct Circle {
    var radius: Double {
        didSet {
            if radius < 0 {
                radius = 0
            }
        }
    }

    init(radius: Double) {
        self.radius = radius
        setRadius(radius) // <-- this will invoke didSet
    }

    mutating func setRadius(radius: Double) {
        self.radius = radius
    }
}

var circ = Circle(radius: -25)

print(circ.radius) // 0.0
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35096907

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档