Primer C# pour Objective-C les développeurs

Xamarin.iOS permet de partager entre les plateformes du code écrit en C# indépendant de la plateforme. Toutefois, les applications iOS existantes peuvent vouloir tirer parti du Objective-C code qui a déjà été créé. Cet article sert de brève introduction pour Objective-C les développeurs qui cherchent à passer à Xamarin et au langage C#.

Les applications iOS et macOS développées dans peuvent tirer parti de Xamarin en Objective-C tirant parti de C# dans les endroits où le code spécifique à la plateforme n’est pas requis, ce qui permet d’utiliser ce code sur des appareils non Apple. Les éléments tels que les services web, l’analyse JSON et XML, ainsi que les algorithmes personnalisés, peuvent ensuite être utilisés à travers les différentes plateformes.

Pour tirer parti de Xamarin tout en conservant des ressources existantes Objective-C , les premières peuvent être exposées à C# dans une technologie de Xamarin appelée liaisons, qui expose Objective-C le code au monde C# managé. Le cas échéant, le code peut également être transféré ligne par ligne vers C#. Quelle que soit l’approche, qu’il s’agisse de liaison ou de portage, une certaine connaissance des deux Objective-C et de C# est nécessaire pour tirer efficacement parti du code existant Objective-C avec Xamarin.iOS.

Objective-C Interop

Il n’existe actuellement aucun mécanisme pris en charge pour créer une bibliothèque en C# à l’aide de Xamarin.iOS qui peut être appelée à partir de Objective-C. Cela est principalement dû au fait que le runtime Mono est également nécessaire en plus de la liaison. Toutefois, vous pouvez toujours créer la majorité de votre logique dans , y compris les Objective-Cinterfaces utilisateur. Pour ce faire, encapsulez le Objective-C code dans une bibliothèque et créez une liaison avec celle-ci. Xamarin.iOS est nécessaire pour démarrer l’application (il doit créer le point d’entrée Main). Après cela, toute autre logique peut être dans Objective-C, exposée à C# via la liaison (ou via P/Invoke). De cette façon, vous pouvez conserver la logique spécifique de la plateforme dans Objective-C et développer les parties indépendantes de la plateforme en C#.

Cet article met en évidence certaines similitudes clés, ainsi que plusieurs différences dans les deux langages pour servir d’introduction lors du passage en C# avec Xamarin.iOS, qu’il s’agisse de la liaison au code existant Objective-C ou du portage vers C#.

Pour plus d’informations sur la création de liaisons, consultez les autres documents dans Liaison Objective-C.

Comparaison des langages

Objective-C et C# sont des langages très différents tant du point de vue syntaxique que du point de vue du runtime. Objective-C est un langage dynamique et utilise un schéma de transmission de message, tandis que C# est typé statiquement. En ce qui concerne la syntaxe, Objective-C c’est comme Smalltalk, tandis que C# dérive une grande partie de sa syntaxe fondamentale de Java, bien qu’il ait évolué pour inclure de nombreuses fonctionnalités au-delà de Java au cours des dernières années.

Cela dit, il existe plusieurs fonctionnalités de langage des deux Objective-C et C# qui sont similaires en fonction. Lors de la création d’une liaison au code à Objective-C partir de C# ou lors du Objective-C portage vers C#, il est utile de comprendre ces similitudes.

Protocoles et interfaces

Les deux Objective-C et C# sont des langages d’héritage unique. Toutefois, les deux langages prennent en charge l’implémentation d’interfaces multiples dans une classe donnée. Dans Objective-C ces interfaces logiques sont appelées protocoles alors qu’en C#, elles sont appelées interfaces. Du point de vue de l’implémentation, la main différence entre une interface C# et un Objective-C protocole est que ce dernier peut avoir des méthodes facultatives. Pour plus d’informations, consultez l’article Événements, délégués et protocoles.

Catégories et méthodes d’extension

Objective-C permet d’ajouter des méthodes à une classe pour laquelle vous n’avez peut-être pas le code d’implémentation à l’aide de Catégories. En C#, un concept similaire est disponible à travers ce que l'on appelle des méthodes d’extension.

Les méthodes d’extension vous permettent d’ajouter des méthodes statiques à une classe, où les méthodes statiques en C# sont analogues aux méthodes de classe dans Objective-C. Par exemple, le code suivant ajoute une méthode nommée ScrollToBottom à la UITextView classe, qui à son tour est une classe managée liée à la Objective-CUITextView classe à partir d’UIKit :

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

Ainsi, quand une instance d’un argument UITextView sera créée dans le code, la méthode sera disponible dans la liste de saisie semi-automatique, comme indiqué ci-dessous :

Méthode disponible dans la saisie semi-automatique

Quand la méthode d’extension est appelée, l’instance est passée à l’argument, tel que textView dans cet exemple.

Frameworks et assemblys

