2016-05-24 10 views
0

Ich habe eine FunktionWie übergeben Sie einen Teil eines Arrays an eine Inout-Funktion? Typ-Löschung?

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

Ich habe das Array

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

ich doThing will nur die ersten drei Elemente operieren.

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

funktioniert nicht, da

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

und doThing nicht ArraySlice s akzeptiert. Das beste, was ich mir vorstellen kann, wäre, stuff in AnyCollectionType oder eine andere Typ-gelöschte Struktur einzubetten und die Argumente von doStuff zu ändern, um den Typ-gelöschten Typ zu sein. Aber das scheint die Mühe kaum wert und sehr unelegant, ich denke nur inout wäre nicht besser.

Jeder hat einen besseren Weg?

+0

Sie die Scheibe in ein Array stellen könnten ... Sie haben könnten 'doThing' nehmen ein' _ArrayType' ... Wirklich, ohne zu wissen, was 'doThing '_does_, es ist schwer, hilfreich zu sein. Warum braucht es ein 'inout [Int]'? – matt

Antwort

0

ArraySlice ist Copy-on-write so, wenn Sie es als inout verwenden, führen Sie eine Kopie des ursprünglichen Arrays ändern. Es ist besser, die Indizes zu übergeben, die Sie ändern möchten:

// 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))