Um pouco sobre injeção de dependência em IOS

Como funciona injeção de dependência e um pouco sobre como aprendi a fazer da maneira mais divertida possível.

Victor Brito M. C
4 min readMay 16, 2022

Recentemente estive trabalhando em um projeto onde o objetivo era criar rotas de voos autônomos utilizando um drone da DJI, nesse caso o drone escolhido foi o DJI Tello. Calma não se assustem!!!! Apesar de parecer algo muito complexo vou explicar passo a passo de como utilizei injeção de dependência.

Drone escolhido para o projeto

Quase todos os drones necessitam de uma conexão com um dispositivo móvel, essa conexão é feita para poder controlar o drone através de controles virtuais, em alguns casos ter acesso a logs de voos ou poder manusear a câmera, em alguns drones mais caros é possível criar rotas de voos através de funcionalidades GPS.

O Drone utilizado nesse projeto foi um DJI tello, um dos drones mais simples da DJI, este drone não conta com o auxílio de GPS para voos ou funcionalidades mais complexas, possuindo apenas dois sensores infravermelhos para ajudar a estabilização durante o voo. Por se tratar de um drone com funcionalidades básicas, todos os controles de direção são realizados através de um app para dispositivos móveis, abrindo uma brecha para que desenvolvedores curiosos possam criar seu próprio app.

Comunicação de drones com dispositivos móveis

Como criar um app para controlar o DJI Tello será assunto para uma próxima publicação, o objetivo aqui é contar como a utilização de injeção de dependência ajuda a manter as coisas em ordem na parte de Back-end. Drones que se conectam com dispositivos móveis precisam gerar um acesso wifi, na maior parte dos casos esse ponto wifi é gerado pelo próprio drone, através disso o dispositivo móvel consegue se conectar com o drone por meio de um protocolo UDP, assim existindo uma comunicação entre dispositivo móvel e drone. Para que isso aconteça é preciso ter acesso à algumas propriedades que o wifi gera, nesse caso o nosso drone possui um IP fixo que possibilita a conexão com o dispositivo móvel, após a conexão é necessário enviar os comandos para as portas que estão abertas no wifi gerado. Essas portas sempre serão padrões para o DJ Tello, na porta 8889 é possível enviar comandos referentes as direções que o drone deve voar, na porta 8890 acontece o envio de dados de telemetria, que nada mais é do que logs gerado pelo drone informando altitude, velocidade, posição, nível da bateria e por fim temos a porta 11111, que se encarrega pelo envio de imagem da câmera.

Hora de programar

Nosso primeiro passo será separar as propriedades de acesso que permitem o drone se conectar com o dispositivo móvel

struct TelloAddress {Public let IP_ADDRESS: STRING 
Public let UDP_CMD_PORT: Int
Public let UDP_STATE_PORT: Int
Public let UDP_VS_PORT: Int
Public let PORT: Int32
Public let TIME_BTW_COMMANDS: Float
}

Agora que temos nossas propriedades separadas precisamos iniciar os nossos dados de maneira com que envie nossas propriedades.

Iniciando nossos dados

Em uma classe separada vamos criar uma variável "telloAddress" do tipo "TelloAddress"

var telloAddress: TelloAddress

Dentro da mesma classe vamos iniciar o nosso "telloAddres" que vai ser responsável por enviar o nosso tipo de dado armazenado nas propriedades "TelloAddres"

init(telloAddress: TelloAddress) {self.telloAddress = telloAddress
self.state = .disconnected
client = UDPClient(address: self.telloAddress.IP_ADDRESS, port: self.telloAddress.PORT)
}

Resumindo o processo até este ponto, temos nossas propriedades seperadas em um arquivo diferente "TelloAddress" onde são inicializadas dentro de uma classe.

Injeção de dados

Após criarmos a inicialização de nossas propriedades em uma classe precisamos injetar nossos dados em uma outra classe separada.

import UIKitimport SwiftSocketclass TelloComands {var service = TelloService(telloAdddress: TelloAddress(IP_ADDRESS: "192.168.10.1", UDP_CMD_PORT: 8889))// MARK: - Tello Command Methodsfunc enterCommandMode() async {
await service.sendMessage(msg: START.start)
}

Dentro da TelloComands é instanciado a TelloService que inicializa a nossa TelloAddress, dessa forma precisamos apenas fazer a injeção de dados. É importante ressaltar que quando for possível fazer a inserção de dados dentro do init será sempre considerado uma boa maneira de trabalhar utilizando esse método

var service = TelloService(telloAdddress: TelloAddress(IP_ADDRESS: "192.168.10.1", UDP_CMD_PORT: 8889))

Conclusão

A injeção de dependência que foi feita nesse projeto tem como objetivo apenas mostrar o conceito básico da inicialização de dados em uma classe e depois a inserção desses dados dentro de uma classe distinta. A utilização desse método gera menos responsabilidade de tratamento para quem for trabalhar em futuras manutenções no código, evitando comprometimento da aplicação ou soluções temporárias. O principal objetivo desse método é livrar o seu código do acoplamento entre objetos e propriedades ou referências estáticas.

--

--

Victor Brito M. C

22, Brazil IOS dev WWDC22 Swift Student Challenge Winner 🏆