Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Computed read-only property vs function in Swift

In the Introduction to Swift WWDC session, a read-only property description is demonstrated:

class Vehicle {     var numberOfWheels = 0     var description: String {         return "\(numberOfWheels) wheels"     } }  let vehicle = Vehicle() println(vehicle.description) 

Are there any implications to choosing the above approach over using a method instead:

class Vehicle {     var numberOfWheels = 0     func description() -> String {         return "\(numberOfWheels) wheels"     } }  let vehicle = Vehicle() println(vehicle.description()) 

It seems to me that the most obvious reasons for choosing a read-only computed property are:

  • Semantics - in this example it makes sense for description to be a property of the class, rather than an action it performs.
  • Brevity/Clarity - prevents the need to use empty parentheses when getting the value.

Clearly the above example is overly simple, but are there other good reasons to choose one over the other? For example, are there some features of functions or properties that would guide your decision of which to use?


N.B. At first glance this seems like quite a common OOP question, but I'm keen to know of any Swift-specific features that would guide best practice when using this language.

like image 263
Stuart Avatar asked Jun 04 '14 10:06

Stuart


People also ask

Are computed properties read-only Swift?

Read-Only Computed PropertiesA computed property with a getter but no setter is known as a read-only computed property. A read-only computed property always returns a value, and can be accessed through dot syntax, but can't be set to a different value.

What is the difference between a computed property and a property set to a closure?

In short, the first is a stored property that is initialized via a closure, with that closure being called only one time, when it is initialized. The second is a computed property whose get block is called every time you reference that property.

What is computed property in Swift?

Computed properties are part of a family of property types in Swift. Stored properties are the most common which save and return a stored value whereas computed ones are a bit different. A computed property, it's all in the name, computes its property upon request.

Are computed properties lazy Swift?

Swift's lazy properties let us delay the creation of a property until it's actually used, which makes them like a computed property. However, unlike a computed property they store the result that gets calculated, so that subsequent accesses to the property don't redo the work.


2 Answers

It seems to me that it's mostly a matter of style: I strongly prefer using properties for just that: properties; meaning simple values that you can get and/or set. I use functions (or methods) when actual work is being done. Maybe something has to be computed or read from disk or from a database: In this case I use a function, even when only a simple value is returned. That way I can easily see whether a call is cheap (properties) or possibly expensive (functions).

We will probably get more clarity when Apple publishes some Swift coding conventions.

like image 123
Johannes Fahrenkrug Avatar answered Oct 15 '22 08:10

Johannes Fahrenkrug


Well, you can apply Kotlin 's advices https://kotlinlang.org/docs/reference/coding-conventions.html#functions-vs-properties.

In some cases functions with no arguments might be interchangeable with read-only properties. Although the semantics are similar, there are some stylistic conventions on when to prefer one to another.

Prefer a property over a function when the underlying algorithm:

  • does not throw
  • complexity is cheap to calculate (or caсhed on the first run)
  • returns the same result over invocations
like image 44
onmyway133 Avatar answered Oct 15 '22 07:10

onmyway133