Search code examples
swiftaccess-controlaccess-modifiersswift4access-levels

What is the difference between private and fileprivate in Swift 4


In Swift 4, since now private is visible in extensions also in the same source code file, how is it different from the fileprivate access modifier?

Background: In Swift 3, private variables in a class are not visible in its extensions in the same file. For that, fileprivate had to be used.


Solution

  • File Private
    File-private access restricts the use of an entity to its own defining source file. Use file-private access to hide the implementation details of a specific piece of functionality when those details are used within an entire file.
    Syntax: fileprivate <var type> <variable name>
    Example: fileprivate class SomeFilePrivateClass {}


    Private
    Private access restricts the use of an entity to the enclosing declaration, and to extensions of that declaration that are in the same file. Use private access to hide the implementation details of a specific piece of functionality when those details are used only within a single declaration.
    Syntax: private <var type> <variable name>
    Example: private class SomePrivateClass {}


    Here is more detail about all access levels: Swift - Access Levels

    Answer to your question: (In Swift 3, private variables in a class are not visible in its extensions in the same file. For that, fileprivate had to be used.)

    Yes, in Swift 4.0, Private is now accessible in extension but within same file. If you declare/define extension in other file, then your private variable will not be accessible to your extension


    Look at this images:
    File: ViewController.swift
    Here extension and view controller both are in same file, hence private variable testPrivateAccessLevel is accessible in extension

    enter image description here


    File: TestFile.swift
    Here extension and view controller both are in different files, hence private variable testPrivateAccessLevel is not accessible in extension.

    enter image description here

    enter image description here


    Here class ViewController2 is a subclass of ViewController and both are in same file. Here private variable testPrivateAccessLevel is not accessible in Subclass but fileprivate is accessible in subclass.

    enter image description here