我正在做A Swift Tour。
一:
我没有获得Generics
函数逻辑。它用于Design Patterns
?这次巡演的解释看起来很短,不清楚。
两个的
在这个用于创建泛型函数的代码中,
func repeatItem<Item>(item: Item, numberOfTimes: Int) -> [Item] {
var result = [Item]()
for _ in 0..<numberOfTimes { //im not getting this line (?)
result.append(item)
}
return result
}
repeatItem("knock", numberOfTimes:4)
我不太了解这种语法,在同一行中_
,..
和<
是什么意思,为什么会这样使用?
答案 0 :(得分:3)
_
,..
和<
不属于泛型。
_
只是一个从未使用的参数的非名称。
通常你会在这里放一个像i
这样的变量名,并在块中使用它,但是你只是做了一些事情,你实际上没有使用索引。
..<
是起始值和结束值之间范围的简写。然后,1..<5
会生成范围1,2,3,4
还有一个范围简写...
,可以为您提供最后一个值5
通用代码使您可以编写灵活,可重用的函数和 可以使用任何类型的类型,符合您的要求 限定。您可以编写避免重复的代码并表达它 意图以清晰,抽象的方式。 Generics
答案 1 :(得分:2)
如果不在其他地方使用变量,可以使用下划线。因此,如果您循环使用某些数字范围,并且未使用索引,则可以使用_
。这只是语法糖。
0..<4
表示从0开始计数,并计数到4-1 = 3 。您可以使用0...4
包含最后一个数字,这意味着*从0开始计数,最多计数到4`。
for i in 0..<4 {
print(i)
} // prints 0, 1, 2, 3
虽然
for i in 0...4 {
print(i)
} // prints 0, 1, 2, 3, 4
答案 2 :(得分:1)
考虑C:
中的旧学校for
循环
for var i = 0; i < numberOfTimes; i++ {
result.append(item)
}
哎呀,很多代码只是为result.append(item)
重复numberOfTimes
! Swift有一个简写语法:a..<b
表示“从a迭代到小于b”,因此您的for
循环可以重写为:
for i in 0..<numberOfTimes {
result.append(item)
}
但是你不要在循环体内使用i
。你想要的只是重复它numberOfTimes
。所以你不关心迭代器采用什么名称:i
,x
或z
。因此,您甚至不需要声明它,只需将其替换为_
:
for _ in 0..<numberOfTimes {
result.append(item)
}
答案 3 :(得分:0)
for _ in 0..<numberOfTimes {
(something)
}
相当于:
for(var nameForWhichIdontCare = 0; nameForWhichIDontCare < numberOfTimes {
(something)
}
所以:
_
用于需要名称但你不在乎的地方,所以基本上从头开始丢弃名称。
..<
是一个范围,最多可达数字。
...
是一个范围,包括一个数字。