Nozioni di base su C# per Objective-C sviluppatori

Xamarin.iOS consente di condividere tra diverse piattaforme il codice indipendente dalla piattaforma scritto in C#. Tuttavia, le applicazioni iOS esistenti potrebbero voler sfruttare il Objective-C codice già creato. Questo articolo funge da breve introduzione per Objective-C gli sviluppatori che vogliono passare a Xamarin e al linguaggio C#.

Le applicazioni iOS e macOS sviluppate in Objective-C possono trarre vantaggio da Xamarin sfruttando C# in posizioni in cui il codice specifico della piattaforma non è necessario, consentendo l'uso di tale codice nei dispositivi non Apple. Elementi come servizi Web, analisi JSON e XML e algoritmi personalizzati possono quindi essere usati indipendentemente dalla piattaforma.

Per sfruttare i vantaggi di Xamarin mantenendo gli asset esistenti Objective-C , il primo può essere esposto a C# in una tecnologia di Xamarin nota come binding, che espongono Objective-C codice al mondo C# gestito. Inoltre, se necessario, è anche possibile eseguire il porting del codice in C# riga per riga. Indipendentemente dall'approccio, tuttavia, sia che si tratti di associazione o conversione, è necessario conoscere sia Objective-C che C# per sfruttare in modo efficace il codice esistente Objective-C con Xamarin.iOS.

Objective-C Interoperabilità

Attualmente non esiste alcun meccanismo supportato per creare una libreria in C# usando Xamarin.iOS che può essere chiamato da Objective-C. Ciò è dovuto principalmente al fatto che, in aggiunta al binding, è anche necessario il runtime di Mono. Tuttavia, è comunque possibile creare la maggior parte della logica in Objective-C, incluse le interfacce utente. A tale scopo, eseguire il wrapping del Objective-C codice in una libreria e crearvi un'associazione. Xamarin.iOS è necessario per eseguire il bootstrap dell'applicazione (ovvero, deve creare il punto di ingresso Main). Successivamente, qualsiasi altra logica può essere in Objective-C, esposta a C# tramite l'associazione (o tramite P/Invoke). In questo modo, è possibile mantenere la logica specifica della piattaforma in Objective-C e sviluppare parti indipendenti dalla piattaforma in C#.

In questo articolo vengono evidenziate alcune analogie chiave, oltre a diverse differenze in entrambi i linguaggi da usare come base per il passaggio a C# con Xamarin.iOS, sia l'associazione al codice esistente Objective-C o la conversione in C#.

Per informazioni dettagliate sulla creazione di associazioni, vedere gli altri documenti in Binding Objective-C.

Confronto dei linguaggi

Objective-C E C# sono linguaggi molto diversi sia sintatticamente che dal punto di vista del runtime. Objective-C è un linguaggio dinamico e usa uno schema di passaggio di messaggi, mentre C# è tipizzato in modo statico. Objective-C La sintassi è simile a Smalltalk, mentre C# deriva gran parte della sintassi fondamentale da Java, anche se è maturata per includere molte funzionalità oltre a Java negli ultimi anni.

Detto questo, esistono diverse funzionalità del linguaggio sia Objective-C C# che sono simili in funzione. Quando si crea un'associazione al Objective-C codice da C# o quando si esegue la Objective-C conversione in C#, è utile comprendere queste analogie.

Protocolli e interfacce

Sia Objective-C che C# sono linguaggi di ereditarietà singola. Tuttavia, entrambi i linguaggi supportano l'implementazione di più interfacce in una determinata classe. In Objective-C queste interfacce logiche vengono chiamati protocolli , mentre in C# sono denominate interfacce. A livello di implementazione, la differenza principale tra un'interfaccia C# e un Objective-C protocollo è che quest'ultima può avere metodi facoltativi. Per altre informazioni, vedere l'articolo relativo a eventi, delegati e protocolli.

Categorie e metodi di estensione

Objective-C consente l'aggiunta di metodi a una classe per la quale potrebbe non essere presente il codice di implementazione usando Categorie. In C# è disponibile un concetto simile, tramite i metodi di estensione.

I metodi di estensione consentono di aggiungere metodi statici a una classe, in cui i metodi statici in C# sono analoghi ai metodi di classe in Objective-C. Ad esempio, il codice seguente aggiunge un metodo denominato ScrollToBottom alla UITextView classe , che a sua volta è una classe gestita associata alla Objective-CUITextView classe da UIKit:

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

Quindi, quando si crea un'istanza di UITextView nel codice, il metodo è disponibile nell'elenco di completamento automatico, come illustrato di seguito:

The method available in the autocomplete

Quando viene chiamato il metodo di estensione, l'istanza viene passata all'argomento, come textView in questo esempio.

Framework e assembly

