2015-11-25 2 views
4

langage de programmation Swift a ceci à dire au sujet du contrôle d'accès pour l'extension:de contrôle d'accès pour les extensions Swift

Vous pouvez étendre une classe, la structure ou l'énumération dans un contexte d'accès dans lequel la classe, la structure, ou l'énumération est disponible. Tous les membres de type ajoutés dans une extension ont le même niveau d'accès par défaut que les membres de type déclarés dans le type d'origine en cours d'extension. Si vous étendez un type public ou interne, tous les nouveaux membres de type que vous ajoutez auront un niveau d'accès par défaut interne. Si vous étendez un type privé , tous les nouveaux membres de type que vous ajoutez auront un niveau d'accès par défaut de privé. Vous pouvez également marquer une extension avec un modificateur de niveau d'accès explicite (par exemple, extension privée) pour définir un nouveau niveau d'accès par défaut pour tous les membres définis dans l'extension. Cette nouvelle valeur par défaut peut toujours être remplacée dans l'extension pour les membres individuels de type .

Je ne comprends pas complètement l'énoncé ci-dessus. Est-ce qu'il dit ce qui suit:

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 "" } 
} 

Répondre

4

Votre compréhension est correcte.

Une note: public Test { } devrait être public struct Test { }

Une façon plus intéressante de mettre votre scénario 3 serait

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

ainsi que

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 "" } 
} 

Aussi, si vous pourriez trouver intéressant Si votre classe, struct ou enum est internal, vous ne pourrez pas définir une extension public. Il en va de même pour une classe private, struct ou enum, pour laquelle vous ne pouvez pas définir une extension public ou internal.

+0

Merci @mokagio, exemple corrigé. – Boon

+0

Mon hypothèse pour (2) est-elle correcte? Parce que lorsque public est appliqué à la classe, la propriété à l'intérieur est toujours par défaut à interne. – Boon

+0

Oui, votre hypothèse est correcte. Vous pouvez le vérifier en créant un nouveau projet, en y ajoutant un cadre et en reproduisant votre scénario avec une structure contenant le framework. :) – mokagio