2015-08-19 33 views
2

我想在我的添加,添加顏色選擇器我用這個https://github.com/gizmosachin/ColorSlider庫,只寫在迅速和我使用的Objective-C。我已經遵循本指南How to call Objective-C code from Swift瞭解如何在Objective-C項目中添加swift庫。我99%確定我已經正確配置了xcode,因爲我可以導入swift庫並運行我的應用程序而不出錯,只有當我嘗試實例化應用程序崩潰的swift類時,我發現init方法swift類被無限調用。該庫的源代碼是一個文件,以防萬一參考上市(https://github.com/gizmosachin/ColorSlider/blob/master/Source/ColorSlider.swift初始化的目標C項目迅速類導致無限循環

這裏的初始化方法之一(另inits是覆蓋)

// MARK: Initializers 
convenience init() { 
    println("hi there swift") 
    self.init() 
    backgroundColor = UIColor.clearColor() 
} 

在我的日誌我看到「你好,很快「打印了很多次。這是我開始迅速類

ColorSlider *colorSlider = [[ColorSlider alloc] init]; 

我知道,包含上述的代碼行的功能,因爲我使用的NSLog(@「產出」),看看有多少次這樣的顯示出來,並且只被調用一次輸出看起來像這樣

output 
hi there swift 
hi there swift 
hi there swift 
hi there swift 
hi there swift 
etc...to infinity or until app crashes 

我正在實例化Swift類嗎?我不知道爲什麼SWIFT類的init方法被稱爲無限

---- UPDATE -----

看起來好像也低於在init方法使用super.init? enter image description here

+0

嘗試刪除self.init()或使用init(幀替換:的CGRect)或init (編碼器aDecoder:NSCoder) – anhtu

回答

2

如在目標C的一類可具有便利(二次)和初始化指定(主)初始化。

代碼執行的路徑應該是:

  1. 的簡便初始化應該調用一個指定初始化與self.designatedInit()
  2. 一個指定的初始化程序應該調用一個超級的指定初始化程序與super.designatedInit()

在您的代碼中,init()是便利初始值設定項(convenience init())。調用self.init()會導致無限循環,因爲這是Dan所說的實際運行的函數本身。

如果將其更改爲super.init()便利初始化器調用超類的初始化,因爲1以上規則#什麼是非法的。

怎麼辦?

  1. 檢查是否init()確實是一個便利的初始值設定項。
  2. 如果是這樣,請致電self.designatedInit()而不是self.init()
  3. 如果不是這樣,改變init()分類,並調用super.init()(或者是超類的指定初始化
+0

所以我最終只是刪除的便利初始化,現在我可以打電話顏色滑塊,因爲試圖調用self.designatedInit導致另一個錯誤,不知道後果是什麼,但因爲方便才行init是設置背景顏色,它應該很好。但是,感謝您深入解釋指定和便捷的init – poopit

2

刪除self.init。該方法正在調用它自己。

+0

謝謝回答,我試圖改變自我的超級但我得到一個「爲‘ColorSlider’必須委託便利初始化(與‘self.init’),而不是鏈接到一個超類的初始化(與「超級的init 「)」,我不是太熟悉,流暢但我要去看看更多進入迅捷的文檔,但什麼是落後改變自我超推理?要與錯誤的屏幕截圖更新的問題。很抱歉,如果我犯了一個愚蠢的錯誤:/ – poopit

+2

當時地設想明白你的課是一個小類。在你的情況下,你不需要調用self.init()。發生什麼事是你的init()遞歸調用自己。甚至不確定你需要聲明這是方便的。 - 學習斯威夫特自己現在:) –