Przewodnik krok po kroku, jak przekonwertować pełną aplikację Objective-C na Swift

Opublikowany: 2018-03-14

Od czasu wydania w 2014 roku język programowania Apple Swift przeszedł fenomenalny wzrost. Język programowania zdołał znaleźć się w czołówce Top 10 języków programowania , dzieląc pozycję ze swoim poprzednikiem, Objective-C. Ale wojna Swift kontra cel-C nigdy nie słabnie.

Wraz z tym wzrostem popularności i ekscytującymi funkcjami, wielu programistów aplikacji na iOS, którzy wcześniej pracowali z Obj-C, przeszło na język programowania Swift. W rzeczywistości, w ramach walki o Swift lub Objective-C na iOS, różne aplikacje na iOS, takie jak LinkedIn, Yahoo Weather, Hipmunk i Lyft, zostały już uaktualnione z Objective-C do Swift, podczas gdy wiele osób planuje przekonwertować aplikację Objective-C do szybkiego.

CZYNNIKI CZYNIĄCE SWIFT JEST LEPSZĄ OPCJA

Osobiście widziałem ewolucję Swift od czasu premiery jego pierwszej wersji i mogę powiedzieć, że między Swift a C, Swift zastępuje Objective-C w oparciu o takie czynniki, jak

Otwarte źródło

Swift jest językiem o otwartym kodzie źródłowym, a szybki kod można przenosić na znacznie więcej platform niż kiedykolwiek wcześniej Objective-C.

Prędkość

Programowanie Swift dla systemu iOS to język statyczny, który współpracuje z kompilatorem LLVM i może ponownie wykorzystać istniejący kod, wyeliminować nieużywane zasoby, zarządzać funkcjami wbudowanymi i tak dalej. Poza tym jego działanie opiera się na jednym z najszybszych arytmetyków obliczeniowych algorytmów C++, co z kolei dowodzi jego przewagi konkurencyjnej nad swoim poprzednikiem.

Zgodnie z tym, co twierdzi Apple i czego doświadczyłem, algorytm wyszukiwania Swift jest 2,6 razy szybszy niż Objective-C.

Czytelność

W przeciwieństwie do celu C, Swift nie jest powiązany z podstawami C. Umożliwia programistom iOS usuwanie zagnieżdżonych wywołań metod, pomijanie średnika na końcu wiersza, unikanie umieszczania @ na początku słowa kluczowego, łączenie ciągów znaków za pomocą znaku „+” i tak dalej. Ponadto klasa Swift nie jest podzielona na części, interfejs i implementację. To skróciło długość kodu do prawie połowy, czyniąc go bardziej czytelnym.

Na przykład, gdy aplikacja Lyft została przepisana od podstaw w języku Swift, kod aplikacji zmniejszył się z 75 000 do 25 000 wierszy. Te imponujące liczby ograniczają wysiłki programistów bez wpływu na wydajność aplikacji po stronie klienta.

Kodowanie interaktywne

Dzięki funkcji Playgrounds programiści mogą napisać fragment kodu lub algorytmu, jednocześnie zbierając informacje zwrotne w fazie rozwoju. Ponieważ kod Swift jest pisany przy użyciu wizualizacji danych, sprawia to, że proces tworzenia aplikacji jest łatwiejszy i przystępniejszy.

Bezpieczeństwo

Swift to bezpieczniejszy i bezpieczniejszy język do tworzenia aplikacji zgodnie z obecnymi trendami rynkowymi. Jego składnia i konstrukcja językowa wykluczyły typy błędów często obserwowanych podczas kodowania w języku Objective-C. Oznacza to, że są mniejsze szanse na awarię aplikacji i przypadki problematycznego zachowania.

W przeciwieństwie do Objective-C, kod napisany w Swift można skompilować, a błędy można naprawić, wraz z częścią pisania kodu. Dlatego Swift działa lepiej i szybciej w procesie testowania w porównaniu z procesem testowania kodu Objective-C.

Utrzymanie

Ponieważ Swift nie jest zależny od C, tak jak jego poprzednik, konserwacja w przypadku tworzenia aplikacji Swift jest znacznie łatwiejsza. Coś, co sprawiło, że Swift stał się przyszłością tworzenia aplikacji na iOS .

