Swift readonly external, readwrite internal property Swift readonly external, readwrite internal property objective-c objective-c

Swift readonly external, readwrite internal property


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.

Swift 3 notes

2 new access modifiers, fileprivate and open have been added to the language, while private and public have been slightly modified:

  • open applies to class and class members only: it's used to allow a class to be subclassed or a member to be overridden outside of the module where they are defined. public instead makes the class or the member publicly accessible, but not inheritable or overridable

  • private now makes a member visible and accessible from the enclosing declaration only, whereas fileprivate to the entire file where it is contained

More details here.


As per @Antonio, we can use a single property to access as the readOnly property value publicly and readWrite privately. Below is my illustration:

class MyClass {    private(set) public var publicReadOnly: Int = 10    //as below, we can modify the value within same class which is private access    func increment() {        publicReadOnly += 1    }    func decrement() {        publicReadOnly -= 1    }}let object = MyClass()print("Initial  valule: \(object.publicReadOnly)")//For below line we get the compile error saying : "Left side of mutating operator isn't mutable: 'publicReadOnly' setter is inaccessible"//object.publicReadOnly += 1object.increment()print("After increment method call: \(object.publicReadOnly)")object.decrement()print("After decrement method call: \(object.publicReadOnly)")

And here is the output:

  Initial  valule: 10  After increment method call: 11  After decrement method call: 10