Jasper Blues Jasper Blues - 1 month ago 22
Swift Question

Swift readonly external, readwrite internal property

In Swift, what is the conventional way to define the common pattern where a property is to be externally readonly, but modifiable internally by the class (and subclasses) that own it.

In Objective-C, there are the following options:


  • Declare the property as readonly in the interface and use a class extension to access the property internally. This is message-based access, hence it works nicely with KVO, atomicity, etc.

  • Declare the property as readonly in the interface, but access the backing ivar internally. As the default access for an ivar is protected, this works nicely in a class hierarchy, where subclasses will also be able to modify the value, but the field is otherwise readonly.



In Java the convention is:


  • Declare a private field, and implement a public, read-only getter (method).



What is the idiom for Swift?

Answer

Given a class property, you can specify a different access level by prefixing the property declaration with the access modifier followed by get or set between parenthesis. For example, a class property with a public getter and a private setter will be declared as:

private(set) public var readonlyProperty: Int

Suggested reading: Getters and Setters

Martin's considerations about accessibility level are still valid - i.e. there's no protected modifier, internal restricts access to the module only, private to the current file only, and public with no restrictions.