[Ios] خطأ في التحويل البرمجي السريع: "تعبير شديد التعقيد" في سلسلة سلسلة


Answers

هذا هو تقريبا نفس الجواب المقبول ولكن مع بعض الحوار المضافة (كان لي مع روب نابير وصديق آخر من لقاء Cocoahead) والروابط.

انظر التعليقات في this المناقشة. جوهر ذلك هو:

مشغّل + مشغّل بشكل كبير ، حيث أنه يحتوي الآن على 27 وظيفة مختلفة ، لذا إذا كنت تسلسل 4 سلاسل ، أي أن لديك 3 + مشغلين ، يجب على المُجمّع أن يفحص بين 27 مشغلاً في كل مرة ، بحيث تكون 27 ^ 3. لكن هذا ليس هو

هناك أيضًا check لمعرفة ما إذا كانت lhs و lhs الخاصة بوظائف + صالحة إذا كانت مكالمات من خلال جوهر append المدعو. هناك يمكنك أن ترى هناك عدد من checks المكثفة التي يمكن أن تحدث. إذا كانت السلسلة مخزنة بشكل غير متجانس ، والتي يبدو أنها الحالة إذا تم بالفعل ربط السلسلة التي تتعامل معها بـ NSString. لدى Swift ثم إعادة تجميع كافة مخازن الصفيف البايت في المخزن المؤقت المتجاورة واحد والذي يتطلب إنشاء مخازن جديدة على طول الطريق. ثم تحصل في النهاية على مخزن مؤقت واحد يحتوي على السلسلة التي تحاول تجميعها معاً.

باختصار ، هناك 3 مجموعات من عمليات التحقق من المجمع والتي من شأنها أن تبطئك ، وبالتالي " My fullName is \(firstName) \(LastName)" سلاسل مع الاستيفاء بمعنى استخدام " My fullName is \(firstName) \(LastName)" أفضل بكثير من "My firstName is" + firstName + LastName منذ الاستيفاء ليس لديها أي الحمولة الزائدة

قام Swift 3 ببعض التحسينات. لمزيد من المعلومات اقرأ كيفية دمج صفائف متعددة دون إبطاء المحول البرمجي لأسفل؟

Question

أجد هذا مسلية أكثر من أي شيء. لقد أصلحته ، لكنني أتساءل عن السبب. في ما يلي الخطأ: DataManager.swift:51:90: Expression was too complex to be solved in reasonable time; consider breaking up the expression into distinct sub-expressions DataManager.swift:51:90: Expression was too complex to be solved in reasonable time; consider breaking up the expression into distinct sub-expressions . لماذا يشكو؟ يبدو وكأنه واحد من أبسط التعبيرات الممكنة.

يشير المحول البرمجي إلى 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 = "create table if not exists \(self.tableName()) (\(columns))"




كان لدي مشكلة مماثلة:

expression was too complex to be solved in reasonable time; consider breaking up the expression into distinct sub-expressions

في خط Xcode 9.3 ، ينتقل هذا الشكل:

let media = entities.filter { (entity) -> Bool in

بعد تغييره إلى شيء كهذا:

let media = entities.filter { (entity: Entity) -> Bool in

كل شيء عملت.

من المحتمل أن يكون له علاقة بمترجم Swift يحاول استنتاج نوع البيانات من الشفرة.