Swift 3 for 循环增量

2023-11-30

如何在 Swift3 中编写以下内容?

for (f = first; f <= last; f += interval)          
{
    n += 1
}

这是我自己的尝试

for _ in 0.stride(to: last, by: interval)
{
    n += 1
}

斯威夫特 2.2 -> 3.0:Strideable:s stride(...)替换为全局stride(...)功能

在 Swift 2.2 中,我们可以(正如您在自己的尝试中尝试过的那样)使用蓝图(和默认实现的)函数stride(through:by:) and stride(to:by:) 从协议Strideable

/* Swift 2.2: stride example usage */
let from = 0
let to = 10
let through = 10
let by = 1
for _ in from.stride(through, by: by) { } // from ... through (steps: 'by')
for _ in from.stride(to, by: by) { }      // from ..< to      (steps: 'by')

而在 Swift 3.0 中,这两个函数已被删除Strideable赞成全局函数stride(from:through:by:) and stride(from:to:by:);因此上面的等效 Swift 3.0 版本如下

/* Swift 3.0: stride example usage */
let from = 0
let to = 10
let through = 10
let by = 1
for _ in stride(from: from, through: through, by: by) { }
for _ in stride(from: from, to: to, by: by) { }

在您的示例中,您想使用闭区间步幅替代方案stride(from:through:by:),因为你的不变量for循环使用与 less 的比较或等于 (<=). I.e.

/* example values of your parameters 'first', 'last' and 'interval' */
let first = 0
let last = 10
let interval = 2
var n = 0
for f in stride(from: first, through: last, by: interval) { 
    print(f)
    n += 1 
} // 0 2 4 6 8 10
print(n) // 6

我们自然会在哪里使用您的for循环仅作为段落的示例for循环到stride,对于您的具体示例,您自然可以计算n不需要循环(n=1+(last-first)/interval).

Swift 3.0:替代方案stride对于更复杂的迭代增量逻辑

With 进化提案SE-0094的实施、Swift 3.0引入全球sequence功能:

  • sequence(first:next:),
  • sequence(state:next:),

这可以是一个适当的替代方案stride对于具有更复杂迭代增量关系的情况(本例中不是这种情况)。

声明

func sequence<T>(first: T, next: @escaping (T) -> T?) -> 
         UnfoldSequence<T, (T?, Bool)>

func sequence<T, State>(state: State, 
                        next: @escaping (inout State) -> T?) ->
           UnfoldSequence<T, State>

我们将简要介绍这两个函数中的第一个。这next参数采用一个闭包,该闭包应用一些逻辑来延迟构造给定当前序列元素的下一个序列元素(从first)。当以下情况时,序列终止next回报nil,或无穷大,如果next一去不复返nil.

应用于上面的简单恒定步长示例,sequence方法有点冗长和矫枉过正。适合此目的的stride解决方案:

let first = 0
let last = 10
let interval = 2
var n = 0
for f in sequence(first: first,
                  next: { $0 + interval <= last ? $0 + interval : nil }) {
    print(f)
    n += 1
} // 0 2 4 6 8 10
print(n) // 6

The sequence然而,对于步幅不恒定的情况,函数变得非常有用,例如如以下问答中所涵盖的示例所示:

  • 在 swift 中表达具有动态范围的 for 循环

只需注意用最终的终止序列nilreturn (如果不是:“无限”元素生成),或者,当 Swift 3.1 到来时,结合使用其惰性生成prefix(while:)序列方法,如进化提案中所述SE-0045。后者应用于该答案的运行示例使得sequence方法不太冗长,明确包括元素生成的终止标准。

/* for Swift 3.1 */
// ... as above
for f in sequence(first: first, next: { $0 + interval })
    .prefix(while: { $0 <= last }) {
    print(f)
    n += 1
} // 0 2 4 6 8 10
print(n) // 6
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Swift 3 for 循环增量 的相关文章

