Я пытаюсь объявить свойство экземпляра в swift так, чтобы оно было видимо только для его класса и подклассов. Я считаю, что это будет называться охраняемым имуществом на других языках. Есть ли способ достичь этого в Свифт?Как сделать свойство экземпляра видимым только для подкласса swift
ответ
доступа по линиям наследования не очень подходит к конструированию философий за Swift и какао:
При проектировании уровней управления доступом в Swift, мы рассматривали два основных случая использования:
- сохранить
private
сведения о классе, скрытом от остальной части приложения- сохранить
internal
сведения о структуре, скрытой от клиентского приложенияОни соответствуют
private
иinternal
уровням доступа соответственно.В отличие от этого,
protected
связывает доступ с наследованием, добавляя совершенно новую ось управления. Он фактически не предлагает никакой реальной защиты, поскольку подкласс всегда может выставлять «защищенный» API через новый публичный метод или свойство. Он также не предлагает дополнительных возможностей оптимизации, поскольку новые переопределения могут поступать из любого места. И это излишне ограничительно - это позволяет подклассам, но не любому помощнику подкласса, получить доступ к чему-либо.
Дополнительное разъяснение on Apple's Swift blog.
Я нашел способ (не правильный путь в соответствии с другими стандартными объектно-ориентированными языками программирования).
Вы определяете как базовый класс, так и подкласс в одном файле .swift. Затем вы можете получить доступ к закрытым полям вашего базового класса.
Ниже классов буксирных определены в файле BaseClass.swift
class BaseClass {
private var privateVariable : Int
init()
{
privateVariable = 0
}
private func doSomeThing() -> Void
{
privateVariable += 10
}
}
class SubClass: BaseClass {
override init() {
super.init()
privateVariable = 1
}
private override func doSomeThing() {
super.doSomeThing()
privateVariable *= 10
}
}
Это даст вашему подклассу возможность доступа к закрытым переменным.
Обязательно определите как базовый класс, так и подкласс в том же файле быстрого доступа.
Но проблема по-прежнему сохраняется. Проблемы с безопасностью. Вы не всегда можете позволить подклассу обращаться к закрытым полям вашего родительского класса. Для этого вы можете определить расширение вашего подкласса, где частные члены родительского класса недоступны. Просто попробуйте один раз.
extension SubClass
{
func doSomeOtherThing() -> Void {
privateVariable = 0; // This is a compiler error.
}
}
Это расширение определяется в SubClass.swift файле.
Если вы согласны с этим, используйте это, иначе дождитесь, пока Apple согласится использовать защищенный модификатор в предстоящей версии Swift (не уверен, что 3.1 или 3.x или v4.0 имеет какие-либо планы по его поддержке).
Один из способов сделать это определить функцию или свойство с fileprivate
ключевого слова и определить подкласс в том же файле, как так:
class Parent {
fileprivate var someProperty: Any?
}
class Child: Parent {
func someFunction() {
print(someProperty)
}
}
Конечно, это очень раздражает, так как этот файл будет огромным беспорядок. Не говоря уже о том, почему Swift позволяет это, но не protected
просто ... argh.
- 1. Сделать свойство подкласса преходящим
- 2. Как сделать свойство видимым в InterfaceBuilder (Xcode)
- 3. Swift UIViewController. Инициализация переменной экземпляра-подкласса.
- 4. Как сделать видимым RegularExpressionValidator?
- 5. как свойство «количество» подкласса инициализировано
- 6. Как сделать видимым только конкретную область холста?
- 7. iOS/Swift: сделать видимым исходный код приложения?
- 8. Delphi - Создание экземпляра подкласса
- 9. Как сделать URL возврата Paypal видимым только для плательщиков?
- 10. как сделать только один порт USB видимым для приложения
- 11. Как сделать сообщение видимым только для 1 или 2 стран
- 12. Как сделать некоторый контент видимым только для пользователей admin/mod
- 13. Загрузка рекорда - Как сделать его видимым только для друзей?
- 14. Как сделать CSS видимым только для Android-телефона UC-браузер
- 15. Как я могу сделать объявление видимым только для мобильных?
- 16. Как сделать виджет QuickEdit Blogger видимым только для администраторов?
- 17. Django: как сделать часть шаблона видимым только для администратора
- 18. Свойство для настройки протокола Swift через свойство только для чтения
- 19. Как сделать видимым подграф?
- 20. сделать контент видимым только на одной странице
- 21. Потеря ссылки на свойство экземпляра в Swift
- 22. Как сделать содержимое Expander видимым для VisualTreeHelper
- 23. Swift 3: Наблюдение свойство только для чтения
- 24. Как сделать протокол из Swift видимым в файле .h?
- 25. Установите видимым свойство MenuItem
- 26. Как сделать UITableViewCellAccessoryDisclosureIndicator видимым на черном фоне?
- 27. Кастинг экземпляра подкласса QObject
- 28. Использование типа суперкласса для экземпляра подкласса
- 29. Почему я могу вызвать частный метод для экземпляра подкласса, если он не должен быть видимым экземпляру?
- 30. Доступ только для чтения, например, свойство в Swift
http://owensd.io/2014/08/21/protected-swift.html – nwales
Это интересное предложение, и в нем могут быть достоинства. (Лично я не уверен, это помогло бы увидеть более конкретный вариант использования.) Несмотря на это, похоже, повторное использование имени 'protected' для другой цели, чем тот, о котором вы спрашиваете (а также разные от того, что означает это имя на других языках). – rickster
Я думаю, что защищенный, поскольку он существует на других языках программирования, должен существовать в Swift. В принципе, если вы хотите поделиться частным определением с вашими потомками, вы не сможете. Это раздражает. –