Ответ
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, но это совсем другая, блядь, сказка с ушами.