随机推荐

  • 有选择地抑制自定义过时警告

    我正在使用Obsolete属性 正如其他程序员所建议的那样 在使用某种方法时显示警告 有没有办法抑制类似于 CodeAnalysis 的警告SuppressMessage在合理的地方使用 这需要为 Obsolete Some message
  • 了解公共/私有实例变量

    我正在读一本tutorial在公共 私有方法上 无法理解其中的区别 对于私有方法 它说 私有成员由构造函数创建 构造函数的普通变量和参数成为私有成员 function Container param this member param va
  • 如何使用pcap_breakloop?

    我在另一个函数中有一个 pcap loop 函数 用于捕获数据包 直到用户停止它 即 void functionA signal SIGINT terminate process pcap loop handle 1 callback NU
  • 如何在Windows下用Python将表情符号渲染为图像?

    我的目标是生成 在 Windows 下的 Python 中 渲染任何 unicode 字符的位图图像 尤其包括表情符号 我已经安装了几种表情符号友好的字体 包括Symbola 用于测试目的 到目前为止 我已经尝试过 PIL matplotl
  • 包括正确的内在标头

    我一直在阅读关于哪个头文件更适合访问英特尔的内在函数的意见 x86intrin h or immintrin h 两者似乎都达到了相同的结果 但我确信在代码可移植性方面一定存在一些细微的差异 也许其中一个比另一个更常见或更完整 我找不到对其
  • 在 jQuery 的 data() 方法中使用函数更新值设置的变量相当于匿名函数,而不是返回值

    我回答了这个问题 使用 jQuery 操作自定义值 使用这个 jQuery img attr u function i u i is the index of the current image among all the images r
  • 为什么 ASP.NET Web API 只允许 POST 方法使用一个参数?

    我是 ASP NET Web API 的新手 我发现它有一个非常烦人的限制 post方法只支持一个参数 在这里阅读更多内容 使用 jQuery 将 FromBody 参数 POST 到 Web API 从那个链接来看 他们似乎是这样设计的
  • 查询计算工资的累计和总 SUM

    Name Location Salary smith newyork 6000 adam dallas 5000 rams delhi 7000 scott laondon 4000 输出应该是这样的 Name Location Salar
  • 您推荐使用哪些工具来为 Powershell 脚本构建 UI [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 从头开始为 PowerShell 脚本创建 GUI 的最佳工具是什么 该脚本可能包含多个功能 因此需要链接到每个功能的多个按钮 还需要有一个输出区域来显示操作结果 PowerSh
  • 如何提取单元格字符串中的六位数字?

    我有一列数据 纽约真不错 456983 美食北京真棒678932 文化不错 等等 我想提取六位数字并将其放置在原始列旁边的列中 有 n 行 有没有办法不用VBA 用公式来做到这一点 如果没有 VBA 您可以使用以下 Excel 公式 假设
  • 文字字符串和函数返回值是左值还是右值?

    只是想知道文字字符串是左值还是右值 其他文字 如 int float char 等 是左值还是右值 函数的返回值是左值还是右值 你如何区分 字符串文字是左值 但您无法更改它们 右值 但如果它是指针且非 NULL 则它指向的对象是左值 C 标
  • sizeof(array)/sizeof(array[0]) 有什么问题吗?

    我的一位同事最近表示 上述语句不是类型安全的 我应该使用其他内容 因为您需要尽可能多的类型安全结构来减少可能的错误数量 虽然我同意类型安全 但我有点困惑 因为这是有问题的代码类型 仅修改了 data 的内容和长度 unsigned char
  • 如何使用 PyDrive 访问团队云端硬盘而不是个人 Google 云端硬盘?

    我正在尝试使用 PyDrive 以编程方式列出然后下载存储在团队驱动器上的文件 我可以在浏览器中访问这些文件 当我这样做时 from pydrive auth import GoogleAuth from pydrive drive imp
  • 是否允许复制指针并在副本上调用删除?

    如果我复制一个指针 然后要求删除指向的分配 这是有效的 C 还是未定义的行为 char orig new char 100 char copy orig delete copy 这是完全有效的 您正在取消分配在第一行分配的数组 请注意 复制
  • 具有自动存储期限的变量的地址可以在其定义中取吗?

    是否允许在其定义的右侧获取对象的地址 如发生在foo below typedef struct char x 100 chars chars make void p printf p p n p chars c return c void
  • javascript 中 setInterval 函数的闭包

    如何使用setInterval不使用全局变量 我更喜欢将 setInerval 调用的函数的所有变量包装在某种闭包中 如下所示 var wrap function f var local1 local2 return function re
  • Jetpack 撰写 Canvas Arch 额外行程

    我在 jetpack compose 中使用画布来绘制由多个拱门形成的圆圈 为了让拱门看起来更好 我将帽子设置为圆形 style Stroke width chartBarWidth toPx cap StrokeCap Round The
  • Android Spinner:选择同一项目时不会调用 onItemSelected 侦听器

    我需要出示AlertDialog当选择第 2 项时Spinner 我知道使用onItemSelected我们可以聆听微调器的选择并显示弹出窗口 问题是当我选择第二个项目时 会出现对话框 但关闭对话框后 然后再次选择相同的项目 它不会将对话框
  • 在 Thymeleaf 中创建下拉菜单和表单

    我想创建一个下拉菜单 允许客户端通过下拉菜单中指定的字段搜索用户 例如 按州搜索 按城市搜索等 这是我到目前为止所拥有的 p Search options p
  • Swift 3 for 循环增量

    如何在 Swift3 中编写以下内容 for f first f lt last f interval n 1 这是我自己的尝试 for in 0 stride to last by interval n 1 斯威夫特 2 2 gt 3 0