Xcode 10.2, macOS Mojave 10.14.4, iOS 12.1 e outros betas



Novos betas estão aqui e estas são algumas das coisas mais importantes que aprendi sobre eles.

Swift 5 para Xcode 10.2 beta


Swift


Em primeiro lugar, a versão beta mais recente do Xcode vem com a seguinte versão do Swift:

Apple Swift version 5.0 (swiftlang-1001.0.45.7 clang-1001.0.37.7) Target: x86_64-apple-darwin18.2.0 ABI version: 0.6 

Vamos começar com as notícias mais emocionantes:
Os aplicativos Swift não incluem mais bibliotecas vinculadas dinamicamente para a biblioteca padrão Swift e as sobreposições Swift SDK em variantes de compilação para dispositivos executando iOS 12.2, watchOS 5.2 e tvOS 12.2. Como resultado, os aplicativos Swift podem ser menores quando implantados para teste usando o TestFlight, ou ao afinar um arquivo de aplicativos para distribuição local de desenvolvimento.
A estabilidade da interface binária do aplicativo está chegando! E esta é uma excelente notícia. Acho que esse é um dos problemas mais significativos no momento com Swift. Não por causa dos efeitos colaterais, mas por causa da falha de Swift em cumprir as promessas anteriores. Enfim, eu até conheço pessoas que reescreveram suas extensões do Apple Watch no Objective C para reduzir o tamanho do binário (algo como 15 MB vs ~ 1 MB no Objetivo C). Se você quiser saber mais sobre o estado da ABI, siga os links: Swift - ABI Dashboard e Swift ABI Stability Manifesto .

O atributo @dynamicCallable permite chamar tipos nomeados, assim como funções, usando um simples açúcar sintático. O caso de uso principal é a interoperabilidade de linguagem dinâmica. ( SE-0216 )

Exemplo:

 @dynamicCallable struct ToyCallable { func dynamicallyCall(withArguments: [Int]) {} func dynamicallyCall(withKeywordArguments: KeyValuePairs<String, Int>) {} } let x = ToyCallable() x(1, 2, 3) // Desugars to `x.dynamicallyCall(withArguments: [1, 2, 3])` x(label: 1, 2) // Desugars to `x.dynamicallyCall(withKeywordArguments: ["label": 1, "": 2]) 

Este é um tópico enorme e eu tenho sentimentos contraditórios sobre o recurso. Portanto, leia a publicação "O que há de novo no Swift 5.0" de Paul Hudson, se você quiser saber mais sobre o que está por vir.
O modo Swift 3 foi removido. Os valores suportados para o -swift-version são 4, 4.2 e 5.
Chegou a hora. A compatibilidade da fonte com o Swift 3 não existe mais. Era esperado e anunciado com o Swift 5 Roadmap, mas ainda assim. Eu recomendo que você atualize sua memória com o "Swift 5.0 Release Process" porque o Swift 5 está quase aqui. Prepare-se.
No modo Swift 5, é necessário alternar enumerações declaradas no Objective-C ou provenientes de estruturas de sistema para lidar com casos desconhecidos - casos que podem ser adicionados no futuro ou que podem ser definidos privadamente em um arquivo de implementação do Objective-C . Formalmente, o Objective-C permite armazenar qualquer valor em uma enumeração, desde que se encaixe no tipo subjacente.
Esses casos desconhecidos podem ser tratados usando o novo caso @unknown default , que ainda fornece avisos se algum caso conhecido for omitido no comutador. Eles também podem ser manipulados usando um caso default normal.

Se você definiu sua própria enumeração no Objective-C e não precisa de clientes para lidar com casos desconhecidos, poderá usar a macro NS_CLOSED_ENUM vez de NS_ENUM . O compilador Swift reconhece isso e não exige que as opções tenham um caso padrão.

