Xcode 27 chegou: requisitos, deployment targets e o que quebrou
O Xcode 27 saiu em 14 de setembro de 2026 como build 27A266a, três dias depois do item “iOS 27.0 RC” do feed e junto com o iOS 27.0 (24A437), o macOS 27.0 (26A428) e o restante das plataformas 27; no mesmo dia o App Store Connect passou a aceitar builds feitos com os SDKs 27.0 finais (GA), depois de receber builds com os SDKs RC desde 9 de setembro.15 Ele exige macOS Tahoe 26.6 ou posterior e um Mac com Apple silicon, traz o Swift 6.4 e os SDKs 27, depura dispositivos com iOS 17 ou posterior e sobe três pisos de implantação: macOS 12, watchOS 9 e DriverKit 21.23 Para projetos existentes, traz três falhas duras (a macro @State, uma quebra de código-fonte por SE-0508 e a flag de linker -ld64), uma regra de varredura de dependências que pode dar erro, uma mudança silenciosa em ARCHS_STANDARD e dois avisos; abaixo eu executo no 27A266a tudo menos a regra de varredura.246
{.answer-block}
TL;DR
- Datas e builds. O feed de lançamentos da Apple lista o Xcode 27 (27A266a) e os seis sistemas operacionais 27.0 na segunda-feira, 14 de setembro; o item “iOS 27.0 RC (24A437)” traz a data de sexta-feira, 11 de setembro, dois dias depois de o App Store Connect começar a receber uploads com o SDK RC, e a versão GA carrega o mesmo número de build.15 As próprias notas de versão do App Store Connect de 14 de setembro dizem que você já pode enviar apps compilados com o Xcode 27 tanto para a loja quanto para o TestFlight.5
- Requisitos e pisos mudaram. O Xcode 26.6 rodava no macOS 26.2 e depurava dispositivos com iOS 15; o Xcode 27 precisa do macOS 26.6, roda só em Apple silicon e depura iOS 17, tvOS 17 e watchOS 10 ou posteriores, tanto no simulador quanto em hardware. Os deployment targets mínimos sobem de macOS 11 para 12, de watchOS 8 para 9 e de DriverKit 20 para 21; iOS, iPadOS e tvOS ficam em 15, e o visionOS em 1.23
- Três falhas duras. A macro
@State: o próprio exemplo da Apple, um inicializador que atribui uma propriedade@Statecom valor na declaração antes das outras propriedades armazenadas, falha comvariable 'self.title' used before being initialized; uma propriedade computada com um literal de array ou dicionário como valor inicial e um accessorinitnão compila quando o getter vem primeiro, uma quebra de código-fonte que a Apple atribui à SE-0508; e a flag de linker-ld64, que o Xcode 15 documentou, faz o link falhar comld: library 'd64' not found.2468 - Quatro mudanças que avisam, podem dar erro ou não dizem nada. O linker ignora
-ld_classiccom um aviso porque o ld64 não existe mais; nomes duplicados de módulos Clang dentro de uma mesma varredura de dependências “may report an error” (podem reportar um erro); um target só para macOS fixado em 27.0 compila apenas arm64 a menos que você adicione x86_64 de volta, e nada avisa; e oPreviewProvidercarrega uma descontinuação em 27.0 com “Use #Preview instead.”, enquanto cada modificador de preview traz sua própria mensagem de substituição, e o compilador não mostra nenhuma delas abaixo de um deployment target 27.0.24 - A Apple não lançou o Xcode 27.1 até 15 de setembro. Nem o feed de lançamentos nem o índice de notas de versão o listam, e a página da Apple para desenvolvedores do iPhone Duo ainda data o beta do 27.1 como “later this month” (no fim deste mês); a lacuna de SDK descrita no meu post sobre o Duo para desenvolvedores continua de pé.1
O que saiu em 14 de setembro?
| Item | Build | Data no feed |
|---|---|---|
| Xcode 27 | 27A266a | seg, 14 set 2026 |
| iOS 27.0 / iPadOS 27.0 | 24A437 | seg, 14 set; o item “iOS 27.0 RC (24A437)” do feed traz a data de sex, 11 set, e o App Store Connect recebeu uploads com o SDK RC a partir de qua, 9 set |
| macOS 27.0 | 26A428 | seg, 14 set |
| tvOS 27.0 | 24J361 | seg, 14 set |
| visionOS 27.0 | 24M362 | seg, 14 set |
| watchOS 27.0 | 24R364 | seg, 14 set |
| App Store Connect | “You can now upload apps built with Xcode 27 using the SDK for iOS 27.0, iPadOS 27.0, macOS 27.0, tvOS 27.0, visionOS 27.0, and watchOS 27.0 for the App Store, and for internal and external testing through TestFlight.” (Você já pode enviar apps compilados com o Xcode 27 e os SDKs 27.0 para a App Store e para testes internos e externos pelo TestFlight.) | 14 set |
A seção Overview das notas de versão diz: “Xcode 27 includes Swift 6.4 and SDKs for iOS 27, iPadOS 27, tvOS 27, watchOS 27, macOS 27, and visionOS 27. Xcode 27 supports on-device debugging in iOS 17 and later, tvOS 17 and later, watchOS 10 and later, and visionOS. Xcode 27 requires a Mac running macOS Tahoe 26.6 or later.” (O Xcode 27 inclui o Swift 6.4 e os SDKs 27, depura em dispositivo a partir de iOS 17, tvOS 17 e watchOS 10, e exige um Mac com macOS Tahoe 26.6 ou posterior.)2 Neste Mac, xcodebuild -version imprime Xcode 27.0 Build version 27A266a e swift --version imprime Apple Swift version 6.4 (swiftlang-6.4.0.34.1 clang-2100.3.34.1).4
O que o Xcode 27 exige em comparação com o 26.6?
A tabela de compatibilidade da Apple é o documento a conferir antes de atualizar uma máquina de build. As duas linhas, lado a lado:3
| Xcode 26.6 | Xcode 27 | |
|---|---|---|
| macOS para executá-lo | Tahoe 26.2 a 26.x | Tahoe 26.6 ou posterior, só Apple silicon2 |
| SDKs | iOS, tvOS, watchOS, visionOS, macOS 26.5; DriverKit 25.5 | iOS, tvOS, watchOS, visionOS, macOS 27; DriverKit 27 |
| Deployment targets | iOS 15, tvOS 15, watchOS 8, visionOS 1, macOS 11, DriverKit 20 | iOS 15, tvOS 15, watchOS 9, visionOS 1, macOS 12, DriverKit 21 |
| Dispositivos que você pode depurar | iOS 15, tvOS 15, watchOS 8, visionOS 1 ou posterior | iOS 17, tvOS 17, watchOS 10, visionOS 1 ou posterior |
| Simuladores | iOS 15, tvOS 15, watchOS 8, visionOS 1 ou posterior | iOS 17, tvOS 17, watchOS 10, visionOS 1 ou posterior |
| Compilador Swift | 6.3 | 6.4 (modos de linguagem 6, 5, 4.2 e 4) |
Duas consequências se escondem atrás dessas linhas. O Instruments agora recusa dispositivos anteriores a iOS 17, watchOS 10 ou tvOS 17, então uma bancada de profiling montada em um iPhone antigo para de funcionar antes de qualquer linha do app.2 E a Apple delimita as interações de teclado e ponteiro do Device Hub em uma única frase: “only supported on the following OS versions and newer: macOS 15.0, iOS 18.0, tvOS 18.0, watchOS 11.0, visionOS 2.0.” (só têm suporte nessas versões de sistema ou mais novas).2
A exigência de Apple silicon não tem contorno para o Mac em que você roda o Xcode, e não é novidade para quem leu o post sobre Intel em julho; as notas GA mantêm o texto de julho na íntegra: “Xcode 27 will only install and run on Apple silicon Macs. The macOS 27 SDK supports back deploying Universal (Intel and Apple Silicon) apps to macOS 12 and later. Intel development is still possible with macOS versions that support Rosetta like macOS 27.” (O Xcode 27 só instala e roda em Macs com Apple silicon; o SDK do macOS 27 permite implantar apps Universal até o macOS 12; desenvolver para Intel continua possível em versões do macOS que suportam Rosetta, como o macOS 27.)2 A terceira frase é o contorno para os Macs aos quais você distribui, não para o que você usa para compilar.
O que mudou na toolchain?
O linker. As notas GA dizem em uma frase: “The ld64 linker has been removed and the -ld_classic option is no longer supported.” (o linker ld64 foi removido e a opção -ld_classic não tem mais suporte).2 É assim que fica no 27A266a: o usr/bin da toolchain contém um único binário de linker, ld, que se identifica como ld-27037.1, compilado em 25 de agosto de 2026. Passar a flag antiga não faz o link falhar. Com um hello.c contendo a única linha int main(void){return 0;}, clang hello.o -o hello_classic -Xlinker -ld_classic imprime ld: warning: -ld_classic is no longer supported and will be ignored, sai com 0 e grava o executável. A outra grafia que a Apple documentou no Xcode 15, -ld64, se sai pior:8 clang hello.c -o hello_ld64 -Wl,-ld64 falha com ld: library 'd64' not found e sai com 1, porque o novo linker lê -ld64 como -l d64, um pedido por uma biblioteca chamada d64.4 Então um projeto que carrega -ld_classic em OTHER_LDFLAGS continua compilando, com um aviso novo a cada link, e qualquer comportamento que ele obtinha do linker antigo sumiu; um projeto que carrega -ld64 para de linkar, com um erro que nunca cita o linker. Meu post sobre o ld64 audita de onde vieram essas flags e registra as duas execuções.
As arquiteturas padrão. A seção Intel Deprecation enuncia a regra: “Build targets with a min deployment target set to macOS 27.0 or DriverKit 27.0 will not build Universal by default. The ARCHS_STANDARD build setting will no longer include x86_64 when MACOSX_DEPLOYMENT_TARGET or DRIVERKIT_DEPLOYMENT_TARGET >= 27.0.” (targets com deployment target mínimo 27.0 em macOS ou DriverKit não compilam mais em Universal por padrão, porque ARCHS_STANDARD deixa de incluir x86_64).2 Eu reproduzi isso em um projeto multiplataforma (Yawara, com SUPPORTED_PLATFORMS = iphoneos iphonesimulator macosx xros xrsimulator) com xcodebuild -showBuildSettings -sdk macosx; sem o argumento -sdk o projeto não resolve ARCHS_STANDARD nenhum, um detalhe que o post sobre Intel cobre. Com MACOSX_DEPLOYMENT_TARGET = 26.0 a configuração resolve para ARCHS_STANDARD = arm64 x86_64; com 27.0 resolve para ARCHS_STANDARD = arm64, enquanto ARCHS_STANDARD_64_BIT fica em arm64 x86_64 nos dois casos.4 Nada avisa. Se você distribui em Universal e sobe o target, adicione x86_64 a ARCHS por conta própria.
A biblioteca padrão de C++. “The minimum supported deployment target on macOS for the C++ standard library has been increased to 11.0,” (o deployment target mínimo da biblioteca padrão de C++ no macOS subiu para 11.0) e as notas listam mudanças de comportamento sob “Potentially breaking changes,” começando por multi{map,set}::find, que não retorna mais necessariamente o primeiro elemento correspondente.2 A lista de novidades é longa: hashing para valores de std::chrono, zip, std::optional<T&>, std::views::indices(n) e mais.2
A varredura de dependências, e a regra que pode derrubá-la. A Apple diz que otimizou o scanner de dependências do Swift “to avoid redundant setup work and header searches when looking up Clang modules during a single dependency-scan action,” (para evitar trabalho de preparação e buscas de headers redundantes ao localizar módulos Clang dentro de uma mesma ação de varredura) e o ganho de velocidade vem com uma exigência: “every Clang module reachable from a single Swift dependency-scan action must have a unique module name. If two module maps visible to the same scan declare a Clang module with the same name, the scan may report an error. Previously, the scanner may have tolerated duplicating names.” (todo módulo Clang alcançável a partir de uma mesma varredura precisa ter nome único; se dois module maps visíveis à mesma varredura declaram um módulo Clang com o mesmo nome, a varredura pode reportar um erro, algo que o scanner talvez tolerasse antes).2 A Apple nomeia as duas formas que disparam isso: “projects or SDKs that vend the same Clang module name from more than one location on the header search path, and vendored third-party sources that ship a module.modulemap redeclaring an SDK module.” (projetos ou SDKs que expõem o mesmo nome de módulo Clang a partir de mais de um local no caminho de busca de headers, e fontes de terceiros incorporadas ao projeto que trazem um module.modulemap redeclarando um módulo do SDK).2 Como a remoção do linker, a regra dispara na atualização da toolchain, não conforme o deployment target; meu post sobre o ld64 passa dois module maps em colisão pelo scanner, compila um shim SQLite3 incorporado que esconde o módulo do SDK e audita sete projetos em busca das duas formas.
O que para de compilar?
A macro @State. A mudança mora nas notas de versão do iOS 27, não nas do Xcode, e depende do compilador com que você compila, não do target para o qual você implanta: “Xcode 27 introduces a new @State implementation that avoids this repeated evaluation. This new behavior back-deploys to iOS 17 aligned OSes. The new @State is implemented with a Swift macro. It is largely source compatible with the property wrapper version, with a few exceptions.” (O Xcode 27 introduz uma nova implementação de @State como macro Swift, que retroage até os sistemas alinhados ao iOS 17 e é em grande parte compatível em código-fonte com a versão de property wrapper, com algumas exceções.)6 A Apple nomeia quatro exceções e dá listagens de código para duas delas; as outras duas recebem uma ou duas frases cada: “In rare situations, the automatic inference of generic arguments of @State is less flexible with the macro implementation. Write the type with more specificity.” (em situações raras, a inferência automática de argumentos genéricos de @State é menos flexível com a macro; escreva o tipo com mais especificidade) e “Composing @State with other property wrappers or macros is not supported.” (compor @State com outros property wrappers ou macros não tem suporte).6 As duas com listagem são as que pegam código existente. Um inicializador que atribui uma propriedade @State que já tem valor na declaração: o SwiftUI sempre descartou essa atribuição, e agora “some such cases no longer compile.” (alguns desses casos não compilam mais).6 E o inicializador memberwise privado que o compilador sintetiza quando todo membro armazenado é privado: “The state macro disables this synthesized initializer. So the code above no longer compiles.” (a macro desativa esse inicializador sintetizado, então o código acima não compila mais).6 No 27A266a o primeiro exemplo falha do jeito que está escrito, com error: variable 'self.title' used before being initialized na linha que atribui page, porque o setter da macro roda contra self antes de title existir; mova self.title = title para cima e o mesmo arquivo compila, com a atribuição a @State descartada como antes.46 O segundo exemplo, uma extensão chamando self.init(page: page, title: title) em um struct cujo @State não tem valor na declaração, compilou sem alteração na minha execução, e a expansão da macro mostra a forma que permite isso: a macro emite private var _page: SwiftUICore.State<StickerPage> por trás de um accessor init com @storageRestrictions(initializes: _page), a construção que deixa um inicializador memberwise receber page:.4 Leia a nota como uma descrição de formas a verificar, e depois confirme cada uma no seu próprio código. O post sobre a macro @State conta os dois padrões em quatro apps publicados; eu o escrevi a partir das notas do beta em julho, antes deste teste GA, e a pergunta em aberto dele também se fecha aqui: atribuir o armazenamento de apoio diretamente, _page = State(initialValue:) dentro de um inicializador, compila no 27A266a com e sem valor na declaração.4
A quebra da SE-0508. Em Swift Compiler, Known Issues: “A computed property with both an init accessor and an array/dictionary literal initial value will no longer compile if the getter is declared before the init accessor.” (uma propriedade computada com um accessor init e um literal de array ou dicionário como valor inicial não compila mais se o getter é declarado antes do accessor init). Segue uma listagem de código e depois a atribuição: “This is a known source break from SE-0508.” A solução, na íntegra: “Swap the init accessor and the getter such that the init accessor is declared first.” (troque o accessor init e o getter de lugar para que o accessor init seja declarado primeiro).2 A SE-0508 é “Array expression trailing closures”, implementada no Swift 6.4, e a proposta prevê exatamente este caso: “If the getter is declared before the init accessor, we will now attempt to parse as a trailing closure,” (se o getter é declarado antes do accessor init, agora tentaremos interpretar como trailing closure) acrescentando que “init accessors are however considered for disambiguation, so swapping the accessors is sufficient to make this valid regardless of initial value used,” (os accessors init entram na desambiguação, então trocar os accessors basta para tornar isso válido independentemente do valor inicial) e que o caso “does not appear in the source compatibility suite, or for internal Swift projects at Apple.” (não aparece na suíte de compatibilidade de código-fonte nem nos projetos internos de Swift na Apple).7 Ele se reproduz com um struct de nove linhas. Com o getter primeiro, o swiftc falha na linha do accessor com error: initializers may only be declared within a type; mova o accessor init com @storageRestrictions(initializes:) para cima de get e o mesmo arquivo compila.4
struct Container {
private var storage: [Int] = []
var items: [Int] = [] {
@storageRestrictions(initializes: storage)
init(initialValue) { storage = initialValue } // precisa vir antes de get
get { storage }
set { storage = newValue }
}
}
PreviewProvider. A seção Previews lista uma descontinuação: “PreviewProvider and its family of preview modifiers.” (PreviewProvider e sua família de modificadores de preview).2 O SDK a carrega, com uma mensagem para o protocolo e outra diferente para cada modificador. Na interface SwiftUI do SDK do iOS 27, public protocol PreviewProvider fica sob @available(anyAppleOS, deprecated: 27.0, message: "Use #Preview instead."); previewLayout diz “Use #Preview(traits: .sizeThatFitsLayout) or .fixedLayout(width:height:) instead.”; previewDisplayName diz “Use #Preview(“name”) instead.”; previewInterfaceOrientation diz “Use #Preview(traits: .landscapeLeft) or other orientation traits instead.”; previewDevice diz “Use the device picker in Xcode’s canvas.” (use o seletor de dispositivo no canvas do Xcode); e previewContext, junto com os protocolos PreviewContext e PreviewContextKey, diz “Use #Preview with a Widget timeline provider or entries instead.” (use #Preview com um timeline provider ou entradas de Widget).4 Dois fatos decidem se você algum dia vê essas mensagens. O compilador compara a versão da descontinuação com o deployment target, então os modificadores só avisam em um target cujo mínimo seja 27.0: um arquivo que usa previewLayout, previewDisplayName e previewDevice produziu três avisos com -target arm64-apple-ios27.0-simulator e nenhum com 17.0 ou 26.0. E o PreviewProvider em si nunca avisa, por um motivo diferente. O SDK o declara com @available(iOS 13.0, macOS 10.15, tvOS 13.0, watchOS 6.0, *) logo acima da descontinuação anyAppleOS, e na minha sondagem um protocolo com esse par não produziu aviso nenhum, nem para uma conformidade nem para um uso como tipo de parâmetro, em um target 27.0, enquanto o mesmo protocolo descontinuado só com @available(iOS, deprecated: 27.0), ou só com a forma anyAppleOS, avisou nos dois; os modificadores carregam apenas a descontinuação anyAppleOS nas próprias declarações (a extension SwiftUICore.View que os contém carrega o atributo de introdução, e essa forma herdada não suprime o aviso), e é por isso que eles avisam e o protocolo não.4 Em qualquer deployment target que você realmente distribua, o log de build fica em silêncio nos dois casos, então procure PreviewProvider e os modificadores e migre para #Preview, que o canvas agora renderiza em grades por argumento com a nova sintaxe #Preview(arguments:).24
O novo stat() do System. A biblioteca System agora oferece APIs Swift para stat, lstat, fstat e fstatat, com um tipo Stat e métodos de instância FilePath.stat().2 As notas listam como resolvido um conflito em que uma extensão chamando um stat() não qualificado colidia com os novos métodos; se você adicionou a qualificação Darwin. enquanto esse conflito estava ativo, ela pode ficar.2
Address Sanitizer, na direção contrária. “Address Sanitizer might fail to launch on iOS 27.0, tvOS 27.0, watchOS 27.0, and visionOS 27.0 when building with Xcode 26.4 or older.” (o Address Sanitizer pode falhar ao iniciar nos sistemas 27.0 ao compilar com o Xcode 26.4 ou anterior). A solução é o Xcode 26.5 ou posterior, o que importa para equipes que mantêm um Xcode mais antigo na máquina de CI enquanto os dispositivos atualizam para 27.0.2
O que mudou no IDE e nas ferramentas?
- O Interface Builder compila sem simulador. Um novo modo de compilação,
toolchain, “for UIKit (Cocoa Touch) based documents. Enabled by default,toolchainallows compiling IB documents without the need to download a simulator, which is especially useful for build servers.” (para documentos baseados em UIKit; ativado por padrão, permite compilar documentos do IB sem baixar um simulador, o que é especialmente útil em servidores de build).2 - Os simuladores iniciam mais rápido, e reiniciam. “The simulator runtimes now contain a pre-built dyld cache. This will make first launch of a simulator much faster,” (os runtimes do simulador agora contêm um cache dyld pré-construído, o que torna o primeiro início muito mais rápido) e o
simctlganha um comandoreboot.2 Um problema conhecido sobrevive, nas palavras da Apple: “Some simulator runtimes are not completely deleted when removed, re-appearing after a reboot.” (alguns runtimes do simulador não são apagados por completo ao serem removidos e reaparecem depois de um reinício).2 - O JSON do devicectl está na versão 5.
xcrun devicectl --versionreporta 642.16 elist devices --json-outputgrava"jsonVersion": 5; a Apple descontinua os camposhardwareProperties,devicePropertieseconnectionPropertiesem favor de um dicionárioproperties, e qualquer resultado que ainda os contenha carrega um_deprecationNotice.24 - Testes de StoreKit. A interface de configuração do StoreKit pode definir códigos de oferta, você pode configurar pacotes de assinatura para testes locais, e o Transaction Manager pode exercitar compras com códigos de oferta sem dispositivo.2
- Organizer. Um Insights Overview “summarizes high-impact performance regressions,” (resume as regressões de desempenho de alto impacto) e uma métrica Hitches substitui a métrica Scrolling.2
- Assistente de código. O Google Gemini entra na lista de modelos, e “Planning with agents is now first class in Xcode,” (planejar com agentes agora é recurso de primeira classe no Xcode) com planos como artefatos Markdown editáveis que você aprova antes de o agente prosseguir; meu post sobre agentes de código cobre o fluxo desde o beta, e as notas GA listam um editor Markdown exatamente para esses artefatos.2
- Localização. Agentes podem traduzir entradas de String Catalog, e exportar localizações agora extrai
NSLocalizedStringe macros semelhantes de arquivos header.2 - Icon Composer. As notas o chamam de Icon Composer 2.0, “a new sharper rendering mode for upcoming 2027 operating systems” (um novo modo de renderização mais nítido para os sistemas operacionais de 2027); o bundle dentro do 27A266a reporta a versão 27.0.24
- Testes. Um test plan pode definir como o Xcode trata um crash do app alvo durante testes de UI, de desligado a falha fatal, e
swift testganha--maximum-repetitionscom--repeat-until [pass|fail]mais um resumo de falhas no final.2 - Depuração. Com bridging headers, o LLDB “can now directly import explicitly built Swift modules and PCH from DerivedData,” (agora pode importar diretamente do DerivedData os módulos Swift construídos explicitamente e os PCH) e um comando
language swift task treelista as tasks de concorrência do Swift.2
O que eu faria esta semana
- Leia as linhas de compatibilidade antes de mexer no CI: macOS 26.6 nos Macs de build, só Apple silicon, iOS 17 como dispositivo de teste mais antigo, e o piso de macOS 12, watchOS 9 ou DriverKit 21 em que o seu produto se encaixa.23
- Faça grep por
-ld_classice-ld64e remova os dois; o linker ignora o primeiro com um aviso a cada link e falha de vez no segundo. Já que você está nas configurações de build, procure arquivosmodule.modulemapescritos à mão que redeclarem um módulo do SDK, a forma que a Apple nomeia para a regra do nome de módulo único.24 - Se você fixar qualquer target de macOS ou DriverKit em 27.0 e distribuir para Intel, defina
ARCHSexplicitamente;ARCHS_STANDARDsozinho entrega arm64, o que eu reproduzi para macOS e a Apple afirma para os dois.24 - Procure
PreviewProvider,previewLayout,previewDisplayNameepreviewDevice, e siga a mensagem de cada anotação: o protocolo para#Preview,previewLayoutpara#Preview(traits: .sizeThatFitsLayout)ou.fixedLayout(width:height:),previewDisplayNamepara#Preview("name")epreviewDevicepara o seletor de dispositivo no canvas. Os modificadores só avisam em um deployment target 27.0 e a conformidade aPreviewProvidernunca avisa em target nenhum, então o log de build de um target de produção fica em silêncio.4 - Compile uma vez com o Xcode 27 e leia dois diagnósticos:
variable 'self.title' used before being initializedem um inicializador que atribui uma propriedade@Stateque já traz valor na declaração antes das outras propriedades armazenadas, que o post sobre a macro @State percorre passo a passo, einitializers may only be declared within a typeem propriedades com um literal de array ou dicionário como valor inicial e um accessor init, onde você move o accessor para cima do getter.246 - Envie um build para o TestFlight com os SDKs 27 agora que o App Store Connect os aceita, e mantenha em mente a regra da launch screen e a obrigatoriedade de cenas do UIKit, já que as duas passam a valer para o app no momento em que ele linka contra o 27.56
Perguntas frequentes
Quando o Xcode 27 saiu?
Na segunda-feira, 14 de setembro de 2026, como build 27A266a, no mesmo dia que iOS 27.0, iPadOS 27.0, macOS 27.0, tvOS 27.0, visionOS 27.0 e watchOS 27.0; o feed data o item iOS 27.0 RC (24A437) em 11 de setembro, dois dias depois de o App Store Connect começar a receber builds com o SDK RC.15
Qual macOS o Xcode 27 exige?
macOS Tahoe 26.6 ou posterior em um Mac com Apple silicon. Ele não instala nem roda em Macs Intel. Roda no macOS 27.0, que saiu no mesmo dia.23
Quais são os deployment targets mínimos no Xcode 27?
iOS 15, iPadOS 15, tvOS 15, watchOS 9, visionOS 1, macOS 12 e DriverKit 21. Em comparação com o Xcode 26.6, o watchOS subiu de 8, o macOS de 11 e o DriverKit de 20.3
O Xcode 27 ainda compila apps Universal para Mac?
Sim, até o macOS 12, mas não por padrão quando o MACOSX_DEPLOYMENT_TARGET de um target é 27.0: ARCHS_STANDARD então resolve para arm64 sozinho, e você mesmo adiciona x86_64 a ARCHS.24
O Xcode 27.1 já saiu?
Não até 15 de setembro de 2026. O feed de lançamentos da Apple e o índice de notas de versão do Xcode listam só o Xcode 27, e a página da Apple para desenvolvedores do iPhone Duo ainda lista o beta do Xcode 27.1 como “Coming later this month” (chega no fim deste mês); o SDK do iPhone Duo não faz parte deste lançamento.1
Onde estão as notas de versão do Xcode 27?
No site de documentação para desenvolvedores da Apple, em Xcode Release Notes, uma página para o lançamento; as seções citadas aqui são Overview, Linking, Intel Deprecation, Previews, Swift Compiler, Address Sanitizer, Instruments, Device Hub, devicectl, Simulator, Interface Builder, C++ Standard Library, Organizer, Coding Intelligence, Source Editor, Icon Composer, StoreKit Testing in Xcode, Localization, Testing, Swift Package Manager, Debugging e System.2 A mudança da macro @State está, em vez disso, nas notas de versão do iOS e iPadOS 27, em SwiftUI.6
Fontes
-
Apple, Releases, feed RSS consultado em 15 de setembro de 2026: “Xcode 27 (27A266a)”, “iOS 27.0 (24A437)”, “iPadOS 27.0 (24A437)”, “macOS 27.0 (26A428)”, “tvOS 27.0 (24J361)”, “visionOS 27.0 (24M362)”, “watchOS 27.0 (24R364)” e “App Store Connect Update”, todos datados de segunda-feira, 14 de setembro de 2026; “iOS 27.0 RC (24A437)” datado de sexta-feira, 11 de setembro de 2026. O índice de Xcode Release Notes lista uma única entrada 27, “Xcode 27 Release Notes”; nenhum item 27.1 aparece em nenhum dos dois lugares. Apple Developer, Get Ready for iPhone Duo, consultada em 15 de setembro de 2026: “Xcode 27.1 beta. Get the latest SDKs to build, run, and test your app for iPhone Duo. Coming later this month”. ↩↩↩↩↩
-
Apple, Xcode 27 Release Notes, consultadas em 15 de setembro de 2026 após o lançamento GA. Seções citadas: Overview; Linking, Deprecations (“The ld64 linker has been removed and the
-ld_classicoption is no longer supported.” 165165518); Intel Deprecation, New Features (ARCHS_STANDARD, 161837535) e Deprecations (só Apple silicon, citada na íntegra, 162138432); Previews, Deprecations (“PreviewProviderand its family of preview modifiers.” 144168701) e New Features (#Preview(arguments:), 167544057); Swift Compiler, New Features (scanner de dependências e a exigência de nome de módulo único, em trechos, 136303612) e Known Issues (SE-0508, 180969028; frase da solução citada na íntegra); System, New Features e Resolved Issues (177911316); Address Sanitizer, Known Issues (178072780); Instruments, Deprecations (166097304); Device Hub, Deprecations (160482487); devicectl, New Features (170812159) e Deprecations (183772705); Simulator, New Features (179846743, 172303413) e Known Issues (141290052); Interface Builder, New Features; C++ Standard Library, New Features e Deprecations; Organizer; Coding Intelligence (171990272, 172857081); Source Editor, New Features (editor Markdown, 175022151); Localization; Icon Composer; StoreKit Testing in Xcode; Testing; Swift Package Manager, New Features (--maximum-repetitions, 177561078; resumo de falhas, 168311253); Debugging. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩ -
Apple, Xcode support: minimum requirements and supported SDKs, consultada em 15 de setembro de 2026. Linha do Xcode 27: macOS Tahoe 26.6 ou posterior; SDKs iOS 27, tvOS 27, watchOS 27, visionOS 27, macOS 27, DriverKit 27; deployment targets iOS 15 a 27, iPadOS 15 a 27, tvOS 15 a 27, watchOS 9 a 27, visionOS 1 a 27, macOS 12 a 27, DriverKit 21 a 27; suporte a dispositivos iOS 17, tvOS 17, watchOS 10, visionOS 1 ou posterior; simulador iOS 17, tvOS 17, watchOS 10, visionOS 1 ou posterior; compilador Swift 6.4 com modos de linguagem 6, 5, 4.2 e 4. Linha do Xcode 26.6: macOS Tahoe 26.2 a 26.x; SDKs em 26.5 com DriverKit 25.5; deployment targets iOS 15, tvOS 15, watchOS 8, visionOS 1, macOS 11, DriverKit 20; suporte a dispositivos e simulador a partir de iOS 15, tvOS 15, watchOS 8, visionOS 1; Swift 6.3. ↩↩↩↩↩↩
-
Reprodução do autor no Xcode 27.0 (27A266a) com
DEVELOPER_DIRapontado para ele, macOS 26.6.2 (25G83), 15 de setembro de 2026.xcodebuild -version: “Xcode 27.0 Build version 27A266a”;swift --version: “Apple Swift version 6.4 (swiftlang-6.4.0.34.1 clang-2100.3.34.1)”; ousr/binda toolchain lista um único linker,ld, eld -vimprime “PROJECT:ld-27037.1” compilado em “Aug 25 2026”; com umhello.ccontendoint main(void){return 0;},clang hello.o -o hello_classic -Xlinker -ld_classicimprimiu “ld: warning: -ld_classic is no longer supported and will be ignored” e saiu com 0, eclang hello.c -o hello_ld64 -Wl,-ld64imprimiu “ld: library ‘d64’ not found” e “clang: error: linker command failed with exit code 1 (use -v to see invocation)” e saiu com 1 sem arquivo de saída.xcodebuild -showBuildSettings -sdk macosxno Yawara.xcodeproj, um projeto multiplataforma (SUPPORTED_PLATFORMS = iphoneos iphonesimulator macosx xros xrsimulator) que não imprime linhaARCHS_STANDARDnenhuma sem um argumento-sdk:ARCHS_STANDARD = arm64 x86_64comMACOSX_DEPLOYMENT_TARGET = 26.0,ARCHS_STANDARD = arm64com 27.0,ARCHS_STANDARD_64_BIT = arm64 x86_64nos dois. O structContainerde nove linhas comvar items: [Int] = []e um accessor@storageRestrictions(initializes: storage) init(initialValue): com o getter primeiro falha com “error: initializers may only be declared within a type” na linha doinit; com o accessor primeiro compila com saída 0.SwiftUI.swiftmodule/arm64e-apple-ios.swiftinterfaceno SDK do iPhoneOS 27.0:@available(anyAppleOS, deprecated: 27.0, message: "Use #Preview instead.")nas linhas 14971 (public protocol PreviewProvider), 14978 (sua extensão) e 14991 (PreviewPlatform); “Use #Preview with a Widget timeline provider or entries instead.” em 15023 (PreviewContextKey), 15029 (PreviewContext) e 15069 (previewContext); “Use the device picker in Xcode’s canvas.” em 15053 (previewDevice); “Use #Preview(traits: .sizeThatFitsLayout) or .fixedLayout(width:height:) instead.” em 15058 (previewLayout); “Use #Preview("name") instead.” em 15063 (previewDisplayName); “Use #Preview(traits: .landscapeLeft) or other orientation traits instead.” em 15075 (previewInterfaceOrientation); umswiftc -cde uma conformidade simples aPreviewProvidernão emitiu aviso com-target arm64-apple-ios27.0-simulator,ios26.0nemios17.0; um arquivo aplicandopreviewLayout(.sizeThatFits),previewDisplayName("Card")epreviewDevice(PreviewDevice(rawValue: "iPhone 18 Pro"))dentro de umPreviewProvideremitiu três avisos[#DeprecatedDeclaration]comios27.0(“‘previewLayout’ was deprecated in any Apple OS 27.0: Use #Preview(traits: .sizeThatFitsLayout) or .fixedLayout(width:height:) instead.” e as mensagens correspondentes depreviewDisplayNameepreviewDevice) e nenhum comios26.0nemios17.0. Uma sondagem com quatro protocolos, cada um com um struct em conformidade e um parâmetroany Pem uma assinatura de função, compilada com-target arm64-apple-ios27.0-simulator:@available(iOS, deprecated: 27.0)sozinho,@available(anyAppleOS, deprecated: 27.0)sozinho e@available(iOS 13.0, *)acima de@available(iOS, deprecated: 27.0)avisaram cada um na linha da conformidade e no tipo do parâmetroany P(“‘P1’ was deprecated in iOS 27.0”, “‘P2’ was deprecated in any Apple OS 27.0”, “‘P4’ was deprecated in iOS 27.0”), enquanto o par do SDK,@available(iOS 13.0, macOS 10.15, tvOS 13.0, watchOS 6.0, *)acima de@available(anyAppleOS, deprecated: 27.0), não produziu aviso em nenhum dos dois; as chamadas de método por esses existenciais não produziram diagnóstico para nenhum dos quatro, e comios26.0nenhum dos quatro avisou. Na interface,PreviewProviderfica nas linhas 14970 a 14972 sob exatamente esse par;previewLayout, nas linhas 15058 a 15059, carrega só a descontinuaçãoanyAppleOSna própria declaração, dentro de umaextension SwiftUICore.Viewcujo atributo de introdução fica na linha 15051. Um arquivo com duas views atribuindo_page = State(initialValue: StickerPage(title: title))dentro deinit(title:), uma com@State private var page: StickerPagee outra com@State private var page = StickerPage(), compilou comios27.0com saída 0 e sem diagnósticos. As sondagens de@State, cada uma umStickerPageViewcom@State private var pageelet title: String, compiladas comswiftc -c -target arm64-apple-ios27.0-simulatorcontra o SDK do iPhoneSimulator 27.0: o primeiro exemplo da Apple,@State private var page = StickerPage()com uminit(title:)que atribuiself.pagee depoisself.title, falhou com “error: variable ‘self.title’ used before being initialized” na linha deself.page, saída 1; o mesmo arquivo comself.title = titlemovido para cima da atribuição deself.pagecompilou, saída 0; o segundo exemplo da Apple,@State private var page: StickerPagesem valor inicial e uma extensão chamandoself.init(page: page, title: title), compilou, saída 0, e-Xfrontend -dump-macro-expansionsmostrou a macro emitindoprivate var _page: SwiftUICore.State<StickerPage>com um accessor@storageRestrictions(initializes: _page) init(initialValue).xcrun devicectl --version: 642.16;devicectl list devices --json-outputgravou"jsonVersion": 5. OInfo.plistdo Icon Composer dentro do 27A266a:CFBundleShortVersionString27.0. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩ -
Apple, App Store Connect release notes, consultadas em 15 de setembro de 2026. A entrada de 14 de setembro de 2026 está citada na íntegra na tabela acima; as entradas de 9 de setembro de 2026 registram os uploads com o SDK RC e acrescentam especificações de capturas de tela e prévias de app para iPhone Duo, iPhone 18 Pro Max, iPhone 18 Pro, Apple Watch Ultra 4 e Apple Watch Series 12, com “Support for uploading assets for iPhone Duo in App Store Connect will be available later this year.” (o upload de recursos para o iPhone Duo no App Store Connect estará disponível ainda este ano). ↩↩↩↩↩
-
Apple, iOS & iPadOS 27 Release Notes, SwiftUI, New Features (105893279), consultadas em 15 de setembro de 2026. Fonte de “Xcode 27 introduces a new
@Stateimplementation that avoids this repeated evaluation. This new behavior back-deploys to iOS 17 aligned OSes. The new@Stateis implemented with a Swift macro. It is largely source compatible with the property wrapper version, with a few exceptions.”; de “If you provide an initial value at@Statedeclaration, and also try to assign a value to it in an initializer, the initializer value is discarded. This behavior has not changed because of the macro, but some such cases no longer compile:” com a listagem deStickerPageView; de “When all stored members of a struct are private, the compiler synthesizes a private init that can be used in an extension of the same type:” com sua listagem; e de “The state macro disables this synthesized initializer. So the code above no longer compiles. To mitigate, assign value to members explicitly:”; também das duas exceções sem listagem, “In rare situations, the automatic inference of generic arguments of@Stateis less flexible with the macro implementation. Write the type with more specificity.” e “Composing@Statewith other property wrappers or macros is not supported.” A seção UIKit do mesmo documento traz as duas exigências citadas no passo 6: New Features, “iOS and iPadOS apps built with the 27.0 SDK or later are required to include a launch screen.” (168247372), e Deprecations, “Apps built with the latest SDK must adopt the scene-based life cycle or they fail to launch.” (141837548). ↩↩↩↩↩↩↩↩↩↩ -
Cal Stephens, SE-0508: Array expression trailing closures, Swift Evolution, status “Implemented (Swift 6.4)”, implementação swiftlang/swift#86244, consultada em 15 de setembro de 2026. A subseção “Init accessors” é a fonte de “One other case where this can result in an error is for properties with both an
initaccessor and initial value that is either an array or dictionary literal. If the getter is declared before theinitaccessor, we will now attempt to parse as a trailing closure:”, da frase sobre desambiguação citada acima e de “This particular case appears to be quite rare in practice, it does not appear in the source compatibility suite, or for internal Swift projects at Apple.” ↩ -
Apple, Xcode 15 Release Notes, Linking, New Features (108915312), consultadas em 15 de setembro de 2026: “The classic linker can still be explicitly requested using -ld64, and will be removed in a future release.” (o linker clássico ainda pode ser pedido explicitamente com -ld64 e será removido em uma versão futura). ↩↩