2015-12-06 55 views
5

我一直在困惑這一個大約過去一小時,頭髮枯竭。斯威夫特錯誤「不能下標值類型[Uint8]」

我在與AdventOfCode.com第4天的樂趣(10/10,將再次扮演),並希望這個小功能工作。 (請不要評論我的代碼有多麼美麗,它本意是快速和骯髒的,但它現在只是骯髒的,哎呀,我甚至不知道代碼是否有工作的機會。 ...)

func countDigestLeadingZeros(theDigest:[UInt8]) -> Int { 
var theCount: Int = 0 

print(theDigest[0]) 

while ((theCount < 16) && (countLeadingZeroNybbles(theDigest[theCount] as Int)>0)) { 
     theCount++ 
} 

return theCount 
} 

theDigest[theCount]將出現錯誤,並且「不能下標類型的‘[UINT8]’的值」。雖然不熟悉Swift,但我很確定它告訴我的是,我不能在UInt8s的數組上使用索引(任何類型)。但請注意,print(theDigest[0])行不會導致錯誤。

我已經用Google搜索了這個,但是我錯過了顯而易見的解決方案,或者無法解釋我發現的結果,其中大部分似乎與這樣一個看似簡單的問題無關。

回答

18

錯誤消息是誤導性的。問題是,你不能 轉換一個UInt8Int

theDigest[theCount] as Int 

你必須創建UInt8Int

Int(theDigest[theCount]) 

代替。

如果你不明白一些錯誤信息的原因往往是 有助於一個複雜的表達式分割成幾個簡單的。 在這種情況下

let tmp1 = theDigest[theCount] 
let tmp2 = tmp1 as Int // error: cannot convert value of type 'UInt8' to type 'Int' in coercion 
let tmp3 = countLeadingZeroNybbles(tmp2) 

給出第二行建設性的錯誤消息。

+1

神聖莫里,但這是晦澀難懂的。並感謝提供分離表達的提示。我已經遠離編程這麼長時間了,我忘記了一些最基本的故障排除方法。 – BillEccles