转换为Swift 4语法时Swift编译器中的分段错误

时间:2017-09-25 11:38:24

标签: swift swift4 xcode9

我有一些用Swift 3.2编写的Swift代码,我只是尝试使用Xcode 9.0中的自动语法转换器来更新到Swift 4.0。

它实际上找不到任何需要转换的内容,但在代码分析期间,当编译器编译项目时,编译器会因分段错误而崩溃。我无法共享完整的源代码,因此我创建了一个演示相同问题的简单示例,并确认这也会在新创建的Swift项目中产生崩溃。

只有在使用字符串插值将值连接在一起时才会出现编译器崩溃。重现:

  1. 创建一个新的Xcode项目,并将Swift版本设置为3.2
  2. 创建一个新的Swift类
  3. 将以下代码粘贴到新类中:

    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
        }()
    
    }
    
  4. 尝试执行Swift 3.2到Swift 4.0转换 - >这将失败并出现段错误,并显示以下错误:

  5. 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,但我相信其他人会遇到这个神秘的错误,我想找出导致它的原因。我的语法有问题吗?

    感谢。

0 个答案:

没有答案