Bawię się nowym językiem programowania Swift firmy Apple i mam pewne problemy ...
Obecnie próbuję odczytać plik plist, w Objective-C zrobiłbym następujące, aby uzyskać zawartość jako NSDictionary:
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Config" ofType:@"plist"];
NSDictionary *dict = [[NSDictionary alloc] initWithContentsOfFile:filePath];
Jak uzyskać listę w słowniku Swift?
Zakładam, że mogę uzyskać ścieżkę do plist za pomocą:
let path = NSBundle.mainBundle().pathForResource("Config", ofType: "plist")
Kiedy to działa (jeśli jest poprawne?): Jak uzyskać treść jako słownik?
Także bardziej ogólne pytanie:
Czy można używać domyślnych klas NS * ? Tak mi się wydaje ... czy coś mi brakuje? O ile wiem domyślne klasy NS * frameworka są nadal prawidłowe i czy można ich używać?
Odpowiedzi:
W szybkim 3.0 Czytanie z Plist.
Czytaj więcej JAK KORZYSTAĆ Z LISTY NIERUCHOMOŚCI (.PLIST) W SWIFT .
źródło
Nadal możesz używać NSDictionaries w Swift:
Dla Swift 4
Dla Swift 3+
I starsze wersje Swift
Klasy NSClass są nadal dostępne i doskonale nadają się do użycia w Swift. Myślę, że prawdopodobnie będą chcieli wkrótce skupić się na szybkim, ale obecnie szybkie interfejsy API nie mają wszystkich funkcji podstawowych NSClasses.
źródło
mainBundle()
to, że jest właśniemain
w Swift 3NSArray/NSDictionary
do odczytu danych listy nieruchomości.PropertyListSerialization
(aw Swift 4 alternatywnieCodable
protokół) jest odpowiednim API. Zapewnia nowoczesną obsługę błędów, a dane można konwertować bezpośrednio na rodzime typy kolekcji Swift.Oto, co robię, jeśli chcę przekonwertować plik .plist na słownik Swift:
Edytowane dla Swift 2.0:
Edytowane dla Swift 3.0:
źródło
NSArray/NSDictionary
do odczytu danych listy nieruchomości.PropertyListSerialization
(aw Swift 4 alternatywnieCodable
protokół) jest odpowiednim API. Zapewnia nowoczesną obsługę błędów, a dane można konwertować bezpośrednio na rodzime typy kolekcji Swift.Swift 4.0
Możesz teraz użyć protokołu dekodowania, aby zdekodować plik .plist do niestandardowej struktury. Przejdę do podstawowego przykładu, dla bardziej skomplikowanych struktur .plist, które polecam przeczytać na Decodable / Encodable (dobry zasób jest tutaj: https://benscheirman.com/2017/06/swift-json/ ).
Najpierw skonfiguruj swoją strukturę do formatu pliku .plist. W tym przykładzie rozważę .plist ze słownikiem na poziomie katalogu głównego i 3 wpisy: 1 Ciąg z kluczem „nazwa”, 1 Int z kluczem „wiek” i 1 Boolean z kluczem „pojedynczy”. Oto struktura:
Wystarczająco proste. Teraz fajna część. Za pomocą klasy PropertyListDecoder możemy łatwo parsować plik .plist w instancji tej struktury:
Niewiele więcej kodu do zmartwienia, a wszystko to w Swift. Jeszcze lepiej, mamy teraz instancję struktury Config, z której możemy łatwo korzystać:
Wyświetla wartość „nazwa”, „wiek” i „pojedyncze” klucze w .plist.
źródło
Bundle.main.url(forResource: "Config", withExtension: "plist")
pozbyćURL(fileURLWithPath
? A ponieważ plik musi istnieć (w czasie projektowania / kompilacji), wszystkie wartości można wymusić rozpakowaniu. Kod nie może ulec awarii, jeśli wszystko jest poprawnie zaprojektowane.url(forResource: "Config", withExtension: "plist")
Właśnie porównywałem to, co OP zrobił w swoim kodzie. Jeśli chodzi o wymuszanie rozpakowywania wszystkiego, staram się zachować ostrożność. Myślę, że to podstawowe pytanie dla Swift w ogóle. Wolę wiedzieć dokładnie, co zrobi mój kod w każdej sytuacji niż awaria.decoder.decode([Config].self, from: data)
. (Zwróć uwagę na nawiasyTa odpowiedź używa obiektów rodzimych Swift zamiast NSDictionary.
Swift 3.0
źródło
Pracowałem z Swift 3.0 i chciałem udzielić odpowiedzi na temat zaktualizowanej składni. Dodatkowo, a może co ważniejsze, używam obiektu PropertyListSerialization do ciężkiego podnoszenia, który jest o wiele bardziej elastyczny niż tylko używanie NSDictionary, ponieważ pozwala on na macierz jako typ główny plist.
Poniżej znajduje się zrzut ekranu z używanej listy. Jest to trochę skomplikowane, aby pokazać dostępną moc, ale będzie to działać dla każdej dopuszczalnej kombinacji typów plist.
Jak widać, używam słowników Array of String: String do przechowywania listy nazw witryn i odpowiadających im adresów URL.
Korzystam z obiektu PropertyListSerialization , jak wspomniano powyżej, aby wykonać dla mnie ciężkie podnoszenie. Ponadto Swift 3.0 stał się bardziej „Swifty”, więc wszystkie nazwy obiektów straciły prefiks „NS”.
Po uruchomieniu powyższego kodu
plist
będzie on typuArray<AnyObject>
, ale wiemy, jaki to naprawdę jest typ, więc możemy rzutować go na poprawny typ:A teraz możemy uzyskać dostęp do różnych właściwości naszego Array of String: String Dictionaries w naturalny sposób. Mam nadzieję, że przekonwertuję je na rzeczywiste struktury lub klasy o silnym typie;)
źródło
Najlepiej jest używać rodzimych słowników i tablic, ponieważ zostały one zoptymalizowane do szybkiego użycia. Biorąc to pod uwagę, możesz szybko używać klas NS ... i myślę, że taka sytuacja to uzasadnia. Oto jak to zaimplementujesz:
Jak dotąd (moim zdaniem) jest to najłatwiejszy i najskuteczniejszy sposób dostępu do listy odtwarzania, ale w przyszłości spodziewam się, że Apple doda więcej funkcji (takich jak użycie listy odtwarzania) do rodzimych słowników.
źródło
Swift - Odczytywanie / zapisywanie listy i pliku tekstowego ....
źródło
Swift 2.0: Dostęp do Info.Plist
Mam słownik o nazwie CoachMarksDictionary z wartością logiczną w Info.Plist. Chcę uzyskać dostęp do wartości bool i sprawić, by była prawdziwa.
Writing To Plist:
Z niestandardowego listy: - (Utwórz z pliku-nowy-plik-zasób-lista właściwości. Dodano trzy ciągi nazwane: DashBoard_New, DashBoard_Draft, DashBoard_Completed)
Metodę można nazwać jako
źródło
Przekształcony w rozszerzenie wygody dzięki odpowiedzi Nicka:
stosowanie:
Byłbym skłonny się założyć, że to również zadziała, aby stworzyć podobne rozszerzenie dla tablic
źródło
mogę to zrobić w 1 linii
źródło
Możesz przeczytać plist w języku SWIFT w następujący sposób:
Czytaj wartość pojedynczego słownika:
Jeśli chcesz uzyskać pełny słownik wielowymiarowy w Plist:
Oto lista:
źródło
Ponieważ ta odpowiedź nie jest tu jeszcze, po prostu chciałem podkreślić, można również użyć właściwości infoDictionary aby uzyskać informacje plist jako słownika
Bundle.main.infoDictionary
.Chociaż coś takiego
Bundle.main.object(forInfoDictionaryKey: kCFBundleNameKey as String)
może być szybsze, jeśli interesuje Cię tylko konkretny element na liście informacji.źródło
w moim przypadku tworzę
NSDictionary
wywołanieappSettings
i dodam wszystkie potrzebne klucze. W tym przypadku rozwiązaniem jest:źródło
objectForInfoDictionaryKey
było dokładnie tym, czego szukałem.Możesz z tego skorzystać, tworzę proste rozszerzenie słownika w github https://github.com/DaRkD0G/LoadExtension
I możesz użyć tego do obciążenia
źródło
Oto nieco krótsza wersja, oparta na odpowiedzi @connor
źródło
Swift 3.0
Moim zdaniem najłatwiej to zrobić.
źródło
Stworzyłem prosty
Dictionary
inicjalizator, który zastępujeNSDictionary(contentsOfFile: path)
. Po prostu usuńNS
.Możesz go używać w następujący sposób:
źródło
Parsowana lista Swift 4.0 iOS 11.2.6 i kod do parsowania, na podstawie https://stackoverflow.com/users/3647770/ashok-r odpowiedzi powyżej.
źródło
Krok 1 : Prosty i najszybszy sposób na parsowanie plist w szybkim 3+
Krok 2: Jak używać:
źródło
Oto rozwiązanie, które znalazłem:
Ustawiam typ
test
naAnyObject
uciszyć ostrzeżenie o nieoczekiwanym wnioskowania, które mogą wystąpić.Ponadto należy to zrobić metodą klasową.
Aby uzyskać dostęp i zapisać określoną wartość znanego typu:
źródło
Używam szybkich słowników, ale konwertuję je do iz NSDictionaries w mojej klasie menedżera plików w następujący sposób:
To wydaje się najmniej kłopotliwy sposób na czytanie i pisanie, ale resztę mojego kodu pozostań tak szybko, jak to możliwe.
źródło
Plist to proste wyliczenie Swift, które stworzyłem do pracy z listami właściwości.
Więcej przykładów:
Plist.swift
Sam Plist jest dość prosty, oto jego lista na wypadek, gdybyś odniósł się bezpośrednio.
źródło
Swift 3.0
jeśli chcesz przeczytać „2-dimensional Array” z .plist, możesz spróbować w następujący sposób:
źródło
Prosta struktura dostępu do pliku plist (Swift 2.0)
Stosowanie:
źródło