Ошибка индексации индекса Swift?

Я выделил некоторый код Swift из своего проекта, который можно вставить в игровую площадку. Это выдает ошибку "Не удалось найти перегрузку для" + ", которая принимает предоставленные аргументы" как в обычном редактировании Xcode, так и на игровой площадке. Ошибка относится к последней (нетривиальной) строке.

import UIKit

let points = 40
let max = points-1

let L = 10.0
let Deltat = 0.01
let Deltax = L/Double(points)

var a = [Double](count: points, repeatedValue: 0.0)
var b = [Double](count: points, repeatedValue: 0.0)
var c = [Double](count: points, repeatedValue: 0.0)

for i in 1..<max-1
{   //let iPlus1 = i+1
    //let temp = 0.5*Deltat/Deltax
    c[i] = 0.5*(a[i+1] + a[i-1]) + 0.5*Deltat/Deltax * (b[i+1] - b[i-1])
}

Если я раскомментирую строку "let iPlus1..." и внесу следующие изменения, Swift примет код.

{   let iPlus1 = i+1
    //let temp = 0.5*Deltat/Deltax
    c[i] = 0.5*(a[iPlus1] + a[i-1]) + 0.5*Deltat/Deltax * (b[i+1] - b[i-1])
}

Если я раскомментирую строку "let temp..." и внесу следующие изменения, Swift снова примет код.

{   //let iPlus1=i+1
    let temp = 0.5*Deltat/Deltax
    c[i] = 0.5*(a[i+1] + a[i-1]) + temp * (b[i+1] - b[i-1])
}

Ни одно из этих правок не имеет никакого смысла для меня, так как оба, казалось бы, тривиальные замены. Я знаю, что Свифт никогда не будет косвенно настраивать для меня. Похоже, в исходном коде не предпринималось никаких неявных попыток типизации - все Ints и Double объявлены как и предполагалось. Я начинаю верить, что это ошибка индексации индексного массива Swift.

1 ответ

Решение

Это известная быстрая ошибка: длинные операторы генерируют странные ошибки компиляции. Просто разделите вашу строку на 2 строки, например:

c[i] = 0.5*(a[i+1] + a[i-1])
c[i] += 0.5*Deltat/Deltax * (b[i+1] - b[i-1])

Я обнаружил, что это происходит с более чем 4 или 5 арифметическими операциями в одной строке, но это не правило, просто число, встречающееся в некоторых типах выражений - в других случаях оно может быть другим.

Посмотрите, например, на эти вопросы и ответы: Xcode Beta 6.1 и Xcode 6 GM застряли при индексации по странной причине, а Xcode 6 со сверхскоростной медленной типизацией и автозаполнением Swift (последний действительно вызывает медлительность, но решается таким же образом, поэтому, вероятно, корень так же)

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