First of all, imho, this has nothing with derived class, you could remove you subclassing and get the similar error.
Second, I think it is due to the "nature" of convenience initializers and their usage. They are "optional" (in usage) initializers, for example to provide shortcut way to initialize from some complex data (like other class or structure). Adding initialization of self.b to convenience init in your sample wouldn't bring anything helpful, as you anyway would need to initialize b in designated init:
class Sub1: Base1 {
let b: Int
// You must init b
// Or ger error: property 'self.b' not initialized ...
init(b: Int) {
self.b = b
super.init()
}
// Do you really need the code below now?
//convenience init(b: Int) {
// self.b = b
// self.init()
//}
}
Thus as designated init must initialize b, the convenience initializer as your wrote it becomes meaningless.
Third, assume it would be allowed. So, as convenience initializer are delegated across not necessarily calling the designated one. Thus it would be possible to do something like that:
...
convenience init(b: Int) {
self.b = b
self.init(c: 10)
}
// later some crazy guy adds his own "convenience" initializer and points your to this one.
convenience init(c: Int) {
self.c = c
if c == 7 {
self.b = 11
}
self.init()
}
Now imagine that you are the "compiler" and tell me where the constant b is set to it's constant value and what value?
Finally, in my understanding the correct usage could be like that:
class Base1 {
init() {}
}
class Sub1: Base1 {
let b: Int
init(b: Int) {
self.b = b
super.init()
}
// Convenience initializer providing default value
override convenience init() {
self.init(b: 7)
}
}
So, my concern is that I don't understand clearly what you really wanted to achieve by allowing let b initialized in convenience init?