Objective-C pacchetti classi correlate in directory speciali note come framework. In C# e .NET, invece, vengono usati gli assembly per fornire bit riutilizzabili di codice precompilato. Negli ambienti all'esterno di iOS, gli assembly contengono codice Intermediate Language (IL) compilato in modalità JIT (Just In Time) in fase di esecuzione. Tuttavia, Apple non consente l'esecuzione di codice compilato JIT nelle applicazioni iOS rilasciate nell'App Store. Pertanto, il codice C# per iOS con Xamarin è compilato in modalità AOT (Ahead Of Time), che produce un singolo file eseguibile Unix insieme ai file di metadati inclusi nel pacchetto dell'applicazione.

Selettori e parametri denominati

Objective-C i metodi includono intrinsecamente i nomi dei parametri nei selettori in base alla loro natura. Ad esempio, un selettore come AddCrayon:WithColor: indica in modo chiaro la funzione di ogni parametro usato nel codice. C# supporta facoltativamente anche gli argomenti denominati.

Ad esempio, un codice analogo in C# con argomenti denominati sarebbe il seguente:

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

Sebbene sia stato aggiunto questo supporto nella versione 4.0 del linguaggio C#, in pratica non viene usato molto spesso. Se tuttavia si preferisce adottare un approccio esplicito nel codice, il supporto richiesto a tale scopo è disponibile.

Intestazioni e spazi dei nomi

Essendo un superset di C, Objective-C usa le intestazioni per le dichiarazioni pubbliche separate dal file di implementazione. In C# non vengono usati file di intestazione. A differenza di Objective-C, il codice C# è contenuto negli spazi dei nomi. Se si vuole includere codice disponibile in uno spazio dei nomi, è possibile aggiungere una direttiva using all'inizio del file di implementazione oppure qualificare il tipo con lo spazio dei nomi completo.

Ad esempio, il codice seguente include lo spazio dei nomi UIKit, rendendo disponibili tutte le classi nello spazio dei nomi per l'implementazione:

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

Inoltre, la parola chiave namespace nel codice precedente imposta lo spazio dei nomi usato per il file di implementazione. Se più file di implementazione condividono lo stesso spazio dei nomi, non è necessario includere lo spazio dei nomi in una direttiva using, perché è implicita.

Proprietà

Sia Objective-C che C# hanno il concetto di proprietà per fornire un'astrazione di alto livello intorno ai metodi della funzione di accesso. Nella Objective-C direttiva del @property compilatore viene usato per generare in modo efficace i metodi della funzione di accesso. Al contrario, C# include il supporto per le proprietà all'interno del linguaggio stesso. Una proprietà C# può essere implementata usando un stile più lungo che accede a un campo sottostante oppure tramite una sintassi automatica più breve per le proprietà, come illustrato negli esempi seguenti:

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

Parola chiave static

La parola chiave static ha un significato molto diverso tra Objective-C e C#. Nelle Objective-C funzioni statiche vengono usate per limitare l'ambito di una funzione al file corrente. In C#, tuttavia, l'ambito viene gestito tramite le parole chiave public, private e internal.

Quando la parola chiave static viene applicata a una variabile in Objective-C, la variabile mantiene il valore tra le chiamate di funzione.

Anche C# dispone di una parola chiave static. Quando applicato a un metodo, esegue in modo efficace la stessa operazione eseguita dal + modificatore in Objective-C. In particolare, crea un metodo di classe. Analogamente, se applicato ad altri costrutti come campi, proprietà ed eventi, rende tali elementi parte del tipo in cui vengono dichiarati, anziché di qualsiasi istanza del tipo. È inoltre possibile creare una classe statica, in cui anche tutti i metodi definiti nella classe devono essere statici.

NSArray e inizializzazione elenco

Objective-C include ora la sintassi letterale da usare con NSArray, semplificando l'inizializzazione. C# tuttavia dispone di un tipo più completo denominato List, che è generic, vale a dire che il tipo contenuto nell'elenco può essere fornito dal codice che crea l'elenco, ad esempio i modelli in C++. Inoltre, gli elenchi supportano la sintassi di inizializzazione automatica, come illustrato di seguito:

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

Blocchi e espressioni lambda

Objective-C usa i blocchi per creare le chiusura, in cui è possibile creare una funzione inline che può usare lo stato in cui è racchiuso. In C# è presente un concetto simile tramite l'uso delle espressioni lambda. In C# le espressioni lambda vengono create con l'operatore =>, come illustrato di seguito:

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

Per altre informazioni sulle espressioni lambda, vedere la Guida per programmatori C# di Microsoft.

Riepilogo

In questo articolo sono state contrastate diverse funzionalità del linguaggio tra Objective-C e C#. In alcuni casi, sono state descritte le caratteristiche simili in entrambi i linguaggi, come i blocchi e le espressioni lambda o le categorie e i metodi di estensione. Sono state inoltre illustrate le differenze tra i linguaggi, ad esempio per quanto riguarda gli spazi dei nomi in C# e il significato della parola chiave static.