2016-04-06 3 views
2

Я пытаюсь написать расширение для Array на игровой площадке Xcode. Я хочу написать функцию, которая будет изменять массив, чтобы он был заполнен 0s при вызове функции. Код, который я пытаюсь использовать это:Расширение массива, неоднозначная ссылка на индекс участника '

import Foundation 

extension Array { 
    mutating func zero() { 
     for i in 0..<self.count { 
      self[i] = 0 // ERROR - Ambiguous reference to member 'subscript' 
     } 
    } 
} 

Этот код не работает из-за ошибки при:

self[i] = 0 

Однако, если я пытаюсь «получить» значение от себя , У меня нет проблем. Например:

import Foundation 

extension Array { 
    mutating func zero() { 
     for i in 0..<self.count { 
      print(self[i]) 
     } 
    } 
} 

не имеет ошибок и работает должным образом.

Так что мой вопрос: Почему я не могу изменить массив?

Кроме того, замена:

self[i] = 0 

с,

self.append(0) 

также приводит к ошибке. (Невозможно вызывать «append» с списком аргументов типа «(Int)»)

Так что это не позволит мне модифицировать себя вообще, как кажется.

ответ

4

Это будет работать, если вы сделаете следующее:

extension Array where Element: IntegerLiteralConvertible { 
    mutating func zero() { 
     for i in 0..<self.count { 
      self[i] = 0 
     } 
    } 
} 

Вы должны ограничить тип элементов допускается, потому что вы не можете, например, обнулять массив String с.

Важно помнить, что при расширении чего-то вроде Array вы принимаете во внимание, какие типы элементов действительны для метода, который вы добавляете. Если для этого требуются элементы определенного типа, вы ограничиваете его, а затем он будет работать. Таким образом, вы можете использовать только ваш метод zero() на Array s, содержащий ints. Вы можете определить другую версию для массива String s, которая заменяет все в массиве строкой «ноль», например, и эта реализация будет использоваться только для типа, который вы также ограничиваете.

+1

Или 'where Element: IntegerLiteralConvertible', чтобы сделать его несколько более универсальным (для массивов целых чисел или значений с плавающей запятой). –

+0

Спасибо, @MartinR, сделал это изменение! – Gavin

+0

Спасибо Гэвин и @ Мартин R! Это исправляет ошибку. Мне придется углубиться в эту тему немного позже, позже сегодня. – OhNo

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