Em formação

Corda de corações de gatos


Corda de corações de gatos cães ratos coelhos

Estive olhando o código do aplicativo ‘String of Hearts’, que está disponível para dispositivos iOS. É para encontrar a maior sequência de corações em uma sequência de outros caracteres.

O aplicativo tem alguns recursos básicos: você insere uma string, pressiona o botão de coração e mostra a sequência mais longa de corações. É uma ideia simples, mas o código é um tanto confuso e a maioria das decisões de design são feitas muito rapidamente.

Você pode esperar que o problema seja que o código seja muito prolixo. Não sei quantas pessoas usam Swift no iOS, mas esse pode ser o problema. Mesmo que não seja esse o problema, o código é repetitivo e fácil de entender em partes. Mas isso não. É confuso porque este aplicativo tenta fazer muitas coisas diferentes. Ele tem muitas estruturas de dados diferentes e usa muitas APIs diferentes.

Se você quer uma ideia simples, este aplicativo tem uma ideia simples. Mas não acho que seja um grande exemplo de reutilização de código.

O aplicativo String of Hearts é uma combinação de três classes: string, corações e a interface do usuário. As classes string e hearts armazenam, cada uma, uma grande quantidade de dados. A classe string é apenas uma coleção ordenada de caracteres. Ele usa a classe NSCache para economizar memória. A classe de corações armazena a sequência de corações e usa a classe NSUserDefaults para salvar os dados. A classe UI armazena um pouco de dados, o texto de um rótulo.

É difícil fazer um exemplo de código genérico que ilustra tudo isso, então vamos examinar o código um pouco, para mostrar algumas decisões de design e explicar o código.

Primeiro, a classe string. Esta classe contém uma única string: @IBAction func heart (sender: UIButton) {…}. É um método de ação, porque você o usará para chamar uma função ou fazer alterações em uma propriedade em seu controlador de visualização. Ele também possui um tipo associado, UIButton.heart (ou coração: UIButton).

A classe de corações é um objeto modelo. É uma classe que representa uma única unidade de dados: uma sequência de corações. Contém uma string e um array de strings, que representa a sequência.

A classe de corações armazena a sequência de corações como uma matriz de strings. Ele não usa nenhuma outra estrutura de dados, então não precisamos nos preocupar com coisas como classificação, pesquisa, etc.

A classe hearts usa a classe NSUserDefaults para salvar os dados.

Existe uma classe de IU, que é um objeto controlador. Ele contém um rótulo e alguns outros métodos, mas os dados que contém são o texto de uma string. Ele usa a classe NSUserDefaults para salvar os dados também.

A classe UI é um objeto da classe NSUserDefaults. Possui alguns métodos associados a ele e uma propriedade chamada userDefaults, mas não contém nenhum dado.

A classe do controlador de visualização é um objeto controlador. Ele tem alguns métodos para fazer coisas como criar um coração ou encontrar todos os corações, e é uma classe da classe NSUserDefaults. Ele tem uma propriedade para armazenar uma sequência de corações e algumas outras propriedades, e contém uma propriedade heart: UITextField que mantém o valor naquele objeto de modelo.

A classe do controlador de visualização é uma classe da classe NSUserDefaults. Tem algumas funções associadas a ele, mas é apenas uma estrutura de dados.

O controlador de visualização, junto com sua classe NSUserDefaults, constitui um UITableViewController. É uma implementação concreta de uma classe UITableViewController.

O controlador de visualização, sua classe NSUserDefaults e seu modelo de coração são todos encapsulados dentro de um objeto, chamado Singleton. Este é um objeto que estará acessível de qualquer lugar e não possui propriedades, métodos ou outra funcionalidade. Ele existe porque será reutilizado e instanciado muitas vezes e haverá mais de uma instância dele no aplicativo ao mesmo tempo.

O controlador de visualização e o modelo de dados podem ser disponibilizados para qualquer pessoa que precise usá-los. O UITableViewController pode receber alguns dados para preencher sua table view e configurar algumas de suas características, e o controlador pode responder colocando-os em sua própria estrutura de dados e apresentando-os na tela.

Os solteiros às vezes são considerados uma má ideia. Eles são uma solução fácil para um problema difícil: compartilhar uma instância de objeto em diferentes partes do seu aplicativo. Se você tiver uma instância de modelo que não precisa ser acessada por mais nada, torne-a um Singleton. Se o objeto sempre será acessado por uma classe e apenas essa classe, torne-o um Singleton. Se for necessário acessar o objeto de várias classes em seu aplicativo, torne-o uma classe normal. Certifique-se de que o Singleton é thread-safe, porque ele pode ser usado a partir de vários threads a qualquer momento.

Criando o Singleton

O Singleton em nosso aplicativo de amostra é apenas um singleton que gerencia um conjunto de classes NSUserDefaults. É um singleton porque o objeto sempre terá apenas uma instância.

Vamos criá-lo assim:

O método initWithKey é um inicializador necessário para Singletons. Deve receber uma string chave para o Singleton. Em seguida, ele cria um singleton a partir da chave. Ele retorna o Singleton recém-criado, ou nil se não for possível criar um.

Os métodos de classe em Singleton são para obter e definir variáveis ​​no Singleton. Por exemplo, podemos obter todos os dados NSUserDefaults de que precisamos, solicitando que ele retorne a matriz das preferências atuais.

Como você pode ver, também existem métodos de classe para obter e definir preferências para uma determinada chave. Eles funcionam da mesma maneira, mas pode ser necessário lançar o Singleton.

Finalmente, precisaremos usar o Singleton onde quer que seja usado.

O NSUserDefaults também pode ser um Singleton, mas possui um método diferente para obter suas propriedades. Também é thread-safe, mas tem mais trabalho a fazer. Então, vamos ver como funciona:

Pedimos ao Singleton para obter o objeto NSUserDefaults atual e torná-lo o delegado do objeto prefs recém-criado. Então precisamos fazer um novo NSUserDefaults.

Pedimos a ele para obter os NSUserDefaults atuais e atribuí-los aos nossos. Os outros métodos funcionam da mesma maneira.

Os métodos da classe NSUserDefaults fornecem uma maneira de colocar preferências nos padrões do usuário, então precisaremos implementá-los.

Para adicionar métodos à tabela de classes, NSUserDefaults fornece uma maneira de definir os padrões para uma determinada chave.

Para adicionar métodos à tabela de classes, NSUserDefaults fornece uma maneira de definir os padrões para uma determinada chave.

Definiremos o padrão para o defaultKey nos NSUserDefaults quando ele for criado. Vamos criar um método chamado “setDefaults:” para facilitar a definição de padrões para uma chave específica.

Definiremos o padrão para o defaultKey em NSUserDefaults quando ele for criado


Assista o vídeo: Gato dançando (Janeiro 2022).

Video, Sitemap-Video, Sitemap-Videos