Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift元类型(类型,自身)_Swift - Fatal编程技术网

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
vs
SomeClass.self==cls2.dynamicType
(两者都
true
)。不,它们不是