ios - Swift 编译器错误 : "Expression too complex" on a string concatenation

标签 ios xcode swift compiler-errors functional-programming

我觉得这比什么都有趣。我已经解决了,但我想知道原因。这是错误:DataManager.swift:51:90:表达式太复杂,无法在合理的时间内解决;考虑将表达式分解为不同的子表达式。它为什么提示?这似乎是最简单的表达方式之一。

编译器指向columns + ");";部分

func tableName() -> String { return("users"); } 

func createTableStatement(schema: [String]) -> String {

    var schema = schema;

    schema.append("id string");
    schema.append("created integer");
    schema.append("updated integer");
    schema.append("model blob");

    var columns: String = ",".join(schema);

    var statement = "create table if not exists " + self.tableName() + "(" + columns + ");";

    return(statement);
}

修复方法是:

var statement = "create table if not exists " + self.tableName();
statement += "(" + columns + ");";

这也有效(通过@efischency),但我不太喜欢它,因为我认为 ( 迷路了:

var statements = "如果不存在则创建表\(self.tableName()) (\(columns))"

最佳答案

我不是编译器方面的专家 - 我不知道这个答案是否会“以有意义的方式改变你的思维方式”,但我对问题的理解是这样的:

它与类型推断有关。每次使用 + 运算符时,Swift 都必须搜索 + 所有可能的重载,并推断您正在使用哪个版本的 + 。我算了一下 + 运算符的重载不到 30 个。这有很多可能性,当您将 4 或 5 个 + 操作链接在一起并要求编译器推断所有参数时,您所要求的比乍一看要多得多。

该推理可能会变得复杂 - 例如,如果您使用 + 添加 UInt8Int,则输出将是 Int,但是有一些工作涉及评估混合类型与运算符的规则。

当您使用文字时,例如示例中的 String 文字,编译器会将 String 文字转换为 String,然后为 + 运算符推断参数和返回类型等工作。

如果表达式足够复杂 - 即它要求编译器对参数和运算符进行太多推断 - 它会退出并告诉您它已退出。

一旦表达式达到一定的复杂程度,编译器就退出是有意为之的。另一种方法是让编译器尝试执行它,看看是否可以,但这是有风险的 - 编译器可能会永远继续尝试,陷入困境,或者只是崩溃。所以我的理解是,表达式的复杂度存在一个静态阈值,编译器不会超越该阈值。

我的理解是,Swift 团队正在致力于编译器优化,以减少这些错误的发生。 You can learn a little bit about it on the Apple Developer forums by clicking on this link .

在开发论坛上,Chris Lattner 要求人们将这些错误作为雷达报告归档,因为他们正在积极致力于修复这些错误。

这就是我在阅读了这里和开发论坛上的许多帖子后的理解,但我对编译器的理解很幼稚,我希望对如何处理这些任务有更深入了解的人能够扩展关于我在这里写的内容。

关于ios - Swift 编译器错误 : "Expression too complex" on a string concatenation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46645137/

相关文章:

ios - 什么是 Interface Builder 中的适配

ios - XCODE - 链接器命令失败,退出代码为 1 - 自 xcode 更新以来

IOS构建警告: the transform cache was reset

以编程方式设置 iPhone/iPad 外壳颜色

ios - 在 Realm 中实现 Parse 的 currentUser

ios - 点击该单元格时,如何访问 uicollectionviewcell 内标签的文本属性? ( swift )

iOS 检查库中是否存在图像

ios - 在 WKWebView 之间共享/重新加载 localStorage、IndexedDB、cookie

ios - 检测 applicationWillEnterForeground 中存在哪个 View

ios - 传入的推送通知设置警报两次 swift 4