加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Swift开发必备技巧:static和class的使用

发布时间:2020-12-14 02:42:48 所属栏目:百科 来源:网络整理
导读:Swift中表示 “类型范围作用域” 这一概念有两个不同的关键字,它们分别是static和class。这两个关键字确实都表达了这个意思,但是在其他一些语言,包括Objective-C中,我们并不会特别地区分类变量/类方法和静态变量/静态函数。但是在Swift中,这两个关键字

Swift中表示 “类型范围作用域” 这一概念有两个不同的关键字,它们分别是static和class。这两个关键字确实都表达了这个意思,但是在其他一些语言,包括Objective-C中,我们并不会特别地区分类变量/类方法和静态变量/静态函数。但是在Swift中,这两个关键字却是不能用混的。

在非class的类型上下文中,我们统一使用static来描述类型作用域。这包括在enum和struct中表述类型方法和类型属性时。在这两个值类型中,我们可以在类型范围内声明并使用存储属性,计算属性和方法。static适用的场景有这些:

[cpp] view plain copy
  1. structPoint{
  2. letx:Double
  3. lety:Double
  4. //存储属性
  5. staticletzero=Point(x:0,y:0)
  6. //计算属性
  7. staticvarones:[Point]{
  8. return[Point(x:1,y:1),
  9. Point(x:-1,
  10. Point(x:1,y:-1),
  11. }
  12. //类型方法
  13. staticfuncadd(p1:Point,p2:Point)->Point{
  14. returnPoint(x:p1.x+p2.x,y:p1.y+p2.y)
  15. }

enum的情况与这个十分类似,就不再列举了。

class关键字相比起来就明白许多,是专门用在class类型的上下文中的,可以用来修饰类方法以及类的计算属性。要特别注意class中现在是不能出现存储属性的,我们如果写类似这样的代码的话:

    classMyClass{
  1. classvarbar:Bar?
  2. 编译时会得到一个错误:

    class variables not yet supported

    这主要是因为在Objective-C中就没有类变量这个概念,为了运行时的统一和兼容,暂时不太方便添加这个特性。Apple表示今后将会考虑在某个升级版本中实装class类型的类存储变量,现在的话,我们只能在class中用class关键字声明方法和计算属性。

    有一个比较特殊的是protocol。在Swift中class、struct和enum都是可以实现protocol的。那么如果我们想在protocol里定义一个类型域上的方法或者计算属性的话,应该用哪个关键字呢?答案是使用class进行定义,但是在实现时还是按照上面的规则:在class里使用class关键字,而在struct或enum中仍然使用static——虽然在protocol中定义时使用的是class:

      protocolMyProtocol{
    1. classfuncfoo()->String
    2. }
    3. structMyStruct:MyProtocol{
    4. staticfuncfoo()->String{
    5. return"MyStruct"
    6. enumMyEnum:MyProtocol{
    7. staticfuncfoo()->String{
    8. "MyEnum"
    9. classMyClass:MyProtocol{
    10. classfuncfoo()->String{
    11. "MyClass"
    12. }

    (编辑:李大同)

    【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读