Why private is unaccessible to the extension?


December 2018


427 time


Here is my ViewController.swift file:

class ViewController: UIViewController {
    private var myInt = 10

extension ViewController {
    func printMyInt() {

Although as mentioned in the Swift documentation - Access Levels section:

Private access restricts the use of an entity to the enclosing declaration, and to extensions of that declaration that are in the same file. Use private access to hide the implementation details of a specific piece of functionality when those details are used only within a single declaration.

Since Swift 4 has been released, I assume that I am able to implement such a thing (it is also mentioned in: What's New in Swift - WWDC 2017 session), however, the complier shows me:

enter image description here

'myInt' is inaccessible due to 'private' protection level

Is it incompatible with what mentioned in the documentation?

As a simple quick solution, I could declare it as:

fileprivate var myInt = 10

but I wonder why is it behaves like this, am I misunderstand what mentioned in the documentation? or is it a "Xcode" bug (used 9.0.1 version)?

Remark: The project has been created in the older Xcode 8 and then migrated to Xcode 9.

1 answers


В Swift 4 , privateчлены являются доступными для расширения этой декларации , которые находятся в том же файл, см SE-0169 - Улучшение взаимодействия между частными декларациями и расширениями .

Если проект был создан в Xcode 8 (с Swift 3), то Xcode 9 будет открыть его в «Swift 3 режима» и установите «Swift» Язык версии для «Swift 3,2». Поэтому строже Swift 3 ограничения держать.

Для того, чтобы частное расширение видимого для расширения в том же файл, установите версию Swift языка для 4 в настройках сборки. (Конечно, это может сделать больше изменений в коде необходимо.)

Еще лучше, используйте "Edit -> Преобразовать -> Для текущего Swift синтаксиса ..."