gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-10-31 23:14:12 24 4
gpt4 key购买 nike

我觉得这比什么都有趣。我已经修好了,但我想知道原因。这是错误: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 statement = "创建表,如果不存在\(self.tableName()) (\(columns))"

最佳答案

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

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

该推断可能会变得复杂 - 例如,如果您使用 + 添加一个 UInt8 和一个 Int,输出将是一个 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 要求人们将这些错误作为雷达报告提交,因为他们正在积极修复它们。

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

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com