最新消息:20210816 当前crifan.com域名已被污染,为防止失联,请关注(页面右下角的)公众号

[已解决]Swift中Property、Computed property和Property Observer的区别

Swift crifan 3826浏览 0评论
[背景]
折腾:
[已解决]Swift代码出错:Cannot invoke initializer for type [UIViewController] with an argument list of type (() -> ())
期间,看了:
很明显:
此处感觉:
Computed properties
和:
Property Observers
怎么有点类似啊?
并且好像还有个Property

所以需要去搞清楚,Property,Computed properties和Property Observers的区别。

[折腾过程]
1.不过好像之前看的:
也解释了一点了:
get and set are for computed properties (they don’t have any backing store). (In my opinion, the keyword ‘var’ is confusing here)
  • willSet and didSet are called for an instance variable (Use didSet to override any changes)
  • set and get are purely for computed properties
[总结]
Property,是和一个类(结构体,枚举)相关的属性值
stored property,用来,为实例对象,存储,常量或变量的,值的
而computed property是用来,计算出一个值,(而不是存储一个值)
最佳例子,就是官网给的,一看就看懂了:
struct AlternativeRect {
    var origin = Point()
    var size = Size()
    var center: Point {
        get {
            let centerX = origin.x + (size.width / 2)
            let centerY = origin.y + (size.height / 2)
            return Point(x: centerX, y: centerY)
        }
        set {
            origin.x = newValue.x - (size.width / 2)
            origin.y = newValue.y - (size.height / 2)
        }
    }
}
其中的center属性很明显是:
不是用于保存固定的常量值或变量值的,而是用于每次都动态的计算出最新的值的
所以叫做computed property
-》其实只是为了代码的调用者更加方便而已
-》如果你本身知道了此处的AlternativeRect的center的计算公式,其实完全可以去掉这个center属性,而每次都只是自己去用公式计算值就可以了。
center的存在,免去你的烦恼,方便你使用计算好的值,而已。
类,结构体,枚举,会有computed property
只有类和结构体,才会有stored property
stored property和computed property常常会和一个特性类型的实例有关系
而property也可以和类型本身有关系-》这类property被叫做type property
此外,你可以通过定义property observer去监控一个属性值的变化,由此可以响应自定义的动作。
property observer可以添加用于你自己定义的stored property,也可以用于继承了父类的子类的属性
而如何利用willSet和didSet去(重写overvide)stored property的值,官网给的例子:
class StepCounter {
    var totalSteps: Int = 0 {
        willSet(newTotalSteps) {
            print("About to set totalSteps to \(newTotalSteps)")
        }
        didSet {
            if totalSteps > oldValue  {
                print("Added \(totalSteps - oldValue) steps")
            }
        }
    }
}
let stepCounter = StepCounter()
stepCounter.totalSteps = 200
// About to set totalSteps to 200
// Added 200 steps
stepCounter.totalSteps = 360
// About to set totalSteps to 360
// Added 160 steps
stepCounter.totalSteps = 896
// About to set totalSteps to 896
// Added 536 steps
也基本说明问题了:
willSet:传入newXXX,然后加上你要处理的代码
didSet:在然后新的值设置完毕后,有啥还要后处理的,继续处理
get和set,是针对于计算值的Computed Properties的;
大概格式,还是直接参考官网代码吧:
struct someClassOrSturctOrEnum {
    var value1 = initCode1
    var value2 = initCode2
    var computedProperty: SomeType {
        get {
            /* add compute code, to calculate some value out, such as:
            calculatedValue = value1 +value2
            ……..
            */
            return calculatedValue;
        }
        set {
            /* add calculate code, such as:
            value1 = newValue1
            value2 = newValue2
            ……
            */
         }
    }
}
property observer(的willSet和didSet)主要是针对于Stored Property的;
大概格式是:
class  someClass{
    var storedPropertyVar: ValueType = initValue {
        willSet(newStoredPropertyVar) {
            /* add process code */
        }
        didSet {
            /* add extra process code */
        }
    }
}
 即可。

转载请注明:在路上 » [已解决]Swift中Property、Computed property和Property Observer的区别

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
84 queries in 0.198 seconds, using 22.10MB memory