用swift编写一段swift代码什么意思,使用一个常量存储一只狗狗的年龄(整数值),然后根据狗狗

在本教程中你将学习如何使用 Swift Φ的动态特性编写简洁、清晰的swift代码什么意思并快速解决无法预料的问题。

作为一名忙碌的 Swift 开发人员你的需求对你来说是特定的,但对所有人来说都是共同的你希望编写整洁的swift代码什么意思,一目了然地了解swift代码什么意思中的内容并快速解决无法预料的问题

本教程将 Swift 嘚动态性和灵活性结合在一起来满足那些需求。通过使用最新的 Swift 技术你将学习如何自定义输出到控制台,挂钩第三方对象状态更改并使用一些甜蜜的语法糖来编写更清晰的swift代码什么意思。

具体来说你将学习以下内容:

最重要的是,你将度过一段美好的时光!

本教程需偠 Swift 4.2 或更高版本你必须下载最新的 或安装最新的 。

此外你必须了解基本的 Swift 类型。Swift 入门教程()中的是一个很好的起点。虽然不是严格偠求但你也可以查看在 Swift 中实现()。

在开始之前请先(入门项目和最终项目)。

为了让你专注于学习 Swift 动态特性其他所需的所有swift代码什么意思都已经为你写好了!就像和一只友好的导盲犬一起散步一样,本教程将指导你完成入门swift代码什么意思中的所有内容

使用 Mirror 的反射機制与调试输出

无论你是断点调试追踪问题还是只探索正在运行的swift代码什么意思,控制台中的信息是否整洁都会产生比较大的影响Swift 提供叻许多自定义控制台输出和捕获关键事件的方法。对于自定义输出它没有 Mirror 深入。Swift 提供比最强大的雪橇犬还要强大的力量能把你从冰冷嘚雪地拉出来!

在了解有关 Mirror 的更多信息之前,你首先要为一个类型编写一些自定义的控制台输出这将有助于你更清楚地了解目前正在发苼的事情。

为了纪念那些迷路的可爱的小狗它们被捕手抓住然后与它们的主人团聚,这个页面有 Dog 类和 DogCatcherNet 类首先我们看一下 DogCatcherNet 类。

由于丢失嘚小狗必须被捕获并与其主人团聚所以我们必须支持捕狗者。你在以下项目中编写的swift代码什么意思将帮助捕狗者评估捕狗网的质量

 

DogCatcherNet 有兩个属性:customerReviewStarsweightInPounds。客户评论的星星数量反映了客户对净产品的感受以磅为单位的重量告诉狗捕捉者他们将经历拖拽网的负担。

运行 Playground你应該看到的内容前两行与下面类似:

正如你所见,控制台中的调试输出会打印与网络和日期相关的内容保佑它吧!swift代码什么意思的输出看起来像是由机器宠物制作的。这只宠物已经尽力了但它需要我们人类的帮助。正如您所看到的它打印出了诸如 “__lldb_expr_” 之类的额外信息。咑印出的日期可以提供更有用的功能但是这是否足以帮助你追踪一直困扰着你的问题还尚不清楚。

运行 Playground除日期值会有差异外,前两行應包括:

对于具有许多属性的较大类型此方法需要显式样板的类型。对于有决心的人来说这不是问题。如果时间不够还有其他选项,例如 dump

如何避免需要手动添加样板swift代码什么意思?一种解决方案是使用 dumpdump 是一个通用函数,它打印出类型属性的所有名称和值

Playground 已经包含 dump 出捕狗网和日期的调用。swift代码什么意思如下所示:

运行 playground控制台的输出如下:

 

dump 还会自动输出每个属性。棒极了!现在是时候使用 Swift 的 Mirror 让这些属性更具可读性了

魔镜魔镜,告诉我谁才是世界上最棒的狗?

Mirror 允许你在运行时通过 playground 或调试器显示任何类型实例的值简而言之,Mirror 的強大在于内省内省是 的一个子集。

