Compartilhar via


Primer do C# para Objective-C desenvolvedores

O Xamarin.iOS permite que código independente de plataforma escrito em C# seja compartilhado entre plataformas. No entanto, os aplicativos iOS existentes podem querer aproveitar Objective-C o código que já foi criado. Este artigo serve como uma cartilha curta para Objective-C desenvolvedores que procuram migrar para o Xamarin e a linguagem C#.

Os aplicativos iOS e macOS desenvolvidos no Objective-C podem se beneficiar do Xamarin aproveitando o C# em locais em que o código específico da plataforma não é necessário, permitindo que esse código seja usado em dispositivos não Apple. Itens como serviços Web, JSON e análise de XML e algoritmos personalizados podem então ser usados em plataforma cruzada.

Para aproveitar o Xamarin enquanto mantém ativos existentes Objective-C , o primeiro pode ser exposto ao C# em uma tecnologia do Xamarin conhecida como associações, que exibem Objective-C o código para o mundo C# gerenciado. Além disso, se desejado, também é possível fazer a portabilidade do código linha por linha para C#. Independentemente da abordagem, no entanto, seja vinculação ou portabilidade, algum conhecimento de Objective-C e C# é necessário para aproveitar efetivamente o código existente Objective-C com o Xamarin.iOS.

Objective-C Interop

Atualmente, não há nenhum mecanismo com suporte para criar uma biblioteca em C# usando o Xamarin.iOS que pode ser chamado de Objective-C. O principal motivo disso é que o runtime Mono também é necessário, além da associação. No entanto, você ainda pode criar a maior parte da lógica no Objective-C, incluindo interfaces do usuário. Para fazer isso, encapsule o Objective-C código em uma biblioteca e crie uma associação a ela. O Xamarin.iOS é necessário para iniciar o aplicativo (o que significa que deve criar o ponto de entrada Main). Depois disso, qualquer outra lógica pode estar em Objective-C, exposta a C# por meio da associação (ou por meio de P/Invoke). Dessa forma, você pode manter a lógica específica da plataforma e Objective-C desenvolver as partes independentes da plataforma em C#.

Este artigo destaca algumas semelhanças importantes, bem como contrasta várias diferenças em ambas as linguagens para servir como uma cartilha ao mover para C# com Xamarin.iOS, seja associando ao código existente Objective-C ou portando-o para C#.

Para obter detalhes sobre como criar associações, consulte os outros documentos em Associando Objective-C.

Comparação de linguagens

Objective-C e C# são linguagens muito diferentes, sintaticamente e do ponto de vista do runtime. Objective-C é uma linguagem dinâmica e usa um esquema de passagem de mensagens, enquanto O C# é tipado estaticamente. Em termos de sintaxe, Objective-C é como Smalltalk, enquanto o C# deriva grande parte de sua sintaxe fundamental do Java, embora tenha amadurecido para incluir muitos recursos além do Java nos últimos anos.

Dito isso, há vários recursos de linguagem de Objective-C e C# que são semelhantes na função. Ao criar uma associação para Objective-C o código do C# ou ao fazer a portabilidade Objective-C para C#, entender essas semelhanças é útil.

Protocolos versus interfaces

Tanto quanto Objective-C C# são linguagens de herança única. No entanto, ambas as linguagens têm suporte para implementar várias interfaces em uma classe específica. Nessas Objective-C interfaces lógicas são chamados de protocolos , enquanto em C# eles são chamados de interfaces. Em termos de implementação, a diferença main entre uma interface C# e um Objective-C protocolo é que este último pode ter métodos opcionais. Para obter mais informações, confira o artigo Eventos, representantes e protocolos.

Categorias versus métodos de extensão

Objective-C permite que métodos sejam adicionados a uma classe para a qual talvez você não tenha o código de implementação usando Categorias. No C#, um conceito semelhante está disponível por meio de algo conhecido como métodos de extensão.

Os métodos de extensão permitem adicionar métodos estáticos a uma classe, em que os métodos estáticos em C# são análogos aos métodos de classe no Objective-C. Por exemplo, o código a seguir adiciona um método chamado ScrollToBottom à UITextView classe , que, por sua vez, é uma classe gerenciada associada à Objective-CUITextView classe do UIKit:

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

Em seguida, quando uma instância de UITextView for criada no código, o método estará disponível na lista de preenchimento automático, conforme mostrado abaixo:

O método disponível no preenchimento automático

Quando o método de extensão é chamado, a instância é passada para o argumento, como textView neste exemplo.

Estruturas versus assemblies

