1

Playground に貼り付けることができる 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])
}

これらの編集はどちらも一見些細な置換であるため、私には意味がありません。Swift が暗黙のうちに型キャストすることは決してないことを認識しています。元のコードで試みられた暗黙的な型キャストはないようです。すべての Int と Double は意図したとおりに宣言されています。これは Swift 配列の添字インデックス付けのバグだと思い始めています。

4

1 に答える 1

2

これは知られている迅速なバグです: 長いステートメントは奇妙なコンパイル エラーを生成します。次のように、行を 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つ以上の算術演算で発生することがわかりましたが、それはルールではなく、一部の式タイプで見つかった数値にすぎません.他の場合は異なる場合があります.

たとえば、この Q&A を見てください: Xcode Beta 6.1 と Xcode 6 GM は奇妙な理由でインデックス作成を停止し、Xcode 6 では Swift の超遅いタイピングとオートコンプリートを使用しました (この最後のものは実際には速度が遅くなりますが、同じ方法で解決されるため、ルートはおそらく同じ)

于 2014-10-07T20:11:10.463 に答える