2016-02-09 2 views
18

Sono confuso riguardo al modificatore di accesso interno e privato.Swift 2 interno vs privato

la documentazione dice:

“L'accesso interno permette di entità da utilizzare all'interno di qualsiasi file sorgente dal loro modulo che definisca, ma non è in alcun file di origine al di fuori di quel modulo . Di solito si utilizza l'accesso interno quando si definisce un'app o la struttura interna di un quadro .”

Come ho pensato che fosse, era che con interno è possibile accedere a tutto ciò se siete nella vostra app. Ma questo non è vero, perché quando ho un viewcontroller ciò che è di default interno e sto avendo una funzione interna su quel viewcontroller non posso accedervi da un altro file in un altro gruppo (li crei in xCode).

Quello che ho provato è stato avere un ViewController che ha un metodo foo nel gruppo A poi nel gruppo B ho creato un ViewController come questo:

let vc: FakeViewController = FakeViewController() 
vc.foo() 

Così è interno ristretto allo stesso gruppo? O sto interpretando male?

È utile che in un viewcontroller crei metodi privati ​​e vars/lets?

+3

Cosa intendi per "gruppo"? – zaph

+0

I gruppi che è possibile creare in xCode. Non so se ha qualcosa a che fare con. – user1007522

+1

I gruppi non hanno alcun effetto sul controllo degli accessi, sono solo uno strumento per organizzare un progetto/spazio di lavoro. La documentazione non è sbagliata, quindi se non puoi accedere ad un 'func interno 'da qualche parte, deve essere perché in qualche modo si trova in un modulo diverso. –

risposta

8

L'accesso interno limita l'accesso ai file all'interno di una singola applicazione o framework.

limita privati ​​Accesso al file di origine individuo che l'oggetto viene creato in.

Vai a questa link per una spiegazione più approfondita.

Nel complesso, se il "Gruppo A" e il "Gruppo B" si trovano nella stessa applicazione o struttura, è possibile accedere ai metodi da ciascuno, presupponendo che viewController consenta l'accesso interno.

+3

Non proprio corretto, da [documentazione di Apples] (https://developer.apple.com/library/ios/documentation/Swift/Conceptual/ Swift_Programming_Language/AccessControl.html) L'accesso interno consente alle entità di essere utilizzate all'interno di qualsiasi file sorgente dal modulo ** di definizione **, ma non in qualsiasi file sorgente al di fuori di quel ** modulo **. Un modulo! = Applicazione o framework singolare. La lingua nel link citato è un po 'sciatta. – zaph

+0

Il mio gruppo A e B si trovano nello stesso modulo immagino. È nella stessa app. Questo è quello che trovo confondendo la parte del modulo. – user1007522

+0

Il commento di @Mike Pollard è corretto, i gruppi non sono altro che organizzazione in Xcode, non hanno alcun effetto sul codice o sull'app. – zaph

0

La mia comprensione è che privato non consentirà l'accesso alla variabile da quella classe. Tuttavia, ci sono momenti in cui, come nel caso dei riconoscitori di gesti, non puoi renderli privati ​​perché sono necessari dietro le quinte. Contrassegnandoli come "interni" consente loro di accedervi da altre funzioni, ma senza chiamare direttamente.

Principalmente uso interno per mantenere il mio codice organizzato, quindi so che non è una funzione pubblica ma può ancora essere utilizzata.

+2

Non proprio giusto. 'private' non ha nulla a che fare con le classi. Limita l'accesso allo stesso file sorgente (Swift 2) o all'ambito di inclusione (Swift 3). Si noti che quando si dichiara qualcosa in una definizione di classe, l'ambito che lo racchiude non si estende ad altri 'extension's. In questo modo, le funzioni private non sono disponibili nell'intera classe. – Tali

6

Supponiamo di avere 3 file diversa fonte View Controller A, B, C poi in privato: - Se Intancses in A sono privati ​​che solo i metodi di A può usarle In interno: - se A è come interno di B e C possono facilmente usarli. Ecco un esempio: enter image description here

Grazie

2

@ user1007522 Potrebbe inviare l'intero codice sorgente per FakeViewController? Dovresti avere accesso a foo() dalla tua variabile vc. Se non lo fai, sospetto che sia in gioco qualcos'altro.

ho trovato le seguenti definizioni molto più facile da capire (copiato da UseYourLoaf - Swift 4 Access Levels)

i cinque livelli di accesso di Swift 3/4

Swift 3 ha cinque livelli di accesso che controllano dal file di origine o che modulo è possibile accedere a qualcosa. In ordine dal più aperti al più ristretto:

  • aperta è possibile accedere a classi aperte e membri della classe da qualsiasi file sorgente nel modulo di definizione o qualsiasi modulo che importa quel modulo. È possibile creare una sottoclasse di una classe aperta o eseguire l'override di un membro di classe aperto sia nel modulo di definizione che in ogni modulo che importa quel modulo.

  • pubblico consente lo stesso accesso aperto - qualsiasi file sorgente in qualsiasi modulo - ma ha sottoclassi e override più restrittive. Puoi solo creare una sottoclasse di una classe pubblica all'interno dello stesso modulo. Un membro della classe pubblica può essere sostituito solo da sottoclassi nello stesso modulo. Questo è importante se stai scrivendo un framework. Se si desidera che un utente di tale framework sia in grado di creare una sottoclasse di una classe o sovrascrivere un metodo, è necessario renderlo aperto.

  • interno consente l'utilizzo da qualsiasi file sorgente nel modulo di definizione ma non da quello esterno. Questo è generalmente il livello di accesso predefinito.

  • fileprivate consente di utilizzare solo all'interno del file di origine di definizione.

  • privato Swift 4: permette l'uso solo dalla dichiarazione racchiude e di nuovo in Swift 4, a qualsiasi estensione di tale dichiarazione nello stesso file sorgente Swift 3: permette l'uso solo dalla dichiarazione racchiude.