use of unimplemented initializer 'init(layer:)' 引发的构造器问题

我自己写了一个CAShapeLayer的子类,然后用的时候就出问题了 

class LoadingSharpLayer: CAShapeLayer {
    
    override init() {
         super.init()
         let center:CGPoint = CGPointMake(25, 25)
         let uPath:UIBezierPath = UIBezierPath(arcCenter: center, radius: 15 , startAngle: 0 , endAngle: 5.5 , clockwise: true)
         self.path = uPath.CGPath
         self.fillColor = UIColor.clearColor().CGColor
         self.strokeColor = UIColor.blueColor().CGColor
         self.lineWidth = 5
         self.strokeStart = 0
         self.strokeEnd = 0
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    func updateLoadingView(process:CGFloat){
        self.strokeEnd = process < 1 ? process : 1
    }
    
}

 loadingLayer.position = CGPointMake(width/2, height/2)

 // fatal error: use of unimplemented initializer 'init(layer:)' for class 'tableView.LoadingSharpLayer

一看控制台就明白了,找不到init(layer:)这个初始方法。所以把这个方法重载进去就行了

    override init(layer: AnyObject) {
        super.init(layer: layer)
    }

对于这种问题是在是伤脑筋,因为个人觉得SWift的构造器规则确实比较繁琐,但是梳理一下清楚了许多。对于构造器的继承这一块,手册上给了两个规则

1,如果子类没有任何指定构造器,则自动继承父类所有指定构造器(言外之意就是如果子类有一个指定构造器(不管是重载还是自己声明的),那么父类的其他指定构造器子类均不会自动继承)

2 如果子类提供了父类所有指定构造器的实现,不管是通过1还是手动重载的,子类都将会自动继承所有父类的便利构造器,(言外之意就是如果子类中没有任何初始化方法,那么子类将继承父类所有的构造器(指定和便利))

tip 如果子类中只有自定义的便利构造器,那么也会满足规则1。

所以,本人中的问题就在于当重载了指定构造器init()之后,init(layer: AnyObject)不会自动继承,所以出错。

然而,当我取消掉CASharpLayer的隐式动画之后,不加上init(layer: AnyObject)程序也能正常进行,由此可见,当使用了隐式动画的时候,init(layer: AnyObject)这个指定构造方法会被调用,反之,则不会。

               CATransaction.begin();
               CATransaction.setDisableActions(true)
               loadingLayer.position = CGPointMake(width/2, height/2)
               loadingLayer.updateLoadingView(self.currentHeight/QTableViewRefreshConfig.TriggerOffsetToPull)
              CATransaction.commit();

最后,手册上的一则口诀:指定构造器向上代理 ,便利构造器横向代理 。

你可能感兴趣的:(use of unimplemented initializer 'init(layer:)' 引发的构造器问题)