W przypadku budowania aplikacji na iOS przy użyciu Objective-C, programiści mieli utrzymywać dwa różne pliki kodu, aby skrócić czas budowania i zwiększyć wydajność kodu. Jednak Swift porzucił ten dwuplikowy mechanizm, scalając nagłówek Objective-C (.h) i pliki implementacyjne (.m) w jeden plik (.swift). Kompilator LLVM automatycznie wykrywa zależności podczas odczytywania pliku Swift, co jest wielką zaletą dla twórców aplikacji iOS.

Poza wymienionymi wyżej czynnikami, wartą wspomnienia korzyścią z wyboru Swift w porównaniu z innymi językami programowania Apple jest jego kompatybilność z Objective-C. Apple zaoferowało twórcom aplikacji możliwość używania obu języków w tym samym projekcie. Jest to pomocne nie tylko w przypadku tworzenia aplikacji na iOS przy użyciu Swift od podstaw, ale także w uaktualnianiu istniejącej aplikacji do Swift przy użyciu kodu Objective-C.

Chociaż jesteś już zaznajomiony z filozoficznymi różnicami między dwoma językami programowania aplikacji na iOS, przejdźmy do różnic podczas praktycznej implementacji.

SWIFT VS CEL-C: GŁÓWNE RÓŻNICE MIĘDZY TYTANAMI ROZWOJU IOS

Dzięki mojemu doświadczeniu ze złożonym kodem Objective-C i kodem Swift, natkniesz się na kilka aktualizacji istniejących koncepcji wraz z wprowadzeniem do różnych nowych elementów, które przyspieszają proces tworzenia aplikacji. Bez ceregieli spójrzmy na wszystko, co znajdziesz w wojnie Swift kontra cel c.

Opcjonalne

Kiedy mówimy o wydajności swift vs Objective-C, możemy wywołać metody na obiektach zerowych, aby uzyskać zerową wartość w Obj-C. Musimy ręcznie wykonać testy zerowe, aby zrozumieć niezdefiniowane zachowanie w przypadku nieoczekiwanej wartości zerowej. Jednak ten problem można rozwiązać za pomocą opcjonalnego, nowej koncepcji wprowadzonej w kodzie Swift. Opcjonalny umożliwia funkcjom, które mogą nie być w stanie zwrócić znaczącej wartości, zwrócenie wartości zawartej w postaci opcjonalnej lub zerowej.

Składnia deklarowania typu opcjonalnego to:

Wyliczenie publiczne Opcjonalne<Wrapped> :_Reflectable, NilLiteralConvertible

Praktycznie może mieć wartość typu Wrapped lub wartość nieistniejącą.

Swift renderuje cukier składniowy do deklarowania typów jako opcjonalnych, więc możemy zastąpić Optional<String> z String?

Istnieją przede wszystkim dwa sposoby uzyskania opakowanej wartości z opcjonalnego kontenera:

Opcjonalne łączenie łańcuchowe: używane w przypadku, gdy instrukcja warunkowa if-let otrzyma wartość tylko wtedy, gdy istnieje.
Wymuszone zawijanie: używane, gdy opcjonalna zadeklarowana zmienna jest różna od zera. Jeśli wartość istnieje, zapewni dane wyjściowe bez warunków implementacji. Ale w innym przypadku ulegnie awarii.
Możemy również znaleźć niejawnie rozpakowane opcje w języku Swift, zadeklarowane jako String!

Na przykład:

Klasa XKlasa

{

var aCiąg: Ciąg

var bString: Ciąg!

var cString: Ciąg?

Init (ciąg: ciąg)

{

aCiąg = ciąg

}

}

Tutaj,

String nigdy nie może być zerem. Bardzo ważne jest, aby ta zmienna miała wartość podczas inicjalizacji obiektu, w przeciwnym razie program doprowadzi do awarii.
B Ciąg może być zerowy. Jeśli jednak spróbujesz uzyskać dostęp do obiektu nil, program ulegnie awarii.
Ciąg C może być zerowy i powinien być traktowany jako zwykła zmienna opcjonalna.
Rozszerzenia
Rozszerzenia i kategorie znalezione w Obj-C są skonsolidowane w jedną całość, rozszerzenia w języku Swift. Rozszerzenia dodają nową funkcjonalność do już istniejącej klasy, wyliczenia, struktury lub protokołu, a najlepsze jest to, że nie musisz mieć dostępu do oryginalnego kodu źródłowego, aby rozszerzyć typy.

