Class 的不透明类型

Opaque Type with Class

A/c Apple Doc,

A function or method with an opaque return type hides its return value’s type information. Instead of providing a concrete type as the function’s return type, the return value is described in terms of the protocols it supports

编辑:缩短整个问题

/* PROTOCOLS  */
protocol MyPros {}

/* STRUCT */
struct MyStruct {}

/* CLASSES */
class ClassA : MyPros {}
class ClassB : ClassA {}
class ClassC : ClassB {}

现在我使用不透明 return 类型,1. 使用结构 2. 使用 class

/* FUNCTIONS */

func getOpaqueStruct() -> some MyStruct { // ERROR: An 'opaque' type must specify only 'Any', 'AnyObject', protocols, and/or a base class
    return MyStruct()
}

func getOpaqueClass() -> some ClassC {
    return ClassC()
}

getOpaqueStruct returns 错误这是可以理解的,如果你检查 getOpaqueClass ,getOpaqueClass 也不会 returning 协议,and/or 基础 class 所以为什么 class 对象能够 return 继承链中的任何 class 对象。它还必须是 returns baseclass 即 classA 或协议即 MyPros。

ClassC 将来可以是 ClassD 的 superclass 但这些链的基础 class 是 ClassA

我认为您误解了错误消息中短语 "base class" 的含义。这并不意味着 "a class that doesn't inherit from anything, and can have subclasses"。它只是意味着 "a class that can have subclasses" 或者换句话说,"a class that other classes can inherit from".

为什么只将功能限制为 类 不继承任何东西,而任何可能具有子 类 的功能都可以从该功能中受益。


旧答案(对问题的修订版 3):

你不能做 some StructType 因为结构没有 sub类。不透明 return 类型的全部意义在于允许您告诉调用者:

I'm returning a definite type, but you don't need to know what type this is. You just need to know it is a subclass of XXXClass/confomer of YYYProtocol.

没有其他类型可以从结构继承,所以如果你有一个方法被称为 return some StructType,那么它只能 return StructType,没有别的。这违背了不透明 return 类型的目的。

从你的方法名开始,写作:

func getPlanet() -> some Planet {
    return Earth(name: "Earth", creatures: "Humans")
}

在我看来会更有意义。

调用者知道 getPlanet 将 return 一个明确的类型,即 Planet.

的一致性