2014-10-07 38 views
1

我已經從我的項目中分離出一些可以粘貼到遊樂場的Swift代碼。它產生一個錯誤「無法找到'+'的超載,它接受在正常的Xcode編輯和Playground中提供的參數」「。錯誤指的是最後一條(非平凡)線。Swift數組下標索引中的錯誤?

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絕對不會爲我隱式強調。在原始代碼中似乎沒有嘗試使用隱式類型轉換 - 所有的Ints和Doubles都是按照預期進行聲明的。我開始相信這是一個Swift數組下標索引的錯誤。

+0

如果你把身邊這些括號會發生什麼:

在這個問答&神色例如加法?例如'a [(i + 1)]'或者'+(0.5 * Deltat/Deltax)'? – 2014-10-07 20:09:48

+0

在發佈原始問題之前,我實際上已嘗試過諸如您的建議之類的內容。這些建議都不能解決問題。即使他們這樣做,它仍然會提示一個錯誤。 – 2014-10-07 21:58:42

+0

哦,我絕對同意,有一個錯誤,我只是好奇。 :) – 2014-10-08 13:52:20

回答

2

這是一個已知的swift bug:long語句會產生奇怪的編譯錯誤。 只是分割你的線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 and Xcode 6 GM stuck indexing for weird reasonXcode 6 with Swift super slow typing and autocompletion(最後一個實際上導致緩慢,但以同樣的方式解決,所以根可能是相同的)

+0

在我的調試中,我實際上遇到了你的建議解決方案。爲了簡潔起見,我沒有把它列爲解決方案。我也很清楚Swift花了很長時間來編寫我的簡短代碼。驗證這些錯誤是非常有用的,儘管它強制了我是否應該繼續使用Swift這個難題。 – 2014-10-07 21:58:11

+0

關於你的擔憂,如果你想在將來爲iOS或Mac開發,你別無選擇,只能使用Swift。問題可能是:我現在應該發展還是等待它更穩定? – Antonio 2014-10-07 22:01:48

+0

是的,那是我的真實問題。你是對的,斯威夫特不會離開。 ...回到原來的問題 - 看起來*任何*嘗試減少有問題的行中的操作數量是一個潛在的解決方法。 iPlus1解決方案的奇特之處在於它獨立於Double算法降低了複雜性。這表明這個問題是一個基本的解析問題 - 很難相信在v1.0中倖存下來。 – 2014-10-08 21:13:15