2015-11-25 3 views
4

Swift языка программирования это сказать о контроле доступа для расширения:контроля доступа для Swift Extensions

Вы можете расширить класс, структуру или перечислений в любом доступе контекста, в котором класс, структура или перечисление доступно. Любые члены типа, добавленные в расширение, имеют одинаковый доступ по умолчанию уровень как члены типа, объявленные в первоначальном типе, который расширяется. Если вы распространяете общедоступный или внутренний тип, любые добавляемые вами новые члены типа будут иметь внутренний уровень доступа по умолчанию. Если вы добавите частный тип , любые добавляемые вами новые члены типа будут иметь уровень доступа по умолчанию частный.

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

Я не совсем понимаю вышеуказанное утверждение. Он говорит следующее:

public struct Test { } 

extension Test { 
    // 1. This will be default to internal because Test is public? 
    var prop: String { return "" } 
} 

public extension Test { 
    // 2. This will have access level of public because extension is marked public? 
    var prop2: String { return "" } 

extension Test { 
    // 3. Is this the same as the above public extension example? 
    public var prop2: String { return "" } 
} 

ответ

4

Ваше понимание верности.

Примечание: public Test { } должен быть public struct Test { }

Более интересный способ поставить свой сценарий 3 будет

extension Test { 
    // The exension has the same access control of Test, but this member is private 
    private var prop2: String { return "" } 
} 

, а также

internal extension Test { 
    // The compiler will throw a waning here, why would you define something public in an internal extension? 
    public var prop2: String { return "" } 
} 

Кроме того, если вы могли бы найти Интересно, что если ваш класс, struct или enum равен internal, вы не сможете определить расширение public. То же самое относится к классу, структуре или перечислению private, для которых вы не можете определить расширение или internal.

+0

Спасибо @mokagio, исправленный пример. – Boon

+0

Я полагаю, что мое предположение (2) верно? Поскольку, когда public применяется к классу, свойство внутри него по-прежнему дефолтируется по умолчанию. – Boon

+0

Да, ваше предположение верно. Вы можете проверить это, создав новый проект, добавив к нему фреймворк и воспроизведя свой сценарий с помощью структуры, содержащей структуру. :) – mokagio

Смежные вопросы