0Pricing
Swift Academy · Lesson

Access control (public/internal/fileprivate/private)

Control visibility of APIs across files and modules using public, internal (default), fileprivate, and private. Learn when to expose vs hide.

Access control (public/internal/fileprivate/private) is a free Swift Academy lesson on CoddyKit — lesson 3 of 3. You can read the complete lesson below for free — then practise it hands-on in the browser with a built-in code editor and a 24/7 AI tutor. It is part of the Swift Academy learning path, one of 3 lessons in the course, and your progress syncs across the web and the CoddyKit app.

Access levels overview

Swift access levels:

  • public: visible to other modules
  • internal (default): visible in the same module
  • fileprivate: only this source file
  • private: enclosing scope (type/extension)

internal (default)

Omitting a modifier makes declarations internal, usable anywhere within the same module (package/app target).

struct Greeter {            // internal by default
    func hello(_ name: String) -> String { "Hello, \\(name)" }
}
let g = Greeter()
print(g.hello("Ada"))

public API surface

Mark APIs public to expose them to other modules; leave helpers internal to keep surface area small.

public struct Math {
    public static func add(_ a: Int, _ b: Int) -> Int { a + b }
    // internal helper remains hidden outside the module
    static func double(_ x: Int) -> Int { x * 2 }
}
print(Math.add(1,2))

fileprivate scope

fileprivate restricts use to the same source file. Great for splitting helpers for a type inside one file.

// In FileA.swift
fileprivate func hiddenInFile() { print("Only in this file") }

struct A {
    func call() { hiddenInFile() } // OK: same file
}
A().call()

private scope

private limits access to the enclosing scope (type/extension). Use it to protect invariants tightly.

struct Box {
    private var value = 0     // visible only inside Box declaration
    mutating func set(_ v: Int) { value = v } // controlled write
    func get() -> Int { value }                // controlled read
}
var b = Box()
b.set(7)
print(b.get())
// b.value = 3   // error: 'value' is private

Design tips

Design tips:

  • Default to internal, expose only what consumers need as public.
  • Prefer private/fileprivate for helpers to keep APIs small.
  • Access level of a member cannot be broader than its type.

Default access

Quick check: What's the default access level?

Recap

Recap: Use public to expose modules, keep most things internal, and hide details with fileprivate/private to protect invariants.

Frequently asked questions

Is the “Access control (public/internal/fileprivate/private)” lesson free?

Yes — the full text of “Access control (public/internal/fileprivate/private)” is free to read here on the web, and the Swift Academy course includes 3 lessons in total. To practise it interactively (a built-in code editor and a 24/7 AI tutor) and unlock the rest of the Swift Academy course, upgrade to CoddyKit PRO.

What will I learn in “Access control (public/internal/fileprivate/private)”?

Control visibility of APIs across files and modules using public, internal (default), fileprivate, and private. Learn when to expose vs hide. You practise Swift Academy with hands-on code you run directly in the browser, and a 24/7 AI tutor answers your questions as you work through the lesson.

Do I need any experience to start Swift Academy?

No prior experience is required. Swift Academy on CoddyKit is structured for beginners through advanced learners; this is — lesson 3 of 3, so you can start here or from the beginning and move at your own pace.

How long does the “Access control (public/internal/fileprivate/private)” lesson take?

Most CoddyKit lessons take about 5–10 minutes. Each one is bite-sized and interactive, so you make steady progress and pick up exactly where you left off across the web and the app.

Can I write and run code in this Swift Academy lesson?

Yes. Every Swift Academy lesson includes a built-in code editor, so you write and run real code right in your browser and get instant AI feedback — no local setup required.

All lessons in this course

  1. Memberwise init & mutating methods
  2. Inheritance, overriding & final
  3. Access control (public/internal/fileprivate/private)
← Back to Swift Academy