Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What is the preferred way of getting value in swift, var vs. func?

Tags:

ios

swift

What's the preferred way of getting a value in swift? Using a read-only variable

var getString: String? {
    return "Value"
}

or using a function?

func getString() -> String? {
    return "Value"
}

Also, is there a performance difference between the two?

like image 385
Xchord Avatar asked Feb 07 '23 01:02

Xchord


1 Answers

First, neither of these would be appropriate names. They should not begin with get. (There are historical Cocoa meanings for a get prefix that you don't mean, and so even if you mean "go out to the internet and retrieve this information" you'd want to use something like fetch, but certainly not in the case you've given.)

These issues are addressed in various sections of the Swift API Design Guidelines. First, a property is a property, whether it is stored or computed. So there is no difference in design between:

let someProperty: String?

and

var someProperty: String? { return "string" }

You should not change the naming just because it's computed. We can then see in the guidelines:

The names of other types, properties, variables, and constants should read as nouns.

Furthermore, as discussed in The Swift Programming Language:

Properties associate values with a particular class, structure, or enumeration. Stored properties store constant and variable values as part of an instance, whereas computed properties calculate (rather than store) a value.

So if this is best thought of as a value associated with the type (one of its "attributes"), then it should be a property (computed or stored). If it is something that is not really "associated" with the type (something that the caller expects this type to retrieve from elsewhere for instance), then it should be a method. Again from the Design Guidelines:

Document the complexity of any computed property that is not O(1). People often assume that property access involves no significant computation, because they have stored properties as a mental model. Be sure to alert them when that assumption may be violated.

If "stored properties as a mental model" doesn't match what you mean to express, then it probably shouldn't be a property in the first place (and you need to document the discrepancies if you make it a property anyway). So, for instance, accessing a property should generally have no visible side effects. And if you read from a property immediately after writing to it, you should get back the value you wrote (again, as a general mental model without getting into the weeds of multi-threaded programming).

If you use a method, it can often result in a different appropriate name. See the "Strive for Fluent Usage" section of the Design Guidelines for more on that. There are several rules for selecting good method names. As a good example of when to use properties vs methods, consider the x.makeIterator(), i.successor() and x.sorted() examples and think about why these are methods and why they're named as they are. This is not to say there is exactly one answer in all cases, but the Design Guidelines will give you examples of what the Swift team intends.

like image 154
Rob Napier Avatar answered Feb 13 '23 07:02

Rob Napier