2016-03-22 12 views
2

In meinem Swift-Code verwende ich oft den privaten Modifizierer, um die Sichtbarkeit von Hilfsklassen einzuschränken. Zum Beispiel habe ich in einer Datei eine GridController und eine GridControllerModel. Die GridController (UI) sollte für den Rest der Anwendung zugänglich sein, aber die Modellklasse ist vollständig intern und sollte niemals vom Rest der Anwendung aufgerufen werden.Swift: Zugriffsebene zwischen 'privat' und 'internal'?

Ich kann dies in Swift, indem Sie beide Klassen private und halten sie in der gleichen Datei. Aber das wird unhandlich, wenn Klassen größer werden. Was ich gerne tun würde, ist, jede Klasse in einer separaten Datei zu belassen (um die Programmierung zu vereinfachen), aber den Zugriff auf die Modellklasse alles andere als GridController (zum Ausblenden von Informationen) zu verhindern.

Gibt es eine Möglichkeit, dies in Swift zu tun?

+0

Nein. Der richtige Weg, dies in Swift zu tun, besteht darin, sie in die gleiche Datei zu schreiben. –

Antwort

2

Wie andere gesagt haben, gibt es in Swift keine Möglichkeit, genau das zu tun, was Sie heute wollen.

Eine Alternative ist die Verwendung einer Erweiterung in einer anderen Datei, um GridControllerModel als verschachtelten Subtyp von GridController hinzuzufügen. z.B.

//GridControllerModel.swift 

extension GridController { 
    struct GridControllerModel { 
     let propertyOne:String 
     let propertyTwo:String 
    } 
} 

Auf diese Weise können Sie Ihre GridController Klasse in einer eigenen Datei so etwas wie erklären:

//SomeOtherClass.swift 

var nested = GridController.GridControllerModel() 
:

var model = GridControllerModel() 

Doch der Rest der Anwendung noch die GridControllerModel Art wie diese zugreifen kann

So erreichen Sie einige Trennung, indem Sie den Modelltyp Subtyp von GridController, aber es ist nicht wahr, Zugriff con steuern Auf der positiven Seite wird es nicht in der Code-Vervollständigung außerhalb der GridController-Klasse als "GridControllerModel" angezeigt, Sie müssten zuerst "GridController" und dann "." Um den Subtyp "GridController.GridControllerModel" zu sehen

Es ist auch erwähnenswert, dass eine zusätzliche Zugriffskontrolle Ebene derzeit überprüft wird und wahrscheinlich in der nächsten Version von Swift sein wird (3.0):

https://github.com/apple/swift-evolution/blob/master/proposals/0025-scoped-access-level.md

Unter der Annahme, dieser Vorschlag angenommen und umgesetzt wird, würden Sie in der Lage sein, Ihre erklärt Subtyp wie folgt zu aktualisieren:

//GridControllerModel.swift 

local extension GridController { 
    struct GridControllerModel { 
     let propertyOne:String 
     let propertyTwo:String 
    } 
} 

(Man beachte die "local" Stichwort oben jetzt). Dies würde den GridControllerModel-Typ für alle Klassen außer GridController und allen Erweiterungen von GridController unsichtbar und nicht zugänglich machen.

So, ich würde empfehlen, dass Sie diesen verschachtelten Subtyp Ansatz heute betrachten, denn wenn Swift 3.0 später in diesem Jahr ankommt, wird es wahrscheinlich unterstützen, was Sie wollen, indem Sie einfach ein Schlüsselwort vor Ihrer Subtyp-Deklaration hinzufügen. Und in der Zwischenzeit bekommst du auch die Trennung, die du willst.

+0

Danke - das ist ein toller Vorschlag! – Bill

0

Nein, es gibt keinen Zugriffsmodifizierer, der die Sichtbarkeit auf einen bestimmten Satz von Dateien beschränkt. Aber das brauchst du wahrscheinlich nicht.

Was es gibt:

  • private: schränkt die Sichtbarkeit innerhalb der gleichen Quelldatei.
  • internal: Einschränkung der Sichtbarkeit auf das gleiche Modul.

Wenn Sie ein Stück Software Gebäude sind, die für eine Quelldatei zu groß ist, aber beide definiert eine nach außen gerichtete Schnittstelle und interne Details, die von Kunden von dieser Schnittstelle verborgen bleiben sollte ... dann bist du wahrscheinlich auf einem Niveau, wo es angemessen ist, einen Rahmen zu bauen. Ihr Framework kann dann Funktionen definieren, die internal nur für seine Verwendung und separat von der public Schnittstelle sind, die es den Clients zur Verfügung stellt.