Access Control I
Private, fileprivate, internal and public.
Access Control I
Private, fileprivate, internal and public.
0
0
Checkbox to mark video as read
Mark as read

Access control in Swift is a powerful tool that helps developers define how much of their code is exposed to the outside world. It allows you to restrict access to specific parts of your code, ensuring that other developers (or even your future self) use it in a way that’s safe, predictable, and maintainable. Swift offers five levels of access control: open, public, internal, fileprivate, and private. Each of these controls the visibility of classes, structs, enums, properties, and functions within and across modules.

Why Access Control Matters

When designing complex systems or libraries, not all parts of your code should be available for modification or use by others. A good practice is to expose only what is necessary, limiting the risk of accidental misuse or improper modifications. This encapsulation protects the integrity of your objects, hiding the implementation details and allowing you to change the internals without breaking external code.

Swift uses access control to:

  • Prevent unwanted access or modification of data.
  • Safeguard the internal structure of classes or modules.
  • Manage scope visibility for teams working on different parts of a project.

The Five Access Levels in Swift


1. Open

The most permissive access level. It allows the use of a class or function outside the module it’s declared in, and it even allows subclassing or overriding. This is often used when designing libraries or frameworks where you expect users to modify or extend your classes.

open class Vehicle {
    open func startEngine() {
        print("Engine started")
    }
}


2. Public

public allows access to code from other modules but does not allow subclassing or function overriding outside the module. It’s generally used when you want to provide functionality but not allow modifications.

public class Car {
    public let brand: String
    
    public init(brand: String) {
        self.brand = brand
    }
}


3. Internal (Default)

The default access level in Swift, internal, restricts code to the same module. If you don’t specify an access level, Swift assumes internal. This is the most commonly used access level, suitable for most app projects since it hides details from external modules but allows full visibility within the app itself.

class Engine {
    func start() {
        print("Engine started")
    }
}


4. Fileprivate

Limits access to the current Swift file. This is useful when multiple parts of your code need to work together but shouldn’t be exposed beyond that file. It’s typically used when you want to organize related functionality within a single file without exposing it to the rest of your module.

fileprivate class Transmission {
    func engage() {
        print("Transmission engaged")
    }
}


5. Private

The most restrictive level, private, limits the visibility to the scope of the class, struct, or extension where it is declared. This ensures that no other parts of the code, even in the same file, can access it. It’s often used to hide internal details or helper functions that shouldn’t be visible outside of their context.

class Car {
    private var fuelLevel: Int = 100
    
    private func burnFuel() {
        fuelLevel -= 1
    }
    
    func drive() {
        burnFuel()
        print("Driving with \(fuelLevel)% fuel left")
    }
}

Combining Access Control

You can mix access control levels to fine-tune visibility. For example, you can declare an internal class with private properties or functions, which makes the class accessible within the module but hides its internal workings.

internal class AudioPlayer {
    private var volume: Int = 50
    
    func play() {
        print("Playing at volume \(volume)")
    }
    
    private func adjustVolume() {
        volume += 1
    }
}

Use Cases for Each Level

  • Open: Use it when designing libraries or frameworks where external developers are encouraged to subclass or override your code.
  • Public: Useful for making classes or functions available for use by others but preventing subclassing or overriding.
  • Internal: The default choice for most apps, providing access within the module but not outside.
  • Fileprivate: Helps in keeping code readable and organized within a single file, often used for helper functions or tightly related functionality.
  • Private: Best for hiding implementation details that don’t need to be accessed outside of a specific class or structure.

Best Practices

  1. Minimize Exposure: Only make properties and functions accessible when absolutely necessary. Keep things private or fileprivate unless there’s a clear need for broader access.
  2. Use Internal by Default: For most of your app’s code, internal is the default and safest choice.
  3. Open for Frameworks: If you’re building a public framework or library, use open where you want to allow extension or modification by other developers.
  4. Protect with Private and Fileprivate: Limit access as much as possible, particularly for helper functions or sensitive properties.
course

Quiz Time!

0 Comments

Join the community to comment
Sign Up
I have an account
Be the first to comment

Accept Cookies

We use cookies to collect and analyze information on site performance and usage, in order to provide you with better service.

Check our Privacy Policy