2016-11-08 4 views
1

私はこのコードを実行しようとしていますが、このエラーは、私が間違って何をやっているSwiftアレイエクステンションはなぜ機能しませんか?

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

をトリガしていますか?

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

拡張アレイ?私は試みましたが、別のエラー "Type 'Element'が非プロトコルタイプ 'Int'に制約されました。コンパイラエラーです。 – ovo

+0

その型に直接 'Array'を適用することはできません。プロトコルを渡す必要があります、詳細については私の答えを見てください。 – Zaphod

+0

ありがとう、私は多くの恩恵を受けた。 – ovo

答えて

1

あなたはIntタイプにあなたの拡張を制約する必要があります。

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

そして、あなたは直接Arrayを制約することはできませんように、あなたはappendメソッドが定義されているプロトコルを制約しなければなりません。このようなのInt {...} :

次にあなたがIntの任意の配列にそれを使用することができます。要素

var myArray = [3,5,6] 
myArray.random100() 
0
  1. あなたが本当に何をしたいですか? 100個のランダムなIntsを与えるメソッドが必要な場合は、Arrayに静的メソッドを作成する方がよいでしょう。配列を一般的に変異させることは意味をなさない - それが文字列のリストならどうなるだろうか?

  2. モジュロバイアスを避けるためにarc4random_uniformを見てください。この場合バイアスが明らかになるかどうかはわかりませんが、とにかくarc4random_uniformを使用することをお勧めします。

+0

助けてくれてありがとう、そして "arc4random_uniform"は良いです。 – ovo

関連する問題