这儿每天分享一个 iOS 的新知识,快来重视我吧

喜欢我可以帮我投个票哦

前言

在 Swift 中,最常用的类型包含类(Class)、结构体(Struct)和枚举(Enum)。在声明类办法时,既可以用 static 又可以用 class。在本篇文章中,咱们将深入评论 classstatic 的差异,并经过实例代码来提醒他们的特性和运用办法。

class 和 static 在类中的运用

首要,让咱们了解一下 classstatic 这两个要害字。

class 要害字用于界说类办法,这些办法只能由类自身调用,不能被类的实例调用class 界说的类办法可以被子类掩盖。

static 要害字用于界说静态办法同样,这些办法只能由类自身调用,不能被类的实例调用static 界说的静态办法不能被子类掩盖。

下面,咱们经过一些代码示例来看看这两个要害字在实际运用中的差异。

classMyClass{
classfuncclassMethod(){
print("classMethodinMyClass")
}

staticfuncstaticMethod(){
print("staticMethodinMyClass")
}
}
classMySubClass:MyClass{
overrideclassfuncclassMethod(){
print("classMethodinMySubClass")
}

//这儿会报错,由于静态办法不能被掩盖
//overridestaticfuncstaticMethod(){}
}

在上面的代码中,MyClass 界说了两个办法:classMethodstaticMethodclassMethod 运用 class 要害字界说,staticMethod 运用 static 要害字界说。然后,咱们创立了一个 MyClass 的子类 MySubClass,在这个子类中,咱们企图掩盖这两个办法。

成果发现,classMethod 可以被 MySubClass 成功掩盖,而 staticMethod 无法被掩盖,由于 static 界说的办法不能被子类掩盖。

下面,咱们来看看这两个办法怎么被调用。

MyClass.classMethod()//输出"classMethodinMyClass"
MyClass.staticMethod()//输出"staticMethodinMyClass"
MySubClass.classMethod()//输出"classMethodinMySubClass"
MySubClass.staticMethod()//输出"staticMethodinMyClass"

可以看到,classMethodstaticMethod 都可以经过类名来调用。由于 MySubClass 掩盖了 classMethod,所以 MySubClass.classMethod() 调用的是 MySubClass 中的 classMethod。而 MySubClass.staticMethod() 调用的仍然是 MyClass 中的 staticMethod,由于 staticMethod 不能被掩盖。

在结构体和枚举中的运用

Objective-C 中,只能为类界说类型办法。在 Swift 中,您可以为所有类、结构和枚举界说类型办法。

不同的是,在结构体(struct)和枚举(enum)这两种类型中,class 要害字是无法运用的,只能运用 static 要害字来界说类型办法。

static 要害字用于 structenum 中时,它的效果与在 class 中一样,界说的办法是属于类型自身的,可以直接经过类型名来调用,而无需创立该类型的实例。其实,structenum 本质上都是值类型,它们的办法默许便是不能被子类或者子类型掩盖的(不能承继),所以这儿 static 要害字只要一个效果,便是界说类型办法。

structMyStruct{
staticfuncstaticMethod(){
print("staticMethodinMyStruct")
}
}
enumMyEnum{
staticfuncstaticMethod(){
print("staticMethodinMyEnum")
}
}
MyStruct.staticMethod()//输出"staticMethodinMyStruct"
MyEnum.staticMethod()//输出"staticMethodinMyEnum"

在上面的代码中,咱们界说了一个结构体 MyStruct 和一个枚举 MyEnum,并在这两个类型中都界说了一个静态办法 staticMethod。然后,咱们可以经过类型名来调用这些静态办法。

为什么这么规划

classstatic 在 Swift 中的规划,首要是为了供给两种不同的类办法。从规划视点来看,这两种要害字的差异首要在于它们的承继行为,即 class 界说的办法可以被子类掩盖,而 static 界说的办法不能被子类掩盖。这样的规划可以供给更大的灵活性,让开发者可以根据需要选择适宜的办法类型。

从原理和底层完成来看,classstatic 的差异首要体现在它们的办法调用机制上。class 界说的类办法是经过动态派发的方式来调用的,也便是说,当你调用一个类办法时,Swift 会在运行时查找并调用正确的办法。而 static 界说的静态办法是经过静态派发的方式来调用的,也便是说,当你调用一个静态办法时,Swift 会在编译时就确定这个办法的调用。

这儿每天分享一个 iOS 的新知识,快来重视我吧

本文同步自微信公众号 “iOS新知”,每天准时分享一个新知识,这儿仅仅同步,想要及时学到就来重视我吧!