“无法下标'[String]'类型的值”和“无法将'ArraySlice'类型的值下标为'[String]类型?”” Swift中的错误

问题描述 投票:-2回答:3

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

swift compiler-errors swift2
3个回答
3
投票

是因为

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]的数组。


1
投票

ArraySlice仅指向内存中现有Array的(部分)。尚未将“子数组”复制分配给另一个内存位置,因为切片仅描述了内存中已存在的数组子集。但是,要将其用作Array设置器的NSTask.arguments,您需要将ArraySlice强制转换为Array(这将强制“子数组”的复制分配,然后将其发送到属性[ C0])。

.arguments

另外,我同意在报告错误时XCode并不总是正确的。您确实在这里采用了正确的方法。分解错误报告的表达式,然后将实际错误消息提供给您。我实际上认识到屏蔽错误“不能为类型[[T]']下标”,这是我偶然发现的,实际上,随后的函数调用分配是错误的真正根源。


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.