[Ios] Errore Swift Compiler: "Expression too complex" su una concatenazione di stringhe



Answers

Questo è quasi lo stesso della risposta accettata, ma con alcuni dialoghi aggiunti (ho avuto con Rob Napier e un altro amico da un meetup di Cocoahead) e link.

Vedi i commenti in this discussione. Il succo è:

L' operatore + è molto sovraccarico, a partire da ora ha 27 diverse funzioni quindi se si concatenano 4 stringhe, cioè si hanno 3 + operatori, il compilatore deve controllare ogni volta tra 27 operatori, quindi sono 27 ^ 3 volte. Ma non è quello.

C'è anche un check per vedere se il lhs e il rhs delle funzioni + sono entrambi validi se sono chiamati attraverso il nucleo dell'append chiamato. Qui puoi vedere che ci sono un numero di checks un po 'intensi che possono verificarsi. Se la stringa è archiviata in modo non contiguo, il che sembra essere il caso in cui la stringa con cui si sta trattando sia effettivamente collegata a NSString. Swift deve quindi riassemblare tutti i buffer dell'array di byte in un singolo buffer contiguo e che richiede la creazione di nuovi buffer lungo il percorso. e alla fine si ottiene un buffer che contiene la stringa che si sta tentando di concatenare insieme.

In breve ci sono 3 cluster di controlli del compilatore che ti rallenteranno e quindi concatenando stringhe con l'interpolazione, ad esempio usando " My fullName is \(firstName) \(LastName)" è molto meglio di "My firstName is" + firstName + LastName since l'interpolazione non ha sovraccarico

Swift 3 ha apportato alcuni miglioramenti. Per maggiori informazioni leggere Come unire più array senza rallentare il compilatore?

Question

Trovo questo divertente più di ogni altra cosa. L'ho risolto, ma mi chiedo la causa. Ecco l'errore: 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 . Perché si lamenta? Sembra una delle espressioni più semplici possibili.

Il compilatore punta alle columns + ");"; sezione

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);
}

la correzione è:

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

anche questo funziona (via @efischency) ma non mi piace tanto perché penso che ( perdersi:

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




Ho avuto un problema simile:

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

Nella linea Xcode 9.3 va così:

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

Dopo averlo modificato in qualcosa di simile:

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

tutto ha funzionato.

Probabilmente ha qualcosa a che fare con il compilatore Swift che cerca di dedurre il tipo di dati dal codice circostante.






Links