Swift

一种强大但极易学习的编程语言。

Swift 是一种强大直观的编程语言,适用于 macOS、iOS、watchOS 和 tvOS 等。编写 Swift 代码的过程充满了乐趣和互动。Swift 语法简洁,但表现力强,更包含了开发者喜爱的现代功能。Swift 代码从设计上保证安全,同时还能开发出运行快如闪电的软件。

Swift 5 简介

Swift 5 显著改善了 app 的发布操作。Swift 的运行时现已内建在 iOS、macOS、watchOS 和 tvOS 中。在这些最新版的 OS 中,您的 app 不再需要捆绑这个资料库。得益于出色的 App Store 支持,用户的下载速度更快,app 也更小。

Swift 5 的新增功能

  • 字符串采用 UTF-8 编码重新实施,这通常可以加快代码运行速度
  • 默认情况下,独占访问内存功能目前在调试和发布版本上强制执行
  • 标准资料库中添加了 SIMD Vector 和 Result 类型
  • Dictionary 和 Set 的性能得到了提升
  • 支持可动态调用的类型,改善了与动态语言 (如 Python、JavaScript 和 Ruby) 的互操作性

现代化

Swift 是编程语言的最新研究成果,并融合了构建 Apple 平台的数十年经验。命名参数以简洁的语法表示,让您能更轻松地阅读和维护以 Swift 编写的 API。您甚至无需键入分号。推断类型让代码更为简洁且不易出错;而模块则消除了标头,改为提供名称空间。为了给国际语言和表情符号提供最佳支持,字符串会保持 Unicode 正确性,并使用基于 UTF-8 的编码来优化各种用例中的性能。内存采用严谨的确定性引用计数来自动管理,最大程度地降低了内存使用量,且不会产生垃圾回收开销。

struct Player {
    var name: String
    var highScore: Int = 0
    var history: [Int] = []

    init(_ name: String) {
        self.name = name
    }
}

var player = Player("Tomas")

使用现代、简明的语法声明新类型。为实例属性提供默认值,并定义自定构造器。

extension Player {
    mutating func updateScore(_ newScore: Int) {
        history.append(newScore)
        if highScore < newScore {
            print("\(newScore)! A new high score for \(name)! 🎉")
            highScore = newScore
        }
    }
}

player.updateScore(50)
// Prints "50! A new high score for Tomas! 🎉"
// player.highScore == 50

使用扩展向现有类型添加功能,并利用自定字符串插值减少样板代码。

extension Player: Codable, Equatable {}

import Foundation
let encoder = JSONEncoder()
try encoder.encode(player)

print(player)
// Prints "Tomas, games played: 1, high score: 50”

快速扩展您的自定类型,以充分利用强大的语言功能,如自动 JSON 编码和解码。

let players = getPlayers()

// Sort players, with best high scores first
let ranked = players.sorted(by: { player1, player2 in
    player1.highScore > player2.highScore
})

// Create an array with only the players’ names
let rankedNames = ranked.map { $0.name }
// ["Erin", "Rosana", "Tomas"]

使用简化闭包执行强大的自定转换。

正是这些富有前瞻性的概念,成就了这种有趣又易用的编程语言。

Swift 还有许多其他功能,可以让您的代码更富表现力:

  • 泛型强大且易用
  • 协议扩展使得泛型代码编写变得更为容易
  • 头等函数和轻量级闭包语法
  • 对范围或集合进行快速、简洁的迭代
  • 元组和多值返回
  • 支持方法、扩展和协议的结构
  • 枚举能执行有效负载并支持模式匹配
  • 函数式编程模式,例如映射和过滤
  • 使用 try/catch/throw 处理原生错误

从设计上确保安全

Swift 可避免全部类型的不安全代码。变量在使用前会始终先进行初始化,数组和整数会进行溢出检查,内存将实现自动管理,强制式独占访问内存功能亦可防范很多编程错误。语法经过调整,让您可轻松定义目标意图。例如,只需三个字符的关键词就可定义变量 (var) 或常量 (let)。此外,Swift 充分利用值类型,特别是针对 Array 和 Dictionary 等常用类型。这让您在拷贝这种类型的内容时,能放心它不会在其他位置被修改。

默认情况下,Swift 对象不能定为 nil——这在另一方面保证了 Swift 的安全性。实际上,Swift 编译器会在您尝试创建或使用 nil 对象时显示编译时错误,阻止您继续操作。这使得代码编写变得更简洁、更安全,并且可以防止 app 中出现大规模的运行时崩溃。但是,在某些情况下,运用 nil 是适当合理的。针对这类情况,Swift 提供了一项创新功能,称为“可选类型”。可选类型可以包含 nil,但是 Swift 语法会强制要求您使用 ? 语法来安全地处理 nil。使用该语法,等于向编译器表明您理解此行为并将安全地进行处理。

extension Collection where Element == Player {
    // Returns the highest score of all the players,
    // or `nil` if the collection is empty.
    func highestScoringPlayer() -> Player? {
        return self.max(by: { $0.highScore < $1.highScore })
    }
}

无论函数会不会返回实例,都可以使用可选类型。

if let bestPlayer = players.highestScoringPlayer() {
    recordHolder = """
        The record holder is \(bestPlayer.name),\
        with a high score of \(bestPlayer.highScore)!
        """
} else {
    recordHolder = "No games have been played yet.")
}
print(recordHolder)
// The record holder is Erin, with a high score of 271!

let highestScore = players.highestScoringPlayer()?.highScore ?? 0
// highestScore == 271

