2016-09-28 91 views
6

我已經將Swift 2.3項目轉換爲swift 3.現在,編譯器不再拋出任何錯誤,但它不斷編譯。 CPU是100%,如果你不停止編譯,它會持續編譯50分鐘或更長時間。Xcode繼續在Swift上構建3

Xcode一直說建築.. |編譯Swift源文件

在構建日誌中它總是停在相同的swift文件上。 swift文件只是簡單的模型類,所以我不知道這個問題會是什麼。

我在swift 2中遇到了同樣的問題,但這是由??運算符造成的。我重構了代碼來刪除??運營商,所以它不能再這樣了。

我怎樣才能找到什麼減慢編譯時間無盡?

我的模型看起來都一樣:

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是:

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

和型號僅僅是一個擁有另一個初始化爲JSON過的基類。

當我在構建日誌上運行分析器,然後我所有的模型都花費很長時間來創建NSDictionary。但爲什麼?

+0

1.您是否嘗試清理項目/重新啓動Xcode/etc? 2.你有沒有試過在單獨的項目中編譯這個Swift文件? 如果不是,請發佈它掛起的Swift文件的內容。 – fiks

+0

你好,我有同樣的問題,你有任何解決方案? – Rock

+0

@fiks我和班級編輯了我的問題。 – user1007522

回答

5

所以問題是,我們有很多這樣的創建詞典:

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

如果重寫此爲

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

則編譯奇蹟般地只需要每模型15到20毫秒而不是每個型號2000毫秒。

您可以自己與構建時分析儀應用試試吧:-)

+3

實際上,第一個字典其實是一個數組:)定義'let dict:[String:Any] = ...'是不夠的。類型推斷可能很慢,並聲明類型應該足夠。 – Sulthan

+0

對不起,你是對的,第一個是數組。我編輯了代碼。當然,您可以放棄[String:Any]()部分。這只是爲了說清楚。 – user1007522

+1

如果你嘗試讓let dict:[String:Any] = [「key」:value,「key2」:value2]',那麼會發生什麼? – Jesper

0

我面臨同樣的問題,該項目遷移到SWIFT 3後,但很多[R & d後,我找到了解決辦法。由於字典和數組創建時沒有數據類型,因此花費時間。

相關問題