View in English

  • Apple 开发者
    • 入门汇总

    探索“入门汇总”

    • 概览
    • 学习
    • Apple Developer Program

    及时了解最新动态

    • 最新动态
    • 开发者你好
    • 平台

    探索“平台”

    • Apple 平台
    • iOS
    • iPadOS
    • macOS
    • Apple tvOS
    • visionOS
    • watchOS
    • App Store

    精选

    • 设计
    • 分发
    • 游戏
    • 配件
    • 网页
    • Home
    • CarPlay 车载
    • 技术

    探索“技术”

    • 概览
    • Xcode
    • Swift
    • SwiftUI

    精选

    • 辅助功能
    • App Intents
    • Apple 智能
    • 游戏
    • 机器学习与 AI
    • 安全性
    • Xcode Cloud
    • 社区

    探索“社区”

    • 概览
    • “与 Apple 会面交流”活动
    • 社区主导的活动
    • 开发者论坛
    • 开源

    精选

    • WWDC
    • Swift Student Challenge
    • 开发者故事
    • App Store 大奖
    • Apple 设计大奖
    • Apple Developer Centers
    • 文档

    探索“文档”

    • 文档库
    • 技术概述
    • 示例代码
    • 《人机界面指南》
    • 视频

    发布说明

    • 精选更新
    • iOS
    • iPadOS
    • macOS
    • watchOS
    • visionOS
    • Apple tvOS
    • Xcode
    • 下载

    探索“下载”

    • 所有下载
    • 操作系统
    • 应用程序
    • 设计资源

    精选

    • Xcode
    • TestFlight
    • 字体
    • SF Symbols
    • Icon Composer
    • 支持

    探索“支持”

    • 概览
    • 帮助指南
    • 开发者论坛
    • “反馈助理”
    • 联系我们

    精选

    • 《开发者账户帮助》
    • 《App 审核指南》
    • 《App Store Connect 帮助》
    • 即将实行的要求
    • 协议和准则
    • 系统状态
  • 快速链接

    • 活动
    • 新闻
    • 论坛
    • 示例代码
    • 视频
 

视频

打开菜单 关闭菜单
  • 专题
  • 所有视频
  • 关于

