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)岁生日快乐

10 结构体和类 - —— 《Swift3.0 从入门到出家》的更多相关文章

  1. 4 字符串 Swift/Objective -C ——《Swift3.0从入门到出家》

    4 字符串   Swift and Object-C 字符串由多个字符组成,使用 “” 引起的内容 swift语言中提供了两种字符串:可变字符串和不可变字符串 可变字符串:字符串的内容可以修改,字符串 ...

  2. 5 数组 Swift/Object-C ——《Swift3.0从入门到出家》

    Swift中数组是一种数据结构,用来存放多个形同类型的数据结构,数据在数组内的存放是有序的,存进来的数据个读出来的顺序相同 Object-C 中数组能够存放任意类型的数据类型为[AnyObject] ...

  3. 2 分支语句——《Swift3.0 从入门到出家》

    2 分支语句 当程序面临多个选择,每一个选择都会执行不同的代码块,这个时候就要使用分支语句.常见的分支语句有: if 选择语句:if... if…else if…elseif…else if是现实生活 ...

  4. 9 闭包——《Swift3.0从入门到出家》

    8  闭包 Swift语言中可以使用一块独立代码块替代函数的定义,称独立的代码块为闭包 闭包格式为: {(参数列表)->返回值类型    in 执行语句 } 例子: <1>使用闭包实 ...

  5. 8 函数类型——《Swift3.0从入门到出家

    Swift语言中每一个函数都有它特定的数据类型,称其为函数类型 函数类型和基本数据类型一样,可以定义变量或者常量,可以定义函数形参,也可以做为函数的返回值类型 函数类型的格式为:参数列表的数据类型—& ...

  6. 7 函数——《Swift3.0从入门到出家

    6 函数 函数就是对某个功能的封装,一个swift程序可能由多个函数组成 swift中定义函数的格式: func 函数名称(参数列表) —>函数返回值类型{ 函数体 return } 函数定义要 ...

  7. 6 字典和集合——《Swift3.0从入门到出家》

    字典和集合 字典 字典是集合类型存放多个键值对,其中键是唯一的,不能重复 字典中存放的键值对是无序的,写入的顺序和读取的顺序可能不同 字典中存放的数据是任意类型 字典可以分为可变字典和不可变字典 创建 ...

  8. 3 循环语句——《Swift3.0从入门到出家》

    3 循环语句 当一段代码被多次重复利用的使用我们就使用循环 swift提供了三种形式的循环语句 1.while 循环 2.repeat — while 循环 3.for — in 循环 while 循 ...

  9. Swift结构体与类

    在面向过程的编程语言(如C语言)中,结构体用得比较多,但是面向对象之后,如在C++和Objective-C中,结构体已经很少使用了.这是因为结构体能够做的事情,类完全可以取而代之.而Swift语言却非 ...

随机推荐

  1. idea使用maven骨架创建maven项目

    Maven 骨架创建 Java Web 项目 1) File -> New -> Project... 2) 如下图 3)如下图 GroupId和ArtifactId<项目名> ...

  2. [国家集训队2011]happiness

    Description 高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友.这学期要分文理科了,每个同学对于选择文科与理科有着自己的喜悦值,而一对好朋友 ...

  3. TCP的滑动窗口

    TCP发送方的窗口可以划分成四个部分: 1.已经发送并且确认的TCP段: 2.已经发送但是没有确认的TCP段: 3.未发送但是接收方准备接收的TCP段, 4.未发送并且接收方也为准备接受的TCP段. ...

  4. Dynamo概述

    Dynamo 是Amazon提供的一款高可用的分布式Key-Value存储系统,其满足可伸缩性.可用性.可靠性. CAP原理满足:通过一致性哈希满足P,用复制满足A,用对象版本与向量时钟满足C.用牺牲 ...

  5. Java 自定义注解实现ORM对象关系映射

    一,ORM概念 ORM即Object Relation Mapping,Object就是对象,Relation就是关系数据库,Mapping映射,就是说Java中的对象和关系数据库中的表存在一种对应关 ...

  6. 虚拟主机(多站点配置)的实现--centos上的实现

    Apache中配置多主机多站点,可以通过两种方式实现 将同一个域名的不同端口映射到不同的站点(虚拟主机) 将同一个端口映射成不同的域名,不同的域名映射到不同的站点 两种方法可以同时存在,局域网通过   ...

  7. Div层弹出

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <hea ...

  8. flash滚动图片遮住二级下拉菜单解决方法

    如上图所示,在进行排版时,如果不注意会遇到二级下拉菜单被下边的img图片遮住.此种情况在ie7 8 中出现. 解决方法:给二级下拉菜单添加z-index:9999;position:relative; ...

  9. neutron之SDN简单测试

    title: Neutron SDN 手动实现手册 date: 2017-04-13 23:37 tags: Network 本文旨在通过自己搭建类似neutron (openvswitch + gr ...

  10. 关于inline函数

    本文为大便一箩筐的原创内容,转载请注明出处,谢谢:http://www.cnblogs.com/dbylk/p/4975474.html 今天我在优化公司项目代码的过程中,借助了Intel的VTune ...