2016-11-08 1 views
1

Ich versuche, diesen Code auszuführen, und dieser FehlerWarum funktioniert meine Swift-Array-Erweiterung nicht?

Cannot invoke 'append' with an argument list of type '(Int)'

ausgelöst wird Was mache ich falsch?

extension Array {   
    mutating func random100() { 
     for _ in 0 ... 99 { 
      self.append(Int(arc4random() % 10)) // Cannot invoke 'append' with an argument list of type '(Int)' 
     } 
    } 
} 
+0

Erweiterung Array wo Element: Int {...} so? Ich habe versucht, aber einen anderen Fehler "Typ 'Element' auf Nicht-Protokoll-Typ 'Int'" beschränkt, und es ist ein Compiler-Fehler. – ovo

+0

Sie können 'Array' nicht direkt auf ihren Typ beschränken. Sie müssen Protokolle passieren, sehen Sie sich meine Antwort für weitere Details an. – Zaphod

+0

Danke, ich habe sehr profitiert. – ovo

Antwort

1

Sie müssen Ihre Erweiterung Int Typen Beschränkung:

extension RangeReplaceableCollection where Iterator.Element == Int { 
    mutating func random100() { 
     for _ in 1...100 { 
      append(Int(arc4random_uniform(10))) 
     } 
    } 
} 

Und da man nicht direkt Array Einschränkung kann, müssen Sie das Protokoll Constraint wo die append Methode definiert ist.

Dann können Sie es auf jedem Array von Int verwenden:

var myArray = [3,5,6] 
myArray.random100() 
0
  1. Was wollen Sie wirklich? Wenn Sie eine Methode wünschen, die Ihnen hundert Zufallsinstanzen bietet, erstellen Sie am besten eine statische Methode für Array. Das Mutieren eines Arrays im Allgemeinen macht keinen Sinn - was ist, wenn es sich um eine Liste von Strings handelt?

  2. Werfen Sie einen Blick auf arc4random_uniform, um Modulo Bias zu vermeiden. Ich weiß nicht, ob die Verzerrung in diesem Fall offensichtlich sein würde, aber es ist eine gute Praxis, trotzdem arc4random_uniform zu verwenden.

+0

danke für Hilfe, und "arc4random_uniform" ist gut. – ovo

Verwandte Themen