gpt4 book ai didi

Swift - 元类型 .Type 和 .self 之间有什么区别?

转载 作者:IT王子 更新时间:2023-10-29 05:00:24 24 4
gpt4 key购买 nike

Swift 中的元类型 .Type.self 有什么区别?

.self.Type 是否返回一个 struct

我知道 .self 可用于检查 dynamicType。你如何使用.Type

最佳答案

这是一个简单的例子:

func printType<T>(of type: T.Type) {
// or you could do "\(T.self)" directly and
// replace `type` parameter with an underscore
print("\(type)")
}

printType(of: Int.self) // this should print Swift.Int


func printInstanceDescription<T>(of instance: T) {
print("\(instance)")
}

printInstanceDescription(of: 42) // this should print 42

假设每个实体由两件事表示:

  • 类型:#实体名称#

  • 元类型:#实体名称#.Type

A metatype type refers to the type of any type, including class types, structure types, enumeration types, and protocol types.

Source.

您可以很快注意到这是递归的,并且可以按 (((T.Type).Type).Type) 等类型进行递归。

.Type 返回一个元类型的实例。

我们可以通过两种方式获取元类型的实例:

  • 在具体类型上调用 .self,例如 Int.self,这将创建一个static 元类型实例 Int.Type

  • 从任意实例中获取dynamic元类型实例类型(属于:someInstance)

危险区域:

struct S {}
protocol P {}

print("\(type(of: S.self))") // S.Type
print("\(type(of: S.Type.self))") // S.Type.Type
print("\(type(of: P.self))") // P.Protocol
print("\(type(of: P.Type.self))") // P.Type.Protocol

.Protocol 是另一种仅存在于协议(protocol)上下文中的元类型。也就是说,我们无法表达我们只想要 P.Type。这会阻止所有通用算法使用协议(protocol)元类型,并可能导致运行时崩溃。

对于更好奇的人:

type(of:) 函数实际上由编译器处理,因为 .Protocol 创建了不一致。

// This implementation is never used, since calls to `Swift.type(of:)` are
// resolved as a special case by the type checker.
public func type<T, Metatype>(of value: T) -> Metatype { ... }

关于Swift - 元类型 .Type 和 .self 之间有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31438368/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com