2017-01-04 61 views
0

?所以我用它在子類方便初始化,但失敗我知道必須調用超類的指定初始值設定項,我認爲<code>init(type: UIButtonType)</code>已經調用了指定的初始值設定項,爲什麼我不能在易理解初始值設定項中使用「self.init(type:.custom)」,我的子類是UIButton

class TSContourButton: UIButton { 
enum ContourButtonSizeType { 
    case large 
    case small 
} 

convenience init(type:ContourButtonSizeType) { 
    self.init(type: .custom) 
} 

然後,我試了這個。它編譯好。但是,它看起來不專業

class TSClass: UIButton { 

convenience init(frame: CGRect, myString: String) { 
    self.init(frame: frame) 
    self.init(type: .custom) 
} 

所以,我懷疑我可能會認爲錯了。所以,我做了一些測試。它成功地稱爲super convenience initializer。爲什麼我不能在方便初始值設定項中使用self.init(type: .custom)在我的子類UIButton

class person: UIButton { 
var name: String = "test" 

override init(frame: CGRect) { 
    super.init(frame: .zero) 
    self.name = "one" 
} 

convenience init(myName: String) { 
    self.init(frame: .zero) 
} 

required init?(coder aDecoder: NSCoder) { 
    fatalError("init(coder:) has not been implemented") 
} 

}

class man: person { 
convenience init(mySex: Int) { // it successfully call superclass convenience initializer 
    self.init(myName: "info") 
} 
+0

'所以我用它在子類方便初始化,但失敗' - 你得到什麼錯誤? – BaSha

回答

0

如果,比方說,名字是你的必填字段,你實現你所有的初始的功能設置。如果name不可用,你應該處理。如果沒有提供類型,我會保留small作爲默認選項。

// MARK:- Designated Initializers 
required init?(coder aDecoder: NSCoder) { 
    super.init(coder: aDecoder) 

    initialSetup(type: .small) 
} 

override init(frame: CGRect) { 
    super.init(frame: frame) 

    initialSetup(type: .small) 
} 

// MARK:- Convenience Initializers 
convenience init(type: ContourButtonSizeType) { 
    self.init(frame: .zero) 

    initialSetup(type: type) 
} 

func initialSetup(type: ContourButtonSizeType) { 
    // handle all initial setup 
} 
相關問題