我正在尝试解决任务
使用标准的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之间
答案 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))
因为支持更大的收藏集