[解決済み] Swiftのコンパイラーエラー。文字列の連結で「式が複雑すぎる」。
質問
何より面白いです。私はそれを修正しましたが、私は原因について疑問に思っています。以下がそのエラーです。
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つの
+
演算子を連鎖させ、コンパイラにすべての引数を推論するように要求すると、一見したところより多くのことを要求していることになります。
その推論は複雑になることがあります。例えば、あなたが
UInt8
と
Int
を使って
+
を使用すると、出力は
Int
になりますが、演算子で型を混ぜるルールを評価する作業があります。
また、リテラルを使用する場合、例えば
String
のようなリテラルを使っている場合、コンパイラが
String
リテラルから
String
に変換し、引数と戻り値の型を推測する作業をします。
+
演算子などです。
式が十分に複雑な場合、つまり、コンパイラが引数と演算子についてあまりにも多くの推論を行う必要がある場合、コンパイラは終了し、終了したことを通知します。
式があるレベルの複雑さに達するとコンパイラが終了するのは、意図的なものです。コンパイラーにそれをやらせて、できるかどうかを確認することもできますが、それは危険です。つまり、式の複雑さには静的な閾値があり、コンパイラはそれを超えることはできない、というのが私の理解です。
私の理解では、Swift チームは、これらのエラーを少なくするために、コンパイラの最適化に取り組んでいます。 このリンクをクリックすることで、Apple Developer forums でそれについて少し学ぶことができます。 .
Dev フォーラムでは、Chris Lattner 氏が、これらのエラーをレーダー レポートとして提出するよう求めており、彼らは積極的に修正に取り組んでいます。
それについてここと Dev フォーラムで多くの投稿を読んだ後、私はそのように理解しています。しかし、私のコンパイラに対する理解は甘いので、コンパイラがこれらのタスクをどのように処理するかについて深い知識を持つ人が、私がここに書いたことを展開してくれることを期待しています。
関連
-
[エラー処理】iOSのエラー、アーキテクチャx86_64の未定義シンボルについて
-
[解決済み] キーボードがあるときに、UITextFieldを編集開始時に上に移動させるには?
-
[解決済み] iOSのバージョンを確認する方法を教えてください。
-
[解決済み] 文字列の長さを取得する
-
[解決済み] iPhone UITextField - プレースホルダーの文字色を変更する
-
[解決済み] UITextViewのマージン/パディングをなくす方法
-
[解決済み] UIViewの左上と右上だけにcornerRadiusを設定する方法は?
-
[解決済み] Swiftを使用してアプリのバージョンとビルド番号を取得するにはどうすればよいですか?
-
[解決済み] UITextFieldの最大文字数を設定します。
-
[解決済み] iOS 7でステータスバーとナビゲーションバーがビューの境界を越えて表示される
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] performSelectorのセレクタが不明なため、リークが発生する可能性があります。
-
[解決済み] Xcode 7のエラーです。"Missing iOS Distribution signing identity for ..." (iOS配布用署名IDがありません)
-
[解決済み] 奇妙な不要なXcodeログを隠す
-
[解決済み] Objective-Cで文字列が空かどうかをテストするにはどうすればよいですか?
-
[解決済み] iOS 13 のフルスクリーンでモーダルを表示する
-
[解決済み] Swift 3, 4, 5 で dispatch_after GCD を書くにはどうしたらいいですか?
-
[解決済み] iOSで現在のデバイスの言語を取得するには?
-
[解決済み] iPhoneでナビゲーションバーを1ページ目だけ非表示にする
-
[解決済み] iOS 11、Apple TV 4Kなどを搭載したXcode 9でワイヤレスデバッグを行う方法とは?
-
[解決済み] XcodeがIndexingでスタックする