Articles

budowanie struktur Swift 4 i włączanie ich do aplikacji (Xcode 9)

Posted by admin

porozmawiajmy o strukturach Swift 4, jednej z metod pakowania, ponownego wykorzystywania i udostępniania kodu. Zbudujemy własny framework, a następnie włączymy go do naszej aplikacji. Mogliśmy mówić o bibliotekach statycznych, ale frameworki oferują bardziej zaawansowane funkcje-i pozwolą nam rozszerzyć opcje konserwacji kodu w przyszłych dyskusjach. (Jeśli chcesz prowadzić dyskusję o bibliotece statycznej i dynamicznej, przeczytaj ten doskonały artykuł, ale nie będziemy tutaj omawiać tego tematu.) Od Apple (mój nacisk dodany):

framework to hierarchiczny katalog, który zawiera w jednym pakiecie zasoby współdzielone, takie jak dynamiczna biblioteka współdzielona, pliki nib, Pliki Obrazów, zlokalizowane ciągi znaków, pliki nagłówków i dokumentację referencyjną. Wiele aplikacji może używać wszystkich tych zasobów jednocześnie. System ładuje je do pamięci w razie potrzeby i w miarę możliwości udostępnia jedną kopię zasobu wszystkim aplikacjom.

framework jest również pakietem, a jego zawartość można uzyskać za pomocą Usług Core Foundation Bundle lub klasy Cocoa Nsbundle. Jednak w przeciwieństwie do większości pakietów, Pakiet framework nie pojawia się w Finderze jako nieprzezroczysty plik. Pakiet framework jest standardowym katalogiem, którym użytkownik może się poruszać. Ułatwia to programistom przeglądanie zawartości frameworka i przeglądanie dołączonej dokumentacji oraz plików nagłówkowych.

frameworki służą temu samemu celowi, co statyczne i dynamiczne biblioteki współdzielone, to znaczy dostarczają bibliotekę funkcji, które mogą być wywoływane przez aplikację w celu wykonania określonego zadania. Na przykład, zestaw aplikacji i frameworki Foundation dostarczają programowych interfejsów dla klas i metod Cocoa. Frameworki oferują następujące zalety w porównaniu ze statycznymi bibliotekami i innymi typami dynamicznych bibliotek współdzielonych:

  • Framework group powiązane, ale oddzielne, zasoby razem. Ta grupa ułatwia instalowanie, odinstalowywanie i lokalizowanie tych zasobów.
  • frameworki mogą zawierać szerszą gamę typów zasobów niż biblioteki. Na przykład framework może zawierać odpowiednie pliki nagłówkowe i dokumentację.
  • wiele wersji frameworka może być zawartych w tym samym pakiecie. Umożliwia to kompatybilność wsteczną ze starszymi programami.
  • tylko jedna kopia zasobów frameworka tylko do odczytu znajduje się fizycznie w pamięci w danym momencie, niezależnie od tego, ile procesów korzysta z tych zasobów. Takie udostępnianie zasobów zmniejsza ilość pamięci w systemie i pomaga poprawić wydajność. …

oprócz korzystania z frameworków systemowych, możesz tworzyć własne frameworki i używać ich prywatnie do własnych aplikacji lub udostępniać je publicznie innym programistom. Prywatne frameworki są odpowiednie dla modułów kodu, których chcesz używać we własnych aplikacjach, ale nie chcesz, aby inni programiści używali. Frameworki publiczne są przeznaczone do użytku przez innych programistów i zazwyczaj zawierają nagłówki i dokumentację definiującą publiczny interfejs frameworka.

używasz już frameworków

jako Programiści iOS wszyscy w dużej mierze polegamy na wbudowanych frameworkach Apple. Czy możesz sobie wyobrazić, że musisz kodować UIButton lub coś znacznie bardziej złożonego, jak UITableViewController za każdym razem, gdy tworzysz aplikację? Gdy tworzysz nowy projekt na iOS przy użyciu szablonu Xcode Single View App, automatycznie uzyskujesz dostęp do ram, takich jak UIKiti Foundation. Bez tych frameworków nie mielibyśmy UIButton ani UITableViewController — nie mielibyśmy nawet podstawowych typów danych, takich jak Int, Doublelub Decimal. Nie będziesz w stanie zbudować aplikacji.

