Swift元类型(类型,自身)
我试图理解:“Swift元类型(类型,自身),swift,Swift,我试图理解:“self,dynamicType,Type”。我有以下代码: class SomeClass {} let cls : SomeClass.Type = SomeClass.self let cls2 : SomeClass = SomeClass() cls和cls2是一回事吗 有人能提供一些关于差异的细节吗?谢谢不,cls和cls2是不同的东西。理解差异的最简单方法是如下扩展示例: class SomeClass { class func doIt() {
self,dynamicType,Type
”。我有以下代码:
class SomeClass {}
let cls : SomeClass.Type = SomeClass.self
let cls2 : SomeClass = SomeClass()
cls
和cls2
是一回事吗
有人能提供一些关于差异的细节吗?谢谢不,
cls
和cls2
是不同的东西。理解差异的最简单方法是如下扩展示例:
class SomeClass {
class func doIt() {
print("I'm a class method. I belong to my type.")
}
func doItOnlyIfInstanceOfThisType() {
print("I'm a instance method. I belong to my type instance.")
}
}
let myFunc :()->() = cls.doItOnlyIfInstanceOfThisType(cls2)
myFunc()
现在让我们看一下您的cls
:
let cls : SomeClass.Type = SomeClass.self
cls.doIt()
这将打印我是一个类方法。我属于我的类型。
。但您不能调用以下命令:
cls.doItOnlyIfInstanceOfThisType() // causes a compilation error, PRO TIP: actually you can use this method as a func property, but I'll add the explanation for this later
让我们看看你的cls2
。它唯一可见的方法是doitonlyifiinstanceofthitype
,因为它是(这种类型的)实例方法
因此,它们之间的区别在于cls
是一种类型,cls2
是这种类型的一个实例
let cls2 : SomeClass = SomeClass()
cls2.doItOnlyIfInstanceOfThisType()
更多了解为什么SomeClass.self和SomeClass()?
类的类型也存在于内存中(例如,它有自己的方法),作为表示该类型的单例(不是该类型的实例,这是不同的)。
如果对这样的SomeClass.self
类型调用self
,您将得到一个表示SomeClass
类型的单例实例
SomeClass()
调用SomeClass
的init()
方法,该方法是创建SomeClass
实例的构造函数
专业提示
您可以操作类型实例函数(如ObjC中的闭包/块)。这是一个生成的类方法。但您必须将此方法所属类型的实例作为参数传递,如下所示:
class SomeClass {
class func doIt() {
print("I'm a class method. I belong to my type.")
}
func doItOnlyIfInstanceOfThisType() {
print("I'm a instance method. I belong to my type instance.")
}
}
let myFunc :()->() = cls.doItOnlyIfInstanceOfThisType(cls2)
myFunc()
不,
cls
和cls2
是不同的东西。理解差异的最简单方法是如下扩展示例:
class SomeClass {
class func doIt() {
print("I'm a class method. I belong to my type.")
}
func doItOnlyIfInstanceOfThisType() {
print("I'm a instance method. I belong to my type instance.")
}
}
let myFunc :()->() = cls.doItOnlyIfInstanceOfThisType(cls2)
myFunc()
现在让我们看一下您的cls
:
let cls : SomeClass.Type = SomeClass.self
cls.doIt()
这将打印我是一个类方法。我属于我的类型。
。但您不能调用以下命令:
cls.doItOnlyIfInstanceOfThisType() // causes a compilation error, PRO TIP: actually you can use this method as a func property, but I'll add the explanation for this later
让我们看看你的cls2
。它唯一可见的方法是doitonlyifiinstanceofthitype
,因为它是(这种类型的)实例方法
因此,它们之间的区别在于cls
是一种类型,cls2
是这种类型的一个实例
let cls2 : SomeClass = SomeClass()
cls2.doItOnlyIfInstanceOfThisType()
更多了解为什么SomeClass.self和SomeClass()?
类的类型也存在于内存中(例如,它有自己的方法),作为表示该类型的单例(不是该类型的实例,这是不同的)。
如果对这样的SomeClass.self
类型调用self
,您将得到一个表示SomeClass
类型的单例实例
SomeClass()
调用SomeClass
的init()
方法,该方法是创建SomeClass
实例的构造函数
专业提示
您可以操作类型实例函数(如ObjC中的闭包/块)。这是一个生成的类方法。但您必须将此方法所属类型的实例作为参数传递,如下所示:
class SomeClass {
class func doIt() {
print("I'm a class method. I belong to my type.")
}
func doItOnlyIfInstanceOfThisType() {
print("I'm a instance method. I belong to my type instance.")
}
}
let myFunc :()->() = cls.doItOnlyIfInstanceOfThisType(cls2)
myFunc()
元类型是指任何类型的类型,包括类类型、结构类型、枚举类型和协议类型 可以使用后缀自表达式作为值访问类型。例如,
SomeClass.self
返回SomeClass
本身,不是SomeClass
的实例。和SomeProtocol.self
返回SomeProtocol
本身,而不是运行时符合SomeProtocol
的类型的实例。您可以对类型的实例使用dynamicType
表达式,以值的形式访问该实例的动态运行时类型,如下例所示:
class SomeBaseClass {
class func printClassName() {
print("SomeBaseClass")
}
}
class SomeSubClass: SomeBaseClass {
override class func printClassName() {
print("SomeSubClass")
}
}
let someInstance: SomeBaseClass = SomeSubClass()
someInstance.dynamicType.printClassName()
// prints "SomeSubClass"
someInstance的编译时类型是SomeBaseClass
,
someInstance
的运行时类型是SomeSubClass
您可以使用标识运算符(==和!==)来测试实例的运行时类型是否与其编译时类型相同
if someInstance.dynamicType === SomeBaseClass.self {
print("The dynamic type of someInstance is SomeBaseCass")
} else {
print("The dynamic type of someInstance isn't SomeBaseClass")
}
更多详细信息->Swift编程语言:
Swift 3.0:
.dynamicType
已弃用,您应使用类型(of:)
获取其元类型:
type(of: someInstance).printClassName()
元类型是指任何类型的类型,包括类类型、结构类型、枚举类型和协议类型 可以使用后缀自表达式作为值访问类型。例如,
SomeClass.self
返回SomeClass
本身,不是SomeClass
的实例。和SomeProtocol.self
返回SomeProtocol
本身,而不是运行时符合SomeProtocol
的类型的实例。您可以对类型的实例使用dynamicType
表达式,以值的形式访问该实例的动态运行时类型,如下例所示:
class SomeBaseClass {
class func printClassName() {
print("SomeBaseClass")
}
}
class SomeSubClass: SomeBaseClass {
override class func printClassName() {
print("SomeSubClass")
}
}
let someInstance: SomeBaseClass = SomeSubClass()
someInstance.dynamicType.printClassName()
// prints "SomeSubClass"
someInstance的编译时类型是SomeBaseClass
,
someInstance
的运行时类型是SomeSubClass
您可以使用标识运算符(==和!==)来测试实例的运行时类型是否与其编译时类型相同
if someInstance.dynamicType === SomeBaseClass.self {
print("The dynamic type of someInstance is SomeBaseCass")
} else {
print("The dynamic type of someInstance isn't SomeBaseClass")
}
更多详细信息->Swift编程语言:
Swift 3.0:
.dynamicType
已弃用,您应使用类型(of:)
获取其元类型:
type(of: someInstance).printClassName()
不,它们不一样:
cls
属于SomeClass.type
,而cls2
属于SomeClass
。只要尝试向类中添加一个属性,您就会注意到无法从cls
访问它,而您自然可以从cls2
访问它。在测试元类型比较时还要注意差异,SomeClass.self==cls
vsSomeClass.self==cls2.dynamicType
(两者都true
)。不,它们不是