我被要求将一个相当大的应用程序迁移到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中添加它编译而不做任何更改。
答案 0 :(得分:3)
这是一种在XCode7中特别常见的脱毛错误。
有时,通常的XCode愚蠢错误协议(干净,XCode重启,清理,构建)修复它。但是,通常是由于一行或多行违规代码造成的。这并不一定意味着代码中存在错误!
因此,在重新启动之前,有时需要按顺序撤消最近的更改并尝试按照您的方式进行构建。如果自上次成功构建以来,您的任何依赖项或框架已经更新,那么这些可能是候选者。
有一些事情似乎会定期产生这种错误。因此,如果您能够找出一直导致错误的特定问题,请简要地添加到此列表中:
1)在调用使用autoclosures的方法时使用plus运算符进行字符串连接(在调用XCGLogger时找到):
public func myFunc(@autoclosure closure: () -> String?){
// do something
}
someInstance.myFunc("Hi " + nameStr + "!")
2)无法从子类调用super.init(),尤其是当超类使用默认初始值设定项时(尚未显式创建自己的初始化程序)
3)偶然使用单个等号来测试相等性(使用=而非==),尤其是在复杂语句中,例如this answer.