Nos modos Swift 4 e 4.2, você ainda pode usar @unknown default . Se você o omitir e um valor desconhecido for passado para o comutador, o programa traps em tempo de execução, assim como o Swift 4.2 no Xcode 10.1. ( SE-0192 )
Foi e é uma dor, especialmente se você não usar uma abordagem padrão nos comutadores. Lembro-me das soluções feias para a nova opção UNAuthorizationOptions propriedade UNAuthorizationOptions que foi introduzida no iOS 12. Agora, com um caso desconhecido, é muito mais fácil lidar com esses cenários.

Gerenciador de pacotes Swift


Agora, os pacotes podem personalizar a configuração de destino de implantação mínima para plataformas Apple ao usar a versão-ferramenta do Swift 5 Package.swift. A criação de um pacote emite um erro se alguma das dependências do pacote especificar um destino de implantação mínimo maior que o próprio destino de implantação mínimo do pacote. ( SE-0236 )
As notícias mais importantes para mim dizem respeito ao Swift Package Manager. Tecnicamente, essa alteração pode resolver muitos problemas que impedem que o SPM seja útil no mundo do iOS. No artigo anterior, " Swift Package Manager constrói estruturas iOS ", tentei analisar o estado atual do SPM no contexto do desenvolvimento do iOS. E agora parece que vou ter que reavaliar meus pensamentos e conclusões.

Existem alguns problemas ruins também:
Alguns projetos podem enfrentar regressões no tempo de compilação de versões anteriores;
Os projetos de linha de comando Swift falham ao iniciar com erros "dyld: Library not loaded".
Solução alternativa: adicione uma configuração de compilação definida pelo usuário

 SWIFT_FORCE_STATIC_LINK_STDLIB=YES 


Muitos problemas foram resolvidos e outros pontos no changelog relacionados ao Swift 5, mas são específicos para o que você faz. Marque-os, talvez você queira usar inicializadores herdados designados com parâmetros variados ou tenha sido bloqueado pelo problema de conflito devido a definições de tipos recursivos complexos envolvendo classes e genéricos, ou esteja enfrentando um alias de tipo genérico em um método @objc .

Xcode 10.2 beta


Compilador Apple Clang


Existem muitos avisos novos para o Apple Clang Compiler. E a maioria deles está relacionada a estruturas e módulos. É bastante interessante porque pode ser associado à integração do Swift Package Manager como uma ferramenta de dependência. Os mais importantes, na minha opinião, são:
Um novo diagnóstico identifica os cabeçalhos da estrutura que usam aspas, em vez de incluir o estilo da estrutura. O aviso está desativado por padrão, mas você pode ativá-lo passando -Wquoted-include-in-framework-header para clang;
Cabeçalhos públicos em uma estrutura podem #import ou #import engano
cabeçalhos privados, o que causa violações de camadas e possíveis ciclos de módulos. Há um novo diagnóstico que relata essas violações. Está desativado por padrão no clang e é controlado pelo -Wframework-include-private-from-public ;
O uso do @import nos cabeçalhos da estrutura impede que os cabeçalhos sejam usados ​​sem módulos. Um novo diagnóstico detecta o uso de @import nos cabeçalhos da estrutura quando você passa o sinalizador - fmodules . O diagnóstico está DESLIGADO por padrão no clang e é controlado usando o Watimport-in-framework-header - Watimport-in-framework-header ;
Anteriormente, a omissão da palavra-chave framework ao declarar um módulo para uma estrutura não afetava a compilação, mas silenciosamente fazia a coisa errada. Um novo diagnóstico - Wincomplete-framework-module-declaration e uma nova correção - sugerem a adição da palavra-chave apropriada. Esse aviso está -fmodules por padrão quando você passa o sinalizador -fmodules para clang.
Em primeiro lugar, como ativá-los: Vá para criar configurações para o destino do aplicativo, localize "Apple Clang - Sinalizadores de compilador personalizado" e coloque o sinalizador desejado em "Outros sinalizadores C" .



Tentei criar um aplicativo antigo, baseado em Objective-C e encontrei muitos problemas com cabeçalhos privados em cabeçalhos de estrutura pública:



E alguns problemas com importações com aspas duplas nas estruturas:



