Swift 继承函数 return 类型不能是子类型

Swift inheritance function return type can't be sub-type

考虑以下代码:

class A {}
class B: A {}
protocol P {
    var a: A {get}
}
class P1: P {
    let a: A = B() // No problem
}
class P2: P {
    let a: B = B() // Can't compile!!
}

因为 BA 的子 class,为什么我们不能将 B 作为 var a 的 return 类型?

class A {}
class B: A {}
protocol P {
    var a: A {get}
}

class P1: P {
    let a: A = B() // No problem
}

class P1x: P {
    let a = A() // No problem
 
}

class P1y: P {
    var a = A()
    
    let b: B = B() // No problem
}

现在你的困惑点:

class P2: P {
    let a: B = B() // Can't compile!
}

因为a属于类型A而不是协议B中声明的B!

你不能那样做,因为 P 协议特别要求符合 class 的 属性 类型为 A.

您始终可以在协议中使用 associatedtype 和泛型:

class A {}
class B: A {}
protocol P {
    associatedtype T: A
    var a: T { get }
}
class P1: P {
    let a: A = B()
}
class P2: P {
    let a: B = B()
}

不过请记住,如果这样做,您不能将 P 协议直接用作类型,而只能与泛型一起使用: