2016-09-28 6 views
6

Ich habe mein Swift 2.3-Projekt in swift 3 umgewandelt. Nun wirft der Compiler keine Fehler mehr, aber er kompiliert weiter. CPU ist wie 100% und es kompiliert für 50 Minuten oder mehr, wenn Sie es nicht stoppen.Xcode baut weiter auf Swift 3

Xcode sagt immer Building .. | Swift-Quelldateien kompilieren

Im Build-Protokoll stoppt es immer auf den gleichen schnellen Dateien. Die schnellen Dateien sind nur einfache Modellklassen, daher weiß ich nicht, was das Problem sein könnte.

Ich hatte das gleiche Problem in Swift 2, aber das wurde durch den Operator ?? verursacht. Ich habe den Code umstrukturiert, um den Operator ?? zu entfernen, so dass es nicht mehr sein kann.

Wie kann ich herausfinden, was die Kompilierzeit zu endlos verlangsamt?

Meine Modelle sehen alle gleich aus:

class Test: InputContract { 
    var appointmentDate: Date! 
    var startTime: String! 
    var endTime: String! 
    var registerDescription: String! 
    var subjectKey: String! 
    var channelCode: String! 
    var relationManagerHrId: String = "" 
    var employeeUserCode: String = "" 
    var smsReminderMobileNumber: String = "" 
    var smsReminderMobileNumberSequence: String! 
    var contactPhoneNumber: String = "" 
    var contactPhoneNumberSequence: String! 
    var smsReminder: Bool = false 

override func retrieveInputDictionary() -> NSDictionary { 
     return ["description" : self.registerDescription, "appointmentDate" : Utils.formattedDate(self.appointmentDate), 
       "startTime" : self.startTime, "endTime" : self.endTime, "subjectKey" : self.subjectKey, "channelCode" : self.channelCode, "smsReminder" : self.smsReminder ? "true" : "false", "relationManagerHrId" : self.relationManagerHrId, "employeeUserCode" : self.employeeUserCode, 
       "smsReminderMobileNumber" : self.smsReminderMobileNumber, "contactPhoneNumber" : self.contactPhoneNumber, "smsReminderMobileNumberSequence" : self.smsReminderMobileNumberSequence, "contactPhoneNumberSequence" : self.contactPhoneNumberSequence 
     ] 
    } 
} 

InputContract ist:

protocol InputDictionaryMapper { 
    func retrieveInputDictionary() -> NSDictionary 
    func retrievePublicInputDictionary() -> NSDictionary 
} 

class InputContract: Model, InputDictionaryMapper { 

    func retrieveInputDictionary() -> NSDictionary { 
     fatalError("Each inputContract implementation must implement it's own method: \(NSStringFromClass(type(of: self)))") 
    } 

    func retrievePublicInputDictionary() -> NSDictionary { 
     fatalError("Each inputContract implementation must implement it's own method: \(NSStringFromClass(type(of: self)))") 
    } 

    required init(json: JSON) { 
     fatalError("init(json:) has not been implemented") 
    } 

    override init() { 
     super.init() 
    } 
} 

und das Modell ist nur eine Basisklasse, die auch eine andere init für json hat.

Wenn ich den Analysator auf dem Build-Protokoll ausführen, dann nehmen alle meine Modelle Soo lange, um das NSDictionary zu erstellen. Aber warum?

+0

1. Haben Sie versucht, das Projekt zu säubern/Xcode/etc neu zu starten? 2. Haben Sie versucht, diese Swift-Datei in einem separaten Projekt zu kompilieren? Wenn nicht, posten Sie bitte den Inhalt der Swift-Datei, an der er hängt. – fiks

+0

Hallo, ich habe das gleiche Problem, hast du irgendeine Lösung? – Rock

+0

@fiks Ich habe meine Frage mit der Klasse bearbeitet. – user1007522

Antwort

5

Also das Problem war, dass wir viele Wörterbücher wie diese erstellt hatte:

let dict = ["key": value, "key2": value2] 

Wenn Sie diese umschreiben als

var dict: [String: Any] = [String: Any]() 
dict["key"] = value 
dict["key2"] = value2 

dann der Compiler auf magische Weise nur 15 bis 20 ms pro Modell nimmt anstelle von 2000 ms pro Modell.

Sie können es versuchen, sich mit dem Buildtime-Analysator app :-)

+3

eigentlich ist das erste Wörterbuch tatsächlich ein Array :) Wäre es nicht genug zu definieren 'let dict: [String: Any] = ...'. Typ-Inferenz kann langsam sein und der Typ sollte ausreichen. – Sulthan

+0

Entschuldigung, Sie haben recht, der erste war ein Array. Ich habe den Code bearbeitet. Ja, natürlich können Sie den [String: Any]() -Teil ablehnen. Es war nur um es klarzustellen. – user1007522

+1

Was passiert, wenn Sie 'let dict versuchen: [String: Beliebige] = [" key ": value," key2 ": value2]', dh die gleiche Sache, aber mit einem Typ definiert? – Jesper

0

Ich wurde nach dem Projekt zu schnellen 3 Migration vor dem gleichen Problem, aber nach vielen R & D fand ich eine Lösung. Es dauerte Zeit, weil Wörterbücher und Arrays ohne Datentyp erstellt wurden.