凭借可选类型绑定、可选链和 nil 合并等功能,您可以安全、高效地使用可选类型值。

快速而强大

最初构思时,我们就希望 Swift 实现快速运行的效果。利用出色的高性能 LLVM 编译器技术,Swift 代码会转换为经过优化的、可充分利用现代硬件的原生代码。此外,语法和标准资料库也进行了调整,使最浅显的编码方式也能有最佳表现,无论它是在您腕上的手表上运行,还是跨一组服务器运行。

Swift 是在 C 语言和 Objective-C 语言的基础上开发的全新编程语言。它包含诸如类型、流控制和运算符等底层基元。此外,它还提供面向对象的特性,例如类、协议和泛型,为 Cocoa 和 Cocoa Touch 开发者提供了他们所需的性能和功能。

首门编程语言的绝佳选择

Swift 能为您打开通往编程世界的大门。事实上,我们的设计初衷也是希望它能成为任何人的第一门编程语言——无论您是在求学阶段,还是准备开拓全新的职业生涯。对于教育工作者而言,Apple 编写了免费的课程,帮助他们在课堂内外教授 Swift。首次学习编程的用户可以下载 Swift Playgrounds,这是一款能让您的 Swift 代码入门学习充满互动和乐趣的 iPad 版 app 。

有志于此的 app 开发者可以访问免费的课程,学习如何在 Xcode 中构建他们的首个 app。我们在世界各地的 Apple Store 商店都提供有“Today at Apple 编程与 App”课程,您可以在这些课程中动手体验 Swift 代码的实际操作。

进一步了解 Apple 提供的 Swift 教育资源

源代码和二进制文件兼容性

Swift 5 并不要求您先对 Swift 4 代码做任何修改,才能使用新版编译器。您可以先使用新的编译器,然后按照自己的进度每次一个模块地进行迁移,利用 Swift 5 的新功能。另外,现在 Swift 5 针对 app 引入了二进制文件兼容功能。从今往后每个 OS 版本中都将内建 Swift 资料库,您不再需要在今后 OS 版本的 app 中内建 Swift 资料库。您的 app 将利用 OS 中的最新版资料库,您的代码也无需重新编译即可继续运行。这不仅可以简化 app 开发过程,而且还能缩减 app 的大小和启动时间。

开源

Swift 以开源形式在 Swift.org 上开发而成,其源代码、bug 跟踪器、论坛和常规开发版本将对所有人公开。在这个由众多开发者组成的广泛社区中,Apple 内部员工与成百上千位外部贡献者携手合作,让 Swift 愈加出色。该社区还会提供更多博客、播客、会议和聚会,让社区中的开发者分享有关如何发挥 Swift 巨大潜能的经验。

跨平台

Swift 已能够支持所有 Apple 平台和 Linux,社区成员正积极地努力将 Swift 移植到更多平台上。借助 SourceKit-LSP,社区成员还在努力将 Swift 支持集成到各种开发者工具中。我们非常期待看到 Swift 以更多元的方式构建更安全、更快速的软件,同时也让编程变得更有趣。

Swift 适用于服务器

Swift 不仅能够为 Apple 平台开发很多新 app,而且还适用于一系列新的现代化服务器 app。Swift 非常适合用于需要运行时安全、编译性能和较小内存占用空间的服务器 app。为了把握使用 Swift 开发和部署服务器 app 的方向,Swift 社区成立了 Swift Server 工作组。该工作组为此而推出的首个产品为 SwiftNIO,这是一款跨平台的异步事件驱动型网络应用程序框架,适用于高性能协议服务器和客户端。它是构建其他面向服务器的工具和技术的基础,包括正在积极开发的日志记录、指标和数据库驱动程序。

要进一步了解 Swift 开源社区和 Swift Server 工作组,请访问 Swift.org (英文)

Playground 和 Read-Eval-Print-Loop (REPL)

与 iPad 上的 Swift Playgrounds 类似,Xcode 中的 Playground 让编写 Swift 代码变得非常简单有趣。键入一行代码,就能马上看到结果。您可以从代码处快速查看结果,或将结果直接固定在这行代码下方。结果视图可以显示图形、结果列表或某个值随时间而变化的图形。您可以打开“时间轴助理”来观看复杂的视图演变和动画效果 (非常适合用于试验新的 UI 代码),或是在您编码时播放 SpriteKit 动画场景。在 playground 中优化好代码后,即可将代码移到您的项目中。当您在终端或 Xcode 的 LLDB 调试控制台中使用 Swift 时,它也具有互动性。您可以使用 Swift 语法来评估现有 app 并与它互动,也可以编写新的代码来查看它在脚本式环境中的运作情况。

Package Manager

Swift Package Manager 是一个跨平台工具,可用于构建、运行、测试和打包 Swift 资料库和可执行文件。Swift 软件包是向 Swift 社区分发资料库和源代码的最佳方法。软件包的配置采用 Swift 编写,可以让您轻松配置目标、声明产品和管理软件包依赖项。Swift 5 中有一项新功能:运行命令现在无需构建可执行文件,即可在 REPL 中导入资料库。实际上,Swift Package Manager 本身就采用 Swift 构建,也作为软件包内建在 Swift 开源项目中。

Objective-C 互操作性

您可以立即使用 Swift 创建全新的 app,或开始使用 Swift 代码在您的 app 中实施新的特性和功能。Swift 代码可以与您现有的 Objective-C 文件在同一个项目中共存,并可完全访问 Objective-C API,让您能轻松地采用这些文件。

要开始使用 Swift,请下载 Xcode 并按照“资源”标签页上提供的教程操作。