Objective-C empacota classes relacionadas em diretórios especiais conhecidos como estruturas. No entanto, em C# e .NET, assemblies são usados para fornecer código pré-compilado reutilizável. Em ambientes fora do iOS, assemblies contêm código de IL (linguagem intermediária) que é compilado JIT (just-in-time) no runtime. No entanto, a Apple não permite a execução de código compilado JIT em aplicativos iOS lançados no App Store. Portanto, o código em C# voltado para o iOS com o Xamarin é compilado AOT (antecipadamente), produzindo um único executável Unix juntamente com arquivos de metadados que estão incluídos no pacote do aplicativo.

Seletores versus parâmetros nomeados

Objective-C os métodos incluem inerentemente nomes de parâmetros em seletores por sua própria natureza. Por exemplo, um seletor como AddCrayon:WithColor: esclarece o que significa cada parâmetro quando usado no código. Opcionalmente, C# também dá suporte a argumentos nomeados.

Por exemplo, um código semelhante em C# usando argumentos nomeados seria:

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

Embora C# tenha adicionado esse suporte na versão 4.0 da linguagem, na prática, ele não é usado com frequência. No entanto, se você quiser ser explícito no código, o suporte para isso existe.

Cabeçalhos e Namespaces

Sendo um superconjunto de C, Objective-C usa cabeçalhos para declarações públicas separadas do arquivo de implementação. C# não usa arquivos de cabeçalho. Ao contrário Objective-Cde , o código C# está contido em namespaces. Se quiser incluir código disponível em algum namespace, você deve adicionar uma diretiva using à parte superior do arquivo de implementação ou qualificar o tipo com o namespace completo.

Por exemplo, o código a seguir inclui o namespace UIKit, tornando todas as classes no namespace disponíveis para a implementação:

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

Além disso, a palavra-chave de namespace no código acima define o namespace usado para o próprio arquivo de implementação. Se vários arquivos de implementação compartilharem o mesmo namespace, não será necessário incluir o namespace em uma diretiva using também, pois isso estará implícito.

Propriedades

Tanto quanto Objective-C C# têm o conceito de propriedades para fornecer uma abstração de alto nível em relação aos métodos do acessador. Na Objective-C diretiva do @property compilador é usada para gerar efetivamente os métodos do acessador. Por outro lado, C# inclui suporte para propriedades na própria linguagem. Uma propriedade de C# pode ser implementada usando um estilo mais longo que acessa um campo de suporte ou usando uma sintaxe de propriedade automática menor, conforme mostrado nos seguintes exemplos:

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

Palavra-chave Static

A palavra-chave estática tem um significado muito diferente entre Objective-C e C#. Em Objective-C funções estáticas são usadas para limitar o escopo de uma função ao arquivo atual. No entanto, em C#, o escopo é mantido por meio das palavras-chave public, private e internal.

Quando o palavra-chave estático é aplicado a uma variável no Objective-C, a variável mantém seu valor entre chamadas de função.

C# também tem uma palavra-chave static. Quando aplicado a um método, ele efetivamente faz a mesma coisa que o + modificador faz em Objective-C. Ou seja, cria um método de classe. Da mesma forma, quando aplicada a outros constructos, como campos, propriedades e eventos, torna-os parte do tipo em que são declarados, em vez de com qualquer instância desse tipo. Você também pode criar uma classe estática, em que todos os métodos definidos na classe também devem ser estáticos.

NSArray vs. Inicialização de Lista

Objective-C agora inclui a sintaxe literal para uso com NSArray, facilitando a inicialização. Porém, C# tem um tipo mais avançado, chamado List, que é genérico. Isso significa que o tipo que a lista contém pode ser fornecido pelo código que cria a lista (como modelos em C++). Além disso, listas dão suporte à sintaxe de inicialização automática conforme mostrado abaixo:

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

Blocos versus expressões Lambda

Objective-C usa blocos para criar fechamentos, em que você pode criar uma função embutida que pode usar o estado em que ela está incluída. C# tem um conceito semelhante, com o uso de expressões lambda. Em C#, expressões lambda são criadas com o operador =>, conforme mostrado abaixo:

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

Para obter mais informações sobre expressões lambda, confira o Guia de Programação em C# da Microsoft.

Resumo

Neste artigo, uma variedade de recursos de linguagem foi contrastada entre Objective-C e C#. Em alguns casos, foram indicados recursos análogos que existem entre as duas linguagens, como blocos e expressões lambda e categorias e métodos de extensão. Além disso, ele comparou as diferenças entre as linguagens, como namespaces em C# e o significado da palavra-chave static.