Úvod do C# pro Objective-C vývojáře

Xamarin.iOS umožňuje sdílení kódu nezávislého na platformě v jazyce C# napříč platformami. Stávající aplikace pro iOS však mohou chtít využít Objective-C kód, který už byl vytvořen. Tento článek slouží jako krátký úvod pro vývojáře, Objective-C kteří chtějí přejít do Xamarinu a jazyka C#.

Aplikace pro iOS a macOS vyvinuté v Objective-C Xamarinu můžou využívat C# na místech, kde se nevyžaduje kód specifický pro platformu, což umožňuje použití tohoto kódu na zařízeních jiných než Apple. Věci, jako jsou webové služby, analýza JSON a XML a vlastní algoritmy, se pak dají používat napříč platformami.

Aby bylo možné využít Xamarin při zachování stávajících Objective-C prostředků, může být bývalý jazyk C# zpřístupněn v technologii Xamarinu označované jako vazby, které se označují jako vazby, které se dají směrovat Objective-C do spravovaného světa jazyka C#. V případě potřeby je také možné kód přenést řádek po řádku do jazyka C#. Bez ohledu na přístup je však nutné efektivně využívat stávající Objective-C kód s Xamarin.iOS bez ohledu na to, jestli se jedná o vazbu nebo portování, některé znalosti Objective-C jazyka C# iOS.

Objective-C Interop

V současné době neexistuje žádný podporovaný mechanismus pro vytvoření knihovny v jazyce C# pomocí Xamarin.iOS, který lze volat z Objective-C. Hlavním důvodem je také modul runtime Mono, který je navíc k vazbě. Většinu logiky ale můžete vytvořit i v Objective-Cuživatelských rozhraních. Uděláte to tak, že kód zabalíte Objective-C do knihovny a vytvoříte s ním vazbu. K spuštění aplikace je potřeba Xamarin.iOS (což znamená, že musí vytvořit Main vstupní bod). Potom může být jakákoli jiná logika v Objective-Cjazyce C# prostřednictvím vazby (nebo prostřednictvím volání nespravovaného kódu). Tímto způsobem můžete zachovat logiku Objective-C specifickou pro platformu a vyvíjet nezávislé části platformy v jazyce C#.

Tento článek popisuje některé klíčové podobnosti, stejně jako rozdíly mezi několika rozdíly v obou jazycích, které slouží jako primer při přechodu na C# pomocí Xamarin.iOS, ať už vazby na existující Objective-C kód, nebo portování do jazyka C#.

Podrobnosti o vytváření vazeb naleznete v dalších dokumentech v vazbě Objective-C.

Porovnání jazyka

Objective-C jazyk C# jsou syntakticky i z hlediska modulu runtime velmi odlišné jazyky. Objective-C je dynamický jazyk a používá schéma předávání zpráv, zatímco jazyk C# je staticky napsaný. Syntaxe Objective-C je podobná Smalltalku, zatímco jazyk C# odvozuje většinu své základní syntaxe z Javy, i když v posledních letech zralý tak, aby zahrnoval mnoho funkcí mimo Javu.

To znamená, že existuje několik jazykových funkcí jazyka i Objective-C jazyka C#, které jsou podobné funkci. Při vytváření vazby na Objective-C kód z jazyka C# nebo při přenosu Objective-C do jazyka C# je užitečné porozumět těmto podobnostem.

Protokoly vs. rozhraní

Jazyk Objective-C C# jsou jazyky s jednou dědičností. Oba jazyky však podporují implementaci více rozhraní v dané třídě. V Objective-C těchto logických rozhraních se nazývají protokoly , zatímco v jazyce C# se nazývají rozhraní. Implementace je hlavní rozdíl mezi rozhraním jazyka C# a Objective-C protokolem, který může mít volitelné metody. Další informace najdete v článku Události, delegáti a protokoly .

Kategorie versus metody rozšíření

Objective-C umožňuje přidat metody do třídy, pro kterou pravděpodobně nemáte implementační kód používající Kategorie. V jazyce C# je podobný koncept dostupný prostřednictvím metod rozšíření.

Rozšiřující metody umožňují přidat statické metody do třídy, kde statické metody v jazyce C# jsou podobné metodám třídy v Objective-C. Například následující kód přidá metodu pojmenovanou ScrollToBottom do UITextView třídy, která je zase spravovanou třídou, která je svázaná s Objective-CUITextView třídou z UIKitu:

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

Když se pak v kódu vytvoří instance objektu UITextView , metoda bude k dispozici v seznamu automatického dokončování, jak je znázorněno níže:

The method available in the autocomplete

Pokud je metoda rozšíření volána instance je předána argumentu, například v tomto příkladu textView .

Architektury vs. sestavení

