2017-01-20 26 views
10

Chcę utworzyć klasę, która dziedziczy z innej klasy, która znajduje się w innym pliku.Jak zadeklarować zmienną "chronioną" w swift

Na przykład:

Class1.swift

class Class1 
{ 
    protected var 
    //Do Stuff 
} 

Class2.swift

class Class2:Class1 
{ 
    //Do stuff 
} 

Jak bym beable mieć accsess do a'protected zmiennej/funkcja” w szybkim tempie?

Kiedy deklaruję prywatną zmienną/funkcję, mogę jej używać tylko w tej klasie. Jeśli użyję "fileprivate", moja druga klasa HAS będzie w pliku składowania jako Class1. Chcę zachować moje klasy w plikach zbiorczych i używać grup z poziomu Xcode, aby wiedzieć, do której klasy należy dana kategoria.

+0

Możliwy duplikat [Does Swift mają modyfikatory dostępu?] (http://stackoverflow.com/questions/24003918/does-swift-have-access-modifiers) – Sulthan

+0

@Sulthan widziałem to stanowisko becase nic nie mówiło o "chronionym". Mogło to być coś, co zostało dodane w późniejszej wersji szybkiej, lub może być inaczej przyjęte. – iProgram

+0

Grupa w Xcode nie ma nic wspólnego z kompilacją ani z samym językiem. Jest to po prostu sposób logicznego grupowania plików w projekcie, tak jak foldery w systemie plików. Jeśli chcesz oddzielić implementację, będziesz musiał użyć * modułów *, czyli * celów * w projekcie. A następnie użyj 'internal'. – Sulthan

Odpowiedz

14

Do tego celu należy użyć internal, ponieważ Swift nie oferuje słowa kluczowego protected (w przeciwieństwie do wielu innych języków programowania). internal jest tylko modyfikator dostępu między fileprivate i public:

dostęp wewnętrzna podmioty do wykorzystania w dowolnym pliku źródłowym z ich modułu definiującego, ale nie w każdym pliku źródłowym poza tym module . Zwykle używasz dostępu wewnętrznego podczas definiowania struktury wewnętrznej aplikacji lub jej struktury.

Jest blog post że wyjaśnia nieco więcej o tym, dlaczego projektanci język nie zdecydował się zaoferować protected słowa kluczowego (lub czegokolwiek odpowiednik).

Niektóre z powodów będących że

To faktycznie nie oferują żadnej realnej ochrony, ponieważ podklasa może zawsze expose „chronione” przez API nowej metody publicznego lub mienia.

a także fakt, że protected będzie powodować problemy, jeśli chodzi o rozszerzeniach, gdyż nie byłoby jasne, czy rozszerzenia powinny mieć również dostęp do protected właściwości lub nie.

+0

Dzięki za odpowiedź. Wiedziałem, że jest wewnętrzna, jednak ponieważ cały kod jest w jednej jednostce, oznacza to, że równie dobrze mogę go mieć jako publiczny. – iProgram

+0

@iProgram Ale to jest problem. Masz cały kod w jednej jednostce. – Sulthan

+0

Thourght to sposób, w jaki aplikacje mają być. Czy przy tworzeniu aplikacji nic nie powinno znajdować się w różnych jednostkach? Jeśli tak, jaki jest najlepszy sposób robienia tego? Czy to na inny temat? Chociaż nie jestem nowy w rozwoju, jestem, jeśli wiesz, co mam na myśli. – iProgram

0

Nawet jeśli Swift nie zapewnia dostępu do protected, nadal możemy uzyskać dostęp pod numerem za pomocą dostępu przy użyciu kontroli dostępu fileprivate.
Jedyną rzeczą, musimy pamiętać, że musimy zadeklarować wszystkie dzieci w tym samym pliku jako rodzic zadeklarowane.

Animal.swift

import Foundation 

class Animal { 
    fileprivate var protectedVar: Int = 0 
} 

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

innyplik.Swift

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

Problem jest nadklasą, a podklasa musi znajdować się w tym samym pliku. Byłby to problem projektowania kodu. – DEADBEEF