swift自定义便利构造器的实现

743 阅读1分钟

swift 自定义便利构造器原则:

  • 在自定义的 init方法前添加convenience 关键字,同时在内部调用 self.init() ,即一定要调用同级别的指定构造器
  • 如果在子类中创建便利构造器,也要调用 self.init() ,同时重写init方法,如果不重写会报错

UIBarButtonItem+Extension 的扩展中添加便利构造器

import UIKit

extension UIBarButtonItem {
    convenience init(image: String) {
        let letBtn = UIButton()
        letBtn.setBackgroundImage(UIImage(named:image), for: .normal)
        letBtn.setBackgroundImage(UIImage(named:image + "_highlighted"), for: .highlighted)
        letBtn.sizeToFit()
        self.init(customView: letBtn)
    }
}

自定义button


class RightImageButton: UIButton {
    convenience init (image: String, title: String, color: UIColor) {
        self.init()
        setImage(UIImage(named:image), for: .normal)
        setImage(UIImage(named:image + "_highlighted"), for: .highlighted)
        setTitle(title, for: .normal)
        setTitle(title, for: .highlighted)
        setTitleColor(color, for: .normal)
        setTitleColor(color, for: .highlighted)
    }
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        sizeToFit()
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    override func layoutSubviews() {
        super.layoutSubviews()
        //改变title的x坐标
        titleLabel?.frame.origin.x = 0
        imageView?.frame.origin.x = (titleLabel?.frame.size.width)! + 5
    }
    
}