Swift中属性的声明与作用

一、引言

属性将值与类,结构体,枚举进行关联。Swift中的属性分为存储属性和计算属性两种,存储属性用于存储一个值,其只能用于类与结构体,计算属性用于计算一个值,其可以用于类,结构体和枚举。

二、存储属性

存储属性使用变量或者常量来存储一个值,在声明存储属性时,可以为其设置一个默认值,也可以在构造示例是进行值的设置,属性可以通过点语法来访问,结构体的存储属性示例代码如下:

struct MyStruct {  var property1 = 1  var property2:Int}var obj = MyStruct(property1: 1, property2: 2)//通过点语法进行属性的访问print(obj.property1,obj.property2)

登录后复制

如上结构体,如果有属性被声明成let常量,则此属性不能够被修改。还有一点需要注意,如果在创建结构体的实例时,使用的是let进行创建,则即便结构体中的属性是变量也不可进行修改。这和类有很大区别。

还有一类存储属性叫做延时存储属性,可以设想一下这样的情形,类的某些属性可能并不是在每次类实例后都会用到,并且有些属性的构造可能会消耗大量的时间,这时一个比较聪明的设计便是在类进行实例化时,这类属性并不被构造,当次类的实例使用到这个属性时,这个属性才被构造出来,这样的属性被称为延时存储属性,使用lazy关键字来声明,示例如下:

//第一个类class MyClass1 {  init(){    print("MyClass1类被构造")  }}class MyClass2 {  //声明为延时存储属性  lazy var body = MyClass1()}//在构造MyClass2时 并不会进行body属性的构造 不会有打印信息var obj2 = MyClass2()//执行下面代码后 会有打印信息 使用body属性使得body被构造obj2.body

登录后复制

注意,如果在多个线程中对延时构造属性进行使用,不能保证其只被构造一次。

三、计算属性

简单的理解,计算属性并不是独立的用于存储值的属性,开发者甚至可以将其理解为一个计算方法,其主要用于通过计算来获取或者设置其他存储属性的值。示例如下:

struct Circle {  //圆心  var center:(Double,Double)  //半径  var r:Double  //周长 将其作为计算属性  var l:Double{    get{      //计算圆的周长      return 2.0*r*M_PI    }    set{      //通过周长重新计算半径 默认传入的参数名为newValue      r = newValue/(M_PI*2)    }  }}var circle = Circle(center: (0,0), r: 2)print(circle.l)circle.l=24print(circle.r)

登录后复制

通过上面的演示代码可以了解,l属性并非是一个新的属性,只是通过r属性来计算出l,或者通过l来反推出r,其中有一点需要注意,计算属性中可以创建两个代码块set和get,set代码块是可选的,其中会默认生成一个newValue参数来传递外界传进来的数据,get代码块是必须要实现的,当然也可以只实现get代码块,这时这个属性将是只读的计算属性,只可以获取,不能够设置。还有一点需要注意,开发者也可以在set代码块后面自定义一个参数名来接收外界传入的参数,示例如下:

struct Circle {  //圆心  var center:(Double,Double)  //半径  var r:Double  //周长 将其作为计算属性  var l:Double{    get{      //计算圆的周长      return 2.0*r*M_PI    }    set(newL){      //通过周长重新计算半径 默认传入的参数名为newValue      r = newL/(M_PI*2)    }  }}

登录后复制

只读的计算属性可以进行进一步的简写,因为没有了set代码块,所以关键字get和括号也可以给省略掉,不会产生歧义,示例如下:

struct Point {  var x:Double  var y:Double  var center:(Double,Double){    return (x/2,y/2)  }}

登录后复制

四、属性监听器

Swift中的计算属性中的get和set方法和Objective-C中的get和set方法其实并非是一回事,Objective-C提供set和get方法可以让开发者在属性将要获取或者设置的时候来进行一些自定义的操作,这部分的开发需求在Swift中通过属性监听器来实现。

属性监听器有willSet和didSet两种,willSet在属性值将要变化时执行,didSet在属性值已经变化时执行,并且其中会传入变化前后的值。示例如下:

struct Point {  var x:Double  var y:Double{    willSet{      print("将要进行值的更新设置,新的值是:",newValue)    }    didSet{      print("已经进行值得更新设置,旧的值是:",oldValue)    }  }  var center:(Double,Double){    return (x/2,y/2)  }}var point = Point(x: 3, y: 3)//将打印/* 将要进行值的更新设置,新的值是: 4.0 已经进行值得更新设置,旧的值是: 3.0 */point.y=4

登录后复制

willSet中默认会生成一个命名为newValue的参数,didSet中会默认生成一个命名为oldValue的参数,也可以自定义这些参数的命名,示例如下:

struct Point {  var x:Double  var y:Double{    willSet(new){      print("将要进行值的更新设置,新的值是:",new)    }    didSet(old){      print("已经进行值得更新设置,旧的值是:",old)    }  }  var center:(Double,Double){    return (x/2,y/2)  }}

登录后复制

五、实例属性与类型属性

实例属性是针对与一个类型的实例,类型属性则是直接针对与类型。  每对类型进行一次实例化,其实例都有一套独立的实例属性,而类型属性则是类的所有实例所共用的,在Objective-C中,通常使用全局的属性来实现这样的效果,在Swift中,使用static关键字来声明类型属性,示例如下:

struct Point {  //类型存储属性  static var name:String = "Point"  //类型计算属性  static var subName:String{    return "sub"+name  }  var x:Double  var y:Double{    willSet(new){      print("将要进行值的更新设置,新的值是:",new)    }    didSet(old){      print("已经进行值得更新设置,旧的值是:",old)    }  }  var center:(Double,Double){    return (x/2,y/2)  }}//类型属性 通过类型点语法来获取print(Point.name,Point.subName)

登录后复制

注意,有一种特殊的情况是针对于类的类型计算属性,如果其需要子类进行继承重写,需要将static关键字,换成class关键字,示例如下:

class SomeClass {  static var storedTypeProperty = "Some value."  static var computedTypeProperty: Int {    return 27  }  //支持子类进行重写的计算属性  class var overrideableComputedTypeProperty: Int {    return 107  }}

登录后复制

更多Swift中属性的声明与作用相关文章请关注PHP中文网!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2278529.html

(0)
上一篇 2025年2月27日 16:50:44
下一篇 2025年2月23日 00:03:32

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • Python的四个挑战者:Swift、Go、Julia、R

