swift中的T.Type是啥
Posted
技术标签:
【中文标题】swift中的T.Type是啥【英文标题】:what is T.Type in swiftswift中的T.Type是什么 【发布时间】:2018-05-29 21:35:47 【问题描述】:当我使用JSONDecoder().decode()
时,谁能告诉我T.Type
是什么?
我认为这是对我编码的数据进行解码的类型。
很多例子都是这样使用上述方法的:
JSONEncoder().decode([People].self, from: data)
如果我检查该方法的定义,我可以看到 T.Type
。
我知道泛型,但T.Type
是什么?
T
和 T.Type
之间有什么区别?
当我们声明一些变量时,我们像这样分配它们的类型
var someValue: Int
,而不是var someValue: Int.self
T.Type
和 Type.self
到底是什么?
【问题讨论】:
Swift metatype (Type, self)的可能重复T.Type
是 metatype type 对应于 T
。
【参考方案1】:
T.Type
用于参数和约束中,表示“事物本身的类型,而不是事物的实例”。
例如:
class Example
static var staticVar: String return "Foo"
var instanceVar: String return "Bar"
func printVar(from example: Example)
print(example.instanceVar) // "Bar"
print(example.staticVar) // Doesn't compile, _Instances_ of Example don't have the property "staticVar"
func printVar(from example: Example.Type)
print(example.instanceVar) // Doesn't compile, the _Type_ Example doesn't have the property "instanceVar"
print(example.staticVar) // prints "Foo"
通过调用TheType.self
,在运行时可以获得对 Type 的 .Type
(Type 对象本身)的引用。语法TheType.Type
用于类型声明和类型签名,仅用于向编译器指示实例与类型的区别。例如,您实际上无法在运行时或通过调用Int.Type
在函数实现中获得对Int
类型的引用。你会打电话给Int.self
在示例代码var someValue: Int
中,具体的符号identifier: Type
(在本例中为someValue: Int
)意味着 someValue 将是一个实例诠释。如果您希望 someValue 是对实际类型 Int 的引用,您可以编写 var someValue: Int.Type = Int.self
请记住,.Type
表示法仅在向编译器声明类型和类型签名时使用,.self
属性在实际中使用在执行时检索对类型对象本身的引用的代码。
JSONDecoder().decode
需要T.Type
的参数(其中T
符合Decodable
)的原因是因为任何符合Decodable
的类型 都有一个初始化器init(from decoder: Decoder)
。 decode
方法需要在符合Decodable
的类型 上调用此init 方法,而不是在符合Decodable
的类型的实例 上。例如:
var someString: String = ""
someString.init(describing: 5) // Not possible, doesn't compile. Can't call an initializer on an _instance_ of String
var someStringType: String.Type = String.self
someStringType.init(describing: 5) // Iniitializes a String instance "5"
【讨论】:
感谢您的详细和出色的回答! 相关的 Apple 文档可以通过谷歌搜索“Swift Metatype Type”找到:developer.apple.com/library/content/documentation/Swift/…。 优秀的答案 很好的答案!谢谢!以上是关于swift中的T.Type是啥的主要内容,如果未能解决你的问题,请参考以下文章
Swift 中的 === 和 !== 是啥?和 JS 中的一样吗? [复制]