2014-12-25 17 views
3

Я пытаюсь создать общую функцию Swift, которая будет принимать две коллекции и скопировать часть одного в часть другого, вроде std::copy с точки зрения семантики и memcpy с точки зрения интерфейса , Однако я не могу придумать правильные аргументы аргументов/аргументов, чтобы заставить его работать.Общая функция копирования в Swift

Цель состоит в том, чтобы быть в состоянии назвать это так, возможно, опуская любой из трех последних параметров:

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] 
    } 
} 

Однако я имеют эту ошибку на линии a[indA] = b[indB]:

Не удалось найти перегрузку для «индекса», которая принимает прилагаемый аргумент s

Это несколько удивительно, поскольку почти идентичные общие ограничения позволяют мне сравнивать элементы, что означает, что тип должен быть правильным, по крайней мере.

Что мне не хватает? В противном случае, есть ли функция, чтобы сделать это в другом месте?

ответ

4

Эта ошибка связана с тем, что CollectionType не предоставляет присваиваемый индекс. Переключатель T соответствует MutableCollectionType, который добавляет его.

P.S. вы можете переключить T.Index == Int на T.Index: RandomAccessIndexType, если вы хотите сделать его более универсальным. Это может повлечь заблуждение при вычислении max.

Кроме того, я думаю, что вы можете отказаться от требования к равномерности элементов, я не думаю, что вы его используете. Но помните, что это будет мелкая копия, если элементы являются классами.

Вы можете посмотреть на протоколе ExtensibleCollectionType, который добавляет возможность создавать новые пустые коллекции этого типа, и добавляют новые элементы к ним, а также RangeReplaceableCollectionType, который добавляет возможность обновлять диапазоны в коллекции со значениями из другие коллекции (а также удалить диапазоны элементов, вставить новые элементы и т. д.).

+0

Я не перед моим компьютером, но сегодня я попробую его попробовать. – zneak

+0

Общие требования в основном были скопированы из функции сравнения, которую я сделал, поэтому нет, элементы, вероятно, не должны быть равнозначными. – zneak

Смежные вопросы