Тип возврата функции наследования Swift не может быть подтипом

#swift #inheritance #swiftui #subclass #return-type

#swift #наследование #swiftui #подкласс #возвращаемый тип

Вопрос:

Рассмотрим следующий код:

 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!!
}
  

Поскольку B это подкласс of A , почему мы не можем сделать B в качестве возвращаемого типа of var a ?

Комментарии:

1. Я полагаю, это потому, что ваш протокол имеет переменную или тип A, а не B, а B является подклассом A. Итак, P2 понятия не имеет, какой тип B.

2. Уважаемый пользователь, теперь все ясно по вашему вопросу?

3. Я думаю, что это ограничение Swift. На других языках, таких как Scala, Java и Kotlin, объявление в P2 порядке.

Ответ №1:

Вы не можете этого сделать, потому P что протокол специально запрашивает у соответствующего класса свойство type 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 !