wiem, że jestem pedantyczny, ale ilu z nas tak naprawdę poświęca czas na dzielenie i podbijanie własnego kodu? Niektórzy z was korzystali z pracy innych ludzi, włączając w to kod innych firm, używając menedżerów zależności, takich jak Carthage lub CocoaPods. A co z budowaniem własnych bibliotek, agregowaniem i dzieleniem kodu z dobrze zdefiniowanymi funkcjami, dzięki czemu można wygodnie używać własnego kodu?

wcześniej mówiliśmy o poprawie jakości życia programistów, obniżeniu stresu związanego z pracą i zwiększeniu jakości oprogramowania. Pamiętasz jak? Uczyniliśmy to, ćwicząc kilka technik zarządzania złożonością kodu, zwiększając możliwość ponownego użycia kodu i zwiększając łatwość konserwacji dzięki programowaniu zorientowanemu na protokół, dziedziczeniu klas, polimorfizmowi i generykom. Budowanie własnych frameworków i włączanie ich do naszych aplikacji to kolejna technika, którą dodamy do naszego arsenału.

jak budować frameworki

zacznijmy i zbudujmy Swift 4 framework.

Tworzenie projektu base framework
aby utworzyć Swift framework, użyj Xcode 9, aby rozpocząć nowy projekt oparty na szablonie Cocoa Touch Framework, nadaj produktowi nazwę („SwiftFramework”), upewnij się, że język projektu jest Swift, wybierz lokalizację projektu i zapisz nowy projekt. Obejrzyj tutaj:


wideo: Tworzenie projektu Swift 4 Framework w Xcode 9

dostosowywanie ścieżek projektu framework
Nie lubię, gdy Xcode rozkłada zasoby mojego projektu na mój dysk twardy. Chcę, aby wszystko było przechowywane w katalogu projektu. Łatwiej jest mi znaleźć takie rzeczy, jak mój produkt końcowy (aplikacja lub framework) lub katalog „DerivedData”. (Niektórzy z Was wiedzą, że usunięcie katalogu „DerivedData” i pozwolenie Xcode na jego odtworzenie może rozwiązać wiele problemów.) Aby dostosować ścieżki projektu, przejdź do menu Xcode File, a następnie wybierz Project Settings..., jak pokazano w następnym filmie:


wideo: dostosowywanie katalogów projektu Xcode 9

Oto moja struktura projektu po dostosowaniu katalogów:

zauważ, że zbudowałem wersję debugowania frameworka skierowaną na symulator iPhone ’ a. Proszę, zrób to samo.

#ad

pisanie kodu-uczynienie twojego frameworka użytecznym
w tym momencie mamy tylko projekt, który zbuduje framework, który nic nie zrobi. Dodajmy trochę kodu. Otwórz projekt „SwiftFramework” w Xcode, kliknij prawym przyciskiem myszy wirtualną grupę „SwiftFramework” w „Nawigatorze projektu”, wybierz „nowy plik…” z menu kontekstowego, wybierz szablon „plik Swift”, kliknij „Dalej” Nazwij nowy plik ” Frameworkode.swift, „upewnij się, że” SwiftFramework „jest zaznaczone w obszarze” cele”, określ lokalizację i kliknij przycisk” Utwórz”. Oto obrazkowe podsumowanie:

co? Kontrola dostępu?
dodam klasę, z której mogą korzystać konsumenci mojego frameworka-czy mogą? Spójrz na tę klasę uważnie:

co by się stało, gdybym zbudował projekt „SwiftFramework”, włączył pakiet framework do aplikacji, a następnie spróbował utworzyć instancję klasy ” FrameworkClass?”Cóż … nic! Nawet bym nie zobaczył ” FrameworkClass.”Dlaczego?!?

od Apple (mój nacisk dodany):

