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 privateDesign 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
- Memberwise init & mutating methods
- Inheritance, overriding & final
- Access control (public/internal/fileprivate/private)