Udostępnij za pośrednictwem


Podstawy języka C# dla Objective-C deweloperów

Platforma Xamarin.iOS umożliwia udostępnianie kodu niezależnego od platformy napisanego w języku C#. Jednak istniejące aplikacje systemu iOS mogą chcieć korzystać z Objective-C kodu, który został już utworzony. Ten artykuł służy jako krótki elementarz dla Objective-C deweloperów, którzy chcą przejść do platformy Xamarin i języka C#.

Aplikacje dla systemów iOS i macOS opracowane w Objective-C programie mogą korzystać z platformy Xamarin, wykorzystując język C# w miejscach, w których kod specyficzny dla platformy nie jest wymagany, co pozwala na używanie takiego kodu na urządzeniach innych niż Apple. Takie elementy jak usługi internetowe, kod JSON i analizowanie XML oraz niestandardowe algorytmy mogą być następnie używane w sposób międzyplatformowy.

Aby korzystać z platformy Xamarin podczas utrzymywania istniejących Objective-C zasobów, można je udostępnić w języku C# w technologii Z platformy Xamarin znanej jako powiązania, które udostępniają Objective-C kod zarządzanym światu języka C#. Ponadto w razie potrzeby kod można również przenosić wiersz po wierszu do języka C#. Niezależnie od podejścia, niezależnie od tego, czy jest to powiązanie, czy przenoszenie, pewna wiedza na temat języka i Objective-C języka C# jest niezbędna do efektywnego wykorzystania istniejącego Objective-C kodu za pomocą platformy Xamarin.iOS.

Objective-C Współdziałania

Obecnie nie ma obsługiwanego mechanizmu tworzenia biblioteki w języku C# przy użyciu platformy Xamarin.iOS, którą można wywołać z Objective-Cprogramu . Głównym powodem tego jest również środowisko uruchomieniowe Mono oprócz powiązania. Jednak nadal można utworzyć większość logiki w pliku , w Objective-Ctym interfejsy użytkownika. W tym celu opakuj Objective-C kod w bibliotece i utwórz powiązanie z nim. Środowisko Xamarin.iOS jest potrzebne do uruchomienia aplikacji (co oznacza, że musi utworzyć Main punkt wejścia). Następnie każda inna logika może znajdować się w Objective-Cpliku uwidoczniona w języku C# za pośrednictwem powiązania (lub za pośrednictwem wywołania P/Invoke). Dzięki temu można zachować logikę Objective-C specyficzną dla platformy i opracować niezależne części platformy w języku C#.

W tym artykule wyróżniono niektóre kluczowe podobieństwa, a także różne różnice w obu językach, które służą jako podstawy podczas przechodzenia do języka C# za pomocą platformy Xamarin.iOS, powiązania z istniejącym Objective-C kodem lub przenoszenia go do języka C#.

Aby uzyskać szczegółowe informacje na temat tworzenia powiązań, zobacz inne dokumenty w temacie Wiązanie Objective-C.

Porównanie języków

Objective-C i C# są bardzo różne języki zarówno syntaktycznie, jak i z punktu widzenia środowiska uruchomieniowego. Objective-C jest językiem dynamicznym i używa schematu przekazywania komunikatów, podczas gdy język C# jest statycznie typizowane. Składnia mądry Objective-C jest podobna do smalltalk, natomiast język C# pochodzi z podstawowej składni języka Java, chociaż w ostatnich latach dojrzał wiele możliwości poza językiem Java.

Powiedział, że istnieje kilka funkcji językowych zarówno i Objective-C C#, które są podobne w funkcji. Podczas tworzenia powiązania z Objective-C kodem z języka C# lub podczas przenoszenia Objective-C do języka C#zrozumienie tych podobieństw jest przydatne.

Protokoły a interfejsy

Oba Objective-C języki i C# są pojedynczymi językami dziedziczenia. Jednak oba języki obsługują implementowanie wielu interfejsów w danej klasie. W Objective-C tych interfejsach logicznych są nazywane protokołami , podczas gdy w języku C# są nazywane interfejsami. Implementacja jest główną różnicą między interfejsem języka C# a protokołem Objective-C jest ta ostatnia może mieć opcjonalne metody. Aby uzyskać więcej informacji, zobacz artykuł Zdarzenia, delegaty i protokoły .

Kategorie a metody rozszerzeń

Objective-C umożliwia dodanie metod do klasy, dla której być może nie masz kodu implementacji przy użyciu kategorii. W języku C# podobna koncepcja jest dostępna za pośrednictwem metod rozszerzeń.

Metody rozszerzenia umożliwiają dodawanie metod statycznych do klasy, gdzie metody statyczne w języku C# są analogiczne do metod klas w programie Objective-C. Na przykład poniższy kod dodaje metodę o nazwie ScrollToBottom do UITextView klasy, która z kolei jest klasą zarządzaną powiązaną Objective-CUITextView z klasą z zestawu UIKit:

public static class UITextViewExtensions
{
    public static void ScrollToBottom (this UITextView textView)
    {
        // code to scroll textView
    }
}

Następnie po utworzeniu wystąpienia obiektu UITextView w kodzie metoda będzie dostępna na liście autouzupełniania, jak pokazano poniżej:

The method available in the autocomplete

Gdy metoda rozszerzenia jest wywoływana, wystąpienie jest przekazywane do argumentu, na przykład w tym przykładzie textView .

Struktury a zestawy

Objective-C pakiety powiązane klasy w katalogach specjalnych nazywanych strukturami. Jednak w językach C# i .NET zestawy są używane do udostępniania bitów wstępnie skompilowanego kodu wielokrotnego użytku. W środowiskach spoza systemu iOS zestawy zawierają kod języka pośredniego (IL), który jest w czasie (JIT) skompilowany w czasie wykonywania. Jednak firma Apple nie zezwala na wykonywanie skompilowanego kodu JIT w aplikacjach systemu iOS wydanych w sklepie App Store. W związku z tym kod języka C# przeznaczony dla systemu iOS z platformą Xamarin jest przed czasem skompilowany (AOT), tworząc pojedynczy plik wykonywalny systemu Unix wraz z plikami metadanych dołączonymi do pakietu aplikacji.

Selektory a nazwane parametry

Objective-C metody z natury obejmują nazwy parametrów w selektorach ze względu na ich charakter. Na przykład selektor, taki jak sprawia, że AddCrayon:WithColor: jasne jest, co każdy parametr oznacza, gdy jest używany w kodzie. Język C# opcjonalnie obsługuje również nazwane argumenty.

Na przykład podobny kod w języku C# używający nazwanych argumentów to:

AddCrayon (crayon: myCrayon, color: UIColor.Blue);

Mimo że język C# dodał tę obsługę w wersji 4.0 języka, w praktyce nie jest on często używany. Jeśli jednak chcesz być jawnie w kodzie, obsługa tego kodu jest dostępna.

Nagłówki i przestrzenie nazw

Będąc nadzbiorem języka C, Objective-C używa nagłówków dla deklaracji publicznych, które są oddzielone od pliku implementacji. Język C# nie używa plików nagłówków. W przeciwieństwie do Objective-Cjęzyka , kod C# jest zawarty w przestrzeniach nazw. Jeśli chcesz dołączyć kod dostępny w niektórych przestrzeniach nazw, należy dodać dyrektywę using na początku pliku implementacji lub zakwalifikować typ z pełną przestrzenią nazw.

Na przykład następujący kod zawiera UIKit przestrzeń nazw, dzięki czemu każda klasa w tej przestrzeni nazw będzie dostępna dla implementacji:

using UIKit;
namespace MyAppNamespace
{
    // implementation of classes
}

Ponadto słowo kluczowe przestrzeni nazw w powyższym kodzie ustawia przestrzeń nazw używaną dla samego pliku implementacji. Jeśli wiele plików implementacji współużytkuje tę samą przestrzeń nazw, nie ma też potrzeby dołączania przestrzeni nazw do dyrektywy using, ponieważ jest to implikowane.

Właściwości

Obie Objective-C metody i C# mają pojęcie właściwości, aby zapewnić abstrakcję wysokiego poziomu wokół metod dostępu. W Objective-C dyrektywie kompilatora @property jest używana do efektywnego generowania metod dostępu. Z kolei język C# obejmuje obsługę właściwości w samym języku. Właściwość języka C# można zaimplementować przy użyciu dłuższego stylu, który uzyskuje dostęp do pola zapasowego lub przy użyciu krótszej składni właściwości automatycznej, jak pokazano w poniższych przykładach:

// automatic property syntax
public string Name { get; set; }

// property implemented with a backing field
string address;
public string Address {
    get {
        // could add additional code here
        return address;
    }
    set {
        address = value;
    }
}

Statyczne słowo kluczowe

Słowo kluczowe statyczne ma bardzo różne znaczenie między Objective-C i C#. W Objective-C funkcjach statycznych służy do ograniczania zakresu funkcji do bieżącego pliku. Jednak w języku C# zakres jest utrzymywany za pomocą publicznych, prywatnych i wewnętrznych słów kluczowych.

Gdy słowo kluczowe statyczne jest stosowane do zmiennej w Objective-Cprogramie , zmienna zachowuje swoją wartość między wywołaniami funkcji.

Język C# ma również statyczne słowo kluczowe. W przypadku zastosowania do metody skutecznie wykonuje to samo, co + modyfikator w programie Objective-C. Mianowicie tworzy metodę klasy. Podobnie, w przypadku zastosowania do innych konstrukcji, takich jak pola, właściwości i zdarzenia, sprawia, że część tego typu są deklarowane, a nie z dowolnym wystąpieniem tego typu. Można również utworzyć klasę statyczną, w której wszystkie metody zdefiniowane w klasie muszą być również statyczne.

NSArray a inicjowanie listy

Objective-C teraz zawiera składnię literału do użycia z elementem NSArray, co ułatwia inicjowanie. Język C# ma jednak bogatszy typ nazywany Listogólnym, co oznacza, że typ, który zawiera lista, może być dostarczany przez kod tworzący listę (na przykład szablony w języku C++). Ponadto listy obsługują składnię automatycznego inicjowania, jak pokazano poniżej:

MyClass object1 = new MyClass ();
MyClass object2 = new MyClass ();
List<MyClass> myList = new List<MyClass>{ object1, object2 };

Bloki a wyrażenia lambda

Objective-C używa bloków do tworzenia zamknięć, w których można utworzyć funkcję wbudowaną, która może korzystać ze stanu, w którym jest ujęta. Język C# ma podobną koncepcję przy użyciu wyrażeń lambda. W języku C# wyrażenia lambda są tworzone za pomocą => operatora , jak pokazano poniżej:

(args) => {
    //  implementation code
};

Aby uzyskać więcej informacji na temat wyrażeń lambda, zobacz Przewodnik programowania w języku C# firmy Microsoft.

Podsumowanie

W tym artykule porównano różne funkcje językowe między Objective-C i C#. W niektórych przypadkach wywołano analogiczne funkcje, które istnieją między obydwoma językami, takimi jak bloki do wyrażeń lambda i kategorie metod rozszerzeń. Ponadto kontrastował on w miejscach, w których języki różnią się, takie jak przestrzenie nazw w języku C# i znaczenie statycznego słowa kluczowego.