Objective-C balíčky související třídy ve speciálních adresářích, které se označují jako architektury. V jazyce C# a .NET se však sestavení používají k poskytování opakovaně použitelných bitů předkompilovaného kódu. V prostředích mimo iOS sestavení obsahují kód zprostředkujícího jazyka (IL), který je za běhu zkompilován za běhu (JIT). Apple však neumožňuje spouštění kompilovaného kódu JIT v aplikacích pro iOS vydaných v App Storu. Proto je kód jazyka C# určený pro iOS s Xamarinem předem zkompilován (AOT), který vytváří jeden spustitelný soubor unixu spolu se soubory metadat, které jsou součástí sady aplikací.

Selektory vs. pojmenované parametry

Objective-C metody ze své podstaty zahrnují názvy parametrů do selektorů jejich podstatou. Například selektor, například AddCrayon:WithColor: vymaže, co každý parametr znamená při použití v kódu. Jazyk C# volitelně podporuje také pojmenované argumenty.

Například podobný kód v jazyce C# pomocí pojmenovaných argumentů by byl:

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

I když jazyk C# přidal tuto podporu ve verzi 4.0 jazyka, v praxi se nepoužívá příliš často. Pokud ale chcete být ve svém kódu explicitní, podpora pro něj existuje.

Hlavičky a obory názvů

Jako nadmnožina jazyka C Objective-C používá hlavičky pro veřejné deklarace, které jsou oddělené od souboru implementace. Jazyk C# nepoužívá soubory hlaviček. Na rozdíl od Objective-Ckódu jazyka C# je obsažen v oborech názvů. Pokud chcete zahrnout kód dostupný v některých oborech názvů, přidejte buď direktivu using do horní části souboru implementace, nebo kvalifikujete typ s úplným oborem názvů.

Například následující kód obsahuje UIKit obor názvů, který zpřístupňuje každou třídu v tomto oboru názvů implementaci:

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

Klíčové slovo oboru názvů ve výše uvedeném kódu také nastaví obor názvů použitý pro samotný implementační soubor. Pokud více implementačních souborů sdílí stejný obor názvů, není nutné zahrnout obor názvů do direktivy using, jak je odvozeno.

Vlastnosti

Jazyk Objective-C C# má koncept vlastností, který poskytuje abstrakci vysoké úrovně kolem metod příslušenství. V Objective-C direktivě kompilátoru @property se používá k efektivnímu generování přístupových metod. Jazyk C# naproti tomu zahrnuje podporu vlastností v samotném jazyce. Vlastnost jazyka C# je možné implementovat buď pomocí delšího stylu, který přistupuje k záložnímu poli, nebo pomocí kratší, automatické syntaxe vlastností, jak je znázorněno v následujících příkladech:

// 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;
    }
}

Statické klíčové slovo

Statické klíčové slovo má mezi jazykem C# velmi odlišný významObjective-C. Ve Objective-C statických funkcích se používá k omezení rozsahu funkce na aktuální soubor. V jazyce C# se ale obor udržuje prostřednictvím veřejných, privátních a interních klíčových slov.

Pokud je statické klíčové slovo použito na proměnnou v Objective-C, proměnná udržuje jeho hodnotu napříč voláními funkce.

Jazyk C# má také statické klíčové slovo. Při použití na metodu, účinně dělá totéž, co + modifikátor dělá v Objective-C. Konkrétně vytvoří metodu třídy. Podobně platí, že pokud se použije u jiných konstruktorů, jako jsou pole, vlastnosti a události, vytvoří tyto části typu, které jsou deklarovány v rámci, nikoli u jakékoli instance tohoto typu. Můžete také vytvořit statickou třídu, ve které musí být všechny metody definované ve třídě také statické.

NSArray vs. Inicializace seznamu

Objective-C nyní obsahuje literální syntaxi pro použití s NSArray, což usnadňuje inicializaci. Jazyk C# má ale bohatší typ označovaný jako Listobecný, což znamená, že typ blokování seznamu může poskytnout kód, který seznam vytvoří (například šablony v jazyce C++). Seznamy navíc podporují syntaxi automatické inicializace, jak je znázorněno níže:

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

Bloky vs. výrazy lambda

Objective-C používá bloky k vytvoření uzavření, kde můžete vytvořit funkci vloženou, která může využívat stav, ve kterém je uzavřena. Jazyk C# má podobný koncept prostřednictvím výrazů lambda. Ve výrazech lambda jazyka C# se vytvoří => operátor, jak je znázorněno níže:

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

Další informace o výrazech lambda najdete v Průvodci programováním v jazyce C# od Microsoftu.

Shrnutí

V tomto článku byla mezi jazykem a jazykem C# kontrastována Objective-C celá řada jazykových funkcí. V některých případech se označuje jako podobné funkce, které existují mezi oběma jazyky, jako jsou bloky výrazů lambda a kategorie rozšiřujících metod. Kromě toho kontrastovala místa, kde se jazyky rozbíhají, například s obory názvů v jazyce C# a význam statického klíčového slova.