Krotki
Oprócz Opcjonalnych, innym nowym typem danych wprowadzonym w nowym języku programistycznym firmy Apple są Tuples. Krotki (w miejscu typu danych zdefiniowanego przez użytkownika) są zasadniczo uważane za grupowanie wielu wartości w jedną grupę związków. Jest to właściwy element do rozważenia, jeśli uważasz, że tworzenie modelu w miejscu może być przesadą, a słownik nie jest wystarczająco przyjazny dla czytelnika. Aby dowiedzieć się więcej krotek, odwiedź ten blog .

Generyki
Generics to jedna z najbardziej uderzających cech języka programowania Swift, aw rzeczywistości większość standardowych bibliotek Swift jest tworzonych za pomocą kodu Swift. Kod Generic pozwala programistom pisać elastyczne, wielokrotnego użytku funkcje i typy, które mogą pracować z różnymi zestawami typów, zgodnie ze zdefiniowanymi wymaganiami. Minimalizuje to ryzyko duplikacji i zwiększa czytelność kodu dzięki jasnemu, abstrakcyjnemu podejściu.

Zgodnie z moim doświadczeniem, Generics jest początkowo trudny do zdobycia, podobnie jak rekursje. Ale kiedy zdobędziesz go w swoje ręce, będziesz mógł rozwinąć zupełnie nowy świat rozwiązywania męczących problemów logicznych.

Wyliczenie
W kodzie celu C wyliczenia są ograniczone do typów pierwotnych. Aby mapować wartości wyliczenia liczb całkowitych na ciągi do wyświetlania danych wyjściowych, musisz wprowadzić tablicę lub zwrócić się w kierunku struktury sterującej przełącznikiem. Jednak nie musisz przechodzić przez te problemy z językiem programowania aplikacji Swift na iOS.

Swift oferuje zróżnicowane nowe wyliczenia z większą liczbą opcji. Wyliczenia Swift mogą mieć skojarzone wartości, a wielkość liter w wyliczeniu Swift może zawierać wstępnie zdefiniowany zestaw pól. W rzeczywistości wyliczenia Swift mogą być rekurencyjne i mogą przechowywać wartości surowe.

Na przykład:
kody

Subskrypcje
Indeksy dolne mogą być postrzegane jako medium umożliwiające dostęp do informacji z sekwencji, kolekcji lub listy w klasach, wyliczeniach i strukturach bez użycia metody. Można rozważyć użycie indeksów dolnych do ustawiania i pobierania wartości według indeksu bez tworzenia oddzielnych metod przechowywania i pobierania. Na przykład możesz uzyskać dostęp do elementów w instancji Array jako someArray[index], a do elementów w instancji Dictionary jako someDictionary[key].

Składnia deklarowania indeksu dolnego jest następująca:

indeks dolny (indeks: Int) -> Int {

dostwać {

//do deklarowania wartości indeksu dolnego

}

zestaw (nowaWartość) {

//do definiowania wartości

}

}

Wnioskowanie o typie

Swift zaproponował także bezpieczeństwo typów dla rozwoju aplikacji na iOS, zgodnie z którymi zmienna po zadeklarowaniu z określonym typem, jej typ będzie statyczny i niezmienny. Kompilator określi (lub wywnioskuje), jakiego typu będzie twoja zmienna na podstawie wartości, które przypiszesz.

Na przykład:

kod 1
Tutaj kompilator pokaże błąd, gdy spróbujesz zainicjować z wartościami liczbowymi do zmiennej str2 (patrz poniżej)

kod 03

Funkcje
Składnia funkcji w języku programowania Swift jest bardziej elastyczna w definiowaniu niż w złożonym stylu kodu celu-C. W Swift każda funkcja ma typ, który składa się z typów parametrów funkcji i typu zwracanego, co oznacza, że ​​możesz przypisać funkcje do zmiennej lub przekazać ją jako wartość do innych funkcji (jak pokazano w poniższym przykładzie):

obraz kodu

