• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

10结构体和类-——《Swift3.0从入门到出家》

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

Swift中的面向对象5个要素:枚举、结构体、类、协议、扩展

面向对象研究的是对象,完成一件事情需要多个对象参与,是生活的映射

 

Swift中结构体和类非常相似,也就是结构体能完成类的所有功能。结构体是值类型,类是引用类型

 

结构体定义格式:

struct  结构体名称{

成员变量(数据类型定义的变量)—属性

成员方法(函数)     —行为

}

结构体的成员变量不要求初始化

如果结构体的成员变量赋初值,编译器会自动生成一个不带参数的构造器,原有的之一构造器还可以继续使用

结构体自动提供了逐一构造器init,对对象或者实例的所有属性赋值

结构体中的成员方法不能直接修改成员变量的值,如果修改成员变量的值,需要使用关键字mutating修饰该成员方法

 

重点:

1、通过实例或者对象调用的方法称为实例方法

2、类方法只能用类型名称(结构体类型名/类名)调用

3、static或者class修饰的函数,称其为类方法,class修饰函数只能类中使用

4、结构体实例方法可以直接访问结构体的成员变量

5、结构体的类方法默认不能访问结构体中的成员变量

6、实例方法可以直接调用其他实例方法,调用类方法可以直接使用类名调用

7、类方法中可以直接调用其他类方法,不能直接调用实例方法

 

init构造器

1、如果自定义的构造方法和系统提供的构造方法同名,系统的构造方法被替代

2、构造器中用self关键字对成员变量进行初始化,谁调用了该方法,self就相当于谁

 

10 类

类的定义格式:

class 类名{

成员变量

成员方法

}

Swift中的类没有统一的父类

 

类中的成员变量必须初始化,可以直接在定义变量的时候赋值,也可以自定义构造 方法赋值,如果自定义了构造方法,无论和系统提供的构造方法是否相同,系统提供的构造方法就不能再使用了

 

类中实例方法可以直接修改类中的成员变量

 

类提供的构造方法是没有参数的

 

类是引用类型,而结构体是值类型

类可以被继承,结构体不能被继承

 

与值类型不同,引用类型在被赋予到一个变量、常量或者被传递到一个函数时,操作的并不是其拷贝

 

*一个类可以被定义成多个常量,定义了常量后,其数值不会再发生改变,没一次创建一个常量,修改的是后台类的值

 

 

可失败构造器 --- 可以类中定义可以在结构体中定义

    当使用构造器创建对象时 可以向构造器传递的形参无效 或者在构造器中使用函数外部的资源缺失 就会造成创建对象失败 如果创建对象失败 调用任何实例方法都会崩溃 为了解决崩溃问题 使用可失败构造器 将崩溃的结果变成nil

     init? 创建的对象可能存在nil 所以当对象创建成功 需要强制解析

     init! 创建的对象相当于使用了隐式解析 使用隐式解析或者强制解析的前提条件 确保对象真实存在

 

    

可失败构造器 必须在满足某个条件的情况下 才调用return nil的语句 证明对象创建失败

注意】定义的可失败的构造器 一定不能和非可失败的构造器参数名称相同 类型相同 参数个数相同

例子:

    init?(name: String) {//可失败构造器,可能有这个属性,也可能没这个属性

        if name.isEmpty {

            return nil

        }

        self.name = name

        self.age = 10

        self.height = 1.0

    }

    

    func study() -> Void {

        print("正在写代码")

    }

}

var stu1 = Student.init(姓名: "韩梅梅", 年龄: 10, 身高: 1.20)

stu1.study()

var stu2 = Student.init()

stu2.study()

 

var stu3 = Student.init(name: "")

print(stu3)

stu3?.study()

 

 

/************【类和结构体的选择】************

 在你的代码中,可以使用类和结构体来的自定义数据类型

 矜持

 结构体总是通过值传递 类实例总是通过引用传递,意味着两者适用不同的任务

 

 

 按照通用的准则,当符合一条或者多条以下条件时,请考虑使用  构建结构体

 

 

    <1>结构体的主要目的是用来盛装少量相关简单数据值

    <2>有理由预计一个结构体实例在赋值或者传递时,封装的数据将会被拷贝而不是被引用

    <3>任何在结构体中储存的值类型属性,也将会被拷贝,而不是被引用

    <4>结构体不需要去继承另一个已存在类型的属性或行为

 

 

合适的结构体候选者包括:

 

    <1>几何形状的大小,封装一个width属性和height属性,两者均为Double类型

    <2>一定范围内的路径,封装一个start属性和length属性,两者均为Int类型

    三维坐标系内一点,封装x,y和z的属性,三者均为Double类型

 

 

属性观察者

 

属性观察者是用来观察属性变化前和变化后的值

 

 willSet(newValue)willSet方法在被观察的属性将要发生变化时调用该方法 该方法默认携带一个参数newValue 表示属性的新值

 didSet(oldValue)didSet方法在被观察的属性已经变化之后调用该方法 这个方法也携带一个默认参数oldValue 表示属性的旧值

 

OC语言中KVO原理相同

 

class Person {

    //一个属性带有一个观察者

    var age = 1 {   

        willSet {

            //观察属性将要变化的值

            print("预祝你\(newValue)岁生日快乐????")

        

        }

        didSet {

            //观察属性变化以后的值

            print("恭喜你从\(oldValue)岁到\(age)")

        }

    }

    //改变age的值

    func happyBirthday() -> Void {

        age += 1

    }

}

 

var xiaoPerson = Person.init()

 

for i in 1...6 {

    xiaoPerson.happyBirthday()

}

 

<练习>游戏公司观察16月份游戏的下载量 如果当月游戏下载量超过10 工资翻倍

struct gameDownLoadNum {

    

    var downLoadNum = 0 {

    

        willSet {

            

            print("本月的游戏下载量将要到达\(newValue)万次")

        }

        didSet {

            

            print("上个月的下载量为\(oldValue)万次 本月的下载量为\(downLoadNum)万次,请注意查看")

            if downLoadNum >= 10 {

                print("恭喜你当月工资翻倍")

            }

            else {

                print("下载量未超过10万继续努力")

            }

        }

    }

    

    mutating func changeNum() -> Void {

        downLoadNum = Int(arc4random()) % 20

    }

}

 

var num = gameDownLoadNum.init()

for i in 1...6 {

    num.changeNum()

}


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
swift 2特性记录发布时间:2022-07-13
下一篇:
OpenStack Object Storage Developer Guide/Swift官方API文档 -- 翻译 (一) ...发布时间:2022-07-13
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap