swiftpropertiescomputed-propertiesproperty-observer

What makes a property a computed property in Swift


Let's started with the code snippet:

St Foo {
    var proA: Int = 0 { // needs initialization
        willSet {
            print("about to set proA to \(newValue) from \(proA)")
        }
        didSet {
            print("already set proA to \(proA) from \(oldValue)")
        }
    }

    var ProB: Int { // do not needs initialization 
        return 1
    }
}

let foo = Foo()
foo.proA = 23
print(foo.ProB)

Here are some of my personal understandings about the the stored and computed property:

a: Property with only the observer (willSet and didSet) is not a computed property but a stored property (ex. the proA property in the code above).

b: Computed property must not has initialization (See the comments of the code above).

c: setter is kind of equal to the property observer, the property observer is just the setter + the observer to of the before and after mutating.

Questions:

1. I wonder what makes a property a computed property? Is it correct that as long as the property has a getter and return it is a computed property?

2. Are all my understandings (a, b & c) correct? If not, would be nice of you to point out.

3. Why is it not allowed to initialize an computed property? (Please see the figure below) And when I do so the compiler gives out the warning Cannot call value of none-function type "int" What's the meaning of this error?

enter image description here

Thanks a lot.


Solution

  • First, this is about variables, not properties. Any variable can be a computed variable. A property is just one way to use a variable.

    I think on the whole you are making a big mistake in putting a stored variable with setter observers side by side with a computed variable. They are unrelated!

    Think of a computed variable as something that looks and acts like a variable when you use it — you get and (maybe) set it — but is in fact a function (or a pair of functions). It is just a compact way of calling a function. That's all it is.

    A stored variable with observers, on the other hand, is just a stored variable that also has some observers.


    Okay, on to your questions:

    1. I wonder what makes a property a computed property? Is is correct that as long as the property has a getter and return it is a computed property?

    Yes. It's a computed variable because you declared it using the syntax that makes it a computed variable (with the curly braces).

    1. Are all my understandings (a, b & c) correct? If not would be nice of you to point out

    Yes. I think your "c" is quite insightful: a computed variable does not need a setter observer because it has (gasp!) a setter!

    1. Why is it not allowed to initialize an computed property? (Please see the figure below) And when I do so the compiler gives out the warning Cannot call value of none-function type "int" What's the meaning of this error?

    There is no sense in which a computed variable "has" a value — it is computed! it's just some functions! — so it makes no sense to assign it an "initial" value.