【问题标题】:Swift inheritance function return type can't be sub-typeSwift继承函数返回类型不能是子类型
【发布时间】:2020-11-11 08:03:19
【问题描述】:

考虑以下代码:

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 的子类,为什么我们不能将B 作为var a 的返回类型?

【问题讨论】:

  • 我相信这是因为您的协议有一个 var 或类型 A 而不是 B,而 B 是 A 的子类。所以,P2 不知道 B 是什么类型。
  • 尊敬的 PO,您的问题现在一切都清楚了吗?
  • 我认为这是 Swift 的约束。在 Scala、Java 和 Kotlin 等其他语言中,P2 中的声明是可以的。

标签: swift inheritance swiftui subclass return-type


【解决方案1】:

您不能这样做,因为P 协议明确要求符合类具有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 协议作为类型,而只能使用泛型:

【讨论】:

    【解决方案2】:
    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 中声明的!

    【讨论】:

      猜你喜欢
      • 2017-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-13
      • 2020-08-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多