Я пытаюсь добавить метод мутации через расширение массива. Я создаю 2D-массив для выполнения некоторых вычислений. Но странно, что Xcode выдает ошибку ниже при создании 2D-массива.
error: cannot convert value of type '[Int]' to expected argument type 'Int'. var bucket : [[Int]] = Array.init(repeating: Int, count: base)
Мой код игровой площадки таков,
extension Array where Element == Int {
public mutating func someTestMethod() {
let base = 10
var bucket : [[Int]] = Array.init(repeating: [Int](), count: base)
// Some Other Code
}
}
Где приведенный ниже код работает нормально,
extension Array where Element == Int {
public mutating func someTestMethod() {
let base = 10
var bucket : [[Int]] = .init(repeating: [Int](), count: base)
// Some Other Code
}
}
Хотелось бы знать, почему это происходит, поскольку вывод типа должен работать в обоих случаях. Я был бы признателен за любую помощь в понимании того, что здесь происходит.
Element — это просто Int, а не [Int]. Итак, тип массива — [Int]. Внутри этого массива у меня есть расширение для сортировки целочисленных значений на основе алгоритма сортировки ведра. Второй метод не вызывает у меня ошибку, как показано на снимке экрана, я использую Xcode 13.3.1 и Mac 12.3.1. Извините, я не понимаю вашей точки зрения. Не могли бы вы немного объяснить.
Да бро я тебя понял. Тип массива [Int] — [[Int]] . Мое расширение предназначено для массива целых чисел. Я пытаюсь отсортировать их, используя алгоритм сортировки ведра. Для этого мне нужен [[Int]] для размещения моих элементов. Для этого есть var bucket. Я совершенно не понимаю, почему первый не работает, а второй работает нормально. Разве оба кода не одинаковы. Извините, если я упустил что-то очевидное.
Второй работает отлично, братан, и алгоритм сортировки ведра также работает, как и ожидалось. Мой единственный вопрос: почему первый не работает и выдает ошибку компиляции? я просто хочу понять, что происходит за кулисами для обоих этих случаев.
Да, извините, я несколько неправильно понял вариант использования, self не обязательно должен быть [[Int]], как я предполагал.
Да братан. Я не назначаю ведро ([[Int]]) себе ([Int]). Спасибо за ваши усилия. Я очень ценю ваше время. Оба объявления переменной bucket выглядят для меня совершенно одинаково. Но определенно они не потому что один работает, а другой нет. Так что мне просто любопытно узнать, что происходит за кулисами.



Если опустить тип для инициализации, написав только .init
var bucket : [[Int]] = .init(repeating: [Int](), count: base)
затем компилятор выводит вызов инициализации из указанного вами контекстного типа, var bucket : [[Int]] поэтому полный вызов инициализации
Array<[Int]>.init(repeating: [Int](), count: base)
но если вы используете Array.init, то компилятор использует фактический тип расширения, который дается из условия where как Array<Int>
Я не уверен, почему второй подходит, но обратите внимание, что элемент является [Int], поэтому условие where должно быть
where Element == [Int]. На самом деле при тестировании кода выше второй метод также будет генерировать ошибку компиляции, когда вы попытаетесь его использовать, поэтому изменение условияwhereявляется правильным решением здесь.