大多数浏览器和
Developer App 均支持流媒体播放。
-
认识 Xcode 中的 DocC 文档
探索如何使用 DocC 构建和共享适用于 Swift 软件包和框架的文档。我们将展示如何从您自己的代码或您依赖的第三方代码开始生成文档,并使用 Markdown 编写和设置格式。我们还将带您了解导出流程,帮助您生成 DocC 存档,进行公开分享。
资源
- Documenting a Swift Framework or Package
- Formatting your documentation
- SlothCreator: Building DocC Documentation in Xcode
- Writing symbol documentation in your source files
相关视频
WWDC23
WWDC21
-
下载
嗨 我是维多利亚 我在文档工具团队担任工程师 在Apple这里 我和我的同事伊森 将向你介绍 Xcode 13中新的文档功能 新的读取和编写文档方式 会与您的作业流程契合 并为您的发展开启新的可能性 Xcode 13的新功能 适用于Swift框架和软件包 去构建、编写和浏览文档 它开启了一个强大的 文档驱动开发模式 当您在编写程序代码的时候 您可以读取所有 关于您的Swift依赖项 这文档就在Xcode里 开发者文档窗口中的平台库旁边 在这次议程 我们将概述 Xcode 13里的文档功能 为您详细地解释 如何在您正编写和使用的 Swift框架和软件包去构建文档 并向您示范如何使用Xcode 13 去编写出色的文档 然后通过向您展示如何与 Xcode 13共享文档作结 就由解释我为什么 对新文档功能感到兴奋开始吧 我相信我们都经历过 我们都有想要使用的 一些新框架或软件包 当到了要将其整合为 我们的程序代码的时候 我们便需要弄清楚其中包含什么 这就是需要Xcode 13介入的地方 现在的Xcode为您的文档和程序代码 提供编译器 您可以构建并查看Xcode内 所有Swift框架和软件包的文档 我们称之为DocC 我们已将其全部整合于Xcode中 以加强您读取和编写文档的方式 现在 DocC不仅是事后运行的 文档编译器 它更是一个补充Xcode 完全整合的文档环境 为你的文档提供一个 丰富、实时的环境 呈现在Quick Help中 而丰富的程序代码完成功能 可以将您的文档 整合为一个完整的文档 并可于整合的 “开发者文档”窗口中使用 还有一个简单的选项 是在Xcode和网络上 分享预建文档 这里仅举出几个例子 请继续关注我们在 WWDC 2021上的其他DocC议程 在这些议程上将更详细地 讲解所有这些细节以及更多内容 DocC让你能够写出 优秀的参考文档 借助Xcode和Swift的力量 在你的框架和软件包中 为用户提供一个 公开API的鸟瞰图 并能够描述API如何共同工作 而不只是孤立的 但DocC不仅让您能够编写 很好的参考文档 我们很高兴能在今年展示额外 两个使用DocC编写文档的方式 文章让您为用户详细讲解 您的框架背后的整个情况 并给您机会 将您框架中的个别项目与 一个完整的故事连系在一起 而教程是一个功能强大的逐步讲解 解释如何运用您的框架去编写项目 他们通过向您的用户提供 一个对您框架彻底的指南介绍 让您能比看参考文档或文章 更深入了解
所有这些创作经验都影响并扩展 Markdown的能力和简易性 使您创作文档时 就如您编写程序代码般流畅 如果您想了解更多 使用原始码以外的文章和教程 来组装一个文档目录 您可以查看今年WWDC的这些议程
最后 我们将在今年稍晚 以开放原始码的状态 发布DocC和一个web app 让您在网络上托管 您构建的文档档案 因此您可以利用 这些新的文档作业流程 甚至在Xcode以外也可以使用 现在您已经体验了 Xcode 13中新文档的功能 让我们深入讨论在Xcode中 使用DocC构建您的文档 让我们先快速看看它 背后运作的原理 若要构建您的文档 Xcode会构建您的框架和软件包 并要求编译器储存 有关其公开API的信息 和您已编译的假影 那些公开的API信息会交给DocC 然后将其与您的文档目录结合 此目录包含于原始码以外 编写的文章与教程 以创建包含编译好的文档的 最终存档 要了解更多关于文档目录 和组织您的文档 请查看“提升您在Xcode中的 DocC文档”的议程 幸好DocC与Xcode的 构建系统进行整合 对于您的目标所依赖的 每个Swift框架和软件包 此过程都会重复 如此一来 您就能 将所有相关文档集中在一处 但是这对您的日常文档 需求有什么意义呢? 要在Xcode 13中为Swift框架 和软件包构建文档有三种方式
若按需求构建文档 有个新的“构建文档”菜单项目 能进行编译并上载您的文档 如果你正在处理一个Swift框架 并且总是想要随时预览您的文档 那么每次编译时还会有一个 新的构建设置来构建文档 对于您的命令行和CI需求 xcodebuild也有 一个新命令来构建文档 这跟在Xcode中 选择构建文档的构建运行相同 但它是在命令行上使用xcodebuild 我的同事大卫会在 “托管和自动化 DocC文档”议程部分提供 更多关于自动化文档作业流程的信息 让我们看看它的实际效果 我的队友已经研究 这个名为 SlothCreator的软件包 一段时间 这个软件包是关于 编目和定制可爱的小树懒 我想尝试一下 所以让我们 看看它在Xcode 13是如何运作的 我设置了这个app 我称之为Slothy 所以我可以使用SlothCreator 去定制我的树懒 并在运行时预览它们 我已经将 SlothCreator 设置为我的app的依赖项 但有关它提供哪些API 我想了解更多 于是我们打开“产品”菜单…
并选择“构建文档”看看
就像这样 开发者文档窗口打开了 然后在导航器中 我可以延伸我的Slothy项目 和我正在使用的 SlothCreator软件包 以便在导航器中查看概述 我将在主视图中 加载SlothCreator概述 如果我往下滚动 则会看到可用的类型和协议列表
这里我可以看到 这种称为Habitat的类型 让我们点按它以加载它的页面
这里有一些很不错的信息 但我想知道是否有 其他任何信息已经提过了 我们选择顶部的搜索栏 并查找Habitat
似乎有其他的项目也提到它 让我们点按这个“睡眠”方法 以叫出它的文档页面
此页面特定于“睡眠”方法 但我很好奇它属于哪种类型 在窗口顶部的跳转栏中 我看到这是Sloth类型的一部分
如果我点按这个Sloth 会出现一个下拉菜单 如果我再次点按它 我就可以打开该类型的文档页面 现在 我明白了所有这些 API是如何组合在一起 所以我们现在有机会 详细讲解SlothCreator的文档 让我们回顾一下 看看它是如何做到这一点 我的同事伊森 将首先展示Xcode 13中的 一些新功能 以编写出色的文档 开始吧 谢谢 维多利亚 现在我们已经了解Xcode 13 对构建和浏览文档的强大支持 我想向您展示一些技巧 以使用DocC编写更好的文档
DocC是围绕源内文档的 优势而设计的 您将文档与程序代码一起编写 从而轻松方便地与 现有开发作业流程整合在一起
要将文档添加到声明中 您只需在其正上方写一种特殊的注释 这可以轻松地使您的文档与 您将来可能更改的 任何程序代码保持同步 当然它也会适合您现有的 以文字为基础的工具 例如 git diffs
您可能已经为您的原始码加了注释 以便为日后您的代码库维护人员 提供额外的上下文 在Swift和许多其他语言中 您使用两个正斜杠 开始您的句子编写注释 编写这些注释对帮助维护人员 日后理解您的代码库 并提高效率方面起到很大的作用 但是 如果您想帮助 您框架的时下采用者呢? 这就是文档注释的用途 通过编写 以三个正斜杠开头的注释 您是在告诉 Swift文档编译程序 将该注释与其下方的 声明联系起来 注释将被包含在符号的 编译文档页面中 任何导入您框架的人都可进入 如果您较喜欢使用块状注释 您可以通过在开头的分隔符中 包含一个额外的星号 来创建该样式的文档注释 让我们看看这一切 在现实中是如何运作的 正如维多利亚提到 过去几个月里 我们一直在研究SlothCreator框架 SlothCreator是一个Swift软件包 它提供了对可爱小树懒 进行分类和定制的功能 作为SlothCreator的开发者 我想确保该框架的 任何采用者都能轻松上手 因此我一直努力 在我处理的代码库部分 添加文档注释 我尤其想确保SlothCreator中的 每个公开API有详细的记载 因为任何导入我框架的人 都可以查看这些API 同样地 DocC仅为您的框架中的 公开和 开放的符号生成文档页面 SlothCreator中 只有几个符号仍需要记录 让我们从这个“食物”结构开始 我将首先在类型声明上方 添加三个正斜杠
以创建文档注释 然后我会写这是 “树懒可以吃的食物” 我的文档注释的第一行 将变成符号的摘要 但我想在讨论部分 添加一些额外的信息 我现在将添加一个 在我的摘要之后添加一个换行符号 然后为树懒喜欢的食物种类 添加一些额外的细节 并且因为DocC完全支持Markdown 我可以添加一个 使用Markdown的围栏代码块语句的 程序代码例子
好的 我认为这为“食物”结构 添加了一些非常有用的 附加上下文 让我们通过重建文档 来看看我的文档现在的样子 我可以通过将鼠标 向上移动到“产品”菜单 然后选择“构建文档”而做到
Xcode现在将与框架本身 一起重建SlothCreator的文档 因为我在这个构建中 使用了“构建文档”按钮 当它完成时 “文档查看器”将打开我更新的文档 但我其实有兴趣直接转到 “食物”结构的页面 来查看我们刚刚添加的注释 幸运地 Xcode有一个 名为Quick Help的功能 可以让我做到这一点 Quick Help在源码编辑器中 提供了符号文档的简短摘要版本
我现在可以通过按住 “选择”键然后点按 “食物的声明”来尝试一下 但是SlothCreator的采用者 可以通过选项点按其程序代码中 有关“食物”结构的任何引用 来打开相同的视图 所以我们写的注释 就在摘要和讨论部分 但如果我要查找的 不仅是摘要的视图 那么Xcode 13中的新功能 “在开发者文档打开”链接可以做到
如果我将鼠标移到 Quick Help视图的右下角 并点按“在开发者文档中打开” “文档”窗口将直接启动 到该符号的页面 非常好 SlothCreator中 还有一个符号仍然缺少文档 我把鼠标移到Xcode的导航器 并点按Sloth项目来打开Sloth文档 如果我往下滚动 我会发现 “吃”的方法仍然需要文档注释 让我们快速看一下 记录方法的最佳方式
我们以同样的方式开始 在方法的声明上方 添加一个三斜线注释 并添加构成其文档摘要的文本 但是我们还应该具体记录 我们预期作为参数传递的内容
我们可通过“参数”部分做到这一点 通过编写一个以单词“参数” 开头的Markdown列表项 接着是方法参数的名称、冒号 然后是其文档 您便可以在文档中 添加一个“参数”部分 您可以用非常相似的 方式添加“回传”部分 这一次通过编写“回传”分隔符 后跟一个冒号和您的方法回传的描述 但如果你的方法有多个参数怎么办? 这种情况下 最好的办法是 从单数的“参数”分隔符 变成复数的“参数”分隔符 除了您的参数名称 被写为父“参数”分隔符的子项之外 这与其他作业操作非常相似 所以现在我们已经了解基本原理 让我们记录一下 树懒“吃”的方法 现在 我可以用相同的方式 通过手动编写 以三个正斜杠开头的文档注释 来开始记录“食物”结构 但由于我要记录一个更复杂的符号 我将利用Xcode 强大的“添加文档”功能 该功能将插入一个 最适合记录当前声明的样板
通过按住“命令”键 然后点按该方法的声明 以打开“操作”菜单来执行此操作 接下来 我可以点按 “操作”菜单中的 “添加文档” 就像这样 我有很棒的样板能开始记录我的方法
我将首先填写方法的摘要 然后我将描述食物和数量的参数 以及该方法回传的内容 然后我将通过添加讨论部分 和程序代码例子来结束文档
就像上次一样 我可以通过 将鼠标移动到“产品”菜单 并选择“构建文档”项来重建文档
再一次 Xcode与框架本身 一起构建我的文档 这一次 我将通过窗口的导航器 导航到Sloth结构 我将在Sloths主题群组中找到Sloth 如果我在Sloth页面往下滚动 就会在“实例方法” 部分找到我的方法…
以及我更新的文档 我对此已经非常满意 此方法的输入 和输出非常明确 这里还有一个有用的程序代码例子 虽然我认为这几乎已经准备好了 但还是遗漏了一些东西 如果我只阅读这一页文档 我会很难理解应该要 考量其他相关符号的上下文 作为SlothCreator的维护人员 我很想建议我的读者接下来 应该考虑学习一些其他符号 Xcode 13的新功能是 能够链接到文档中的符号 这是连接框架不同部分 一种非常好的方式 并引导读者获取相关信息 您可以通过新的双反引号语句 编写这些链接 我们一起看一个例子
这是我们之前记录的方法 “睡眠” 但它并不是被孤立隔绝的 在Sloth结构上 其实还有另一个属性
有一个值代表树懒的 当前能量水平 我认为重要的是 让我的读者理解 调用睡眠的副作用之一 是树懒能量水平的变化
因此我将引用“能量水平”属性 添加到我的方法讨论部分
在Xcode 13之前 执行此操作的 自然方法是将属性名称 以等宽程序代码字体写入 并用反引号将其括起来 但现在我可以转换为双反引号语句 并创建一个链接 现在 链接到“能量水平”非常简单 因为该属性是我 正在记录的方法的同属兄弟 就像在Swift中引用局部变量时一样 我不需要进一步 为我的链接从父级类型那里取得资格 我可以只写属性的名称“能量水平” 但是如果我想引用不同类型的子级 我就需要更具体一点 所以在这里我写下 Habitat/comfortLevel 来链接到Habitat结构的子级 好的 让我们通过为“吃”的方法 添加一些链接于文档中 来看看这在现实中是如何运作的 我将在这里开始写 “它们进食的时候 树懒的…” 现在我要为“能量水平”属性 写一个符号链接 因此 我将键入两个反引号 然后我将开始编写“能量水平” Xcode的程序代码完成功能 帮助我确保获得正确的链接 我会继续选择那个项目
所以我会说能量水平 “随着食物的增加而增加” 现在我将引用 “食物”结构的一个子元素 我将再次以两个反引号开始 接着我会写“食物” 一个正斜杠 然后是能量
我现在创建了两个符号链接 我认为它们会真正帮助我的读者 更加理解关于此方法的上下文 这些链接甚至可以 在Quick Help中查看 所以我将按住“选择”键 并点按我的方法声明 以打开Quick Help的弹出提示框 这是我们添加的讨论部分 当然 在讨论中还有我们的两个链接 如果我点按一个 我会直接进入 “文档”窗口中引用的符号页面 现在我已经为SlothCreator中 每个公开API编写了很好的文档注释 我真的很高兴 能与我的同事分享此功能 甚至可能使它适用于网络上 我可以通过Xcode输出的 每个文档构建的 一部分文档档案来做到 文档档案包含一个单页网络app 可用于网络上共享文档 我的同事大卫将在他的 “托管和自动化您的DocC文档” 议程中解释如何做到这一点 我强烈推荐你看看那视频
但是Xcode也支持直接 从“文档”窗口导出和导入您的文档 现在让我们来看看 我先将鼠标移到窗口的“导航器”上 接着从“文档”窗口导出SlothCreator 当我将鼠标悬停在 SlothCreator框架项时 会出现一个上下文菜单图标 点按它 然后选择“导出”
再将它储存到我的“桌面” 好的 现在我准备将它发送给我的同事 如果他们只需双击存档 它就会在Xcode的 “文档”窗口中打开 但由于我已经了解 SlothCreator 所以我想打开一个不同的文档档案 我最近一直在与团队讨论 将命令行界面添加到 SlothCreator会很棒 我的一位同事提到 ArgumentParser是一个 可以提供帮助、很棒的开源框架 他们向我发送了ArgumentParser的 最新文档档案 我们现在打开它 只需双击文档档案 就像这样 就可以立即开始学习 文档是开发成功 且持久的框架的关键 您会发现直接在源代码中 编写文档是非常方便和有效的 Xcode 13中的新功能与DocC的整合 让您为编写出色文档的所有付出 都会以全新且有效的方式获得回报
我们在WWDC上还有其他几个议程 可以真正帮助您将文档 提升到一个新的水平 在 Xcode中“提升您的DocC文档” 会从这次议程结束的地方继续 向您展示如何通过添加文档目录 更好地组织您的文档 我之前提到过 “托管和自动化您的DocC文档” 将会解释如何整合文档构建 到您现有的持续整合设置 以及如何在线托管您的文档
最后 如果您的框架中有 更复杂的部分能够 从逐步讲解中获益 我建议您查看“在DocC中 构建互动式教程” 它将向您展示如何做到这一点
谢谢观看 [打击乐]
-
-
9:34 - Existing comments in code
// A model representing a sloth. public struct Sloth { // ... }
-
10:05 - Writing documentation comments
/// A model representing a sloth. public struct Sloth { // ... }
-
10:22 - Writing block-style documentation comments
/** A model representing a sloth. */ public struct Sloth { // ... }
-
11:34 - Documenting the Food struct
/// Food that a sloth can consume. /// /// Sloths love to eat the leaves and twigs they find in the rainforest canopy as they /// slowly move around. To feed them these items, you can use the `twig`, /// `regularLeaf` and `largeLeaf` default foods. /// /// ```swift /// superSloth.eat(.twig) /// ``` public struct Food { // ... }
-
13:58 - Documenting the Sloth.sleep(in:for:) method
/// A model representing a sloth. public struct Sloth { /// Sleep in the specified habitat for a number of hours. /// /// - Parameters: /// - habitat: The location for the sloth to sleep. /// - numberOfHours: The number of hours for the sloth to sleep. /// - Returns: The sloth’s energy level after sleeping. mutating public func sleep(in habitat: Habitat, for numberOfHours: Int = 12) -> Int { energyLevel += habitat.comfortLevel * numberOfHours return energyLevel } }
-
15:39 - Documenting the Sloth.eat(_:quantity:) method
/// A model representing a sloth. public struct Sloth { /// Eat the provided specialty sloth food. /// /// Sloths love to eat while they move very slowly through their rainforest habitats. They /// are especially happy to consume leaves and twigs, which they digest over long periods /// of time, mostly while they sleep. /// /// ```swift /// let flower = Sloth.Food(name: "Flower Bud", energy: 10) /// superSloth.eat(flower) /// ``` /// /// - Parameters: /// - food: The food for the sloth to eat. /// - quantity: The quantity of the food for the sloth to eat. /// - Returns: The sloth's energy level after eating. mutating public func eat(_ food: Food, quantity: Int = 1) -> Int { energyLevel += food.energy * quantity return energyLevel } }
-
17:46 - Adding symbol links to the documentation for Sloth.sleep(in:for:)
/// A model representing a sloth. public struct Sloth { /// The energy level of the sloth. public var energyLevel: EnergyLevel /// Sleep in the specified habitat for a number of hours. /// /// Each time the sloth sleeps, their ``energyLevel`` increases every hour by the /// habitat's ``Habitat/comfortLevel``. /// /// - Parameters: /// - habitat: The location for the sloth to sleep. /// - numberOfHours: The number of hours for the sloth to sleep. /// - Returns: The sloth’s energy level after sleeping. mutating public func sleep(in habitat: Habitat, for numberOfHours: Int = 12) -> Int { energyLevel += habitat.comfortLevel * numberOfHours return energyLevel } }
-
18:44 - Adding symbol links to the documentation for Sloth.eat(_:quantity:)
/// A model representing a sloth. public struct Sloth { /// Eat the provided specialty sloth food. /// /// Sloths love to eat while they move very slowly through their rainforest habitats. They /// are especially happy to consume leaves and twigs, which they digest over long periods /// of time, mostly while they sleep. /// /// ```swift /// let flower = Sloth.Food(name: "Flower Bud", energy: 10) /// superSloth.eat(flower) /// ``` /// /// When they eat food, a sloth's ``energyLevel`` increases by the food's /// ``Food/energy``. /// /// - Parameters: /// - food: The food for the sloth to eat. /// - quantity: The quantity of the food for the sloth to eat. /// - Returns: The sloth's energy level after eating. mutating public func eat(_ food: Food, quantity: Int = 1) -> Int { energyLevel += food.energy * quantity return energyLevel } }
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。