Object Oriented ProgrammingOOP:面向对象,使用对象、类、继承、封装、属性、方法、扩展、协议等
1、基本特性:封装、继承、多态
封装:尽可能隐蔽对象内容细节,对外行程一个边界,只保留有限的对外接口
继承:特殊类具有一般类的全部属性和方法,一般类(父类、基类),特殊类(子类、派生类)
多态:父类中定义的属性、方法,在被子类继承后,可以使同一个属性、方法,在父类、子类中,具有不同的含义
2、类、结构体、枚举,都是面向对象的数据类型
3、枚举
enum 枚举名 { 枚举的定义(一组成员的值和一组相关值) }
Swift中,枚举的成员值默认不是整数类型,成员值前面要加上case
使用枚举成员赋值时,枚举类型名.成员值
在switch中使用枚举,case必须全面包含枚举中的所有成员
枚举原始值
enum 枚举名:数据类型(字符、字符串、整数、浮点数)
{ case 成员名 = 默认值 }
将枚举的成员值转换为原始值:枚举名.成员名.rawValue
将枚举的原始值转换为成员值:枚举名(rawValue: 原始值)
枚举相关值
enum Figure {
case Rectangle(Int, Int)
case Circle(Int)
}
对于Figure,Rectangle和Circle是相关值,都是元组类型,对于一个特定的Figure实例,只能有一个相关值
为了从相关值中提取数据,可以在元组字段前面加let或var,如果元组中字段类型一致并且需要全部提取,可以将let或var移到相关值前面
.Rectangle(let width, let height) let .Rectangle(width, height)
4、结构体、类
Swift中的结构体,不近可以定义成员变量,还可以定义方法,是一种轻量级的类,结构体不具有继承性,不能强制类型转换、使用析构函数、使用引用计等
class 类名 { 定义类的成员 }
struct 结构体名 { 定义结构体的成员 }
classEmployee {
varno:Int=0
varname:String=""
varjob:String?
varsalary:Double=0
vardept :Department? 将结构体和类关联起来
}
structDepartment {
varno:Int=0
varname:String=""
}
实例化: let emp = Employee() var dept = Department(),实例化后,会开辟内存空间
类一般声明为let,类是引用数据类型,let说明不能修改引用,但引用指向的对象可以修改
5、引用类型的比较 === !===,比较两个引用是否为同一个实例,结构体和枚举都是值类型,但不能用== !=,必须重载=== !==运算符,定义相等规则
6、运算符重载
定义一个重载运算符的函数,在需要执行被重载的运算符时调用该函数
func==(lhs:Department, rhs:Department) ->Bool{
returnlhs.name==rhs.name&&lhs.no==rhs.no
}
func!=(lhs:Department, rhs:Department) ->Bool{
if(lhs.name !=rhs.name||lhs.no!=rhs.no) {
returntrue
}
returnfalse
}
7、类型嵌套,类、结构体、枚举可以进行嵌套,在某一个类型的{}内部定义类
8、可选链:显示拆包(?-!)替换为(?-?),就是可选链,遇到nil不会抛出错误,会把nil返回给引用者
9、访问限定
访问范围主要有两个:模块、源文件
模块:指一个应用程序或者一个框架,用import关键字引入
源文件:.swift文件,编译之后被包含在应用程序包或框架中,一个源文件包含一个面向对象类型(类、结构体、枚举),这些类型中又包含函数、属性等
访问级别:open、public、internal、fileprivate、private
open:无论在自己模块内部,还是在其他模块(import语句引入其他模块)都可以被访问
public:在同一个模块中,与open完全一样,在不同模块时,public所声明的类不能被继承,public所声明的属性和方法不能被重写
internal:默认访问限定,只能在自己模块中被访问
fileprivate:只能在当前源文件中被访问
private:只能在类型内部被访问
10、访问级别使用原则
①如果一个类型定义为internal、private,那么类型声明的变量或常量不能使用public
②函数的访问级别,不能高于它的参数和返回类型的访问级别
③元素类型访问级别,遵循字段最低级的访问级别
④枚举中成员的访问级别继承于该枚举
11、类和结构体的异同
相同:定义存储属性、定义方法、定义下标、定义构造函数、定义扩展、实现协议
不同:只有类才能继承、核对运行时对象的类型、析构对象释放资源、引用计数允许一个实例有多个引用
结构体是值类型,每一个实例没有独一无二的标识
类是引用类型,每一个实例都有独一无二的标识
网友评论