2016-01-18 58 views
-1

Xcode是給我一個愚蠢的錯誤是沒有意義的:的Xcode讓愚蠢的錯誤,就沒有任何意義

let command = ["", "", ""] 
let task = NSTask() 
task.arguments = command[1...command.count-1] 

Error: Cannot subscript a value of type '[String]'

跆拳道!??

如果我把它分解:

let command = ["", "", ""] 
let a = command[1...command.count-1] 
let task = NSTask() 
task.arguments = a 

Error: Cannot assign value of type 'ArraySlice' to type '[String]?'

爲什麼Xcode的身體不能產生錯誤信息,使意義的?當然,原始代碼並不是那麼複雜,以至於不能編譯器!

此外,爲什麼我不能將一個ArraySlice分配給一個Array類型的變量?

回答

1

ArraySlice只是指向存儲器中現有的Array(的部分)。 「子數組」尚未被複制分配給另一個內存位置,因爲切片只是描述了已經存在於內存中的數組的子集。但是,要將其作爲用於NSTask.arguments setter,則需要將ArraySlice強制爲Array(它會強制「子數組」的複製分配,然後將其發送給屬性.arguments的設置者)。

let command = ["", "", ""] 
let task = NSTask() 
task.arguments = Array(command[1...command.count-1]) 

此外,我同意XCode並不總是在報告錯誤時點。你確實在這裏採用了正確的方法。分解錯誤報告的表達式,在那裏給出實際的錯誤信息。我實際上認識到掩蓋錯誤「無法將類型爲'[T]'」的值作爲我偶然發現的事實,因爲事實上後續的函數調用分配是錯誤的真正根源。

0

如果不確定表達式的類型(尤其是編譯器抱怨的時候),可以做的一件事就是使用dynamicType屬性來確定實際生成的類型。

print("\(command[1...command.count-1].dynamicType)") 
// gives ArraySlice<String>.Type 

print("\(command.dynamicType)" 
// gives Array<String>.Type 
3

其因

let a = command[1...command.count-1] 
task.arguments = a 

你在 「一」 ArraySlice arrayslice但task.arguments採取[字符串]?

現在,您需要將arrayslice轉換/轉換爲字符串數組。 用途:

let a: [String] = Array(command[1...command.count-1]) 

在這裏,我們採取了arrayslice以及向類型的數組轉換它[字符串] 希望這能解決您的錯誤。 :)