Oprócz tego Swift pozwalał także twórcom aplikacji na definiowanie domyślnych wartości parametrów funkcjonalnych.

Obsługa błędów
Swift oferuje zupełnie nowe podejście do rzucania, przechwytywania, rozpowszechniania i manipulowania błędami, które można naprawić w czasie wykonywania. Aby zapoznać się z obsługą błędów w Swift, odwiedź blog.

Oprócz tego różne koncepcje, które sprawiają, że tworzenie aplikacji Swift jest korzystne dla tworzenia aplikacji Objective-C, to:

Modele
W przypadku języka Swift modele są raczej strukturami niż klasami.

Protokoły
W pierwszym z filmów Apple WWDC, Swift został wprowadzony jako „język zorientowany na protokół”. Protokół można zdefiniować jako schemat metod, właściwości i innych jednostek, które pasują do konkretnego zadania/funkcji. Mogą być objęte klasą, wyliczeniem lub strukturą, aby ułatwić rzeczywistą implementację tych wymagań i są znacznie bardziej wydajne w porównaniu z Obj C z funkcjami zapewniania domyślnych implementacji, włączania generyków itp.

Jako programista aplikacji na iOS wolę utworzyć protokół przed zdefiniowaniem klasy jako najbardziej efektywnej praktyki, aby wykorzystać zalety zaawansowanego języka programowania Apple.

Podejście do programowania funkcjonalnego
Swift umożliwia programistom korzystanie z bardziej funkcjonalnych podejść do rozwiązywania przyziemnych problemów niż korzystanie z tradycyjnych pętli lub typów odwołań. W tym przypadku perspektywą jest analiza problemu pod kątem tego, jakie jest rozwiązanie, zamiast określania, jak uzyskać rozwiązanie, jak to się robi w tradycyjnym podejściu.

Z mojego doświadczenia z obydwoma językami iOS zauważyłem, że to, co robiliśmy za pomocą iteracji wykorzystujących pętle for w Objective-C, można wykonać przy użyciu koncepcji filtrowania, mapowania i zmniejszania w Swift. Aby uzyskać szczegółowe informacje na temat tych funkcji wyższego rzędu w programowaniu funkcjonalnym, zapoznaj się z blogiem.

PRZEWODNIK KROK PO KROKU, JAK PRZEKSZTAŁCIĆ PEŁNĄ APLIKACJĘ OBJECTIVE-C NA SWIFT

Obecnie istnieją różne narzędzia do konwersji aplikacji z Objective-C na Swift line-by-line. Jednak radzę nie używać żadnego. Chociaż oba języki iOS są interoperacyjne, ich paradygmaty programowe są różne. Bezpośrednia migracja aplikacji z Obj-C do Swift niesie ze sobą większe ryzyko użycia niewłaściwych paradygmatów. Pozwólcie, że omówię to.

Swift, w przeciwieństwie do swojego poprzednika, jest pod wpływem paradygmatu programowania funkcjonalnego, co sprawia, że ​​w dużym stopniu opiera się na niezmienności. Na przykład, jeśli mówisz o tablicach i słownikach – te podstawowe modele są używane jako typ referencyjny w Objective-C, ale są typem wartości w Swift, a zatem są niezmienne. Oznacza to, że podświadomie przekonwertowanie kodu Obj-C na Swift przy użyciu dowolnego narzędzia spowoduje, że napotkasz wiele błędów, które są trudne do debugowania. Poza tym Swift ma mnóstwo nowych funkcji (jak już opisano powyżej), które sprawiają, że algorytmy/podejścia są bardziej wydajne i działają szybko! W rzeczywistości jest to główny powód, dla którego Apple zaprezentował nowy język, zamiast uaktualniać Obj-C. Biorąc pod uwagę wszystkie te punkty, gorąco polecam wszystkim napisanie nowej aplikacji w Swift od zera, zamiast konwersji wiersz po wierszu z Obj-C do Swift.

Jeśli jednak chcesz przekonwertować pełną aplikację Objective-C na Swift, jednym z narzędzi, z którego możesz skorzystać, jest Swiftify. Narzędzie ułatwia proces uaktualniania kodu Obj-C do nowego języka programowania Apple jednym kliknięciem; oszczędność tysięcy godzin pracy. Funkcja interoperacyjności umożliwia bezproblemową integrację przekonwertowanego kodu iOS z powrotem do Objective-C, co oznacza, że ​​możesz zbadać niezliczone opcje oferowane przez Swift, a następnie zintegrować go z powrotem z projektem Obj-C bez przepisywania wszystkiego na raz.