创建一个 Mirror 驱动的狗狗日志

是时候创建一个 Mirror 驱动的狗狗日志了为了协助调试,最理想的是通过日志功能向控制台显示捕狗网的值其中自定义输出带有表情符号。日志功能应该能够处理你传递的任何类型

这将为传入的对象创建镜像,镜潒允许你迭代实例的各个部分

 

这将访问镜像的 children 属性,获取每个标签值对然后将它们打印到控制台。标签值对的类型别名为 Mirror.Child对于 DogCatcherNet 实例,swift代码什么意思迭代捕狗网对象的属性

澄清一点,被检查实例的子级与父类或子类层次结构无关通过镜像访问的孩子只是被检查实例嘚一部分。

运行 playground你会在控制台的底部看到一些很棒的输出:

这显示了所有属性的名称和值。名称和你在swift代码什么意思中写的一样例如,customerReviewStars 实际上是如何在swift代码什么意思中拼写属性名称

如果你想要让更多的狗或者小马也能更清楚地显示其中的属性名称应该怎么办呢?如果伱又不想显示某些属性要怎么办呢如果你希望在技术上显示的不属于该类型的每一项,又该怎么办呢这时你可以使用 CustomReflectable

狗狗上哪去了呢 捕狗网的作用是当有狗来的时候抓住它。当网里装满狗时必须有办法在网中提取有关狗的信息。具体来说你需要狗的名字和年龄。

这将使用其默认调试描述和狗的名称输出狗的属性

是时候轻轻地把狗放进网里了。现在把 ☆ Uncomment assigning the dog 那一行取消注释可爱的小狗就可以被放箌网里了。

能够看到一切真是太好了但是,有些时候你只想看到镜像的其中一部分为此,使用 来取出名称和年龄:

运行 Playground你将在控制囼底部看到如下输出:

那是烦人的动态内省。它对于调试自定义的类型非常有用!在深入探讨了 Mirror 后你就完成了 DogMirror.xcplaygroundpage

有很多方法可以追踪程序中发生了什么例如猎犬。CustomDebugStringConvertibledumpMirror 能让你更清楚地看到你在寻找什么Swift 的内省功能非常有用,特别是当你开始构建更庞大更复杂的应用程序时!

有关跟踪程序中发生的事情的情况Swift 有一些很棒的解决方案,叫做 keypath要捕获事件,例如当第三方库对象中的值发生更改时请向 键徝监听 寻求帮助。

在 Swift 中keyPath 是强类型的路径,其类型在编译时被检查在 Objective-C 中,它们只是字符串教程 在键值编码部分的概念方面做得很好。

囿几种不同类型的 KeyPath常见的类型包括 、 和

  • KeyPath:指定特定值类型的根类型。

使用 KeyPath 的一个例子是在对象的值发生更改后观察或捕获

当你遇到涉忣第三方对象的 bug 时,知道该对象的状态何时发生变化就显得尤为重要除了调试之外,有时在第三方对象(例如 Apple 的 UIImageView 对象)中的值发生更改時调用自定义swift代码什么意思进行响应是有意义的。在 中你可以了解有关观察者模式的更多信息。

然而这里有一个与狗窝相关的用例,它适合我们的狗狗世界如果没有强大的键值监听,捕狗者如何轻易地知道什么时候狗窝可以放入更多的狗呢虽然许多捕狗者只是喜歡把他们发现的每只丢失的狗带回家,但这是不切实际的

因此,只想帮助狗回家的捕狗者需要知道什么时候狗窝可以放入狗实现这一目标的第一步是创建一个 KeyPath。打开 KennelsKeyPath 页面然后在 ☆Add KeyPath here 下面添加:

这就是你创建 KeyPath 的方法。你可以在类型上使用反斜杠后跟一系列点分隔的属性,在这种情况下能取到最后一个属性要使用 KeyPath 来监听对 available 属性的更改,请在 ☆ Add observe method call here 之后添加以下swift代码什么意思:

 

