Подтвердить что ты не робот

Бинарный оператор '/' не может применяться к двум операндам "Двойной"

При попытке выполнить этот блок кода в Swift 3 я столкнулся с ошибкой: двоичный оператор '/' не может быть применен к двум "двойным" операндам

var array2 = [8, 7, 19, 20]

for (index, value) in array2.enumerated() {
    array2[index] = Double(value) / 2.0
}

Но это работает

var array2 = [Double]()
array2 = [8, 7, 19, 20]

for (index, value) in array2.enumerated() {
    array2[index] = value / 2.0
}

Почему не работает первый блок кода?

4b9b3361

Ответ 1

Ошибка немного вводит в заблуждение.

В первом наборе кода array2 неявно объявляется как массив Int. Поэтому любая попытка присвоить значение индексу array2 потребует значение Int.

Проблема заключается в том, что Double(value) / 2.0 приводит к значению Double, а не к Int. Поэтому компилятор ищет версию /, которая возвращает Int. И эта версия ожидает два параметра Int. Поскольку вы поставляете два параметра Double, вы получаете ошибку, указанную в вашем вопросе.

Решение состоит в том, чтобы либо передать результат в Int, либо использовать два параметра Int для /.

var array2 = [8, 7, 19, 20]

for (index, value) in array2.enumerated() {
    array2[index] = Int(Double(value) / 2.0) // cast to Int
}

или

var array2 = [8, 7, 19, 20]

for (index, value) in array2.enumerated() {
    array2[index] = value / 2 // Use two Int
}

В этом случае результат будет таким же. 8 будет заменен на 4. 7 будет заменен на 3 и т.д.

Второй набор кодов работает как есть, потому что вы объявляете массив заполняемым Double, чтобы все соответствовало правильному типу.

Ответ 2

Для первого, ваш массив имеет тип Int, поэтому выполнение array2.enumerated() дает вам value как Int. Когда вы сделаете это с этим, Double(value) / 2.0, окончательный результат возвращается типа Double, который несовместим с вашим типом массива.

Для второго, хотя вы явно объявили массив Double, поэтому array2.enumerated() возвращает value как Double, поэтому выполнение операции работает нормально.

Ответ 3

Ответ rmaddy правильный, почему вы видите проблему, неявную декларацию Int. Ради полноты. Есть несколько способов исправить это, литье - одно; другой, еще не упомянутый здесь, заключается в том, чтобы продлить Double, чтобы включить этот случай, если вам нужно сделать это достаточно, вы можете просто определить свою собственную версию Double/Int и контролировать, как Swift обрабатывает ее в пределах вашей собственной функции.

extension Double {
    static func / (left: Double, right: Int) -> Double {
        return left / Double(right)
    }
}

Вы всегда можете добавить другую функцию, обрабатывающую обратный регистр, Int/Double и т.д.