由于信号:分段错误:11,命令执行失败 | Xcode 7.2

4

我被要求将一个相当大的应用程序迁移到Swift 2。编译器在一个函数中不断抛出分段错误:11个错误,该函数存在于应用程序逻辑的不同模块中(唯一的区别是使用的变量):

func loadMoreContent() {

if let collection = self.ratingsCollection where collection.identifier != 0,
  let totalEntries = collection.totalEntries,
  let objects = self.ratings?.count where objects < totalEntries {

    self.ratingsCollection = nil

    collection.nextPage().onSuccess { (value) in

      if let collection = value as? Collection<Rating> {
        self.ratingsCollection = collection
      } else {
        self.ratingsCollection = Collection<Rating>(identifier: 0)
      }

      }.onFailure { error in
        self.ratingsCollection = Collection<Rating>(identifier: 0)
    }
  }
}

以下是错误信息本身:

1.  While type-checking 'loadMoreContent' at (path redacted).swift:46:3
2.  While type-checking expression at [(path redacted).swift:54:9 - line:64:9] 
    RangeText="collection.nextPage().onSuccess { (value) in

              if let collection = value as? Collection<Rating> {
                self.ratingsCollection = collection
              } else {
                self.ratingsCollection = Collection<Rating>(identifier: 0)
              }

              }.onFailure { error in
                self.ratingsCollection = Collection<Rating>(identifier: 0)
            }"

3.  While loading members for declaration 0x7fdda42ea2b0 at <invalid loc>
4.  While deserializing 'producer' (FuncDecl #340) 

有人能一开始看出这个函数有什么问题吗?需要补充的是,它在Xcode 6 / Swift 1.2中编译时没有任何更改。

你能够确定是loadMoreContent中的哪一行代码导致了错误吗?也许可以先将所有代码注释掉,然后逐行添加。我猜测问题可能与'as? Collection<Rating>'转换有关。如果你能更多地了解你正在使用的Collection类,那么这会很有帮助。 - nwales
很奇怪,我更新了 ReactiveCocoa,虽然它在 Collection 类或函数本身中都没有使用,但错误却消失了... 接手一个没有交接的废弃项目真是一件愉悦的事情。非常感谢你的建议 @nwales - michalronin
1个回答

3
这是一个在XCode7中特别常见的令人抓狂的错误。
通常情况下,按照XCode的惯例(清理、重启XCode、再次清理、构建)可以修复该错误。然而,往往是由于一行或多行有问题的代码导致的。这并不一定意味着代码中有错误!
因此,在重新启动之前,有时逐个撤销最近的更改并尝试构建是有用的。如果您的任何依赖项或框架自上次成功构建以来已更新,则它们可能是一个可能的候选对象。
有几件事情似乎会经常产生这个错误。所以,如果您能够确定导致错误的具体问题,请简要地将其添加到此列表中:
1)在调用使用自动闭包的方法时使用加号运算符进行字符串连接(在对XCGLogger的调用中发现)。
 public func myFunc(@autoclosure closure: () -> String?){
      // do something
 }

 someInstance.myFunc("Hi " + nameStr + "!")

2) 子类没有调用super.init(),特别是当父类使用默认初始化程序时(您没有显式创建自己的init)。

3) 意外地使用单个等号来测试相等性(在复杂语句中使用=而不是==),尤其是在这个答案中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接