我有一些用Swift 3.2编写的Swift代码,我只是尝试使用Xcode 9.0中的自动语法转换器来更新到Swift 4.0。
它实际上找不到任何需要转换的内容,但在代码分析期间,当编译器编译项目时,编译器会因分段错误而崩溃。我无法共享完整的源代码,因此我创建了一个演示相同问题的简单示例,并确认这也会在新创建的Swift项目中产生崩溃。
只有在使用字符串插值将值连接在一起时才会出现编译器崩溃。重现:
将以下代码粘贴到新类中:
public class SomeClass: NSObject {
static let defaultStringPrefix = "abc"
var a: String = ""
var b: String = ""
var c: String = ""
lazy var concatStr: String = {
let str = "\(defaultStringPrefix)/\(self.a)/\(self.b)/\(self.c)/somepage.html"
return str
}()
}
尝试执行Swift 3.2到Swift 4.0转换 - >这将失败并出现段错误,并显示以下错误:
Command failed due to Segmentation fault: 11
Stack dump:
0....(a huge load of arguments to the swift compiler)
1. While type-checking getter for concatStr at /Users/craigrouse/mobiledev/test/test/SomeClass.swift:17:14
2. While type-checking declaration 0x7ff292a86400 in module 'test'
3. While type-checking expression at [/Users/craigrouse/mobiledev/test/test/SomeClass.swift:17:34 - line:20:7] RangeText="{
let str = "\(a)/\(b)/\(c)/somepage.html"
return str
}()"
我已尝试过各种版本,如果删除字符串插值,问题就会消失。显然我可以避免使用自动转换,并在项目设置中手动将Swift版本设置为4,但我相信其他人会遇到这个神秘的错误,我想找出导致它的原因。我的语法有问题吗?
感谢。