在swift中循环使用奇数

时间:2016-12-17 23:39:30

标签: swift

我正在尝试解决任务

  

使用标准的for-in循环将所有小于或等于100的奇数加到oddNumbers数组

我尝试了以下内容:

var oddNumbers = [Int]()
var numbt = 0
for newNumt in 0..<100 {
    var newNumt = numbt + 1; numbt += 2; oddNumbers.append(newNumt)
}

print(oddNumbers)

这导致:

  

1,3,5,7,9,... 199

我的问题是:为什么我打印数字大于100虽然我指定的范围介于0和<100之间

5 个答案:

答案 0 :(得分:7)

你犯了一个错误:

for newNumt in 0..<100 {
    var newNumt = numbt + 1; numbt += 2; oddNumbers.append(newNumt)
}

在循环中定义的变量newNumt不会影响newNumt语句中声明的变量for。因此for循环打印出前100个奇数,而不是 0到100之间的奇数

如果您需要使用for循环:

var odds = [Int]()
for number in 0...100 where number % 2 == 1 {
    odds.append(number)   
}

可替换地:

let odds = (0...100).filter { $0 % 2 == 1 }

将使用0到100之间的项过滤数组中的奇数。为了更好的实现,请使用stride运算符:

let odds = Array(stride(from: 1, to: 100, by: 2))

答案 1 :(得分:3)

如果你想要0到100之间的所有奇数,你可以写

let oddNums = (0...100).filter { $0 % 2 == 1 }

let oddNums = Array(stride(from: 1, to: 100, by: 2))

答案 2 :(得分:2)

为什么我在0到<100之间指定数字,却打印出100以上的数字?

再次查看您的代码:

for newNumt in 0..<100 {
    var newNumt = numbt + 1; numbt += 2; oddNumbers.append(newNumt)
}  

循环中使用的newNumt与循环变量不同; var newNumt声明了一个新变量,其范围是循环的主体,因此每次通过循环都会创建和销毁它。同时,numbt是在循环外部声明的,因此每次循环都将其递增2。

我看到这是一个老问题,但是没有一个答案专门针对奇数循环,因此我将添加另一个。 Luca Angeletti指出的stride()函数是正确的方法,但是您可以像这样在for循环中直接使用它:

for oddNumber in stride(from:1, to:100, by:2) {
    // your code here
}

stride(from:,to:,by:)from:参数为增量,创建一个直至但不包括by:参数的任何可跨越类型的列表,因此在这种情况下oddNumber开始于1并包括3, 5, 7, 9...99。如果要包括上限,则可以使用stride(from:,through:,by:)形式,其中包含through:参数。

答案 3 :(得分:1)

如果您希望所有0到100之间的奇数都可以写

<form #imageForm="ngForm" (ngSubmit)="OnSubmit(Caption,Image)">
        <div class="input-field col s12">
          <input type="text" #Caption ngModel name="Caption" id="Caption">
          <label for="Caption">Caption</label>
        </div>
        <img [src]="imageUrl" style="width:200px;height:200px;">
        <input type="file" #Image accept="Image/*" (change)="handleInputFile($event.target.files)">
        <button class="btn waves-effect waves-light" type="submit">Submit
          <i class="material-icons right">send</i>
        </button>
      </form>

答案 4 :(得分:0)

对于 Swift 4.2

extension Collection {
    func everyOther(_ body: (Element) -> Void) {
        let start = self.startIndex
        let end = self.endIndex

        var iter = start

        while iter != end {
            body(self[iter])

            let next = index(after: iter)
            if next == end { break }
            iter = index(after: next)
        }
    }
}

然后您可以像这样使用它:

class OddsEvent: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()

        (1...900000).everyOther{ print($0) } //Even
        (0...100000).everyOther{ print($0) } //Odds

    }
}

这比以下方法更有效:
让oddNums =(0 ... 100).filter {$ 0%2 == 1}
let oddNums = Array(stride(从:1,到:100,通过:2))
因为支持更大的收藏集

来源:https://developer.apple.com/videos/play/wwdc2018/229/