2016-05-24 11 views
0

У меня есть функцияКак вы передаете кусок массива функции inout? Type-стирание?

func doThing(inout array: [Int]) { //thing } 

У меня есть массив

var stuff = [0,1,2,3,4,5,6] 

Я хочу doThing работать на только первые три элемента.

doThing(&stuff[0..<3]) 

не работает, так как

var partOfStuff: ArraySlice<Int> = stuff[0..<3] 

и doThing не принимает ArraySlice с. Самое лучшее, что я могу придумать, - вставить stuff в AnyCollectionType или какую-то другую стираемую структуру и изменить аргументы doStuff на тип типа. Но это вряд ли стоит усилий и очень неэлегантных, я думаю, что просто не использовать inout было бы лучше.

У кого-нибудь есть лучший способ?

+0

Вы могли бы бросить кусочек в массив ... Вы можете иметь 'doThing' взять' _ArrayType' ... Действительно, не зная, что 'doThing '_does_, трудно быть полезным. Зачем нужно использовать 'inout [Int]'? – matt

ответ

0

ArraySlice is copy-on-write поэтому, когда вы используете его как inout, вы изменяете копию исходного массива. Лучше пройти индексы, которые вы хотите изменить:

// Double the elements at the indicated indices 
func doThing(inout array: [Int], onIndices indices: [Int]) { 
    for i in indices { 
     array[i] *= 2 
    } 
} 

var stuff = [0,1,2,3,4,5,6] 
doThing(&stuff, onIndices: Array(0..<3))