2017-01-20 3 views
10

Ich möchte eine Klasse erstellen, die von einer anderen Klasse erbt, die sich in einer anderen Datei befindet.Wie man eine 'geschützte' Variable in swift deklariert

Zum Beispiel:

Class1.swift

class Class1 
{ 
    protected var 
    //Do Stuff 
} 

Class2.swift

class Class2:Class1 
{ 
    //Do stuff 
} 

Wie würde ich accsess haben beable a'protected‘Variable/Funktion in schnell?

Wenn ich eine private Variable/Funktion deklariere, kann ich sie nur in dieser Klasse verwenden. Wenn ich 'fileprivate' verwende, muss meine andere Klasse in der Sicherungsdatei als Class1 sein. Was ich tun möchte, ist, meine Klassen in Unternehmensdateien zu behalten und die Gruppen aus Xcode zu verwenden, um zu wissen, welche Klasse zu welcher Kategorie gehört.

+0

Mögliche Duplikat [Does Swift Zugriffsmodifikatoren haben?] (Http://stackoverflow.com/questions/24003918/does-swift-have-access-modifiers) – Sulthan

+0

@Sulthan ich diesen Posten sah becase es hat nichts über "geschützt" gesagt. Dies könnte etwas gewesen sein, das in einer späteren Version von swift hinzugefügt wurde, oder auf eine andere Art und Weise aufgenommen wurde. – iProgram

+0

Eine Gruppe in Xcode hat nichts mit Kompilierung oder mit der Sprache selbst zu tun. Es ist nur eine Möglichkeit, Dateien in Ihrem Projekt logisch zu gruppieren, genau wie Ordner in Ihrem Dateisystem. Wenn Sie die Implementierung trennen möchten, müssen Sie * Module *, dh * Ziele * im Projekt verwenden. Und dann benutze 'internal'. – Sulthan

Antwort

14

würden Sie haben internal dafür zu verwenden, wie Swift ein protected Schlüsselwort nicht bieten (im Gegensatz zu vielen anderen Programmiersprachen). internal ist der einzige Zugriffsmodifikator zwischen fileprivate und public:

Interner Zugang ermöglicht Einheiten innerhalb einer Quelldatei von ihrer Definition von Modul verwendet werden, aber nicht in einer Quelldatei außerhalb dieses Modul. Normalerweise verwenden Sie den internen Zugriff, wenn Sie die interne Struktur einer App oder eines Frameworks definieren.

Es gibt eine blog post, die ein wenig mehr darüber, warum die Sprache Designer wählten nicht bieten protected Schlüsselwort (oder irgendetwas Äquivalent) erklärt. Seiner Einige der Gründe

dass

Es eigentlich keinen wirklichen Schutz nicht bieten kann, da eine Unterklasse immer API durch eine neue öffentliche Methode oder Eigenschaft „geschützt“ belichten.

und auch die Tatsache, dass protected Probleme verursachen würde, wenn es um Erweiterungen kommt, da es nicht klar wäre, ob Erweiterungen auch Zugang zu protected Eigenschaften oder nicht haben sollten. Auch

+0

Danke für die Antwort. Ich wusste, dass es intern war, aber da der gesamte Code in einer Einheit ist, bedeutet dies, dass ich es genauso gut öffentlich haben kann. – iProgram

+0

@iProgram Aber das ist das Problem. Sie haben den gesamten Code in einer Einheit. – Sulthan

+0

Thourght, so sollten Apps sein. Also, wenn man Anwendungen macht, sollte alles in verschiedenen Einheiten sein? Wenn ja, was ist der beste Weg, dies zu tun? Oder ist das für ein anderes Thema? Während ich nicht neu in der Entwicklung bin, bin ich, wenn Sie wissen, was ich meine. – iProgram

0

wenn Swift nicht protected Zugang liefert, noch wir können unter Verwendung fileprivate Zugriffskontrolle ähnlichen Zugang erreichen.
Das Einzige, was müssen wir im Auge behalten, dass wir alle Kinder in derselben Datei deklarieren müssen als Eltern in deklariert.

Animal.swift

import Foundation 

class Animal { 
    fileprivate var protectedVar: Int = 0 
} 

class Dog: Animal { 
    func doSomething() { 
     protectedVar = 1 
    } 
} 

OtherFile. swift

let dog = Dog() 
dog.doSomething() 
+2

Das Problem ist die Oberklasse und die Unterklasse muss in der gleichen Datei sein. Es wäre ein Code-Design-Problem. – DEADBEEF

Verwandte Themen