在 Swift 中使用 Set 时出现编译器分段错误
Posted
技术标签:
【中文标题】在 Swift 中使用 Set 时出现编译器分段错误【英文标题】:Compiler segmentation fault while using Set in Swift 【发布时间】:2017-10-02 18:45:33 【问题描述】:这段代码运行良好:
let lines = ["one", "one", "two"]
let lineSet = lines
但是在编译这个时:
let lines = ["one", "one", "two"]
let lineSet = Set(lines)
我明白了:
由于信号而导致命令失败:分段错误:11
我有 Xcode 版本 9.0 (9A235)。这真的是一个错误还是我只是做错了什么?
我现在的解决方法:
var lineSet = Set<String>()
let lines = ["one", "one", "two"]
lines.forEach lineSet.insert($0)
【问题讨论】:
你能生成一个minimal reproducible example吗? 您确定这就是您拥有的所有代码吗?您是否在新的游乐场或项目中尝试过这个?这绝对是您正在崩溃的线路还是可能是另一条线路? 您的错误示例对我来说编译得很好。 别忘了清除你的派生数据 编译器段错误总是是一个错误。 【参考方案1】:构建lineSet
的更好、更惯用的方法很简单:
let lineSet: Set = ["one", "one", "two"]
希望这可以解决您的编译器崩溃问题。不幸的是,我无法完全重现您的原始问题,因此我无法真正确认我的修复是否会有所不同;)
如前所述,删除您的 DerivedData
文件夹是个好主意(~/Library/Caches/com.apple.dt.Xcode
也可能有所帮助)。当 Xcode 开始出现异常行为时,这是一种有点标准的做法。
【讨论】:
【参考方案2】:引用here 的 John Caswell 的话
编译器段错误总是是一个错误
根据我的经验,Playgrounds 有点问题。 XCode Playground 卡在“正在运行的游乐场”或“启动模拟器”上,然后无法运行代码。我不时遇到这样的错误,而其他人遇到了不可重现的问题:
XCode hangs every time when i write few lines of code in playground https://teamtreehouse.com/community/xcode-playground-gets-stuck-on-running-and-wont-run-the-code-what-to-do https://forums.bignerdranch.com/t/playground-hangs-frequently/7331 https://forums.developer.apple.com/thread/75045 failed to launch stub for playground execution Playground execution failed: error: Couldn't lookup symbols - Playground in xcode using swift https://ericasadun.com/2015/03/16/swift-working-around-sources-playground-bugs/(虽然其中一些链接很旧,但 Playground 还没有那么成熟。)
通常,解决方法是关闭 Xcode,更改光标位置等。
因此,我要么使用https://repl.it/site/languages/swift,要么谨慎使用 Playground,要么使用最新的 Xcode(因为通常错误最少)。
编辑:
当我在我的 macbook air 和 macbook pro 上都使用 Xcode 9.4.1 时,Xcode 崩溃或只是停止在操场上工作。我的同事也是这样。有时即使我只是在 Chrome 中,Playground 也会崩溃!
有人告诉我,如果您打开实用程序,然后将您的平台从 ios 切换到 macOS,那么您可能能够解决 Playground 的冻结/挂起问题。但我还没有尝试过。
【讨论】:
我认为他最初的问题与 Playground 无关,但无论如何,我有点同意您关于 Playground 整体稳定性的评论;)以上是关于在 Swift 中使用 Set 时出现编译器分段错误的主要内容,如果未能解决你的问题,请参考以下文章