Objective-C package des classes associées dans des répertoires spéciaux appelés frameworks. Toutefois, en C# et en .NET, les assemblys sont utilisés pour fournir des bits réutilisables de code précompilé. Dans les environnements en dehors d’iOS, les assemblys contiennent le code de langage intermédiaire (IL) qui est compilé « juste-à-temps » (JIT) au moment de l’exécution. Toutefois, Apple n’autorise pas l’exécution du code compilé JIT dans les applications iOS publiées sur le App Store. Par conséquent, le code C# ciblant iOS avec Xamarin est compilé en avance (AOT), produisant ainsi un seul exécutable Unix et les fichiers de métadonnées qui sont inclus dans l’ensemble d’applications.

Sélecteurs et paramètres nommés

Objective-C les méthodes incluent intrinsèquement des noms de paramètres dans les sélecteurs en fonction de leur nature même. Par exemple, un sélecteur tel que AddCrayon:WithColor: indique clairement ce que signifie chaque paramètre quand il est utilisé dans le code. C# peut éventuellement prendre aussi en charge les arguments nommés.

Par exemple, un code similaire en C# utilisant des arguments nommés pourrait se présenter comme suit :

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

Bien que C# ait ajouté cette prise en charge dans la version 4.0 du langage, dans la pratique, elle est rarement utilisée. Toutefois, si vous souhaitez être explicite dans votre code, il existe bien une prise en charge.

En-têtes et espaces de noms

Étant un sur-ensemble de C, Objective-C utilise des en-têtes pour les déclarations publiques qui sont distinctes du fichier d’implémentation. C# n’utilise pas de fichiers d’en-tête. Contrairement à Objective-C, le code C# est contenu dans les espaces de noms. Si vous souhaitez inclure du code disponible dans un espace de noms, vous devez ajouter une directive using au début du fichier d’implémentation ou qualifier le type avec l’espace de noms complet.

Par exemple, le code suivant inclut l’espace de noms UIKit, qui rend disponible chaque classe de cet espace de noms pour l’implémentation :

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

En outre, le mot clé de l’espace de noms dans le code ci-dessus définit l’espace de noms utilisé pour le fichier d’implémentation lui-même. Si plusieurs fichiers d’implémentation partagent le même espace de noms, il est inutile d’inclure l’espace de noms dans une directive using, car cela est implicite.

Propriétés

Les deux Objective-C et C# ont le concept de propriétés pour fournir une abstraction de haut niveau autour des méthodes d’accesseur. Dans Objective-C la directive du @property compilateur est utilisée pour générer efficacement les méthodes d’accesseur. En revanche, C# prend en charge les propriétés dans le langage même. Une propriété C# peut être implémentée soit à l’aide d’un style plus long qui accède à un champ de stockage, soit à l’aide d’une syntaxe de propriété automatique plus courte, comme indiqué dans les exemples suivants :

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

Mot clé Static

Le mot clé statique a une signification très différente entre Objective-C et C#. Dans les Objective-C fonctions statiques sont utilisées pour limiter l’étendue d’une fonction au fichier actif. En revanche, en C#, l’étendue est gérée à travers les mots clés publics, privés et internes.

Lorsque le mot clé statique est appliqué à une variable dans Objective-C, la variable conserve sa valeur entre les appels de fonction.

C# possède également un mot clé static. Lorsqu’elle est appliquée à une méthode, elle fait effectivement la même chose que le + modificateur dans Objective-C. à savoir qu’il crée une méthode de classe. De même, quand il est appliqué à d’autres constructions telles que des champs, des propriétés ou des événements, il inclut ces derniers dans le type dans lequel ils sont déclarés plutôt qu’avec une instance quelconque de ce type. Vous pouvez également rendre une classe statique, dans laquelle toutes les méthodes définies doivent également être statiques.

Initialisation de NSArray et de liste

Objective-C inclut désormais la syntaxe littérale à utiliser avec NSArray, ce qui facilite l’initialisation. C# a toutefois un type plus riche appelé un List, qui est générique, ce qui signifie que le type contenu par la liste peut être fourni par le code qui crée la liste (comme les modèles en C++). En outre, les listes prennent en charge la syntaxe d’initialisation d’automatique comme indiqué ci-dessous :

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

Blocs et expressions lambda

Objective-C utilise des blocs pour créer des fermetures, où vous pouvez créer une fonction inline qui peut utiliser l’état où elle est placée. C# a un concept similaire à travers l’utilisation d’expressions lambda. En C#, les expressions lambda sont créées avec l’opérateur =>, comme indiqué ci-dessous :

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

Pour plus d’informations sur les expressions lambda, consultez le Guide de programmation C# de Microsoft.

Résumé

Dans cet article, diverses fonctionnalités de langage ont été contrastées entre Objective-C et C#. Dans certains cas, il a évoqué des fonctionnalités analogues qui existent dans les deux langages, telles que les blocs pour les expressions lambda et les catégories pour les méthodes d’extension. Il a également souligné certaines différences entre les langages, par exemple au niveau des espaces de noms en C# et de la signification du mot clé static.