2016-05-24 13 views
2

Es muss eine wirklich elegante Art und Weise sein, von einem Index beginnend mit Swift Ende des Array zu kopieren, aber ich kann es einfach nicht finden, so dass ich endete dies mit:Wie kopiert man das Ende des Arrays in swift?

func getEndOfArray<T>(arr : [T], fromIndex : Int? = 0) -> [T] { 
    var i=0; 
    var newArray : [T] = [T]() 
    for item in arr { 
     if i >= fromIndex { 
      newArray.append(item) 
     } 
     i = i + 1; 
    } 
    return newArray // returns copy of the array starting from index fromIndex 
} 

Gibt es eine bessere Art und Weise zu tun, das ohne zusätzliche Funktion?

Antwort

7

Und noch eins ...

let array = [1, 2, 3, 4, 5] 
let fromIndex = 2 
let endOfArray = array.dropFirst(fromIndex) 
print(endOfArray) // [3, 4, 5] 

Dies gibt ein ArraySlice die für die meisten Zwecke gut genug sein sollte. Wenn Sie ein echtes Array benötigen, verwenden

let endOfArray = Array(array.dropFirst(fromIndex)) 

Eine leere Array/Scheibe erzeugt wird, wenn der Startindex größer als (oder gleich), das Element zu zählen.

+0

Dies war der ursprünglichen Frage am nächsten. Ich denke, die wirkliche Funktionalität ist hier das SequenceType-Protokoll? https://developer.apple.com/library/watchos/documentation/Swift/Reference/Swift_SequenceType_Protocol/index.html –

+0

@TeroTolonen: Sie haben recht, 'dropFirst()' funktioniert auf jedem 'SequenceType'. –

2

Dies ist eine mögliche Lösung, gibt es wahrscheinlich ein paar mehr

let array = [1, 2, 3, 4, 5] 
let endOfArray = Array(array[2..<array.endIndex]) // [3, 4, 5] 

Oder mit dynamischen Index und Bereichsprüfung

let array = [1, 2, 3, 4, 5] 
let index = 2 
let endOfArray : [Int] 
if index < array.count { 
    endOfArray = Array(array[index..<array.endIndex]) // [3, 4, 5] 
} else { 
    endOfArray = array 
} 

Die Wieder initializition des Arrays, da der Bereich Abonnement erforderlich von Array kehrt ArraySlice<Element>

+0

können die "2" sein eine Variable wie fromindex verwenden? –

+0

Ich aktualisierte die Antwort – vadian

8

Sie Suffix verwenden können:

let array = [1,2,3,4,5,6] 
let lastTwo = array.suffix(2) // [5, 6] 

Wie in dem Kommentar erwähnt: Dies gibt Ihnen ein ArraySlice Objekt, das für die meisten Fälle ausreicht. Wenn Sie wirklich ein Array Objekt benötigen haben Sie es werfen:

let lastTwoArray = Array(lastTwo) 
+0

Wie 'dropFirst' und' dropLast', 'Präfix' und' Suffix' zurückgeben 'ArraySlice' Objekte, so wenn Sie ein Array benötigen, müssen Sie das Ergebnis an' Array() 'übergeben. – Jamborino

0

Sie nutzen könnten filter

func getEndOfArray(arr : [Int], fromIndex : Int? = 0) -> [Int] { 
    let filteredArray = arr.filter({$0 <= fromIndex}) 

    return filteredArray 
} 

die Freiheit nahm, der zum Zwecke dieses Beispiels zu [Int] ändern.

1

Sie konnten die neue Methode removeFirst(_:) in Swift 4

var array = [1, 2, 3, 4, 5] 
array.removeFirst(2) 
print(array) // [3, 4, 5] 
Verwandte Themen