Eu recomendo que você execute esses diagnósticos também e, pelo menos, crie problemas para sua lista de pendências. Um dia, todos esses problemas causarão uma verdadeira dor de cabeça.

Sistema de compilação


Há também um novo e agradável recurso do Sistema de Compilação:
As dependências implícitas agora -framework suporte à localização de dependências em outros sinalizadores de vinculador para estruturas e bibliotecas vinculadas especificadas com -framework , -weak_framework , -reexport_framework , -lazy_framework , -weak-l, -reexport-l , -lazy-l e -l .
É realmente interessante também. Em geral, isso significa que você pode definir suas dependências implícitas via .xcconfig ou mesmo com xcodebuild opções xcodebuild e evitar essas xcodebuild /
Incorporar fases no Xcode.

Depuração


A depuração possui novos recursos:
As propriedades UIStackView agora são apresentadas no inspetor de objetos do depurador de exibição;
O depurador de exibição apresenta um layout 3D mais compacto.


O Xcode agora pode capturar automaticamente um gráfico de memória, se uma exceção de recurso de memória for encontrada durante a depuração. Para habilitar capturas de gráficos de memória, vá para a guia Diagnóstico das configurações de execução do esquema;
No iOS e watchOS, o Xcode mostra o limite de memória para a execução de aplicativos no Relatório de Memória à medida que você se aproxima do limite;


Veja a linha vermelha? O Watchdog envia applicationDidReceiveMemoryWarning(...)
quando você alcança a borda. Mas pensei que seria mais útil do que é, para ser honesto. Por enquanto, parece apenas uma pequena melhoria agradável.

Depurador LLDB


E o LLDB Debugger também teve um pouco de amor:

Agora você pode usar $0, $1, ... atalhos na avaliação da expressão LLDB em fechamentos;
O depurador LLDB possui um novo alias de comando, v , para o comando "frame variable" para imprimir variáveis ​​no quadro de pilha atual. Como ignora o avaliador de expressão, v pode ser muito mais rápido e deve ter preferência sobre p ou po .
Não notei nenhuma melhoria no desempenho, mas v produz uma saída melhor em alguns casos, embora não substitua po em geral, é apenas para o quadro de pilha atual com algumas limitações. Veja os exemplos abaixo.



Playgrounds


Minha seção favorita? Playgrounds! Vamos começar com problemas conhecidos:
Playgrounds podem não ser executados!
Infelizmente, esta é a única notícia sobre Playgrounds na versão beta atual.

Simulador


Algumas notas sobre o Simulator:
O Siri não funciona nos simuladores watchOS e iOS;

A sincronização da pasta entre o macOS e os dispositivos iOS simulados é mais confiável;
Eu realmente espero que seja.
Agora, você é solicitado apenas uma vez a autorizar o acesso do microfone a todos os dispositivos do simulador.
Esta é uma boa melhoria, pois muitas pessoas têm problemas com o IC e criam agentes devido a esse problema. Agora, uma solução alternativa pode ser automatizada ou, pelo menos, podemos atualizar nossos guias para configurar agentes de construção com a etapa "Executar um simulador uma vez".

Teste


xccov suporta a fusão de vários relatórios de cobertura - e seus arquivos associados - em um relatório e arquivo agregados. Ao mesclar relatórios, o relatório agregado pode ser impreciso para os arquivos de origem que foram alterados desde o momento em que os relatórios originais foram gerados. Se não houver alterações na fonte, o relatório e o arquivo agregados serão precisos;
xccov agora suporta diferentes relatórios de cobertura do Xcode, que podem ser usados ​​para calcular alterações de cobertura ao longo do tempo. Por exemplo, para diferenciar os relatórios de cobertura before.xccovreport e after.xccovreport , chame o xccov seguinte maneira: xccov diff — json before.xccovreport after.xccovreport ;
Os destinos de biblioteca e estrutura estática agora aparecem no relatório de cobertura como entradas de nível superior, com valores de cobertura de linha que são agregados em todos os destinos que incluem a biblioteca ou estrutura estática. Isso também resolve um problema em que os arquivos de origem de uma biblioteca estática ou destino de estrutura seriam incluídos no relatório de cobertura, mesmo que o próprio destino fosse excluído da cobertura de código no esquema.
Essas mudanças são excelentes notícias para a integração contínua. Especialmente diferente. Informe sua equipe de engenharia de lançamento e qualquer outra pessoa responsável por essas coisas.

