Define a read-only property in Swift

12,027

Solution 1

You can use a Computed Property which (like a method) can be overridden.

class Parent: UIView {
    var itemCount: Int { return 0 }
}

class Child: Parent {
    override var itemCount: Int { return 1 }
}

Update (as reply to the comment below)

This is how you declared and override a function

class Parent: UIView {
    func doSomething() { print("Hello") }
}

class Child: Parent {
    override func doSomething() { print("Hello world!") }
}

Solution 2

You can declare setter as private while getter is public.

public class someClass {
    public private(set) var count: String
}

Refer to this link

Solution 3

As one more option you can use private variable for read/write and another for read-only. Count you're using for internal class changes, and numberOfItems for public access. Little bit weird, but it solves the problem.

class someClass {
    private var count: Int = 0
    var numberOfItems: Int { return count }

    func doSomething()  {
       count += 1
    }
}
Share:
12,027
Jason
Author by

Jason

React/GraphQL enthusiast. Working with Node.js, React, Relay, GraphQL, PostgreSQL, PHP, JavaScript, HTML, CSS. Enjoys writing C and shell scripts.

Updated on June 14, 2022

Comments

  • Jason
    Jason almost 2 years

    How do you define a read-only property in Swift? I have one parent class which needs to define a public property eg. itemCount. Here's my code:

    Class Parent: UIView {
      private(set) var itemCount: Int = 0
    }
    
    class Child {
      private(set) override var itemCount {
        get {
          return items.count
        }
      }
    }
    

    I get the error: Cannot override mutable property with read-only property


    Option 1 - Protocols:

    Well I can't use a protocol because they can't inherit from classes (UIView)

    Option 2 - Composition:

    I add a var view = UIView to my Child class and drop the UIView inheritance from my Parent class. This seems to be the only possible way, but in my actual project it seems like the wrong thing to do, eg. addSubview(myCustomView.view)

    Option 3 - Subclass UIView on the Child class

    I can't do this either because I intend to have multiple related Child classes with different properties and behaviour, and I need to be able to declare instances of my Child classes as the Parent class to take advantage of UIView's properties and Parent's public properties.

  • Jason
    Jason almost 8 years
    Thanks! Would I have to use var and override var to declare functions as well?
  • Luca Angeletti
    Luca Angeletti almost 8 years
    No, to declare a function you use the func keyword.
  • Jason
    Jason almost 8 years
    I haven't been able to define it in Parent and been able to successfully override it in a Child class
  • Gino Mempin
    Gino Mempin over 3 years
    The link is dead. :(