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
.
的一致性
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 ofYYYProtocol
.
没有其他类型可以从结构继承,所以如果你有一个方法被称为 return some StructType
,那么它只能 return StructType
,没有别的。这违背了不透明 return 类型的目的。
从你的方法名开始,写作:
func getPlanet() -> some Planet {
return Earth(name: "Earth", creatures: "Humans")
}
在我看来会更有意义。
调用者知道 getPlanet
将 return 一个明确的类型,即 Planet
.