我正在尝试使用swift构建一个映射数组的函数,将数组中的每个值除以3,然后吐出一个新数组。这就是我到目前为止所做的:
func divideby3Map<T, U>(y: [T], z: T -> U) -> [U] {
let array = [int]()
let divideby3Array = array.map { [y] / 3 }
return dividedby3Array
}
divideby3Map([1,2,3,4,5])
T
和U
是原始数组,并且分别返回新数组,并且使用泛型完成。
我确定这写得不好,我的语法正确。例如,由于返回的数组由通用[U]
表示,我假设我必须在返回的数组中的某处使用它,但不确定在哪里。
答案 0 :(得分:7)
编写泛型函数时,有时更容易通过3个步骤来处理它:首先使用特定类型单独编写代码。然后将代码编写为函数,仍然使用特定类型。最后,将功能更改为通用。
第一部分,将数组除以3,可以这样做:
let a = [1,2,3,4,5]
// map is run on the array of integers, and returns a new
// array with the operation performed on each element in a:
let b = a.map { $0 / 3 }
// so b will be [0,0,1,1,1]
// (don’t forget, integer division truncates)
请注意,{ }
之间提供的闭包是一个将应用于数组的每个元素的操作。 $0
表示元素,并将其除以3.您也可以将其写为a.map { i in i / 3 }
。
将其置于自己的功能中:
func divideby3Map(source: [Int]) -> [Int] {
return source.map { $0 / 3 }
}
无需声明新数组 - map
将为您创建一个。然后您可以直接返回(如果您愿意,可以将其分配给临时,但这不是必需的。)
最后,如果你想让它变得通用,首先要添加一个占位符:
func divideby3Map<T>(source: [T]) -> [T] {
return source.map { $0 / 3 }
}
请注意,只需要一个占位符T
,因为您返回的是与传入的完全相同的类型。
除了......这不会编译,因为编译器不知道T
可以保证提供两个关键的东西:划分能力(/
运算符),以及能力从整数文字创建新的T
(即创建值为T
的{{1}}除以)。否则,如果我们在?
为此,我们需要“约束”3
,以便我们的函数只接受提供这些功能的参数类型。我们可以用来约束T
的一个这样的协议是T
,这确保了这些功能(以及其他一些功能,如IntegerType
,+
等):
*