В чем разница между модификаторами доступа public и internal в Swift?

Ответ

public и internal — это модификаторы доступа, определяющие область видимости сущностей (классов, свойств, методов) в Swift.

public

  • Доступен везде, включая другие модули.
  • Используется для создания публичного API библиотек и фреймворков.
  • Важно: public-класс не позволяет наследоваться или переопределять его методы вне модуля. Для этого требуется open.
// Модуль MyFramework
public class PublicClass {
    public var value: Int = 10
}
// Доступен в другом модуле: import MyFramework
let obj = PublicClass()

internal

  • Доступен только внутри модуля, где объявлен.
  • Это модификатор по умолчанию, если не указан другой.
  • Невидим для других модулей.
// Модуль MyFramework
internal class InternalClass {}
// Недоступен в другом модуле при импорте

Итог: public — для межмодульного использования, internal — для скрытия деталей реализации внутри модуля.

Ответ 18+ 🔞

А, слушай, вот этот ваш Swift, он же, блядь, как хитрая жопа — с виду просто, а копнёшь, там целый ёперный театр! Вот эти модификаторы доступа, public и internal... Ну, представь, что твой код — это квартира.

internal — это как дверь в комнату внутри квартиры. По умолчанию, если ты не выебнулся и ничего не написал, все твои классы и методы — они internal. То есть, любой другой код внутри твоего же модуля (внутри твоей же квартиры) может спокойно зайти, взять что надо, позвать: «Э, Герасим, дай сюда ту переменную!». А вот соседям из другого подъезда (другого модуля) на это похуй — они этой двери просто не видят. Всё спрятано. Это для внутренней кухни, чтобы не светить всем свою постыдную логику, где ты if в for засунул.

// Твой модуль "МояХата"
internal class ТвойСекретныйДиван {
    internal var посиделки = 10
}
// Внутри "МоейХаты" всё ок
let диван = ТвойСекретныйДиван()
// А вот если кто-то импортит "МояХата" — нихуя он не увидит, сосёт лапу.

А теперь public — это, блядь, парадная дверь твоей квартиры, выходящая в общий подъезд (в другие модули). Ты её специально такую красивущую сделал, табличку «API» повесил. Любой, кто подключит твой модуль, может через эту дверь зайти и сказать: «О, привет, PublicClass!». Доступен везде.

НО! Вот тут, сука, подвох, который всех наебывает! public — это как гость в прихожей. Он может войти, посмотреть на твой публичный диван (public var), даже присесть. Но унаследоваться от твоего public-класса или переопределить его public-метод в своём модуле — нихуя! Для этого дверь должна быть не просто public, а open — то есть вообще нараспашку, «заходи, делай что хочешь». public же говорит: «Смотри, но руками не трогай, я сам всё сделаю».

// Модуль "МояБиблиотека"
public class МояПубличнаяТачка {
    public var колёса = 4
}
// В другом модуле
import МояБиблиотека
let тачка = МояПубличнаяТачка() // Зашёл в прихожую, ок
print(тачка.колёса) // Посмотрел на колёса, ок
// class ТюнингованнаяТачка: МояПубличнаяТачка {} // А вот так, сука, НЕЛЬЗЯ! Наследоваться нельзя!

Итог, ёпта: internal — спрячь своё говно от чужих глаз внутри своего модуля (дефолтная история). public — покажи аккуратную вывеску и функционал вовне, но так, чтобы тебя не раздербанили. А если хочешь, чтобы раздербанивали — это уже open, но это совсем другая, блядь, сказка с ушами.