Использование "open" и "public"
Я уже читал документацию о новых модификаторах "open" и "fileprivate". Но есть две вещи, которые я не понимаю:
- Почему невозможно объявить протоколы или расширения также как "открытые"? И значит ли это, что невозможно использовать эти вещи вне модуля?
- Если я не хочу создавать свои классы для модуля, а для общего приложения, должен ли я в любом случае объявить свои классы и методы как "открытые", или это хорошая практика, чтобы они оставались только "открытыми"?
1 ответ
Как этот ответ говорит:
- Открытый класс доступен и подклассифицирован вне определяющего модуля. Открытый член класса доступен и может быть переопределен вне определяющего модуля.
- Открытый класс доступен, но не подклассифицирован вне определяющего модуля. Публичный член класса доступен, но не может быть переопределен вне определяющего модуля.
Я думаю, что ответ на ваш первый вопрос заключается в том, что вы не можете переопределить или создать подкласс для протокола или расширения. Таким образом, бесполезно, чтобы такие вещи были open
так как public
уже делает их доступными вне модуля.
На ваш второй вопрос я бы сказал, что вы должны объявлять свои собственные классы только как open
если вы планируете переопределение или подклассы. В противном случае вы разрешаете ненужный доступ к этим элементам. Большую часть времени public
должно соответствовать вашим потребностям.
Редактировать:
Как отмечает @Alex, я не думаю, что есть много недостатков, позволяющих этот "дополнительный доступ". Единственное, о чем я могу подумать, это если вы просто хотели защитить свои уроки от своего будущего я, но это может или не может быть применимо. Таким образом, если это не так, то не должно быть большого вреда в установлении их как open
по умолчанию.
open предназначен для другого модуля, например, когда мы используем его в модульном тесте или в какао-бобах, вы можете наследовать от pod (если это: open class somePod {...}) или переопределить некоторую функцию (если это: open func someFunctionInPod{...}) в вашем проекте.