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

Swift类与结构、存储属性、计算属性、函数与方法、附属脚本等

发布时间:2020-12-14 06:43:23 所属栏目:百科 来源:网络整理
导读:一、类与结构体 两者在Swift中差不了多少了 类与结构体有很多相同的地方 : ( 第 2,3 点是其他语言中不存在的 ) 1) 都可以定义属性 / 方法 / 下标 ( 结构体也可以定义方法了 ) 2) 都能初始化 ( 通过构造方法 ) 3) 都能使用扩展 (extension) 与协议 (protocol)

一、类与结构体

两者在Swift中差不了多少了

类与结构体有很多相同的地方: (2,3点是其他语言中不存在的)

1)都可以定义属性/方法/下标(结构体也可以定义方法了)

2)都能初始化(通过构造方法)

3)都能使用扩展(extension)与协议(protocol)

4)类与结构体(枚举)中的全局属性/方法:在类中用class关键字,但在结构体中用static


类比结构体多的功能:

1)能继承

2)运行时能检查类对象的类型

3)析构释放资源

4)引用计数允许一个类实例有多个引用

[java] view plain copy
  1. classPerson1{
  2. varname="jack"
  3. //classvarheight:Int=10//错误!类中不能有全局存储属性的,只能是计算属性.见下文说明
  4. }
  5. structPerson2{//结构体更像Java中的类
  6. varage:Int
  7. //staticvarheight:Int=10//可以设定全局属性,需要初始化.
  8. }
  9. //1.1实例化类与结构,默认构造器
  10. letp1=Person1()
  11. letp2=Person2(age:10)//当使用默认构造器时,必须初始化里面所有的属性


二、属性(存储属性--计算属性--类属性)

2.1存储属性:就是存储一个常量或变量,类似Java中的成员变量

copy
    classPerson3{
  1. varname:String="xuneng"//需要手动初始化
  2. varage:Int=10
  3. letheight=175
  4. lazyvarp1:Person1=Person1()//延迟,必须是var
  5. varp3=Person3()
  6. p3.name//通过点语法来访问
  7. p3.age=11//设置
  8. //延迟lazy存储属性:当使用改属性时才进行初始化,好处是避免空间浪费
  9. println(p3.p1)//这句调用时,p1才进行初始化

2.2计算属性:不直接存储值,而是用get/set来做.可用来操作其他属性值的变化

get:,用来封装取值的过程

set:,用来封装设值的过程

copy

classPerson4{
  • varname:String="jack"
  • varjjLength:Int= varage:Int{//只能是var
  • get{
  • returnjjLength*2
  • set(newAge){
  • jjLength=newAge/2
  • varp4=Person4()
  • p4.age=10//当设age为10时,jjLength变为5

  • 2.2.1简便的计算属性写法

    copy
    //默认参数newValue,表示新赋给的值
  • classPerson5{
  • //用newValue
  • varjjLength:Int=10
  • varage:Int{//只能是var
  • get{
  • set{
  • jjLength=newValue///只读计算属性
  • varheight:Int{
  • 4
  • varheight2:Int{//只读直接可以省略get
  • 4
  • varp5=Person5()
  • p5.height
  • //p5.height=10//只读的不能赋值


  • 2.2.2注意计算属性的死循环情况

    计算属性的值是不固定的,因此不能用let修饰,只能用var

    计算属性不能直接赋值

    set和get 是针对 计算变量(Calculated property ) 是不可以赋值的 普通的存储变量(storage property)才是可以赋值的

    对属性赋值进行监视最好就是用willSet{ }

    copy

    classPerson6{
  • //用newValue
  • //varheight2:Int=10{//不能直接赋值,否则成存储属性了
  • //returnjjLength*4
  • //}
  • varage:Int{
  • returnage//死循环.age会调用get方法
  • age=newValue//死循环.age设值时会调用set方法
  • }

  • 只读计算属性

    只有 getter 没有 setter 的计算属性就是只读计算属性。只读计算属性总是返回一个值,可以通过点运算符访问,但不能设置新的值。
    注意:必须使用var关键字定义计算属性,包括只读计算属性,因为他们的值不是固定的。let关键字只用来声明常量属性,表示初始化后再也无法修改的值。
    只读计算属性的声明可以去掉get关键字和花括号:
       
       
    1. struct Cuboid {
    2. var width = 0.0,height = 0.0,depth = 0.0
    3. var volume: Double {
    4. return width * height * depth
    5. }
    6. }
    7. let fourByFiveByTwo = Cuboid(width: 4.0,height: 5.0,depth: 2.0)
    8. println("the volume of fourByFiveByTwo is (fourByFiveByTwo.volume)")
    9. // 输出 "the volume of fourByFiveByTwo is 40.0"
    这个例子定义了一个名为Cuboid的结构体,表示三维空间的立方体,包含width、height和depth属性,还有一个名为volume的只读计算属性用来返回立方体的体积。设置volume的值毫无意义,因为通过width、height和depth就能算出volume。然而,Cuboid提供一个只读计算属性来让外部用户直接获取体积是很有用的。


    2.3类属性(或者叫做类型属性)class关键字修饰.类属性只能是计算属性.

    类属性就是类似javastatic修饰的属性.一个类只有一份,且多个实例对象共享.可直接用类名调用

    copy
    classPerson7{
  • classvarname:String{
  • return"xuneng"
  • Person7.name

  • 2.4属性监视器:可用来监视属性变化的2个方法willSet,didSet

    计算属性因为有getset方法,因此监视器其实对计算属性没多大用处.对存储属性用处大

    初始化值时,不会调用willSetdidSet

    willSet,didSetset,get不能共存

    copy

    classPerson8{
  • varname:String="xuneng"{
  • willSet{
  • println("新值为:(newValue)")//newValue新值
  • didSet{
  • println("新值为:(oldValue)")//oldValue表示旧值
  • varp8=Person8()
  • p8.name="jack"//这句调用

  • 三、函数与方法

    3.1对象方法

    类中的方法与函数的一点区别:方法的第一个参数以后,全是外部参数.名字即为参数名

    copy
    classPerson9{
  • funcsum(num1:Int,num2:Int){
  • println(num1+num2)
  • varp9=Person9()
  • p9.sum(10,num2://第一个参数以后,全是外部参数.相当于加了#

  • 3.2类方法.class修饰

    copy

    classPerson10{
  • classfuncsum(num1:Int,num2:Int){
  • Person10.sum(10)

  • 3.3 selfsuper,OC相同

    copy
    classPerson11{
  • self.fun()//对象方法调用对象方法,类方法调用类方法
  • funcfun(){
  • println("hello")
  • }

  • 四、下标(附属脚本) 下标,有的叫附属脚本(subscript), 新东西。

    可以定义在/结构体/枚举中进行快速访问。

    copy
    //格式:也可以设定set/get
  • /*
  • subscript(index:Int)->Int{
  • get{
  • }
  • set{
  • }
  • */

  • copy
    structPerson12{//官方很多用的结构体
  • letjjLength:Int//结构体在这里可以不初始化
  • subscript(index:Int)->Int{
  • returnjjLength*index
  • varp12=Person12(jjLength:10)
  • p12[3]//直接像访问数组一样访问.根据jj长度,index为3,值为30
  • (编辑:李大同)

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

      推荐文章
        热点阅读