No entanto, existem algumas limitações relacionadas ao teste de paralelização:
A gravação não funciona nos Clones quando a paralelização está ativada;
Os testes de criação de perfil não se comportam corretamente quando a paralelização de teste está ativada;
Existem também algumas correções de erros promissoras:
Se o teste falhar devido ao travamento do executor no teste, o Xcode tentará gerar uma rica mensagem de erro descrevendo a falha. Essa falha está presente no log de atividades de teste e aparece no stdout se você estiver usando o xcodebuild . O erro também está presente nos logs estruturados contidos no pacote configurável de resultados.
Temos muitos desses problemas e, geralmente, não está claro o que está acontecendo. Às vezes, está relacionado à vinculação incorreta, às vezes à sobrecarga do sistema. Isso deve ajudar a reduzir a descamação.
Os relatórios de falhas coletados durante o teste não omitem mais campos importantes, como o motivo e a descrição da finalização.
Nenhum comentário, apenas amor.


E o último ponto sobre o Xcode, útil para empresas com muitos desenvolvedores, o Xcode agora suporta o serviço de cache de conteúdo do macOS . Isso significa que você pode ter um servidor de cache com o aplicativo Xcode na sua rede local.

Questões


Eu encontrei alguns problemas com a versão beta. Principalmente com ferramentas de terceiros: Cartago, por exemplo, que não funciona, com o seguinte erro:

 Could not find any available simulators for iOS 

Eu verifiquei o simulador disponível e parece que algo está quebrado na versão beta atual; também é impossível baixar outros tempos de execução do Xcode, a lista de simuladores disponíveis está vazia (um radar cheio):

 $ xcrun simctl list devices --json | grep -A16 12.1 "com.apple.CoreSimulator.SimRuntime.iOS-12-1" : [ { "availability" : "(unavailable, runtime profile not found)", "state" : "Shutdown", "isAvailable" : false, "name" : "iPhone 5s", "udid" : "DDD36346-A76F-42E8-80F4-6F11E1EE4BEB", "availabilityError" : "runtime profile not found" }, { "availability" : "(unavailable, runtime profile not found)", "state" : "Shutdown", "isAvailable" : false, "name" : "iPhone 6", "udid" : "21794717-BC89-45E4-9F57-8CF9D14A87D1", "availabilityError" : "runtime profile not found" }, -- 

É uma versão beta, é claro. E o changelog é enorme. Seja paciente e razoável :)

PS Cartago já tem uma correção ( # 2691 ).

iOS 12.2 beta


Ok Parece que eles estão polindo sua dívida tecnológica e aplicando patches de segurança. Duas coisas estão quebradas:
Talvez você não consiga se autenticar na Carteira virtual depois de selecionar um cartão.

Talvez você não consiga comprar um plano de dados pré-pago usando dados de celular.
E o Apple News estará disponível no Canadá . Fique atento.

macOS Mojave 10.14.4 beta


A única novidade aqui é um possível problema com o Safari 12.1. Após a atualização do Safari 10.1.2:
Após a atualização para o Safari 12.1 a partir do Safari 10.1.2, as páginas da web podem não ser exibidas.
Solução alternativa: execute o seguinte comando no Terminal:

 defaults delete com.apple.Safari 
Com as seguintes conseqüências:
Aviso: você perderá as configurações anteriores do Safari após executar o comando acima.

Corte final


Este artigo acabou sendo muito mais longo do que eu pensava. Bem, eu pensei em todas as seções acima. Uma versão curta de todo o artigo é simplesmente 'Swift 5 chegou!'

Fique atento e hidratado! E obrigado pela leitura.

Source: https://habr.com/ru/post/pt437812/


All Articles