Xcode给我一个没有道理的错误:
let command = ["", "", ""]
let task = NSTask()
task.arguments = command[1...command.count-1]
错误:无法下标'[String]'类型的值
为什么?
如果我将其分解:
let command = ["", "", ""]
let a = command[1...command.count-1]
let task = NSTask()
task.arguments = a
错误:无法将类型为'ArraySlice'的值分配为类型为[[String]?]
为什么Xcode在物理上不能产生有意义的错误消息?当然,原始代码没有那么复杂,以至于使编译器感到困惑!
而且,为什么不能将ArraySlice分配给Array类型的变量?
是因为
let a = command[1...command.count-1]
task.arguments = a
您在“ a” ArraySlice中获得arrayslice,但task.arguments取[String]?
现在,您需要将arrayslice强制转换/转换为字符串数组。使用:
let a: [String] = Array(command[1...command.count-1])
在这里,我们获取arrayslice并将其转换为类型为[String]
的数组。
ArraySlice
仅指向内存中现有Array
的(部分)。尚未将“子数组”复制分配给另一个内存位置,因为切片仅描述了内存中已存在的数组子集。但是,要将其用作Array
设置器的NSTask.arguments
,您需要将ArraySlice
强制转换为Array
(这将强制“子数组”的复制分配,然后将其发送到属性[ C0])。
.arguments
另外,我同意在报告错误时XCode并不总是正确的。您确实在这里采用了正确的方法。分解错误报告的表达式,然后将实际错误消息提供给您。我实际上认识到屏蔽错误“不能为类型[[T]']下标”,这是我偶然发现的,实际上,随后的函数调用分配是错误的真正根源。
[不确定表达式类型时(尤其是在编译器抱怨时),您可以做的一件事是使用dynamicType属性来确定实际生成的类型。