Swift создает функцию в расширении «private» в том же расширении

#swift #xcode

#swift #xcode

Вопрос:

Есть ли способ сделать расширение способным получать доступ к частной переменной, определенной в файле определения, но сохранить закрытую функцию расширения закрытой только для этого расширения (не подлежащей оценке в файле определения)?

Например:

 class MyClass {
  private var myStr = "str"
  func doSomething() {
    funcA() // <- should cause compiler error
  }
}

extension MyClass {
  private func funcA() {
    print(myStr)
  }
}

 

Таким образом, doSomething() не может вызвать funcA(), но funcA() может получить доступ к myStr.

Комментарии:

1. Я сам не пробовал, но как насчет переноса расширения в другой файл и создания функции fileprivate ? При этом я лично предпочитаю использовать private перед fileprivate

2. @Jessy Спасибо за ваши предложения. Я исправил их в обновлениях.

Ответ №1:

ДА. Поместите определение в один файл, а расширение в другой.

Частный доступ ограничивает использование объекта вложенным объявлением и расширениями этого объявления, которые находятся в том же файле.

Эта информация не совсем полная. Как вы видели, все, что находится private в расширении, доступно в объявлении и других расширениях. Но только в том же файле.

https://docs.swift.org/swift-book/LanguageGuide/AccessControl.html