【问题标题】:How to write this code in swift 3.0. using For loop [duplicate]如何在 swift 3.0 中编写此代码。使用 For 循环 [重复]
【发布时间】:2017-09-11 06:17:26
【问题描述】:

如何在 swift 3.0 中编写此代码。使用 For 循环?

for (int index = 0; index < 100; index += (1 + index)) {        
    printf("%d\t",index);      
}

【问题讨论】:

  • 该代码似乎毫无意义。它会产生奇怪的结果。 Swift 不再具有 C 风格的 for (;;) 构造,因此您必须使用 while 循环来构建它。这对我来说就像一个家庭作业。是吗?

标签: swift


【解决方案1】:

这种for 循环来自C,与Swift 语言的设计和精神背道而驰。这就是它在 Swift 3 中被淘汰的原因(你可以找到更多关于它的移除here)。

C 风格的 for 循环有三个语句:

首先,有初始化语句,您可以在其中设置一个或多个变量。在这种情况下,初始化语句是:

int index = 0

在 Swift 中变成了

var index = 0

然后,有 循环不变量, 这是一个条件,在每次循环的开始和结束时都必须为真。在这种情况下,循环不变量是:

index < 100

Swift 代码与 C 代码几乎相同。

最后,我称之为 change 语句, 它对循环中的某些条件进行更改,需要对其进行评估以查看是否需要通过循环进行另一次传递。在这种情况下,就是这样的声明:

index += 1 + index

同样,Swift 代码与 C 代码几乎相同。

你应该使用 while 循环,等效的 Swift 代码如下所示:

while index < 100 {
  print("\(index)\t")
  index += 1 + index
}

index += 1 + index 代码虽然有效,但并不常见。你确定你想要那个,还是想要更常见的index += 1

【讨论】:

  • 良好、清晰、逐步的答案。不过有一个小问题。 C printf() 函数不会终止该行,而 Swift print() 函数默认情况下会终止该行。在我的回答中,我提供了可选的终止符参数,它用制表符替换了正常的换行符。您的代码将在新行上显示循环中的每个步骤,这与提供的 C 代码不同。
【解决方案2】:

您的增量正在增加。由于 C 风格的 for 循环不可用,您可以使用如下代码:

var index = 0
while index < 100 {
  print("\(index)", terminator: "\t")
  index += 1 + index
}
print("")

你也可以写成函数式的代码:

for f in sequence(first: 0,
                  next: {
                    $0 + $0 + 1
})
  .prefix(while: {$0 < last}) {
    print(f, terminator: "\t")
}
print("")

(前缀功能需要Swift 3.1)

【讨论】:

  • 赞成正确翻译,包括使用带有终结符的打印。
【解决方案3】:

如果你必须使用 for 循环,你可以使用一个序列,但这会比 while 循环更冗长和麻烦:

for index in  sequence(first:0, next:{ let index = $0 + $0 + 1; return index < 100 ? index : nil})
{
  print("\(index)")
}

您还可以使用泛型函数将其推广到任何类型和增量:

func cFor<T>(_ start:T, _ condition:@escaping (T)->Bool, _ increment:@escaping (inout T)->()) -> UnfoldSequence<T, (T?, Bool)>
{
   return sequence(first:start, next:{ var next = $0; increment(&next); return condition(next) ? next : nil })
}

for index in cFor(0,{$0<100},{$0 += $0 + 1})
{
  print("\(index)")
}

【讨论】:

    猜你喜欢
    • 2017-03-30
    • 2019-05-17
    • 1970-01-01
    • 1970-01-01
    • 2019-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-03
    相关资源
    最近更新 更多