我不知道为什么 Swift 设计成这样，毕竟一个便利构造器最终都会调用一个指定构造器。也许这迫使我们去思考最合适的默认属性值，而不是只顾便利。又或许以后这点会改变？谁知道呢。
All code in this post was tested against a playground in Xcode 7.3.1.
Designated initializers perform the actual initialization for a class’s properties. Convenience initializers let you program defaults into simpler initializers with less input parameters, and they hand off the actual initialization back to the designated initializers. You don’t have to have any convenience initializers if you wish, but they are quite useful in certain situations.
I am particularly happy about the addition of the convenience keyword in Swift. In Objective-C, as far as i know, the only way to know which was the designated initializer was to look in the comments in the header file (assuming you do not have access to the code). If they did not comment about it, and you don’t have the code, I think you would just have to guess. If you had the code, the designated initializer is the one that calls the superclass’s initializer (similar to rule 1 above).
Clearly marking a convenience initializer as such just makes it easier to know. In our class, it was rather obvious, but it may not be so obvious for all classes.