访问数组时Swift编译器错误 - 退出代码254

时间:2014-08-11 12:20:13

标签: swift ios8

我对swift很新,并且得到了一个非常奇怪的编译器错误:

  

命令   /Applications/Xcode6-Beta5.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swiftc   退出代码254失败

当我将以下行添加到我的代码时出现错误:

var response = HoopsClient.instance().collections["posts"]

response = response["_id"]

当我删除第二行时,一切都编译好了。我不明白^^

编辑:原因可能是"响应"属于" AnyObject"根据编译器...但是不应该被xcode检测到或者给我一个运行时错误而不是这个编译器错误?

2 个答案:

答案 0 :(得分:0)

尝试将response视为您期望的类型。根据您的尝试,instance().collections我会假设它应该返回某种类型的字典。

var response = HoopsClient.instance().collections["posts"] as NSDictionary

这样,response现在可以处理下标了,所以你现在(理论上)可以这样做:

response = response["_id"]

<强>然而

您得到的错误是关于对阵列的错误访问。这让我觉得instance().collections实际上返回了某种类型的数组,包含Post个对象。

Swift中的数组只能处理Integer下标。如果要访问数组中Post的信息,可以执行以下操作:

for post: Post in response {
    println(post._id)
}

我知道这是一个很长的镜头,但希望它有所帮助。

答案 1 :(得分:0)

当Swift无法推断出对象的类型时,它往往会抛出错误,您可能会做的是添加条件转换,如下所示

我假设HoopsClient.instance()。collections [“posts”]是字典或数组

var response = HoopsClient.instance().collections["posts"]
if response is NSArray {
    let item = response.objectAtIndex(0)
    let reponseId: Post = item    
}
if response is NSDictionary {
    let item = response.objectForKet("_id")
    let reponseId: Post = item    
}

根据我的经验,你应该尝试在从返回AnyObject的类型中分配变量时,xcode不能很好地处理类型推断,并且当它无法推断出接口开始抛出错误的类型时,如文本编辑器对代码进行着色。