译自 BetterRest: Introduction
更多内容欢迎关注公众号 「Swift花园」
BetterRest 介绍
这个 SwiftUI 工程是又一个基于表单的 app ,它让用户输入信息,然后转换成警告。听起来很无趣 —— 之前不是已经做过了,对吧?
练习总归没有坏处。不过,我们之所以采用这么简单的工程是因为我想向你介绍 iOS 开发中一项非常强大的特性:机器学习 (ML)。
所有 iPhones 都内置搭载了被称为 Core ML 的技术,它使得我们我可以编写代码,基于之前的数据对新的数据做出预测。我们会从一些原始数据开始,喂给我们的 Mac 作为原始数据,然后用训练结果构建一个 app ,对新数据做出精确的评估 —— 这个过程在设备上完成,并且完全保护用户的隐私。
我们将构建的实际的 app 叫 BetterRest ,它被设计来帮助喝咖啡的人获取更好的夜间睡眠,主要通过询问三个问题实现:
- 他们想要什么时候醒来?
- 他们想睡多少个小时?
- 他们每天喝多少杯咖啡?
一旦我们有了这三个问题的答案,我们把它们喂给 Core ML 以获取这些人应该上床睡觉的时间。思考一下,可能的答案可能有几亿个 —— 各种醒来的时间乘上睡眠时间,再乘上喝咖啡的数量。
机器学习在这里可以派上用场:采用一种叫做 回归分析 的技术,我们可以让计算机产生一种可以代表所有数据的算法,最终使得还未出现的新数据可以被算法计算出来。
开始之前你需要用到一些文件,到这里下载,SwiftUI 目录下
拿到这些文件后,你可以在 Xcode 中创建一个新的 Single View App 模板工程,起名叫 BetterRest. 跟之前一样,开始之前你需要了解许多知识,让我们开始吧。
译自 Entering numbers with Stepper
用 Stepper 输入数字
SwiftUI 有两种让用户输入数字的方法,下面我们要用的这种是Stepper:它很简单,只有 - 和 + 按钮,可以被点击以选取精确的数字。另外一个选项是Slider,它也可以让我们从一个范围内选取值,但更不精确,这个之后我们也会用到。
Stepper 足以应对任何类型的数字 —— 你可以把它绑定到 Int ,Double 等等,它会自动适配。举个例子,我们可能会创建一个下面这样的属性:
@State private var sleepAmount = 8.0然后我们可以把它绑定到一个 stepper 以便 stepper 显示当前值,像这样:
Stepper(value: $sleepAmount) {
Text("\(sleepAmount) hours")
}上面的代码运行时你会看到 8.000000 小时,你可以点击 - 和 + 来变成 7, 6, 5 直到负数,或者变成 9, 10, 11, 等。
默认情况下,stepper 只受存储范围的限制。在例子中我们用的是 Double类型,这意味着stepper 的最大范围是 1.7976931348623157e+308 。这是科学记数法,指的是 “1.79769 乘以 e 的 308 次方” 。简单来说,一个非常非常大的数。
作为两个孩子的父亲,我没办法告诉你我需要睡多久,因为我根本没法睡那么多。幸运的是,Stepper提供了 in 参数,用以限制我们想要它接收的数字的范围,像这样:
Stepper(value: $sleepAmount, in: 4...12) {
Text("\(sleepAmount) hours")
}通过这个改变,stepper 将从 8 开始,允许用户在 4 和 12 之间移动。这个改变让我们可以控制睡眠范围,以便用户无法尝试睡 24 小时,也让我们拒绝不可能的值 —— 比如你不可能睡 -1 小时。
Stepper还有第三个有用的参数, 它就是 step —— 每次 – 或者 + 被点击时移动的步长。它也可以是任意数字,但是必须匹配绑定的数据类型。因此,如果你绑定的是整数,就不能用 Double作为步长值。
在这个例子中,我们可以说用户可以在 4 到 12 之间选择任意睡眠时间,增量 15 分钟:
Stepper(value: $sleepAmount, in: 4...12, step: 0.25) {
Text("\(sleepAmount) hours")
}看起来有模有样了 —— 我们有一个合理的精确范围,一个靠谱的睡眠增量,用户可以很清楚地看到自己选择的时间。
不过在我们继续之前,让我们修正一下文本,现在是 8.000000 ,过于精确了。之前我们用过字符串插值,像这样:
Text("\(sleepAmount, specifier: "%.2f") hours")这个虽然可以,但 “8.00 hours” 看起来也过于可观了。这里是 “%g” 区分符的绝佳应用范围,因为这个区分符会自动移除数字尾部不重要的 0 。因此,它会显示成 8, 8.25, 8.5, 8.75, 9, 等,这对于阅读来说更自然。
相关文章
[SwiftUI 100 天] BetterRest - part2
[SwiftUI 100 天] BetterRest - part3
我的公众号 这里有Swift及计算机编程的相关文章,以及优秀国外文章翻译,欢迎关注~
