我遇到了一个奇怪的问题,其中Playground打印出预期的结果,但同时我看到一个错误,告诉我由于EXC_I386_GPFLT
错误导致执行被停止。
我正在使用Playground来模拟我正在编写的API包装器应该如何使用。这样做的想法是为未来的开发人员规划一个不错的API。
以下是我为计划我的包装而编写的整个“计划”代码。您可以将其复制并粘贴到Playground上,以查看操作中的问题:
class Anilist {
init() {}
internal class UserAPIs {
weak var parent: Anilist? = nil
init(parent: Anilist) {
self.parent = parent
}
}
lazy var user: UserAPIs = { [unowned self] in
let userapi = UserAPIs(parent: self)
return userapi
}()
}
extension Anilist.UserAPIs {
func me(_ completionHandler: (results: [String]) -> Void ) {
// Do some logic, fetching stuff from parent
completionHandler(results: ["Lorem", "Sammet"])
}
}
let andy = Anilist()
andy.user.me { results in
print(results)
}
奇怪的是,它正确打印["Lorem", "Sammet"]
,但同时我收到了错误。
我有read (for C++)其他一些questions关于此错误,但遗憾的是我无法解决此问题。我可以收集到的是这种情况正在发生,因为我试图访问的内存为零?总的来说,除了它是一种架构保护之外,我还没有找到关于此的更多信息。
虽然代码运行良好,但我对于将它放在我的实际代码上犹豫不决,因为我不知道它会如何表现。即使它在第一次运行时起作用,也很难预测它是否会在长期内产生错误。
看起来它与计算的lazy var
有关。将该行更改为:
lazy var user: UserAPIs = UserAPIs(parent: self)
按预期工作(例如,它打印数组并且不会给我EXC_I386_GPFLT
错误。)
以前的编辑似乎是不准确的信息。
答案 0 :(得分:0)
这不是一个真正的答案,而是一个解决方法,直到我找出其工作原理:
let andy = Anilist()
let someVar = andy.user.me { results in
print(results)
}
这给出了constant someVar inferred to have type (), which maybe unexpected
的编译时警告。
但是这样做:
let andy = Anilist()
let _ = andy.user.me { results
print(results)
}
工作正常,没有任何错误。很奇怪。如果有人可以解释为什么会发生这种情况,那将是非常好的。