更多视频

  • 简介
  • 概要
  • 代码
  • Swift 的新功能

    与我们一起了解 Swift 的最新更新。探索语言方面的最新进展,包括提升日常开发体验的更新、改进的并发性,以及更安全的高性能代码。了解工作流程和语言互操作性的改进,以及嵌入式 Swift 的更新。

    章节

    • 0:07 - Introduction
    • 0:44 - Everyday Language Improvements
    • 1:55 - anyAppleOS Availability
    • 3:02 - @diagnose Attribute
    • 3:52 - Module Selectors (::)
    • 5:59 - Library Updates
    • 6:16 - Standard Library
    • 7:31 - Swift Testing Updates
    • 9:29 - Subprocess 1.0
    • 10:14 - Foundation
    • 11:59 - Beyond Apple Platforms
    • 12:35 - Swift–C Interoperability (@C attribute)
    • 15:09 - Swift-Java
    • 16:03 - Editor support
    • 16:44 - WebAssembly (Wasm) & JavascriptKit
    • 18:08 - Embedded Swift
    • 19:59 - Performance Tuning
    • 21:29 - Optimizer Control: @inline(always) & @specialized
    • 24:29 - Ownership System & Noncopyable Types
    • 26:18 - Iterable Protocol & Borrow/Mutate Accessors
    • 28:57 - New Standard Library Types: UniqueBox, UniqueArray, Ref
    • 31:11 - The Future of Swift

    资源

    • Swift Blog
    • Explore documentation on swift.org
    • Swift Forums
      • 高清视频
      • 标清视频

    相关视频

    WWDC26

    • 使用 gRPC 和 Swift 构建实时 App 及服务
    • 迁移到 Swift Testing
  • 搜索此视频…
    • 1:12 - Better Swift Concurrency diagnostics (catching in the task)

      Task {
          do {
              try lander.fly(to: moon)
          }
          catch {
              lander.abort()
          }
      }
    • 1:21 - Better Swift Concurrency diagnostics (saving the task for later)

      let landingTask = Task {
          try lander.fly(to: moon)
      }
      
      defer {
          await orbiter.rendezvous(with: lander)
      }
      
      try await orbiter.justHangOut(waitingFor: landingTask)
    • 1:27 - Better 'Sendable' conformances

      final class Spacecraft: Sendable {
          ...
          weak let dockedAt: SpaceStation?
          ...
      }
      
      class Mission: ~Sendable { ... }
      
      class CrewedMission: Mission, @unchecked Sendable { ... }
    • 1:48 - More accessible memberwise initializers

      struct Briefing {
          internal var topic: String
          internal var scheduledAt: Date
          private  var attendees: [Person] = []
      }
      
      // Generated memberwise initializers:
      // extension Briefing {
      //     private init(topic: String, scheduledAt: Date, attendees: [Person] = []) { 
      //          self.topic = topic
      //          self.scheduledAt = scheduledAt
      //          self.attendees = attendees
      //     }
      // 
      //     internal init(topic: String, scheduledAt: Date) {
      //          self.topic = topic
      //          self.scheduledAt = scheduledAt
      //          self.attendees = []
      //     }
      // }
    • 2:03 - 'anyAppleOS' availability (before)

      extension Mission {
          @available(macOS 27, iOS 27, watchOS 27, tvOS 27, visionOS 27, *)
          func showStatus() { ... }
      
          @available(macOS 27, iOS 27, watchOS 27, visionOS 27, *)
          @available(tvOS, unavailable)
          func launch() { ... }
        
          #if os(macOS) || os(iOS) || os(watchOS) || os(tvOS) || os(visionOS)
          func makeLiveActivityWidget() -> some Widget { ... }
          #endif
      }
    • 2:17 - 'anyAppleOS' availability (after)

      extension Mission {
          @available(anyAppleOS 27, *)
          func showStatus() { ... }
      
          @available(anyAppleOS 27, *)
          @available(tvOS, unavailable)
          func launch() { ... }
        
          #if os(anyAppleOS)
          func makeLiveActivityWidget() -> some Widget { ... }
          #endif
      }
    • 2:40 - Controlling warnings with '@diagnose'

      @diagnose(DeprecatedDeclaration, as: ignored, reason: "Flying with surplus hardware")
      func makeApolloSoyuzMission() -> Mission {
          CrewedMission(
              rocket: makeSaturnIRocket(),
              payload: makeApolloCSM(),
              crew: [.daniellePoole, .nathanMorrison]
          )
      }
      
      @diagnose(StrictMemorySafety, as: warning)
      func uplinkCommand(from receiver: inout Receiver, to computer: inout Computer) {
          let commandSize = receiver.receiveInt()
          receiver.withReceivedData(byteCount: commandSize) {
              computer.receiveUplinkedCommand($0)
          }
      }
      
      @diagnose(ErrorInFutureSwiftVersion, as: error)
      func fetchPosition() -> (x: Double, y: Double, z: Double) {
          return self.rotation
      }
    • 3:47 - Clarifying code with module selectors

      import Rocket
      import GiftShopToys
      
      let rocket1 = SaturnV()            // could mean `Rocket::SaturnV` or `GiftShopToys::SaturnV`
      let rocket2 = Rocket.SaturnV()     // prefers `Rocket::Rocket.SaturnV`
      let rocket3 = Rocket::SaturnV()    // correctly finds `Rocket::SaturnV`
    • 5:00 - Clarifying code with module selectors (module selectors work on members, too)

      //
      // Module Chemistry
      //
      
      public protocol Flammable { ... }
      
      extension Flammable {
          /// Set `self` on fire.
          public func fire() { ... }
      }
      
      //
      // Module HumanResources
      //
      
      import Chemistry
      
      public protocol Employee { ... }
      
      extension Employee {
          /// Remove `self` from job.
          public func fire() { ... }
      }
      
      public class LaunchPadTechnician: Employee, Flammable { ... }
      
      //
      // Module main
      //
      
      import HumanResources
      import Chemistry
      
      let launchPadTechnician = LaunchPadTechnician(...)
      
      launchPadTechnician.HumanResources::fire()
    • 6:26 - Task cancellation

      // Radio for help
      
      extension Radio {
        func send(_ data: [UInt8] {
          if Task.isCancelled { return }
          // ...
        }
      }
        
      extension EmergencyTransponder {
        func sendSOS() {
          radio.send(makeSOSPacket())
        }
      }
    • 6:40 - Task cancellation shield

      // Radio for help
      
      extension Radio {
        func send(_ data: [UInt8] {
          if Task.isCancelled { return }
          // ...
        }
      }
        
      extension EmergencyTransponder {
        func sendSOS() {
          withTaskCancellationShield {
          	radio.send(makeSOSPacket())
          }
        }
      }
    • 6:53 - Constructing a new dictionary

      // Map values with keys
      
      func makeCalendarDisplayNames(for missions: [Mission: LaunchWindow]) -> [Mission: String] {
          let new: [Mission: String] = .init(
              uniqueKeysWithValues: missions.lazy.map { mission, launchWindow in
                  (mission, makeDisplayName(for: mission, in: launchWindow))
              }
          )
          return new
      }
    • 7:06 - Dictionary.mapKeyedValues

      // Map values with keys
      
      func makeCalendarDisplayNames(for missions: [Mission: LaunchWindow]) -> [Mission: String] {
          missions.mapKeyedValues { mission, launchWindow in
              makeDisplayName(for: mission, in: launchWindow)
          }
      }
    • 7:14 - The new FilePath type

      // FilePath handling macOS-named resources
      
      var path: FilePath = "/var/www/static"
      path.components.append("WWDC")
      print(path.components)
      // [ "var", "www", "static", "WWDC" ]
      
      var path: FilePath = "/var/www/static/..namedresource/rsrc"
      print(path.components)
      // [ "var", "www", "static" ]
    • 7:41 - Issue Severity

      // Issue severity
      
      @Test(arguments: allRockets)
      func testBurn(rocket: Rocket) throws {
          rocket.burn(for: .seconds(150))
          let remaining = rocket.propellantKg / rocket.totalPropellantKg
      
          if remaining < 0.10 {
              Issue.record(
                  "\(rocket.name) remaining fuel is below 10% reserve target",
                  severity: .warning
              )
          }
      
          #expect(remaining > 0.02, "\(rocket.name) propellant critically low - abort")
      }
    • 7:52 - Test Cancellation

      // Test Cancellation
      
      @Test(arguments: allRockets)
      func testBurn(rocket: Rocket) throws {
          // solid-fuel rocket engines can't be stopped
          if rocket.engineType == .solid {
              try Test.cancel("\(rocket.name) has solid fuel")
          }
       
          rocket.burn(for: .seconds(150))
          let remaining = rocket.propellantKg / rocket.totalPropellantKg
      
          if remaining < 0.10 {
              Issue.record(
                  "\(rocket.name) remaining fuel is below 10% reserve target",
                  severity: .warning
              )
          }
      
          #expect(remaining > 0.02, "\(rocket.name) propellant critically low - abort")
      }
    • 8:34 - XCTest interoperability: Using XCTest from Swift Testing

      // XCTest interoperability: Using XCTest from Swift Testing
      
      func checkedTransmitAndReceive(on radio: Radio,
                                     packet: Packet,
                                     expectedByteCount: Int) throws -> [UInt8] {
          try radio.transmit(bytes: packet.data)
          let bytes = try radio.receive()
          XCTAssertEqual(bytes.count, expectedByteCount)
          return bytes
      }
      
      @Test
      func pingTest() throws {
          let radio = Radio()
          let bytes = try checkedTransmitAndReceive(on: radio, packet: .ping, expectedByteCount: 8)
          #expect(bytes == [0x00, 0x00, 0xf0, 0x37, 0x0f, 0xc7, 0x00, 0x01])
      }
    • 8:48 - XCTest interoperability: Using Swift Testing from XCTest

      // XCTest interoperability: Using Swift Testing from XCTest
      
      class RadioTests: XCTestCase {
          func testPingPacketTransmission() {
              let radio = Radio()
              let bytes = try checkedTransmitAndReceive(on: radio,
                                                        packet: .ping,
                                                        expectedByteCount: 8)
      
              #expect(bytes == [0x00, 0x00, 0xf0, 0x36, 0x0f, 0xc7, 0x00, 0x02])
          }
      }
    • 10:01 - Subprocess Output Stream

      // Subprocess output streaming
      
      let result = try await Subprocess.run(.name("ls"),
                                            input: .none,
                                            output: .sequence,
                                            error: .string(limit:4096)) { execution in
      		execution.standardOtput.strings().filter { $0.hasSuffix(".obj") }
      }
      
      for try await objectFiles in result.closureOutput {
        	print("Object file: \(objectFile)")
      }
    • 10:37 - Progress Manager - Concurrency

      // Progress reporting - Concurrency
      
      let manager = ProgressManager(totalCount: 100)
      try await rocket.launch(mission.subprogress(assigningCount: 100))
      
      extension Rocket {
          func launch(_ progress: consuming Subprogress? = nil) async throws {
              let stage = progress?.start(totalCount: 3)
              try await ignite(); stage?.complete(count: 1)
              try await liftoff(); stage?.complete(count: 1)
              try await stageSeparation(); stage?.complete(count: 1)
          }
      }
    • 10:37 - Progress Manager - progress reporting

      // Progress reporting - progress reporting
      
      let manager = ProgressManager(totalCount: 100)
      try await rocket.launch(mission.subprogress(assigningCount: 100))
      
      Task {
          for await update in Observations({ mission.fractionCompleted }) {
              print("🚀 Mission \(Int(update * 100))%")
          }
      }
    • 10:37 - Progress reporting - metadata

      // Progress reporting - metadata
      
      extension Rocket {
          func ascend(_ progress: consuming Subprogress) async throws {
              let stage = progress.start(totalCount: 3)
              stage.detlaV = 3_400; try await burn(); stage.complete(count: 1)
              stage.detlaV = 2_100; try await stageSeparation(); stage.complete(count: 1)
              stage.detlaV = 1_800; try await coast(); stage.complete(count: 1)
          }
      }
      
      print("Δv to orbit: \(mission.summary(of: \.deltaV)) m/s")
    • 20:56 - Directly control inlining (source code)

      func histogram<Values>(of values: Values) -> [256 of Int] where Values: Sequence<UInt8> {
          var result = makeInts(randomized: false)
        
          for value in values {
              result[Int(value)] += 1
          }
        
          return result
      }
      
      func makeInts(randomized: Bool) -> [256 of Int] {
          if randomized {
              InlineArray { _ in Int.random(in: (.min)...(.max)) }
          } else {
              InlineArray(repeating: 0)
          }
      }
    • 21:01 - Directly control inlining (inlined, but not optimized)

      func histogram<Values>(of values: Values) -> [256 of Int] where Values: Sequence<UInt8> {
          var result = if false {                                                  //
                           InlineArray { _ in Int.random(in: (.min)...(.max)) }    //
                       } else {                                                    // Inlined code
                           InlineArray(repeating: 0)                               //
                       }                                                           //
      
         for value in values {
              result[Int(value)] += 1
          }
          return result
      }
      
      func makeInts(randomized: Bool) -> [256 of Int] {
          if randomized {
              InlineArray { _ in Int.random(in: (.min)...(.max)) }
          } else {
              InlineArray(repeating: 0)
          }
      }
    • 21:07 - Directly control inlining (inlined and optimized)

      func histogram<Values>(of values: Values) -> [256 of Int] where Values: Sequence<UInt8> {
          var result = InlineArray(repeating: 0)    // Inlined and optimized code
      
         for value in values {
              result[Int(value)] += 1
          }
          return result
      }
      
      func makeInts(randomized: Bool) -> [256 of Int] {
          if randomized {
              InlineArray { _ in Int.random(in: (.min)...(.max)) }
          } else {
              InlineArray(repeating: 0)
          }
      }
    • 21:30 - Directly control inlining (preventing inlining)

      @inline(never)
      func makeInts(randomized: Bool) -> [256 of Int] {
          if randomized {
              InlineArray { _ in Int.random(in: (.min)...(.max)) }
          } else {
              InlineArray(repeating: 0)
          }
      }
    • 21:39 - Directly control inlining (forcing inlining)

      @inline(always)
      func makeInts(randomized: Bool) -> [256 of Int] {
          if randomized {
              InlineArray { _ in Int.random(in: (.min)...(.max)) }
          } else {
              InlineArray(repeating: 0)
          }
      }
    • 21:55 - Making generic functions faster with '@specialized'​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​

      func histogram<Values>(of values: Values) -> [256 of Int] where Values: Sequence<UInt8> {
          var result = makeInts(randomized: false)
        
          for value in values {
              result[Int(value)] += 1
          }
        
          return result
      }
      
      // Note: Specialized function doesn't actually have a directly callable name.
      func `histogram of [UInt8]`(of values: [UInt8]) -> [256 of Int] {    //
          var result = makeInts(randomized: false)                         //
                                                                           //
          for value in values {                                            //
              result[Int(value)] += 1                                      // Specialized code
          }                                                                //
                                                                           //
          return result                                                    //
      }                                                                    //
    • 22:17 - Making generic functions faster with '@specialized'​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​ (explicitly requesting specialization)

      @specialized(where Values == [UInt8])
      func histogram<Values>(of values: Values) -> [256 of Int] where Values: Sequence<UInt8> {
          var result = makeInts(randomized: false)
        
          for value in values {
              result[Int(value)] += 1
          }
        
          return result
      }
      
      // Note: Specialized function doesn't actually have a directly callable name.
      func `histogram of [UInt8]`(of values: [UInt8]) -> [256 of Int] {    //
          var result = makeInts(randomized: false)                         //
                                                                           //
          for value in values {                                            //
              result[Int(value)] += 1                                      // Specialized code
          }                                                                //
                                                                           //
          return result                                                    //
      }                                                                    //
    • 25:46 - Associated types can be '~Copyable' and '~Escapable'

      protocol Iterable<Element, Failure>: ~Copyable, ~Escapable {
          associatedtype Element: ~Copyable
          associatedtype IterableIterator: IterableIteratorProtocol<Element, Failure>, ~Copyable, ~Escapable
          associatedtype Failure: Error = Never
      
          func makeIterableIterator() -> IterableIterator
        
          var underestimatedCount: Int { get }
      }
      
      protocol IterableIteratorProtocol<Element, Failure>: ~Copyable, ~Escapable {
          associatedtype Element: ~Copyable
          associatedtype Failure: Error = Never
      
          mutating func nextSpan(maximumCount: Int) throws(Failure) -> Span<Element>
        
          mutating func skip(by maximumOffset: Int) throws(Failure) -> Int
      }
    • 27:28 - The problem with existing accessors

      @safe public struct UniqueBox<Value>: ~Copyable {
          private let valuePointer: UnsafeMutablePointer<Value>
      
          public init(_ value: consuming Value) {
              valuePointer = UnsafeMutablePointer.allocate(capacity: 1)
              valuePointer.initialize(to: value)
          }
      
          public var value: Value {
              get { valuePointer.pointee }
              set { valuePointer.pointee = newValue }
          }
      
          deinit {
              valuePointer.deinitialize(count: 1)
              valuePointer.deallocate()
          }
      }
    • 28:19 - 'borrow' and 'mutate' accessors

      @safe public struct UniqueBox<Value: ~Copyable>: ~Copyable {
          private let valuePointer: UnsafeMutablePointer<Value>
      
          public init(_ value: consuming Value) {
              valuePointer = UnsafeMutablePointer.allocate(capacity: 1)
              valuePointer.initialize(to: value)
          }
      
          public var value: Value {
              borrow { valuePointer.pointee }
              mutate { &valuePointer.pointee }
          }
      
          deinit {
              valuePointer.deinitialize(count: 1)
              valuePointer.deallocate()
          }
      }
    • 30:14 - Using 'MutableRef' to eliminate repeated accesses (with un-hoisted access)

      func updateCount<Key: Hashable>(
          for key: Key,
          from sets: [Set<Key>],
          in counts: inout [Key: Int]
      ) {
          for set in sets {
              if set.contains(key) {
                  counts[key, default: 0] += 1
              }
          }
      }
    • 30:34 - Using 'MutableRef' to eliminate repeated accesses (hoisted by 'inout' parameter)

      func updateCount<Key: Hashable>(
          for key: Key,
          from sets: [Set<Key>],
          in counts: inout [Key: Int]
      ) {
          func updateCountImpl(count: inout Int) {
              for set in sets {
                  if set.contains(key) {
                      count += 1
                  }
              }
          }
          
          updateCountImpl(count: &counts[key, default: 0])
      }
    • 30:41 - Using 'MutableRef' to eliminate repeated accesses (hoisted by 'MutableRef')

      func updateCount<Key: Hashable>(
          for key: Key,
          from sets: [Set<Key>],
          in counts: inout [Key: Int]
      ) {
          var countRef = MutableRef(&counts[key, default: 0])
      
          for set in sets {
              if set.contains(key) {
                  countRef.value += 1
              }
          }
      }
    • 0:07 - Introduction
    • A preview of the session's four topics: language improvements, library updates, cross-platform support, and performance tuning in Swift 6.3 and 6.4.

    • 0:44 - Everyday Language Improvements
    • Quality-of-life changes land in Swift 6.4, including optional parentheses removal, concurrency task warnings, weak let, ~Sendable, and a new memberwise initializer.

    • 1:55 - anyAppleOS Availability
    • Swift now lets you condense multi-platform availability attributes into a single anyAppleOS condition, reducing boilerplate across iOS, macOS, watchOS, and more.

    • 3:02 - @diagnose Attribute
    • The new @diagnose attribute gives fine-grained control over warnings within a specific declaration, letting you suppress, enable, or promote them to errors.

    • 3:52 - Module Selectors (::)
    • Swift 6.3 introduces double-colon module selector syntax to unambiguously reference a type or member from a specific module when name conflicts arise.

    • 5:59 - Library Updates
    • Updates across four key libraries: the standard library, Swift Testing, Subprocess, and Foundation.

    • 6:16 - Standard Library
    • New additions include a task cancellation shield, mapKeyedValues for dictionaries, and a cross-platform FilePath type.

    • 7:31 - Swift Testing Updates
    • Swift Testing gains configurable issue severity, dynamic test cancellation, flaky test repetition, and improved two-way interoperability with XCTest.

    • 9:29 - Subprocess 1.0
    • Subprocess reaches 1.0 with a refined API, improved error handling, convenient line-by-line output streaming, and expanded cross-platform support.

    • 10:14 - Foundation
    • Foundation gains a new ProgressManager type and continues its Swift migration, with performance improvements to Data, NSURL, and CFURL.

    • 11:59 - Beyond Apple Platforms
    • Swift 6.4 extends language interoperability and broadens its reach to new environments including web, Android, and embedded devices.

    • 12:35 - Swift–C Interoperability (@C attribute)
    • The new @C attribute lets you expose Swift functions directly to C, enabling safe, incremental migration of C codebases to Swift.

    • 15:09 - Swift-Java
    • The Swift-Java package now supports async and throwing Swift functions from Java, constrained extensions, and conforming Java classes to Swift protocols.

    • 16:03 - Editor support
    • The Swift VSCode extension adds Swiftly integration for toolchain management and is now available on the OpenVSX marketplace for editors like Cursor and VSCodium.

    • 16:44 - WebAssembly (Wasm) & JavascriptKit
    • Swift can now compile to WebAssembly, with JavascriptKit improvements delivering up to 40x faster safe bridging between Swift and JavaScript.

    • 18:08 - Embedded Swift
    • Embedded Swift expands its language subset with existential types, untyped throws, and improved DWARF debug info for coredump debugging on constrained hardware.

    • 19:59 - Performance Tuning
    • Two areas of advanced performance work: explicit optimizer control and extensions to the ownership system to prevent unnecessary copying.

    • 21:29 - Optimizer Control: @inline(always) & @specialized
    • New @inline(always) and @specialized attributes give you direct control over the compiler's inlining and generic specialization decisions.

    • 24:29 - Ownership System & Noncopyable Types
    • Equatable, Comparable, Hashable, and associated types now work with noncopyable and non-escapable types, broadening the ownership system's reach.

    • 26:18 - Iterable Protocol & Borrow/Mutate Accessors
    • A new Iterable protocol enables efficient borrow-based for loops over noncopyable elements, while new borrow and mutate accessors eliminate costly copies in computed properties.

    • 28:57 - New Standard Library Types: UniqueBox, UniqueArray, Ref
    • The standard library gains UniqueBox, UniqueArray, Continuation, and the new Ref/MutableRef types for safe, high-performance ownership patterns.

    • 31:11 - The Future of Swift
    • Highlights open-source progress including Swift Build, new workgroups for build, networking, Windows, and Android, and an invitation to participate at forums.swift.org.

Developer Footer

  • 视频
  • WWDC26
  • Swift 的新功能
  • 打开菜单 关闭菜单
    • iOS
    • iPadOS
    • macOS
    • Apple tvOS
    • visionOS
    • watchOS
    打开菜单 关闭菜单
    • Swift
    • SwiftUI
    • Swift Playground
    • TestFlight
    • Xcode
    • Xcode Cloud
    • SF Symbols
    打开菜单 关闭菜单
    • 辅助功能
    • 配件
    • Apple 智能
    • App 扩展
    • App Store
    • 音频与视频 (英文)
    • 增强现实
    • 设计
    • 分发
    • 教育
    • 字体 (英文)
    • 游戏
    • 健康与健身
    • App 内购买项目
    • 本地化
    • 地图与位置
    • 机器学习与 AI
    • 开源资源 (英文)
    • 安全性
    • Safari 浏览器与网页 (英文)
    打开菜单 关闭菜单
    • 完整文档 (英文)
    • 部分主题文档 (简体中文)
    • 教程
    • 下载
    • 论坛 (英文)
    • 视频
    打开菜单 关闭菜单
    • 支持文档
    • 联系我们
    • 错误报告
    • 系统状态 (英文)
    打开菜单 关闭菜单
    • Apple 开发者
    • App Store Connect
    • 证书、标识符和描述文件 (英文)
    • 反馈助理
    打开菜单 关闭菜单
    • Apple Developer Program
    • Apple Developer Enterprise Program
    • App Store Small Business Program
    • MFi Program (英文)
    • Mini Apps Partner Program
    • News Partner Program (英文)
    • Video Partner Program (英文)
    • 安全赏金计划 (英文)
    • Security Research Device Program (英文)
    打开菜单 关闭菜单
    • 与 Apple 会面交流
    • Apple Developer Center
    • App Store 大奖 (英文)
    • Apple 设计大奖
    • Apple Developer Academies (英文)
    • WWDC
    阅读最近新闻。
    获取 Apple Developer App。
    版权所有 © 2026 Apple Inc. 保留所有权利。
    使用条款 隐私政策 协议和准则