【问题标题】:Swift Compiler Error when accessing array - Exit code 254访问数组时出现 Swift 编译器错误 - 退出代码 254
【发布时间】:2014-08-11 12:20:12
【问题描述】:

我对 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 检测到或者给我一个运行时错误而不是这个编译器错误?

【问题讨论】:

  • 您是否尝试分配给新变量而不是“响应”?
  • 是的,试过了,同样的错误。我也尝试了不同的 indizes(虽然如果这就是原因会很奇怪)......
  • an AnyObject 没有定义下标,这就解释了为什么会出现编译器错误。这是正确的行为;你不希望它等到运行时它可以在编译时告诉你错误。

标签: swift ios8


【解决方案1】:

尝试将response 转换为您期望的类型。从您尝试做的事情来看,instance().collections 我认为它应该返回某种类型的字典。

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

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

response = response["_id"]

但是

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

Swift 中的数组只能处理整数下标。如果要访问数组中Post 的信息,可以这样做:

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

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

【讨论】:

    【解决方案2】:

    当 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 不能很好地处理类型推断,并且当它无法推断类型时,接口开始抛出错误,如文本编辑器为代码着色。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多