1. Por que é UIKit em 2026

Apple enfatiza a evolução do SwiftUI em sua WWDC anual, e a conveniência da UI declarativa não é mais duvidosa.

No entanto, este aplicativo tem requisitos de inflexão. É para fazer Time-to-Text (tempo desde a inicialização até a entrada de texto) para 500ms ou menos.

No SwiftUI, existem sobrecargas declarativas específicas da estrutura da interface do usuário, como inicialização do @StateObject, reavaliação do body e controle de tempo do .onAppear. Estes podem ser ignorados em aplicativos gerais, mas não podem ser ignorados em situações em que a otimização é realizada em milissegundos.

Por outro lado, o caminho que chama becomeFirstResponder() de viewDidAppear no UIKit é determinísticamente rápido. O ciclo de vida do ViewController é claro e você pode controlar com precisão quando o teclado é exibido.

Ajulgamento do projeto:O UIKit é usado para atender aos requisitos não funcionais do Time-to-Text 500ms ou menos.

2. A razão para eliminar completamente o Storyboard

Não é suficiente escolher o UIKit. O storyboard também tem sobrecarga que afeta o desempenho da inicialização.

  • Custo da análise XML:O Storyboard é um arquivo XML interno e precisa ser analisado na inicialização
  • Custo de resolução de Segue:Leva tempo para resolver as configurações do Segue para transições de tela
  • Complicidade desnecessária:As ferramentas de design visual do Storyboard são excessivas para aplicativos simples de memorandos

, o método de gerar ViewController diretamente com SceneDelegate foi adotado.

func scene(_ scene: UIScene, willConnectTo session: UISceneSession,
           options connectionOptions: UIScene.ConnectionOptions) {
    PerformanceLogger.shared.signpostBegin(name: "SceneConnect")
    guard let windowScene = (scene as? UIWindowScene) else { return }
    let window = UIWindow(windowScene: windowScene)
    let composeVC = ComposeViewController()
    let navController = UINavigationController(rootViewController: composeVC)
    window.rootViewController = navController
    window.makeKeyAndVisible()
    PerformanceLogger.shared.signpostEnd(name: "SceneConnect")
}

Esta abordagem atinge Zero Persing time para Storyboard e zero tempo de resolução Segui. Ao gerar o ComposeViewController diretamente do SceneDelegate, o processamento desnecessário foi completamente eliminado do caminho de inicialização.

3. A linha de visão 1DidAppear completa tudo

A maior força do UIKit é que o Ciclo de Vida do ViewController é claramente definido. Quando viewDidAppear(_:) é chamado, a visualização é totalmente exibida na tela. Ao ligar para becomeFirstResponder() neste determinado horário, você pode minimizar o atraso até que o teclado seja exibido.

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    activateTextInput()
}

private func activateTextInput() {
    textView.becomeFirstResponder()
    PerformanceLogger.shared.endTimeToText()
}

A medição por os_signpost é realizada com precisão de nanossegundos. O PerformanceLogger.shared.endTimeToText() registra o evento de término do Sinal e permite uma análise detalhada nos Instrumentos.

Resultados da medição:A meta é no máximo 500 ms. Nas medições por gravação de tela a partir do toque no ícone, realizadas no dia 11 do mês 8 de 2026 no iPhone 16e, com inicialização a quente, o campo recebeu foco em 0.17 segundos e o teclado ficou totalmente visível em 0.4 segundos.

4. Mecanismo de medição de desempenho

Os julgamentos de design são feitos com base em dados quantitativos, não no julgamento sensorial de "rápido".

  • PerformanceLogger:Loger personalizado embrulhado com os_signpost. Meça cada fase de inicialização, transmissão e atualização da interface do usuário
  • Colaboração de instrumentos:O rastreamento de precisão de nanossegundos é possível com o instrumento os_signpost do Xcode
  • Principais métricas:Time-to-Text (início → entrada), Enviar-to-Reset (botão enviar → inicialização da interface do usuário)
  • Monitoramento contínuo:Medição de desempenho em todas as construções em desenvolvimento e detecção instantânea de regressão

Desempenho é uma função. Mesmo que os usuários não exijam explicitamente "velocidade", aplicativos lentos não serão usados inconscientemente. É por isso que é importante continuar a gerenciar o desempenho numericamente.

5. Há alguma situação em que o SwiftUI é usado

UIKit não é a única opção. Existem algumas situações no aplicativo em que o SwiftUI é adequado.

  • Tela de configuração: A interface do usuário declarativa do SwiftUI aumenta a produtividade em telas não críticas que não afetam a velocidade de inicialização
  • Definição de caminho crítico:Início → Digite uma nota → Mantenha o fluxo principal de envio com UIKit
  • Complexidade híbrida:A mistura de UIKit e SwiftUI requer atenção à consistência do gerenciamento e do fluxo de dados do UIHostingController
  • Julgamento no momento: A interface do usuário do aplicativo de memorando é simples, e é melhor unificá-la com um UIKit em tela cheia para manter a consistência baseada em código

Se o desempenho do SwiftUI melhorar ainda mais no futuro, há espaço para reavaliação, mas o caminho crítico UIKit será mantido por enquanto.

Perguntas frequentes

P. É impossível iniciar 500ms ou menos no SwiftUI?
Não é impossível. No entanto, no SwiftUI@StateObjectebody. Neste desenvolvimento, que visa o mais rápido, escolhemos o UIKit, que pode controlar o ciclo de vida em detalhes (não o resultado de medir e comparar os dois nas mesmas condições).
P. Quais são as desvantagens de não usar o Storyboard?
A visualização da interface do usuário se torna uma base de código. Você não poderá arrastar e soltar o design no Interface Builder. No entanto, a interface do usuário do aplicativo memo é simples, então não é um problema criar uma interface do usuário baseada em código.
P. Quais são os resultados da medição na máquina real?
A meta é no máximo 500 ms. A medição preservada foi feita por gravação de tela a partir do toque no ícone, em 11/8/2026, no iPhone 16e com inicialização a quente. O campo recebeu foco em 0.17 segundos e o teclado ficou totalmente visível em 0.4 segundos. Durante o desenvolvimento, os_signposte analisada com Instrumentos.
P. Você planeja migrar para o SwiftUI no futuro?
O caminho crítico (início → entrada → envio) mantém o UIKit. Para telas não críticas, como a tela de configuração, há espaço para considerar a adoção do SwiftUI.