      没什么是永恒的——包括编程语言。很多看起来可能是将来的佼佼者,到头来可能被人们遗忘。无论是因为不可抗拒的原因,还是因为自身发展的原因。   Python时下正在“最热门的编程语言榜”上春风得意,看起来将会成为一门不朽的语言。但是现在,很…

    2025年2月27日
    200
  • 简单了解python私有公有属性

    python中,类内方法外的变量叫属性,类内方法内的变量叫字段。他们的私有公有访问方法类似。 class C:    __name=”私有属性”    def func(self):        print(C.__name)class …

    编程技术 2025年2月27日
    100
  • 有关类的公有属性的介绍

    一、概念   我们前面提到类的私有属性,也就是类中不能直接访问的。但是不是可以直接访问的属性就是公有属性呢?其实也不是。在__init__()构造函数中的属性,对外基本都可以访问,但是他们并不是公有属性。那什么叫公有属性呢?   定义: 指…

    2025年2月27日
    200
  • Python中关于复数属性以及方法运算的示例

    这篇文章主要介绍了python复数属性和方法运算操作,结合实例形式分析了python复数运算相关操作技巧,代码注释备有详尽说明,需要的朋友可以参考下 本文实例讲述了Python复数属性和方法运算操作。分享给大家供大家参考,具体如下: #co…

    2025年2月27日
    200
  • python实现对实例属性进行类型检查

    本文主要为大家详细介绍了python如何对实例属性进行类型检查,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能帮助到大家。 案例: 在某项目中,我们实现了一些类,并希望能像静态语言那样对他们的实例属性进行类型检查         …

    编程技术 2025年2月27日
    200
  • 详解Python中的动态属性和特性_python

    本篇文章主要介绍了详解python中的动态属性和特性,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧 导语:本文章记录了本人在学习Python基础之元编程篇的重点知识及个人心得,打算入门Python的朋友们可以来…

    编程技术 2025年2月27日
    200
  • Python面向对象之实例属性和类属性

    本篇文章给大家分享的内容是关于Python面向对象之实例属性和类属性 ,有着一定的参考价值,有需要的朋友可以参考一下 由于python是动态语言,根据类创建实例可以任意绑定属性。 给实例绑定属性的方法是通过实例变量,或者通过self变量: …

    编程技术 2025年2月27日
    200
  • 使用Python和Swift构建移动应用程序的最佳实践

    在当今移动应用日益普及的时代,python和swift成为了最受欢迎的编程语言之一。虽然这两种语言独立的应用场景各不相同,但它们在架构和设计移动应用程序方面的最佳实践有着共同之处。 Python作为一种高级编程语言,具有直观、快速和易于学习…

    编程技术 2025年2月26日
    200
  • 如何在Python中获取整数字面量属性而不是SyntaxError?

    to get int literal attribute instead of syntaxerror, use a space or parenthesis. the int literal is a part if numeric li…

    2025年2月26日
    200
  • 使用Python的vars()函数获取对象的属性和方法

    使用Python的vars()函数获取对象的属性和方法 在Python中,vars()函数是一个非常有用的内置函数,它可以帮助我们获取一个对象的所有属性和方法。本文将介绍vars()函数的用法,并给出一些代码示例来说明它的用途和优势。 首先…

    2025年2月26日
    200

发表回复

登录后才能评论