Xcode给出了毫无意义的愚蠢错误

时间:2016-01-18 23:01:08

标签: xcode compiler-errors swift2

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类型的变量?

3 个答案:

答案 0 :(得分:3)

因为

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

你得到的数据片是" a" ArraySlice但task.arguments采用[String]?

现在,您需要将arrayslice转换/转换为字符串数组。 使用:

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

在这里,我们使用了数组并将其转换为[String]类型的数组 希望这能解决你的错误。 :)

答案 1 :(得分:1)

ArraySlice只指向内存中现有Array的(部分)。 “子阵列”尚未被复制分配到另一个存储器位置,因为切片仅描述了已存在于存储器中的阵列的子集。但是,要将其用作Array设置器的NSTask.arguments,您需要强制ArraySliceArray(强制您的“子阵列”的副本分配,然后将其发送到属性.arguments)的设置者。

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

另外,我同意在报告错误时XCode并不总是很重要。你确实在这里采取了正确的方法;分解您的错误报告表达式,在给出实际错误消息之后。我实际上认识到掩码错误“不能下标类型'[T]'”的值作为我偶然发现的事情,实际上后续的函数调用赋值是错误的真正根源。

答案 2 :(得分:0)

当不确定表达式类型时(特别是当编译器抱怨时),您可以做的一件事是使用dynamicType属性来确定实际生成的类型。

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

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