2016-11-08 3 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

расширение массива, где элемент: Int {...} как это? Я попытался, но еще одна ошибка «Тип« Элемент », ограниченный не-протокольным типом« 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:

var myArray = [3,5,6] 
myArray.random100() 
0
  1. Что вы действительно хотите? Если вам нужен метод, который дает вам сотни случайных интов, лучше создать статический метод в Array. Мутирование любого массива вообще не имеет смысла - что, если это список строк?

  2. Взгляните на arc4random_uniform, чтобы избежать смещения по модулю. Я не знаю, будет ли предубеждение в этом случае очевидным, но в любом случае хорошо использовать arc4random_uniform.

+0

спасибо за помощь, и «arc4random_uniform» это хорошо. – ovo

Смежные вопросы