Generics Swift中的通用复制功能

Generics Swift中的通用复制功能,generics,swift,Generics,Swift,我正在尝试创建一个通用的Swift函数,它将接受两个集合,并将其中一个集合的一部分复制到另一个集合的一部分,在语义方面类似于std::copy,在接口方面类似于memcpy。然而,我发现自己无法想出正确的泛型参数/函数参数来让它工作 目标是能够这样调用它,可能省略最后三个参数中的任何一个: copy(&output, input, offsetA: 0, offsetB: 4, count: 20) 这就是我到目前为止所做的: func copy <T: Collecti

我正在尝试创建一个通用的Swift函数,它将接受两个集合,并将其中一个集合的一部分复制到另一个集合的一部分,在语义方面类似于
std::copy
,在接口方面类似于
memcpy
。然而,我发现自己无法想出正确的泛型参数/函数参数来让它工作

目标是能够这样调用它,可能省略最后三个参数中的任何一个:

copy(&output, input, offsetA: 0, offsetB: 4, count: 20)
这就是我到目前为止所做的:

func copy
    <T: CollectionType, U: CollectionType where
        T.Generator.Element == U.Generator.Element,
        T.Index == Int, T.Index == U.Index,
        T.Generator.Element: Equatable>
    (inout a: T, b: U, offsetA: Int = 0, offsetB: Int = 0, count: Int? = nil) {
    let max = count ?? b.endIndex - b.startIndex - offsetB
    for i in 0..<max {
        let indA = offsetA + i
        let indB = offsetB + i
        a[indA] = b[indB]
    }
}
func复制
(输入a:T,b:U,偏移量:Int=0,偏移量b:Int=0,计数:Int?=nil){
设max=count??b.endIndex-b.startIndex-offsetB

对于0..中的i,该错误是因为
CollectionType
未提供可分配的下标。切换
t
以符合
MutableCollectionType
,这会添加一个下标

另外,如果你想让它更通用一点,你可以将
T.Index==Int
切换为
T.Index:RandomAccessIndexType
。这可能需要稍微修改
max
的计算

此外,我认为您可以放弃元素是可等分的要求,我不认为您正在使用它。但是请记住,如果元素是类,那么它将是一个肤浅的副本


您可能需要查看
ExtensibleCollectionType
协议,该协议添加了创建该类型的新空集合并向其添加新元素的功能,以及
RangeReplacableCollectionType
协议,该协议添加了使用来自其他集合的值更新集合中的范围的功能(以及删除元素范围、插入新元素等)。

我不在我的计算机前,但今天晚些时候我会尝试一下。一般要求大多是从我制作的比较函数中复制的,因此不,元素可能不需要相等。