Swift e Objective-C

Por que a sintaxe de colchetes do Objective-C é assim? (O segredo do envio de mensagens)

Ao começar a estudar iOS e ver código Objective-C pela primeira vez, é fácil ficar confuso.

5 min de leitura
Imagem de capa de Por que a sintaxe de colchetes do Objective-C é assim? (O segredo do envio de mensagens)

Ao começar a estudar iOS e ver código Objective-C pela primeira vez, é fácil ficar confuso.

Ele é cheio de colchetes [ ]. Parece uma chamada de função, mas tem uma aparência muito diferente da de outras linguagens.

É natural ficar com a dúvida: “Por que fizeram isso desse jeito?”.

Indo direto ao ponto, os colchetes do Objective-C não “chamam” uma função; eles são a sintaxe para “enviar uma mensagem” a um objeto. Quando você entende essa ideia, os colchetes deixam de parecer estranhos.

Hoje vamos entender com calma, desde a origem, por que esses colchetes têm esse formato. 😊


Vamos começar pelo resumo dos pontos principais

Primeiro, veja o que você vai aprender neste artigo.

  1. Os colchetes do Objective-C significam “enviar uma mensagem a um objeto”
  2. Essa sintaxe foi herdada da linguagem Smalltalk
  3. Entendendo apenas a estrutura [객체 메서드], você consegue ler a maior parte dos casos
  4. Internamente, ela é convertida em uma função chamada objc_msgSend para ser executada

Entendendo esses quatro pontos, você já terá atingido o objetivo de hoje.


Afinal, o que é a sintaxe de envio de mensagens do Objective-C?

Em outras linguagens, normalmente escrevemos uma chamada de método assim.

object.method()

No Objective-C, porém, escrevemos assim.

// dog Enviar a mensagem  bark  ao objeto
[dog bark];

// count Enviar o valor junto como argumento
[dog barkTimes:3];

A aparência é diferente, mas a estrutura é simples.

[받는객체 보낼메시지]

Abra os colchetes, coloque à esquerda o objeto que recebe a mensagem e, à direita, escreva a mensagem a ser enviada.

Assim, [dog bark] significa “dog, faça bark”.

Para mim, pensar nisso como “conversar” com o objeto, e não como uma “chamada de função”, torna tudo muito mais fácil.

Quando há vários argumentos, a expressão cresce desta forma.

// O nome da mensagem é dividido em  setName:age: duas partes
[person setName:@"Cheolsu" age:20];

Pense que cada dois-pontos (:) recebe um valor.


Por que os colchetes têm esse formato?

Os colchetes do Objective-C são um vestígio da adaptação da filosofia de “envio de mensagens” do Smalltalk sobre a linguagem C.

A história remonta ao início da década de 1980.

Objective-C foi criado por Brad Cox e Tom Love.

Eles queriam continuar usando a popular linguagem C da época, mas acrescentar a ela conceitos de programação orientada a objetos.

O modelo dessa programação orientada a objetos era o Smalltalk.

A filosofia central do Smalltalk era: “tudo é um objeto, e os objetos trocam mensagens entre si”.

O desafio era inserir o conceito de mensagens sem quebrar a sintaxe do C.

Por isso, escolheram os colchetes, pouco usados na sintaxe do C, e definiram seu interior como o espaço para enviar mensagens.

Assim, eles podiam ser diferenciados sem conflitos mesmo quando misturados ao código C existente.

Quando você se acostuma com a ideia de “enviar” mensagens, os colchetes ficam mais confortáveis
Quando você se acostuma com a ideia de “enviar” mensagens, os colchetes ficam mais confortáveis

Mais tarde, a linguagem foi adotada pela NeXT e, quando a Apple comprou a NeXT em 1996, tornou-se a base do desenvolvimento para Mac e iPhone.

O framework Cocoa que conhecemos também surgiu daí.

Um par de colchetes estranhos carrega uma história longa.


Qual é a diferença para a sintaxe com ponto (.)?

No código Objective-C atual, a sintaxe com ponto (.) também aparece com frequência.

Por exemplo, dog.name.

É fácil confundir as duas, então organizei a relação entre elas em uma tabela.

Categoria Sintaxe com colchetes Sintaxe com ponto (.)
Forma [dog name] dog.name
Significado Envio de mensagens Acesso a propriedades
Período de surgimento Desde o início A partir do Objective-C 2.0 (2007)
Funcionamento interno Execução de métodos Conversão efetiva em método

O interessante é que a sintaxe com ponto também acaba sendo convertida internamente em uma mensagem com colchetes.

Ou seja, quando executado, dog.name faz essencialmente o mesmo que [dog name].

A sintaxe com ponto é apenas uma camada externa criada para facilitar a leitura.

Por isso, recomendo que iniciantes entendam primeiro que a essência está nos colchetes.


O que realmente acontece dentro dos colchetes?

Vamos um pouco mais fundo.

Quando você escreve [dog bark], o compilador converte isso em uma chamada à função objc_msgSend.

// O código que escrevemos
[dog bark];

// Internamente, isso é convertido mais ou menos assim
objc_msgSend(dog, @selector(bark));

Na primeira posição entra o objeto que recebe a mensagem; na segunda, o nome do método a ser executado (selector).

Mesmo com aparências diferentes, tudo converge para o mesmo lugar
Mesmo com aparências diferentes, tudo converge para o mesmo lugar

Essa abordagem é flexível porque permite decidir em tempo de execução qual método será executado.

Por isso, o Objective-C tinha recursos dinâmicos poderosos, como alterar ou adicionar métodos durante a execução.

Por trás da aparência dos colchetes, havia uma estrutura flexível como essa.

Uma sintaxe que fica natural depois de alguns dias de uso
Uma sintaxe que fica natural depois de alguns dias de uso

Vamos resumir em perguntas e respostas

P. Preciso decorar os colchetes?

Mais do que decorar, basta entender a estrutura [받는객체 보낼메시지] para conseguir ler naturalmente.

P. Hoje uso Swift. Ainda preciso saber disso?

Bibliotecas antigas e códigos de exemplo ainda estão escritos em Objective-C, então saber lê-los ajuda bastante.

P. E se houver colchetes dentro de outros colchetes?

É uma estrutura em que o lado de fora recebe novamente o resultado do lado de dentro. Leia de dentro para fora e tudo se resolve.


Mesmo que os colchetes pareçam apenas uma regra estranha, eles ficam muito mais familiares quando você passa a pensar neles como uma “sintaxe para conversar com objetos”.

Quanto mais estranha a sintaxe, mais tempo ela tende a permanecer na memória quando você conhece sua origem.

Espero que este artigo ajude você a se aproximar um pouco mais do Objective-C. Torcendo por você! 🙌

Continue lendo