Kontrola dostępu ogranicza dostęp do części kodu z kodu w innych plikach źródłowych i modułach. Ta funkcja umożliwia ukrycie szczegółów implementacji kodu i określenie preferowanego interfejsu, za pomocą którego można uzyskać dostęp do tego kodu i z niego korzystać.

można przypisać określone poziomy dostępu do poszczególnych typów (klas, struktur i wyliczeń), a także do właściwości, metod, inicjalizatorów i indeksów podrzędnych należących do tych typów. …

oprócz oferowania różnych poziomów Kontroli dostępu, Swift zmniejsza potrzebę określania wyraźnych poziomów Kontroli dostępu, zapewniając domyślne poziomy dostępu dla typowych scenariuszy. W rzeczywistości, jeśli piszesz aplikację z jednym celem, może nie być konieczne określanie jawnych poziomów Kontroli dostępu w ogóle. …

zauważ, że nie udekorowałem swojej klasy ani żadnej z jej metod jawnymi modyfikatorami kontroli dostępu. Więc mam domyślne, co nie jest to, czego potrzebowałem(mój nacisk dodany):

… wszystkie encje w Twoim kodzie … mają Domyślny poziom dostępu wewnętrzny, jeśli sam nie określisz poziomu dostępu jawnego. W rezultacie w wielu przypadkach nie trzeba określać jawnego poziomu dostępu w kodzie. …

wiesz jakiego poziomu dostępu potrzebuję? Pomyśl o tym … Oh, oto jest:

… publiczny dostęp umożliwia używanie encji w dowolnym pliku źródłowym z ich modułu definiującego, a także w pliku źródłowym z innego modułu, który importuje moduł definiujący. Zazwyczaj używa się dostępu otwartego lub publicznego przy określaniu interfejsu publicznego dla struktury. …

oto moja klasa „FrameworkClass” z odpowiednią kontrolą dostępu:

Zbuduj framework
zbudujmy instancję mojego „SwiftFramework.”Pamiętaj, aby zbudować wersję debugowania frameworka skierowaną na symulator iPhone’ a. Generalnie zawsze zaczynam rozwój od Active Scheme zestawu dla Build Configuration Debug, kierując się na symulowane urządzenie. Zostaw komentarz, jeśli nie rozumiesz, dlaczego zaczynam rozwój z taką konfiguracją.

tak więc nowo zbudowany framework będzie znajdował się w tym katalogu:

Path The Framework bundle

Shell

1
~/Documents / Code / SwiftFramework / Build / Products / Debug-iphonesimulator

Jak korzystać z frameworków

Tworzenie aplikacji klienckiej frameworku
stwórzmy aplikację, która korzysta z mojego niestandardowego frameworku Swift, „SwiftFramework.”Użyj Xcode 9, aby rozpocząć nowy projekt oparty na szablonie Single View App, nadaj produktowi nazwę („FrameworkConsumerApp”), upewnij się, że język projektu jest szybki, wybierz lokalizację projektu i zapisz nowy projekt.

włączając framework w aplikacji klienckiej
możesz liczyć na frameworki takie jak UIKit i Foundation zainstalowane na iPhone ’ ach/iPadach. Podczas tworzenia, odwoływać się do nich z aplikacji. Gdy aplikacja działa na urządzeniu fizycznym, wywołuje odpowiednie struktury systemowe już zainstalowane na urządzeniach. Twoje niestandardowe struktury oczywiście nie istnieją na urządzeniach Apple. (OK, Tak, Tak, Tak … znajdziesz jakieś .pliki dylib w pakiecie aplikacji … wszystko poza zakresem tego artykułu.) Nie można zakładać, że Niestandardowy framework istnieje na urządzeniach Apple.

jedyną prostą metodą, jaką znalazłem, aby włączyć niestandardowe frameworki do własnej aplikacji, jest:

  • skopiuj pakiet niestandardowych RAM do struktury katalogów projektu aplikacji; i
  • Dodaj niestandardowe ramy do Xcode > > General > Embedded Binaries.

