Вывод типа в Swift

Я пытаюсь добавить метод мутации через расширение массива. Я создаю 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
    }
}

Вывод типа в Swift

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

Я не уверен, почему второй подходит, но обратите внимание, что элемент является [Int], поэтому условие where должно быть where Element == [Int]. На самом деле при тестировании кода выше второй метод также будет генерировать ошибку компиляции, когда вы попытаетесь его использовать, поэтому изменение условия where является правильным решением здесь.

Joakim Danielson 11.05.2022 11:04

Element — это просто Int, а не [Int]. Итак, тип массива — [Int]. Внутри этого массива у меня есть расширение для сортировки целочисленных значений на основе алгоритма сортировки ведра. Второй метод не вызывает у меня ошибку, как показано на снимке экрана, я использую Xcode 13.3.1 и Mac 12.3.1. Извините, я не понимаю вашей точки зрения. Не могли бы вы немного объяснить.

Jaffer Sheriff 11.05.2022 11:41

Да бро я тебя понял. Тип массива [Int] — [[Int]] . Мое расширение предназначено для массива целых чисел. Я пытаюсь отсортировать их, используя алгоритм сортировки ведра. Для этого мне нужен [[Int]] для размещения моих элементов. Для этого есть var bucket. Я совершенно не понимаю, почему первый не работает, а второй работает нормально. Разве оба кода не одинаковы. Извините, если я упустил что-то очевидное.

Jaffer Sheriff 11.05.2022 11:48

Второй работает отлично, братан, и алгоритм сортировки ведра также работает, как и ожидалось. Мой единственный вопрос: почему первый не работает и выдает ошибку компиляции? я просто хочу понять, что происходит за кулисами для обоих этих случаев.

Jaffer Sheriff 11.05.2022 11:57

Да, извините, я несколько неправильно понял вариант использования, self не обязательно должен быть [[Int]], как я предполагал.

Joakim Danielson 11.05.2022 12:01

Да братан. Я не назначаю ведро ([[Int]]) себе ([Int]). Спасибо за ваши усилия. Я очень ценю ваше время. Оба объявления переменной bucket выглядят для меня совершенно одинаково. Но определенно они не потому что один работает, а другой нет. Так что мне просто любопытно узнать, что происходит за кулисами.

Jaffer Sheriff 11.05.2022 12:08
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
1
6
38
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если опустить тип для инициализации, написав только .init

var bucket : [[Int]] = .init(repeating: [Int](), count: base)

затем компилятор выводит вызов инициализации из указанного вами контекстного типа, var bucket : [[Int]] поэтому полный вызов инициализации

Array<[Int]>.init(repeating: [Int](), count: base)

но если вы используете Array.init, то компилятор использует фактический тип расширения, который дается из условия where как Array<Int>

Другие вопросы по теме