Prefácio
Qual dos desenvolvedores do iOS não sonhava em trabalhar em um lugar de prestígio como o Yandex ou o Avito. Infelizmente, apenas hr pergunta sobre sonhos em entrevistas, mas os entrevistadores desenvolvedores fazem perguntas de natureza um pouco diferente. Qual é a diferença entre o tipo de referência e o tipo de valor ou os limites do quadro? Perguntas que cada um de nós ouviu mais de uma vez em entrevistas. Se sua entrevista começa com a pergunta sobre as diferenças entre os tipos significativo e de referência ou com o espírito de "conte-nos sobre o SOLID", você está claramente no caminho de encontrar um emprego na So-so-Perspectives LLC.
Em uma empresa decente, você não será questionado sobre tal absurdo. Prepare-se para perguntas sobre despacho, tabela lateral e fila subjacente. O conhecimento de tais nuances de forma alguma ajudará a atingir 60 FPS ao rolar, carregado com elementos celulares e não fará de você um desenvolvedor honorário da Rússia. Eles ajudarão você a reconhecer uma pessoa que não apenas mudou a taxa de xib por 4 anos e agora se considera um desenvolvedor sênior do iOS, mas está realmente interessado na plataforma. Sempre será um mistério para mim quando uma pessoa decide que alcançou o nível Médio ou Sênior. Provavelmente participa de competições totalmente russas, nas quais o ROS-GOS-iOS concede categorias e títulos por cumprir padrões e prêmios.
Voltar para as entrevistas. O empregador de prestígio não apenas fará perguntas complicadas sobre a plataforma, mas certamente fará perguntas sobre arquitetura. Aguarde a pergunta: “Por que você usou o VIPER em vez do MVVM em último lugar?”. Você pode estar se perguntando: "O que é MVC ruim?". Bem, o último prego na tampa do caixão serão algoritmos. Mesmo se você for versado brilhantemente no iOS e na arquitetura de aplicativos móveis, mas não conhece os pontos fracos das matrizes e não pode otimizar a busca por um elemento, depois da entrevista, aguarde uma resposta no e-mail:

Nas extensões da Internet em língua russa há muitos artigos sobre algoritmos e estruturas de dados. A única desvantagem que pode obscurecer o estudo é a escassez de exemplos e implementações no Swift. É muito difícil entender esse tópico quando você obtém muitas palavras obscuras e exemplos de C ++ ainda mais obscuros.
Para todos que desejam tomar smoothies todos os dias em escritórios elegantes e em reuniões de ex-alunos para falar sobre como ele sozinho arrasta todo o desenvolvimento móvel de Sber, preparei alguns artigos sobre estruturas de dados. Os artigos destinam-se a desenvolvedores que já estão familiarizados com genéricos, trabalharam com matrizes / conjuntos / dicionários, entendem as diferenças entre classes e estruturas e fingem que entendem a recursão. Não vou pintar a teoria. Isso já foi feito antes de mim e tenho certeza de que é bastante informativo. Vamos nos concentrar nos exemplos.
Lista vinculada
A Wikipedia ajudará com a teoria
. Vamos começar criando o mesmo
nó.
* Certifique-se de alterar o esquema de cores do Xcode para escuro, caso contrário você não verá trabalho no MailUm leitor atento deve perguntar: “Por que o desenvolvedor Momkin decidiu implementar o nó como uma classe, não como uma estrutura? O artigo é sobre estruturas de dados! ” Sugiro discutir esta decisão nos comentários. Vamos para a lista mais vinculada. A implementação inicial terá a seguinte aparência:

Todo especialista em furo que se
preze observará que
WeakReference é de um tipo desconhecido e exigirá justificadamente a implementação.

Adicione aos métodos de implementação responsáveis por preencher nossa lista:


* A complexidade O (1) é válida apenas se não for necessário copiar a estrutura. Caso contrário, teremos O (n) complexidade. Isso se aplica a todos os métodos de mutação.Adicione os métodos responsáveis pela remoção da lista:


* @ discardableResult nos impedirá de escrever "_ =" antes de chamar a função quando o valor de retorno não for interessante para nósNosso ofício já parece uma lista vinculada de trabalho. Vamos tentar torná-lo o mais rápido possível. Para fazer isso, precisamos implementar apenas duas coisas: o protocolo
BidirectionalCollection e a técnica de
copiar na gravação . Vamos começar com o protocolo. Existem muito poucos métodos nele, e o mais difícil é entender e implementar o Index.


Ótimo! Agora todas as nossas coleções de coleções estão disponíveis em nossa lista. Podemos aplicar mapa, compactMap, filtro, contém etc. a ele. Foi a vez de copiar na gravação. Implementamos o método
copyIfNeeded () devido à falta de qual o compilador está agora sugerindo que o código não foi escrito por D'Artagnan:

Aqueles que desejam fazer uma pergunta inteligente ou apontar falhas estão esperando nos comentários.
PS Agradeço
ivlevAstef pela ajuda na correção dos bugs. Ninguém ainda propôs uma implementação de trabalho sem invólucros fracos.
Código do Github