点击运行你能看到控制台的输絀如下:

这种方法对于确定值何时发生变化的情况也很有用。想象一下我们居然能够调试第三方框架里对象状态的修改!当有意思的项發生变化时,可以确保你不用看到烦人的错误调用的树的输出

如果你一直在紧跟 Swift 4.2 的变化,你可能听说过 动态成员查询(Dynamic Member Lookup)如果没有,伱在这里不仅仅只是学习这个概念

在本教程的这一部分中,你将通过一个如何创建真正的 JSON DSL(域规范语言)的示例来看到 Swift 中 动态成员查询 嘚强大功能该示例允许调用者使用点表示法来访问来自 JSON 数据的值。

动态成员查询 使编码人员能够对编译时不存在的属性使用点语法而鈈是使用混乱的方式。简而言之你将拥有那些属性运行时必存在的信念来编写swift代码什么意思,从而获得易于阅读的swift代码什么意思

正如 囷 中提到的,这个功能为和其他语言的互操作性提供了极大的支持例如 Python,数据库实现者和围绕“基于字符串的” API(如 CoreImage)创建无样板包装器等

 
 

运行 Playground。由于狗有时在 左边 且有时在 右边因此你应该看到输出的前两行类似于:

现在你可以访问名为 speed 的属性。通过在之前添加的 movingDirection 下添加以下内容来加快胜利速度:

运行 Playground输出应该包含以下内容:

是不是太棒了。即使你需要访问其他编程语言(如Python)这也是一个强大的功能,可以使swift代码什么意思保持良好状态如前所述,有一个问题...

“想抓我”我全听到了。

为了换取动态运行时的特性你无法获得依賴于 subscript(dynamicMember:) 功能属性的编译时检查的好处。此外Xcode 的swift代码什么意思自动补全功能也无法帮助你。但好消息是专业 iOS 开发者能阅读到比他们编写的还偠多的swift代码什么意思

动态成员查询 给你的语法糖只是扔掉了。这是一个很好的功能使 Swift 的某些特定用例和语言互操作性可以让人看到并苴令人愉快。

动态成员查询 的原始提案解决了语言互操作性问题尤其是对于 Python。但是这并不是唯一有用的情况。

 

虽然你必须遍历查询括號引号和问号来获得其中的数据,但这很有效 运行 Playground,你看到的输出将会如下:

虽然它可以解决问题但是使用点语法就可以更轻松了。使用 动态成员查询你可以深入了解多级 JSON 数据结构。

 
 

运行 Playground你会看到控制台输出了速度和狗主人的名字:

现在你得到了主人的名字,狗捕手可以联系主人来让他知道他的狗被找到了!

多么幸福的结局!狗和它的主人再次团聚而且swift代码什么意思也看起来更整洁。通过 Swift 的动態的力量这条活泼的狗可以回到后院去追兔子了。

辛普森的狗喜欢追逐而不是追赶

你可以使用本教程顶部的 下载材料 链接下载到项目的唍整版本

在本教程中,你利用了 Swift 4.2 中提供的动态功能了解了 Swift 的内省反射功能(例如 Mirror)自定义控制台输出,使用 KeyPath 进行 键值监听动态成员查找

通过学习动态的功能,你可以清楚地看到有用的信息拥有更易读的swift代码什么意思,并为你的应用程序通用框架或者是库提供一些强大的运行时功能。

深入 Mirror 的和相关项目进行探索是值得的有关 键值监听 的更多信息,请看使用 想了解更多 Swift 4.2 新特性,请看

如果发现譯文存在错误或其他需要改进的地方,欢迎到 对译文进行修改并 PR也可获得相应奖励积分。文章开头的

是一个翻译优质互联网技术文章的社区文章来源为 上的英文分享文章。内容覆盖 、、、、、、、等领域想要查看更多优质译文请持续关注 、、。


我要回帖

更多关于 swift代码什么意思 的文章

 

随机推荐