Каков уровень доступа к делу в рамках частного перечисления - PullRequest
3 голосов
/ 17 июня 2019

Я прочитал документ о Swift 5.1 с swift.org и у меня есть несколько вопросов об уровне доступа в перечислении.

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

В документе написано:

Отдельные случаи перечисления автоматически получают тот же уровень доступа, что и перечисление, которому они принадлежат.

private enum SomePrivateEnum {
    case one
    case two
    case three
}

private class SomePrivateClass {
    private var somePrivateProperty = 0
}


// work
print(SomePrivateEnum.one)

// error: 'somePrivateProperty' is inaccessible due to 'private' protection level
print(SomePrivateClass().somePrivateProperty)


Согласно документу, если у меня есть перечисление private,тогда все случаи должны получить private уровень доступа.Вопрос в том, почему я могу получить доступ к закрытому делу вне декларации enum?Это поведение отличается от Class.

Ответы [ 2 ]

1 голос
/ 17 июня 2019

Прежде всего, ваш код полностью искусственный, так как он даже не будет компилироваться, кроме как на игровой площадке - а на детской площадке понятия приватности более или менее бессмысленны. Тестируйте только в рамках реального проекта.

Когда вы это сделаете, у вас будет что-то вроде этого:

private enum SomePrivateEnum {
    case one
    case two
    case three
}
private class SomePrivateClass {
    private var somePrivateProperty = 0
}
class ViewController : UIViewController {
    func test() {
        print(SomePrivateEnum.one)
        print(SomePrivateClass().somePrivateProperty)
    }
}

Теперь, когда мы установили это, мы можем перейти к тому, что не так с самим тестом, а именно к тому, что вы сравниваете яблоки с апельсинами. Вот параллелизм:

    print(SomePrivateEnum.one) // ok
    print(SomePrivateClass()) // ok

То есть private для SomePrivateEnum и private для SomePrivateClass означают одно и то же, а именно: "private в этом файле ". Этот код находится в одном и том же файле, поэтому он может видеть как SomePrivateEnum, так и SomePrivateClass. (Как показывают документы, код, который может видеть SomePrivateEnum, может видеть SomePrivateEnum.one, и наоборот. Поэтому мы сейчас сравниваем яблоки с яблоками.)

Но private для somePrivateProperty означает что-то еще . Это означает "private внутри этого типа ". Так что только код внутри SomePrivateClass может видеть somePrivateProperty. Этот код не находится внутри SomePrivateClass, поэтому он не может видеть это свойство.

0 голосов
/ 17 июня 2019

Вы можете получить доступ к private объявлениям внутри текущего контекста.например, если вы перенесете enum в другой контекст - он не будет доступен так же, как свойство внутри SomePrivateClass.

, то есть это будет недоступно:

struct Foo {
    private enum SomePrivateEnum {
        case one
        case two
        case three
    }
}
print(Foo.SomePrivateEnum.one)

, и это будет:

private class SomePrivateClass {
    var somePrivateProperty = 0
}
print(SomePrivateClass().somePrivateProperty)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...