元类型之间有什么区别。键入
和。Swift中的self
?
做. Self
和。类型
返回一个结构
?
我知道. Self
可以用来检查DynamicType
。你如何使用。类型
?
它们在句法上出现在不同的地方。
在语法上必须指定类型的地方,Type是一个有效的类型,对应于类型是元类型(类的元类)。
在一个语法上必须编写表达式的地方,Something。self
是一个有效的表达式。这是一个类型的表达式。类型
,值是表示类型某物的对象(“类对象”)<代码>什么。类型不是有效的表达式语法。
首先也是最重要的一点,请参见苹果文档的type(of:)
函数签名很有趣:
func type<T, Metatype>(of value: T) -> Metatype
在哪里使用?
如果您正在编写/创建接受类型的函数,例如UIView。键入
,而不是实例,例如,UIView()
,然后将T.Type
作为参数的类型写入。它所期望的参数可以是:String。self
,自定义表格视图。self
,其他类。self
。
通常,需要类型的函数是为您实例化对象的函数。我可以想出两个很好的例子:
tableView.register(CustomTableViewCell.self, forCellReuseIdentifier: "CustomTableViewCell")
请注意,您传递了CustomTableViewCell.self
。如果稍后您尝试退出类型为CustomTableViewCell
的tableView,但没有注册CustomTableViewCell
类型,那么它将崩溃,因为tableView没有退出/实例化任何CustomTableViewCell
类型的tableviewcell。
struct GroceryProduct: Codable {
var name: String
var points: Int
var description: String?
}
let json = """
{
"name": "Durian",
"points": 600,
"description": "A fruit with a distinctive scent."
}
""".data(using: .utf8)!
let decoder = JSONDecoder()
let product = try decoder.decode(GroceryProduct.self, from: json)
print(product.name)
注意尝试decoder.decode(GroceryProduct.self,来自:json)
。因为您传递了GroceryProduct.self
,所以它知道需要实例化类型为GroceryProducts
的对象。如果不能,那么它会抛出一个错误。有关JSONDecoder的更多信息,请参阅这个写得很好的答案
有关内部结构及其工作原理的更多信息:
类、结构或枚举类型的元类型是该类型的名称后跟。类型协议类型的元类型(不是在运行时符合协议的具体类型)是该协议的名称,后跟。协议例如,类类型SomeClass
的元类型是SomeClass。类型
和协议的元类型SomeProtocol
是SomeProtocol。协议
。
来自Apple:metaType
发动机罩下AnyClass
为
typealias AnyClass = AnyObject.Type // which is why you see T.Type
基本上,无论你在哪里看到AnyClass
,Any。键入
,任何对象。类型
,因为它需要一个类型。当我们想使用register
func为tableView注册一个类时,我们会看到一个非常常见的地方。
func register(_ cellClass: Swift.AnyClass?, forCellReuseIdentifier identifier: String)
如果您不清楚“Swift”是什么意思执行上述操作,然后查看此处的评论
上述内容也可以写成:
func register(_ cellClass: AnyObject.Type, forCellReuseIdentifier identifier: String)
可以使用后缀自表达式以值的形式访问类型。例如,某些lass.self返回某些类本身,而不是某个类的实例。而且rotocol.self返回的是某些协议本身,而不是在运行时符合某些协议的类型的实例。您可以将type(of:)
表达式与类型的实例一起使用,以作为值访问该实例的动态运行时类型,如以下示例所示:
来自Apple:metaType
游乐场代码:
简单的例子
struct Something {
var x = 5
}
let a = Something()
type(of:a) == Something.self // true
艰难的例子
class BaseClass {
class func printClassName() {
print("BaseClass")
}
}
class SubClass: BaseClass {
override class func printClassName() {
print("SubClass")
}
}
let someInstance: BaseClass = SubClass()
/* | |
compileTime Runtime
| |
To extract, use: .self type(of)
Check the runtime type of someInstance use `type(of:)`: */
print(type(of: someInstance) == SubClass.self) // True
print(type(of: someInstance) == BaseClass.self) // False
/* Check the compile time type of someInstance use `is`: */
print(someInstance is SubClass) // True
print(someInstance is BaseClass) // True
我强烈建议阅读类型上的苹果留档。也看到这里
下面是一个简单的例子:
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
假设每个实体由两个东西表示:
>
元类型:#实体名称#。类型
元类型是指任何类型的类型,包括类类型、结构类型、枚举类型和协议类型。
来源。
您可以很快注意到,这是递归的,并且可以通过((T.Type))之类的类型执行。类型)。类型)
等。
。Type
返回元类型的实例。
有两种方法可以获取元类型的实例:
>
在一个具体类型上调用. Self
,如Int.self
,这将创建一个静态元类型实例Int。类型
。
从任何实例通过type(of:某物实例)
获取动态元类型实例。
危险区域:
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
。协议
是另一种仅存在于协议上下文中的元类型。也就是说,我们无法表达我们只想要P.Type
。这会阻止所有通用算法使用协议元类型,并可能导致运行时崩溃。
对于更多好奇的人:
由于不一致性,类型(of:)
函数实际上由编译器处理。协议创建。
// 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中有什么区别? 这样做并返回一个? 我了解可以用来进行检查。你怎么用? 问题答案: 这是一个简单的示例: 假设每个实体由两件事表示: 类型: 元类型: 元类型类型是指任何类型的类型,包括类类型,结构类型,枚举类型和协议类型。 资源。 您会很快注意到这是递归的,并且可以通过诸如此类的类型来实现。 返回一个元类型的实例。 我们可以通过两种方式获取元类型的实例: 调用一个像
问题内容: 我试图了解:“ ”。我有这个代码: 是和同一件事吗? 有人可以提供一些有关差异的细节吗?谢谢 问题答案: 没有,并且是不同的东西。理解差异的最简单方法是像这样扩展您的示例: 现在让您开始: 那将打印。但是您不能调用此: 让我们来吧。它唯一可见的方法是因为它是一个实例方法(这种类型)。 因此,它们之间的区别在于这是一个类型,并且是该类型的实例。 有关为何SomeClass.self和So
这个问题是在泛型关联类型在Rust中可用之前提出的,尽管它们是被提出和开发的。 我的理解是,特征泛型和关联类型在它们可以绑定到结构的类型数量上有所不同。 关联类型仅绑定1个类型: 泛型关联类型是这两种类型的混合。它们绑定到一个类型,正好有一个关联的生成器,而生成器又可以关联任何数量的类型。那么前面示例中的和这个泛型关联类型有什么区别呢?
问题内容: 它们有何不同?我有点困惑,因为它们似乎是相似的概念。 了解它们如何帮助优化编译时间? 问题答案: 从Swift自己的文档中: 类型安全 Swift是一种类型安全的语言。类型安全的语言鼓励您清楚代码可以使用的值的类型。 如果代码的一部分需要一个String,则不能错误地将其传递给Int。 类型推断 如果您 未 指定所需的值类型,则Swift会使用类型推断来得出适当的类型。通过类型推断,编
问题内容: 您能否帮助您理解本机int类型与numpy.int32或numpy.int64类型之间的主要区别(如果有)? 问题答案: 观察差异的另一种方法是询问两种对象有什么方法。 在Ipython中,我可以使用tab complete来查看方法: 方法和属性: “经营者” 方法和属性(或属性)。一些相同,但更多的是,基本上所有的: 该方法看起来很像的。他们可以做同样的数学。 在很多方面与0d数组