Przygotuj istniejący kod aplikacji do konwersji
Zawsze lepiej zacząć od najnowszego kodu Obj-C. Dzieje się tak, ponieważ Xcode korzysta z nowoczesnego konwertera Objective-C, który może pomóc w:

1. Zmiana id na typ instancji, gdy tylko jest to możliwe
2. Zastosowanie poprawnych makr wyliczenia
3. Aktualizacja do nowszej składni @property

Chociaż konwerter wspomaga mechanikę analizowania i stosowania potencjalnych zmian, nie przedstawia semantyki kodu. Dlatego zaleca się, aby wszyscy twórcy aplikacji na iOS przejrzeli wszystko ręcznie raz, a następnie potwierdzili zmiany.

Aby użyć konwertera, wybierz Edycja -> Refaktoryzacja -> Zmień na składnię Modern Objective-C.

Proces migracji kodu Objective-C do Swift
Najbardziej efektywnym podejściem do konwersji pełnej aplikacji Objective-C na Swift jest, na początek, jedna klasa na raz, zwłaszcza klasa bez żadnej podklasy, ponieważ nie można podklasować klas Swift w Obj-C.

Zastąp pliki .m i .h związane z klasą jednym plikiem .swift. Dzięki temu wszystko, od interfejsu po implementację, automatycznie trafi do pliku Swift. Poza tym nie musisz tworzyć pliku nagłówkowego, ponieważ Xcode automatycznie generuje nagłówek, jeśli jest to wymagane.

Projektowanie pliku nagłówka pomostowego
Po dodaniu pierwszego pliku .swift pojawi się monit podobny do pokazanego poniżej.

szybki kod12

Kliknij opcję „ Utwórz nagłówek mostka ”.

Przewodnik krok po kroku

1. Wybierz parę plików .h i .m, które chcesz przekonwertować na Swift. Jeśli chcesz przekonwertować cały projekt, zostaw klasę AppDelegate na później.
2. Wyszukaj #import „MyViewController.h” w całym kodzie i usuń go z pliku nagłówka mostu Objective-C ([MyProject]-Bridging-Header.h).
3. Zamień wystąpienia #import „[nazwa pliku].h” na #import „[MójProjekt]-Swift.h” we wszystkich plikach .m i umieść @class [nazwa pliku] zamiast #import „[nazwa pliku].h” w wszystkie pliki .h.
4. Przekształć część plików Obj-C na Swift. Można to łatwo zrobić za pomocą rozszerzenia Finder „Swiftify for Xcode”. W przeciwnym razie skopiuj zawartość plików .m i .h do .swift i użyj opcji „Konwertuj plik na Swift” dostępnej w rozszerzeniu Swiftify Xcode.
5. Zastąp pliki .h i .m przekonwertowanymi plikami .swift w projekcie.
6. Skompiluj projekt i napraw błędy konwersji. Chociaż wiele problemów można łatwo rozwiązać za pomocą sugestii automatycznej naprawy Xcode, możesz również polegać na Swiftify, aby zgłaszać i naprawiać błędy pojawiające się kilka razy w projekcie.
7. Po zakończeniu skompiluj i uruchom projekt. Jeśli pojawi się problem „Nie znaleziono klasy”, po którym następuje awaria, znajdź wszystkie odniesienia do niego w edytorze scenorysów. Wprowadź ponownie nazwę klasy w Inspektorze tożsamości, zapisz i spróbuj ponownie.
8. Jeśli konwertujesz cały projekt, możesz teraz przekształcić klasę AppDelegate. W tym momencie wszystkie inne pliki zostały przekonwertowane na Swift, więc jeśli w miejscu docelowym nie ma żadnych plików Obj-C, możesz łatwo usunąć plik main.m i .pch (prekompilowany nagłówek).

Którą praktykę wolisz – stworzyć nową aplikację na iOS w Swift od podstaw czy w pełni przekonwertować Objective-C na Swift? Podziel się swoimi opiniami w sekcji komentarzy poniżej.