如何正确格式化此Swift函数以映射数组?

时间:2015-04-21 21:34:07

标签: ios arrays swift

我正在尝试使用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])

TU是原始数组,并且分别返回新数组,并且使用泛型完成。

我确定这写得不好,我的语法正确。例如,由于返回的数组由通用[U]表示,我假设我必须在返回的数组中的某处使用它,但不确定在哪里。

1 个答案:

答案 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+等):

*