W celu C danych może być na przykład public
, protected
albo private
. Na przykład:
@interface Foo : NSObject
{
@public
int x;
@protected:
int y;
@private:
int z;
}
-(int) apple;
-(int) pear;
-(int) banana;
@end
W odnośniku Swift nie znalazłem żadnej wzmianki o modyfikatorach dostępu. Czy można ograniczyć widoczność danych w Swift?
access-modifiers
swift
Gergo Erdosi
źródło
źródło
Odpowiedzi:
Począwszy od wersji Swift 3.0.1 , istnieją 4 poziomy dostępu , opisane poniżej, od najwyższego (najmniej restrykcyjnego) do najniższego (najbardziej restrykcyjnego).
1.
open
ipublic
Włącz encję do użycia poza modułem definiującym (docelowym). Zazwyczaj używasz
open
lubpublic
uzyskujesz dostęp przy określaniu publicznego interfejsu do frameworka.Jednak
open
dostęp dotyczy tylko klas i członków klasy i różni się odpublic
dostępu w następujący sposób:public
klasy i członkowie klasy mogą być podklasowane i zastępowane tylko w module definiującym (docelowym).open
klasy i elementy klasy mogą być podklasowane i zastępowane zarówno w module definiującym, jak i poza nim (cel).2)
internal
Umożliwia użycie encji w module definiującym (docelowym). Zwykle używasz
internal
dostępu podczas definiowania wewnętrznej struktury aplikacji lub frameworka.3)
fileprivate
Ogranicza użycie encji do jej pliku źródłowego definiującego. Zwykle używasz
fileprivate
dostępu, aby ukryć szczegóły implementacji określonego elementu funkcjonalności, gdy są one używane w całym pliku.4
private
Ogranicza użycie encji do jej załączonej deklaracji. Zwykle używasz
private
dostępu, aby ukryć szczegóły implementacji określonego elementu funkcjonalności, gdy szczegóły te są używane tylko w ramach jednej deklaracji.źródło
Swift 4 / Swift 5
Jak wspomniano w dokumentacji Swift - Kontrola dostępu , Swift ma 5 kontroli dostępu :
otwarty i publiczny : można uzyskać do niego dostęp z encji ich modułu i encji dowolnego modułu, który importuje moduł definiujący.
wewnętrzne : można uzyskać dostęp tylko z encji ich modułu. Jest to domyślny poziom dostępu.
fileprivate i prywatne mogą być dostępne tylko w ograniczony w ograniczonym zakresie, w którym ich zdefiniowania.
Jaka jest różnica między jawnym a publicznym ?
open jest taki sam jak public we wcześniejszych wersjach Swift, pozwalają one klasom z innych modułów na używanie i dziedziczenie, tj .: można je subklasować z innych modułów. Pozwalają również członkom z innych modułów na ich używanie i zastępowanie. Ta sama logika dotyczy ich modułów.
public zezwala klasom z innych modułów na używanie ich, ale nie na dziedziczenie ich, tj .: nie można ich podklasować z innych modułów. Pozwalają też członkom z innych modułów korzystać z nich, ale NIE mogą ich zastępować. W przypadku modułów mają one tę samą logikę otwartą (pozwalają klasom na ich używanie i dziedziczenie; Pozwalają członkom na ich używanie i zastępowanie).
Jaka jest różnica między plikiem prywatnym a prywatnym ?
fileprivate można uzyskać z całego pliku.
private może być dostępne tylko z ich pojedynczej deklaracji i rozszerzeń tej deklaracji, które znajdują się w tym samym pliku; Na przykład:
Jakie są różnice między Swift 3 a Swift 4 Access Control?
Jak wspomniano w propozycji SE-0169 , jedynym ulepszeniem dodanym do Swift 4 jest to, że zakres prywatnej kontroli dostępu został rozszerzony, aby był dostępny z rozszerzeń tej deklaracji w tym samym pliku; Na przykład:
Dlatego nie ma potrzeby deklarowania
myMessage
jako plikprivate, aby był dostępny w całym pliku.źródło
Kiedy mówi się o stworzeniu „prywatnej metody” w Swift lub ObjC (lub ruby, java lub…), te metody nie są tak naprawdę prywatne. Wokół nich nie ma faktycznej kontroli dostępu. Każdy język, który oferuje choć odrobinę introspekcji, pozwala programistom uzyskać dostęp do tych wartości spoza klasy, jeśli naprawdę tego chcą.
Tak więc tak naprawdę tutaj mówimy o sposobie zdefiniowania publicznego interfejsu, który jedynie przedstawia pożądaną funkcjonalność i „ukrywa” resztę, którą uważamy za „prywatną”.
Mechanizm Swift do deklarowania interfejsów jest
protocol
i można go w tym celu wykorzystać.Pamiętaj, że protokoły są pierwszorzędnymi typami i mogą być używane w dowolnym miejscu. W ten sposób ujawniają tylko własne interfejsy, a nie implementacyjne.
Tak więc, o ile używasz
MyClass
zamiastMyClassImplementation
w typach parametrów itp., Wszystko powinno działać:Istnieją pewne przypadki bezpośredniego przypisania, w których musisz jawnie pisać na maszynie zamiast polegać na Swift, aby wnioskować, ale to nie wydaje się być przełomem:
Używanie protokołów w ten sposób jest semantyczne, dość zwięzłe, i moim zdaniem przypomina bardzo rozszerzenia klas, których używaliśmy do tego celu w ObjC.
źródło
O ile mi wiadomo, nie ma słów kluczowych „public”, „private” ani „protected”. Sugerowałoby to, że wszystko jest publiczne.
Jednak Apple może oczekiwać, że ludzie będą używać „ protokołów ” (zwanych przez resztę świata interfejsami) i fabrycznego wzorca projektowego, aby ukryć szczegóły typu wdrożenia.
W każdym razie jest to dobry wzorzec projektowy; ponieważ pozwala to zmienić hierarchię klas implementacji , zachowując jednocześnie logiczny system typów.
źródło
Korzystając z kombinacji protokołów, zamknięć oraz klas zagnieżdżonych / wewnętrznych, możliwe jest użycie czegoś podobnego do wzoru modułu, aby ukryć informacje w Swift w tej chwili. Nie jest super czysty ani przyjemny w czytaniu, ale działa.
Przykład:
innerVal i mysteriousMath są tutaj ukryte przed użyciem zewnętrznym, a próba wkopania się w obiekt powinna spowodować błąd.
Jestem tylko częścią mojej drogi do czytania dokumentów Swift, więc jeśli jest tu jakaś wada, proszę to wskazać, chciałbym wiedzieć.
źródło
reflect(h)[0].1.value // 19
Począwszy od Xcode 6 beta 4, Swift ma modyfikatory dostępu. Z informacji o wersji:
Domyślna wartość domyślna to
internal
, więc w obrębie celu aplikacji możesz pozostawić modyfikatory dostępu wyłączone, chyba że chcesz być bardziej restrykcyjny. W celu struktury (np. Jeśli osadzasz platformę do udostępniania kodu między aplikacją a rozszerzeniem udostępniania lub widoku Dzisiaj), użyjpublic
do wyznaczenia interfejsu API, który chcesz udostępnić klientom twojej struktury.źródło
Swift 3.0 zapewnia pięć różnych kontroli dostępu:
Domyślne poziomy dostępu
Wszystkie podmioty w twoim kodzie (z kilkoma wyjątkami) mają domyślny poziom dostępu wewnętrznego, jeśli sam nie określisz jawnego poziomu dostępu. W rezultacie w wielu przypadkach nie trzeba określać jawnego poziomu dostępu w kodzie.
Informacja o wersji na ten temat:
Więcej informacji i szczegółów: Swift Programming Language (kontrola dostępu)
źródło
W wersji Beta 6 dokumentacja stwierdza, że istnieją trzy różne modyfikatory dostępu:
Te trzy dotyczą klas, protokołów, funkcji i właściwości.
Aby uzyskać więcej informacji, sprawdź kontrolę dostępu .
źródło
Teraz w wersji beta 4 dodali modyfikatory dostępu do Swift.
z notatek dotyczących aktualizacji Xcode 6 beta 4 :
źródło
Mechanizmy kontroli dostępu wprowadzone w Xcode 6 :
Domyślnie akceptuje go wewnętrznie i jako takie nie musi być określone. Zauważ też, że prywatny specyfikator nie działa na poziomie klasy, ale na poziomie pliku źródłowego. Oznacza to, że aby części klasy były naprawdę prywatne, musisz podzielić je na własny plik. Wprowadza to również kilka interesujących przypadków dotyczących testów jednostkowych ...
Innym stwierdzeniem, które skomentowałem w powyższym linku, jest to, że nie można „uaktualnić” poziomu dostępu. Jeśli podklasujesz coś, możesz to bardziej ograniczyć, ale nie na odwrót.
Ten ostatni bit wpływa również na funkcje, krotki i na pewno inne rzeczy w taki sposób, że jeśli np. Funkcja wykorzystuje klasę prywatną , to nie jest ważne, aby funkcja była wewnętrzna lub publiczna , ponieważ mogą nie mieć dostępu do klasy prywatnej . Powoduje to ostrzeżenie kompilatora i konieczne jest ponowne określenie funkcji jako funkcji prywatnej .
źródło
Swift 3 i 4 przyniosły wiele zmian również dla poziomów dostępu do zmiennych i metod. Swift 3 i 4 mają teraz 4 różne poziomy dostępu, gdzie dostęp otwarty / publiczny jest najwyższym (najmniej restrykcyjnym) poziomem dostępu, a dostęp prywatny jest najniższym (najbardziej restrykcyjnym) poziomem dostępu:
Ciekawy:
Zamiast oznaczać każdą metodę lub członka jako „prywatny”, możesz uwzględnić niektóre metody (np. Zwykle funkcje pomocnicze) w rozszerzeniu klasy / struktury i oznaczyć całe rozszerzenie jako „Prywatne”.
To może być dobry pomysł, aby uzyskać łatwiejszy do utrzymania kod. I możesz łatwo zmienić (np. Do testowania jednostkowego) na nieprywatne, zmieniając tylko jedno słowo.
Dokumentacja Apple
źródło
W przypadku Swift 1-3:
Nie, to niemożliwe. Nie ma żadnych prywatnych / chronionych metod i zmiennych.
Wszystko jest publiczne.
Aktualizacja Od wersji Swift 4 można zobaczyć inne odpowiedzi w tym wątku
źródło
Jedną z opcji, których możesz użyć, jest zawinięcie tworzenia instancji do funkcji i dostarczenie odpowiednich programów pobierających i ustawiających w konstruktorze:
źródło
Gramatyki języka nie ma słowa kluczowe „publiczny”, „prywatny” lub „chronione”. Sugerowałoby to, że wszystko jest publiczne. Oczywiście mogłaby istnieć alternatywna metoda określania modyfikatorów dostępu bez tych słów kluczowych, ale nie mogłem jej znaleźć w odnośniku językowym.
źródło
Mam nadzieję, że zaoszczędzisz trochę czasu tym, którzy chcą czegoś podobnego do chronionych metod:
Podobnie jak w przypadku innych odpowiedzi, swift zapewnia teraz „prywatny” modyfikator - który jest zdefiniowany pod względem plików, a nie pod względem klasy, na przykład w Javie lub C #. Oznacza to, że jeśli chcesz metod chronionych, możesz to zrobić za pomocą szybkich metod prywatnych, jeśli są one w tym samym pliku
np. plik 1:
Plik 2:
}
źródło
https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/AccessControl.html#//apple_ref/doc/uid/TP40014097-CH41-ID3
URUCHAMIANIE SWIFT 2.2;)
Domyślnie wewnętrzny
źródło
do wersji 2.0 istniały tylko trzy poziomy dostępu [publiczny, wewnętrzny, prywatny], ale w swift 3.0 Apple dodało dwa nowe poziomy dostępu, które są [Open, fileType], więc teraz w swift 3.0 jest 5 poziom dostępu Tutaj chcę wyczyścić rolę z tych dwóch poziomów dostępu 1. Otwarty: jest to bardzo podobne do Publicznego, ale jedyna różnica polega na tym, że Publiczny może uzyskać dostęp do podklasy i zastąpić, a Otwarty poziom dostępu nie może uzyskać dostępu do tego, że to zdjęcie pochodzi ze strony internetowej Średni i opisuje różnicę między dostępem otwartym a publicznym
Teraz na drugi nowy poziom dostępu 2. typ pliku jest większą wersją prywatnego lub mniejszym poziomem dostępu niż wewnętrzny FileType może uzyskać dostęp do rozszerzonej części [klasy, struktury, wyliczenia], a prywatny nie może uzyskać dostępu do rozszerzonej części kodu, do którego może uzyskać dostęp tylko zakres leksykalny to zdjęcie pochodzi ze strony Medium i opisuje różnicę między typem pliku a poziomem dostępu prywatnego
źródło