Свифт, почему я не могу использовать "self.init(type: .custom)" в инициализаторе удобства в моем подклассе UIButton
Я знаю, должен вызвать назначенный инициализатор суперкласса, я думаю, init(type: UIButtonType)
вызвал назначенный инициализатор, поэтому я использовал его в удобном инициализаторе подкласса, но не смог
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")
}
1 ответ
Если, скажем, имя является вашим обязательным полем, вы реализуете все свои первоначальные настройки в функции. И вы должны справиться, если 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
}
init(type: UIButtonType)
не назначенный инициализатор UIButton, init(frame: CGRect)
является правильно обозначенным инициализатором UIButton
вам просто нужно перезаписать init(frame: CGRect)
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let button1 = MyButton(type: .custom)
}
}
class MyButton: UIButton {
// 初始化父类的指定构造器,然后你就可以获得父类的便利构造器
// overwrite the designated initializer of the super class, then you can automatically inherit the convenience initializer of the super class
override init(frame: CGRect) {
super.init(frame: frame)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
если вы хотите настроить свою собственную кнопку, вы можете добавить convenience init(myType: UIButton.ButtonType)
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let button1 = MyButton(type: .custom)
let button2 = MyButton(myType: .custom)
}
}
class MyButton: UIButton {
// 初始化父类的指定构造器,然后你就可以获得父类的便利构造器
// overwrite the designated initializer of the super class, then you can automatically inherit the convenience initializer of the super class
override init(frame: CGRect) {
super.init(frame: frame)
}
// 创建自己的遍历构造器
// this is what you want
convenience init(myType: UIButton.ButtonType) {
self.init(type: myType) // called the convenience initializer which you automatically inherit from super class
// customize your own button
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
Если это полезно для вас, можете ли вы дать мне подобное, ( ̄  ̄ 3 ̄)づ