wiem, że to działa-na symulatorach i urządzeniach. Jeśli przejrzę mój pakiet aplikacji, widzę, że mój Niestandardowy framework jest tam zawarty w całości. Istnieje alternatywna metoda: przeciągnięcie pliku projektu Xcode niestandardowego frameworka z Findera do Nawigatora projektu aplikacji konsumenckiej, tworząc w ten sposób odniesienie do projektu frameworka. Uważam, że ta praktyka jest zbyt brudna. Trzymam moje projekty Xcode oddzielnie i pracowałem nad bardzo złożonymi projektami OS X i iOS i opracowywałem oprogramowanie przez 30 lat.

zróbmy to.

Utwórz podkatalog dla frameworka
Utwórz podkatalog wewnątrz struktury projektu aplikacji „FrameworkConsumerApp” w ten sposób:

ścieżka do folderu, który właśnie stworzyliśmy jest:

Shell

1
~/Documents / Code / FrameworkConsumerApp / FrameworkConsumerApp / Framework

Zbuduj framework
Zbuduj wersję debug framework skierowaną na symulator iPhone ’ a.

skopiuj framework do struktury projektu aplikacji konsumenckiej
skopiuj „SwiftFramework.framework „dołącz do podkatalogu „Framework” struktury folderów projektu aplikacji konsumenckiej, jak pokazano tutaj:


skopiuj Swift 4 Framework Bundle do docelowej aplikacji

uruchamianie aplikacji z wbudowanym niestandardowym frameworkiem

nadal musimy wykonać kilka dodatkowych kroków konfiguracji frameworku dla konsumentów, ale chcę pokazać kod frameworku Swift, który będzie działał w aplikacji konsumenckiej, „FrameworkConsumerApp.”Ten kod zostanie zapisany w” ViewController.swift:”

uruchamianie kodu frameworka z aplikacji klienckiej

Swift

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

Importuj UIKit
// Importuj framework Swift 4
Importuj SwiftFramework
class ViewController: UIViewController
{
override func viewDidLoad()
{
super.viewDidLoad()
// wykonaj dowolną dodatkową konfigurację po załadowaniu widoku, zazwyczaj z stalówki.
// Tworzenie instancji klasy framework.
let frameworkClass = FrameworkClass()
// wywołanie metody klasy framework.
_ = dodaj (lewy: 8, prawy: 8)
// „8 + 8 = 16” zostanie zapisany do konsoli.
}

umieść framework w aplikacji konsumenckiej
Dodaj własny framework do Xcode > (target) > General > Embedded Binaries. Skonfiguruj Active Scheme dla Build Configuration z Debug i celuj w symulowane urządzenie. Wreszcie, import Niestandardowy framework, tworzy instancję klasy framework, wywołuje metodę klasy, kliknij „Uruchom” i oglądaj wyjście konsoli, wszystko jak pokazano tutaj:


wideo: Umieść Swift 4 Framework w aplikacji i użyj kodu Framework

dokonując zmian w niestandardowym frameworku

prawdopodobnie myślisz: „za każdym razem, gdy wprowadzę jakiekolwiek zmiany w niestandardowym frameworku, będę musiał skopiować nowo zbudowany „SwiftFramework.framework ” pakiet do aplikacji konsumenckiej… a co jeśli chcę wdrożyć aplikację wraz z frameworkiem na urządzeniu?”

# ad

nie martw się. To tam Xcode przychodzi na ratunek. Wszystko, co muszę zrobić, to przejść do celu mojego projektu „SwiftFramework”, przejść do Build Phases i wybrać opcję” nowa faza kopiowania plików”. Zapamiętaj ścieżkę do folderu, w którym „FrameworkConsumerApp” przechowuje „SwiftFramework.ramy?”Oto przypomnienie:

Shell

1
~/Documents / Code / FrameworkConsumerApp / FrameworkConsumerApp / Framework

dokonajmy zmiany w kodzie „SwiftFramework” :

teraz kliknijmy ten przycisk ” + „i wybierzmy” new Copy Files Phase”, aby skopiować ” SwiftFramework.framework „bundle to the” FrameworkConsumerApp „folder we called” Framework.”Więc za każdym razem, gdy przebudowujemy produkt ramowy,” FrameworkConsumerApp ” zostaje zaktualizowany. Oto kroki:


wideo: Automatyczne aktualizowanie Swift Framework Consumer

uruchamianie aplikacji z wbudowanym niestandardowym frameworkiem na urządzeniu

czy to wszystko działa na urządzeniu fizycznym? Tak! Oto kroki, których użyłem w Xcode, aby uzyskać „FrameworkConsumerApp” z ” SwiftFramework.framework „osadzony, działający na iPhonie 6 z zainstalowanym systemem iOS 10.3.2:

dla projektu” SwiftFramework ”

