1. ホーム
  2. ios

[解決済み] Swiftのコンパイラーエラー。文字列の連結で「式が複雑すぎる」。

2022-05-15 23:16:22

質問

何より面白いです。私はそれを修正しましたが、私は原因について疑問に思っています。以下がそのエラーです。 DataManager.swift:51:90: Expression was too complex to be solved in reasonable time; consider breaking up the expression into distinct sub-expressions . なぜ文句を言われるのでしょうか?最もシンプルな表現の1つのように思えます。

コンパイラは 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 + ");";

も使えますが (via @efischency)、私はこの方法はあまり好きではありません。 ( が失われてしまうからです。

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

どのように解決するのですか?

私はコンパイラの専門家ではないので、この回答があなたの考え方を有意義に変えるかどうかは分かりませんが、私の理解では、この問題は次のようになります。

それは型推論と関係があります。あなたが + 演算子を使うたびに、Swift は + を検索し、どのバージョンの + を推測することができます。のオーバーロードを30個弱数えました。 + 演算子には30個弱のオーバーロードがあります。これは非常に多くの可能性があり、4つまたは5つの + 演算子を連鎖させ、コンパイラにすべての引数を推論するように要求すると、一見したところより多くのことを要求していることになります。

その推論は複雑になることがあります。例えば、あなたが UInt8Int を使って + を使用すると、出力は Int になりますが、演算子で型を混ぜるルールを評価する作業があります。

また、リテラルを使用する場合、例えば String のようなリテラルを使っている場合、コンパイラが String リテラルから String に変換し、引数と戻り値の型を推測する作業をします。 + 演算子などです。

式が十分に複雑な場合、つまり、コンパイラが引数と演算子についてあまりにも多くの推論を行う必要がある場合、コンパイラは終了し、終了したことを通知します。

式があるレベルの複雑さに達するとコンパイラが終了するのは、意図的なものです。コンパイラーにそれをやらせて、できるかどうかを確認することもできますが、それは危険です。つまり、式の複雑さには静的な閾値があり、コンパイラはそれを超えることはできない、というのが私の理解です。

私の理解では、Swift チームは、これらのエラーを少なくするために、コンパイラの最適化に取り組んでいます。 このリンクをクリックすることで、Apple Developer forums でそれについて少し学ぶことができます。 .

Dev フォーラムでは、Chris Lattner 氏が、これらのエラーをレーダー レポートとして提出するよう求めており、彼らは積極的に修正に取り組んでいます。

それについてここと Dev フォーラムで多くの投稿を読んだ後、私はそのように理解しています。しかし、私のコンパイラに対する理解は甘いので、コンパイラがこれらのタスクをどのように処理するかについて深い知識を持つ人が、私がここに書いたことを展開してくれることを期待しています。