2016-08-09 13 views
0
extension Array { 

    mutating func fiveHundred() { 

     var arrCopy = self 
     arrCopy = arrCopy.reverse() 

     if arrCopy.count > 0 { 
      for i in 1..<250 { 

       print(arrCopy[i]) 
       self.append(arrCopy[i]) 
      } 
     } else { 
      print("Array is empty") 
     } 
    } 
} 

Wenn es auf einem Array mit gibt es dem FehlerHolen Sie sich die neuesten Daten mit Array-Erweiterung

„Wert vom Typ‚()‘in dem angegebenen Typ‚[Double]‘Kann nicht konvertieren“

zum Beispiel:

var data: [Int] = [1, 2, 3, 4, ..... all the way to 1000] 

data.fiveHundred() // Gives error 

EDIT: Sah, dass es < 250. Sorry! Ich benutzte dies auf einem anderen Datenfeld mit mehr als 250 Einträgen.

Angenommen, dieses Datenarray hat mehr als 250 Daten.

EDIT2: Hier ist der eigentliche Code

struct Data { 
    let array: [Double] = [1.0, 2.0, 3.0, 4.0] 
} 



printData(Data.array.fiveHundred) // The function printData(val: [Double]) 

EDIT3: entschuldigen Mein. Die Beispiele und die Frage sind sehr verwirrend.

extension Array where Element: Equatable { 

    mutating func fiveHundred() -> [Element] { 

     var arrCopy = self 
     arrCopy = arrCopy.reverse() 

     if arrCopy.count > 0 { 
      for i in 1..<250 { 

       print(arrCopy[i]) 
       self.append(arrCopy[i]) 
      } 
     } else { 
      print("Array is empty") 
     } 
    } 
} 

Dies löste meinen Teil meines Problems. Das andere Problem ist, dass ich nur maximal 250 Daten benötige. Derzeit seine 1000.

Ich möchte data.fiveHerdred() verwenden, um nur 250 Daten zu erhalten.

EDIT4: Ich habe es endlich gelöst. Ich schätze all die Hilfe.

Erweiterung Array wo Element: {gleichzusetzen

mutating func fiveHundred() -> [Element] { 

    var tempArr: [Element] = [] 

    for i in (count-1500)..<count { 

     tempArr.append(self[i]) 
    } 
    return tempArr 
} 

}

gibt mir die richtige Array. Entschuldigung für das verwirrende. Das nächste Mal, ich habe mehr klar zu sein mit meiner Frage und Beschreibung über das Problem

+0

@Hamish eine Funktion verwenden, die [Double] erwartet, und ich habe ein double array, auf dem ich fiveHundred() verwende. – bCM

+0

@Hamish sollte ich fiveHundred ändern, um [Double] zurückzugeben? Die Sache ist, ich habe verschiedene Arrays mit unterschiedlichen Typen wie [Int] oder [String] ... – bCM

+0

Sie sollten Var verwenden. Überprüfen Sie meine Antwort –

Antwort

1

print(arrCopy[i]) einen Fehler gibt, weil Ihr Array out of index mit 250

Nach arrCopy[3] Fehler beginnt, können Sie den Fehler mit % arrCopy.count

entlassen
extension Array { 

    mutating func fiveHundred() { 

     var arrCopy = self 
     arrCopy = arrCopy.reverse() 

     if arrCopy.count > 0 { 
      for i in 1..<250 { 

       ///print(arrCopy[i]) 
       self.append(arrCopy[i%arrCopy.count]) 
      } 
     } else { 
      print("Array is empty") 
     } 
    } 
} 
+0

Danke für eine Antwort. Sehen Sie sich das bearbeitete Fragedetail an. – bCM

1

Ich verstehe nicht wirklich, was Sie erreichen möchten. Aber wenn ich gut verstanden, dass Sie reversed Array anhängen müssen, nicht mehr als 250 Elemente, nicht das erste Element einschließlich, dann ist hier Lösung:

extension Array { 
    mutating func fiveHundred() { 

     var arrCopy = self 
     arrCopy = arrCopy.reverse() 

     if arrCopy.count > 0 { 
      let endIndex = arrCopy.count > 250 ? 250 : arrCopy.count 
      let subArrCopy = arrCopy[1..<endIndex] 
      self.appendContentsOf(subArrCopy) 
     } else { 
      print("Array is empty") 
     } 
    } 
} 

Natürlich wird diese Erweiterung funktioniert nur mit var iables, nicht mit let - Konstanten:

var data: [Double] = [1.0, 2.0, 3.0, 4.0] 
data.fiveHundred() //ok 
print(data) 
//[1.0, 2.0, 3.0, 4.0, 3.0, 2.0, 1.0] 
print(data.fiveHundred()) 
//() - because fiveHundred() is void function, it only mutate your array returning void 
print(data) 
//[1.0, 2.0, 3.0, 4.0, 3.0, 2.0, 1.0, 2.0, 3.0, 4.0, 3.0, 2.0, 1.0] - fiveHundred() mutated data in previous print call 

let data: [Double] = [1.0, 2.0, 3.0, 4.0] 
data.fiveHundred() //error 
+1

Ein paar Verbesserungen: 'var arrCopy = self' setzt 'arrCopy' auf eine Kopie von' self', aber es wird sofort in der nächsten Zeile durch 'arrCopy.reverse()' ersetzt. Das wäre wahrscheinlich besser als Wachmann geeignet. Auch wäre die Verwendung von "max" für das Anklemmen auf 250 klarer – Alexander

0

Hier ist eine Verbesserung gegenüber Shadow Of's answer:

extension Array { 
    mutating func fiveHundred() { 
     guard self.count > 0 else { 
      print("Array is empty") 
      return 
     } 

     let endIndex = min(self.count, 250) 
     self += self.reverse()[1..<endIndex] 
    } 
} 
+0

Hi, ich denke das 'max' sollte ein' min' sein. Und Sie müssen 'arrCopy' definieren. –

+0

@appzYourLife Guten Morgen :) Kannst du mir sagen, dass ich noch keinen Kaffee getrunken habe? :) – Alexander

+0

Ty für Code-Revision; Fühlen Sie sich frei, meine Beiträge zu bearbeiten, wenn Sie möchten –

Verwandte Themen