  • Ustaw Target > Build Settings > iOS Deployment Target = „iOS 10.3 „
  • Set Active Scheme to target a Generic iOS Device
  • Rebuilted

przełączanie urządzenia docelowego nie koliduje z fazą kopiowania plików.”Xcode automatycznie wykrył nowy katalog wyjściowy produktu i skopiował nowy” SwiftFramework.framework „do folderu” Framework „w strukturze katalogu projektu „FrameworkConsumerApp”.

dla projektu „FrameworkConsumerApp”

  • zestaw Target > Build Settings > iOS Deployment Target = „iOS 10.3 „
  • dołączono mój iPhone 6 do mojego Maca
  • Ustaw Active Scheme na cel
  • klikając Uruchom

aplikacja pojawiła się na moim iPhonie 6, a” LEFT:8 + RIGHT:8 = SUM:16 ” pojawiła się w konsoli Xcode. Aby być wybrednym, następnie podłączyłem prosty interfejs użytkownika w projekcie” FrameworkConsumerApp”, zainstalowałem aplikację / produkt na moim iPhonie 6 i mogę teraz uruchomić aplikację, niezależnie od jakiegokolwiek połączenia z komputerem Mac i uruchomić aplikację tyle razy, ile chcę:

epilog

frameworki Swift będą szczególnie przydatne na OS X, ponieważ wiele aplikacji będzie mogło je ładować i używać jednocześnie. Pamiętaj, że musisz rozpowszechniać te struktury z aplikacjami OS X, jeśli rozpowszechniasz je publicznie. Korzyści płynące z frameworków Swift dla iOS będą wynikać z ponownego użycia własnego gotowego kodu i/lub dystrybucji funkcji innym programistom poza sklepem App Store, bez ujawniania tajemnic kodowania. Ponieważ aplikacje na iOS są tak szczelnie zamknięte w piaskownicy, możesz połączyć swoje niestandardowe struktury z każdą z aplikacji.

na przyszłość: cele
frameworki mogą być bardzo wydajne i przenośne. Mógłbym napisać framework dla jakiegoś super-zastrzeżonego algorytmu, który mógłby być używany zarówno w OS X, jak i iOS — o ile używam celów do określenia Build Settings (Architectures, Base SDK, Supported Platforms, Valid Architectures) dla każdego przypadku produktu ramowego odpowiedniego dla każdej aplikacji konsumenckiej. Cele i wsparcie wieloplatformowe wykraczają poza zakres dzisiejszej dyskusji, ale omówimy je w przyszłych postach. Nie przejmuj się tym tematem teraz.

Teaser: ilu z was wie co robię z tym #if DEBUG stwierdzeniem? Wskazówka :nazywa się to ” blok kompilacji warunkowej.”

przede wszystkim — smacznego!

#ad

autor: Andrew Jaffee

zapalony i dobrze opublikowany autor, inżynier oprogramowania, projektant i programista, obecnie specjalizujący się w tworzeniu aplikacji mobilnych iOS w Objective-C i Swift, ale z silnym doświadczeniem w C#, C++,. Net, JavaScript, HTML, CSS, jQuery, SQL Server, MySQL, Oracle, Agile, Test Driven Development, Git, Continuous Integration, Responsive Web Design, bla, bla, bla… Czy przegapiłem jakieś fad-based catch frazy? Mój mózgowy avatar został udostępniony przez http://icons8.com na licencji Creative Commons Uznanie autorstwa-Bez utworów zależnych 3.0 Unported.Zobacz wszystkie posty, których autorem jest Andrew Jaffee

Related Post