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类型的变量?
答案 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
,您需要强制ArraySlice
加Array
(强制您的“子阵列”的副本分配,然后将其发送到属性.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