博客> 第六章面向对象(上)
第六章面向对象(上)
2018-12-13 10:40 评论:0 阅读:453 易_君
ios swift

/** 面向对象:在程序中使用对象来映射现实的事物,使用对象的关系来描述事物之间的联系,这种思想就是面向对象。保证了功能的统一性 面向过程:是一种以时间为中心的编程思想,面向过程就是分析出解决问题的步骤,然后用这些步骤一一实现,使用的时候一个一个依次调用即可 类和结构体:可以把结构体理解为轻量级的类。类是一种复杂的数据类型,它是将不同类型的数据和与这些数据的相关操作封装在一起的集合体,“数据的相关操作”就是我们平常经常看到的“方法”,因此,类具有更高的抽象性;结构体(Struct)和类相似,用于封装具有相同类型和不同类型的一系列数据。 swift中的结构体不仅可以定义成员变量还可以定义成员方法。 类和结构体具有类似的定义方式,分别使用关键字class和struct来表示,并在大括号中来定义其内容。 类的语法格式: class 类名 { //在这里定义类的内容 }

结构体的语法格式: struct 结构体名称 { //在这里定义结构体的内容 } 注意:类和结构体的名称都是以大写开头,类的方法和属性使用小写开头 */ //使用Xcode创建一个类

class Student{ //定义学生类 var number:Int = 0 //定义学生编号属性 var name:String = "" //定义学生姓名属性 var height:Int = 0 //定义学生身高属性 var weight:Int = 0 //定义学生体重属性 func demo() { //定义了一个demo方法 print("Student") } }

let stu = Student() //创建了以Student类的实例 stu.name = "xiaoMing" //为name的属性赋值 stu.demo() //调用Student类的demo方法 print(stu.name)

//结构体的定义 struct Person{

var name:String = "张三"
var age:Int = 20

} let per = Person() print("名字: (per.name)") print("年龄: (per.age)")

/* 类的实例及访问 在上述let stu = Student()中Student() 表示构造函数创建了一个Student实例,即在结构体或者类的类型名称后跟随一对空括号,通过这种方式创建的类实例,其属性均会被初始化为默认值。在stu.name = "xiaoMing"中使用了点语法对stu实例的name赋值,其语法规则是,实例后面紧跟随姓名,两者通过点号(.)连接。在Swift中类是引用类型的,与值不同,引用类型在被赋予到一个变量、常量或者被传递到一个函数时,其值不会被拷贝。因此,引用的是已存在的实例本身而不是其拷贝 结构体的实例及访问 Swift要求实例化一个结构体时,所有成员变量都必须有初始值,构造函数的意义就是用于初始化所有成员变量的,与Objective-C不同的是,内存分配是系统帮我们做的定义结构体时,所含属性都有默认值可以直接使用()来构造一个结构体实例 var per = Person() 访问结构体的属性,同样使用点语法 print("姓名:(per.name)---年龄:(per.age)") / struct Students{

var name:String
var age:Int

} var st = Students(name: "小米", age: 10) //定义属性:赋值顺序必须与结构体中的成员顺序一致 print("(st.name)---(st.age)")

//结构体中定义方法 struct Teacher { var name:String var age:Int var knowledge:String

func teachStudent() -> String {

    return knowledge
}

}

var teacherOne = Teacher(name: "David", age: 35, knowledge: "English") print(teacherOne.teachStudent()) var teacherTwo = Teacher(name: "lilei", age: 25, knowledge: "Chainise") print(teacherTwo.teachStudent())

//结构体是值类型 struct StudentInfo { var name:String var age:Int

func showStudentInfo() -> Void {

    print("姓名:\(name)--年龄:\(age)")
}

} //实例化StudentInfo结构体 var stu1 = StudentInfo(name:"章三",age:17) var stu2 = stu1 //stu1拷贝到stu2中的,所以它们是两个不同的实例 stu1.showStudentInfo() stu2.showStudentInfo()

/* 懒存储属性 是指当被第一次调用的时候才会计算初始值的属性,一个懒存储属性通过在属性声明的前面加上lazy来标识; 当属性初始值因为外部原因,在实例初始化完成之前不能确定,或者当属性的初始值需要复杂,大量的计算时,就可以使用懒存储属性 / class PersonInfo{

/**PersonInfo是一个将外部文件中数据导入的类,这个初始化需要消耗很多时间*/
var personFileName = "personInfo.text"

//这里会提供数据导入功能

}

class PersonDataManager{

lazy var personInfo = PersonInfo()
var data = String()
//这里会提供数据管理功能

} let manager = PersonDataManager() manager.data += "some data" manager.data += " Some more data" print(manager.data) print(manager.personInfo.personFileName)

/*计算属性 计算属性不存储值,而是提供了一个getter和setter来分别进行获取值和设置其他属性的值。getter使用get关键字进行定义,setter使用set关键字进行定义 注意:计算属性必须使用关键词var关键字定义,包括只计算属性,因为他们的值是不固定的,let关键字只用来声明常量存储的属性,表示初始化以后对此再也无法修改 / //如果计算属性的setter方法没有将被设置的值定义一个名词==名称,会默认使用newValue名称代替 class Persons { var length:Int = 10 var age:Int { get{ return length 2 } set{ length = newValue / 2 } } //只读计算属性 var height:Int { get{ return length 4 } } //只读可以直接省略get var height2:Int { return length * 4 } } var pers = Persons() pers.height //只读不可以赋值

/* 属性观测器 可以用于监控和响应初始化的属性值变化,当属性的值发生改变时候,可以调用事先写好的代码额外执行一些操作并对此做出响应 属性观测器包括didSet和willSet,其中属性值改变前会触发willSet,属性值改变后会触发didSet。 其特点: 1.给属性添加观测器必须要声明清楚属性类型,否则编译器会报错。 2.willSet可以带一个newName的参数,没有的话,该参数默认命名为newValue。 3.didSet可以带一个oldName的参数,表示旧的属性,不带的话默认命名为oldValue。 4.属性初始化时,willSet和didSet不会调用,只有在初始化上下文之外,当设置属性值时才会调用。另外,在didSet的实现体内给属性赋值,也不会再次调用属性的。 5.即使是设置的值和原来的值相同,willSet和didSet也会被调用 /

class Pepple{ //普通属性 var name:String? var age:Int = 0 { //在age属性变化之前做点什么 willSet { print("将要设置年龄的值为 (newValue)") } //在age属性发生变化之后,更新一下name这个属性 didSet //如果在didSet观测器里为属性赋值,这个值会替换观测器之前的设置的值 { if age < 10 { name = "Lucy" }else{ name = "Lily" } print("(name!)的年龄从(oldValue)改为(age)") } } } let perr = Pepple() perr.age = 0 perr.age = 20 / 注意: 如果在didSet观测器里为属性赋值,这个值会替换观测器之前设置的值 / / 全局变量和局部变量 计算属性和属性观测器,它们所描述的模式也是可以用于全局变量和局部变量,所谓的全局变量是在函数、方法、闭包或任何类型之外定义的变量,局部变量是在函数方法或闭包内部定义的变量 全局变量和局部变量都属于存储型变量,跟存储属性类似,它提供特定类型的存储空间,并允许读取和写入 / let str1 = "Swift" //全局变量 class Peples { let str2 = "Open" //类局部变量,作用域是Peples类内部 func printStringFirst() { let str3 = "Source" //属于函数局部变量,作用域只是在printStringFirst()方法内部 } }

//注意:全局变量的常量或变量都是延迟计算的,跟延迟存储属性相识,不同的地方在于全局的计算不需要标记lazy特性;局部范围的常量或变量不会延迟计算 /* 类型属性:在一个类中,有部分相同的属性其属性值不同,部分属性的属性值相同的称为类型属性 类型属性使用关键字static来定义,结构体、枚举和类都可以定义类型属性 1.结构体类型属性的语法格式: struct 结构体名 { static var 存储属性 = "XXX" static var 计算属性名:属性数据类型 { return 计算后属性值 } }

2.枚举类型属性的语法格式: enum 枚举名 { static var 存储属性 = "XXX" static var 计算属性名:属性数据类型 { return 计算后属性值 } }

3.类类型属性的语法格式: class 类名 { static var 存储属性 = "XXX" static var 计算属性名:属性数据类型 { return 计算后属性值 } class var 子类对父类实现支持重写:属性数据类型 { return 重写后属性值 } }

*/ struct StudentKing { var livingCost:Double = 0.0 var owner:String = "" static var tuition:Double = 11668 //定义静态存储属性 static var tuitionProp:Double { //定义静态计算属性 return StudentKing.tuition + 100 } var totalCost:Double { return StudentKing.tuition + livingCost } }

//访问静态属性 print(StudentKing.tuitionProp) var aStudent = StudentKing() //访问实例属性 aStudent.livingCost = 1_000 print(aStudent.totalCost)

enum SStudent {

case ios
case Java
case PHP
case nodejs

static var tuition:Double = 1168
static var tutionProp:Double {

    return tuition
}

var instanceProp:Double {

    switch (self) {
    case .ios:
        SStudent.tuition = 11667
    case .Java:
        SStudent.tuition = 11669
    case .PHP:
        SStudent.tuition = 11670
    case .nodejs:
        SStudent.tuition = 11671
    }
    return SStudent.tuition + 1_000
}

}

//访问静态属性 print(SStudent.tutionProp) var aSStudent = SStudent.ios //访问实例属性 print(aSStudent.instanceProp)

class ClassStudent { var livingCost:Double = 0.0 var name:String = ""

static var tutition:Double = 12222
static var tutitionProp:Double{
    return tutition
}
var totalCost:Double {
    return ClassStudent.tutition + livingCost
}

}

//访问静态属性 print(ClassStudent.tutition) var cStudent = ClassStudent() //访问实例属性 cStudent.livingCost = 1_000 print(cStudent.livingCost) print(cStudent.totalCost)

print(cStudent.livingCost)

收藏
0
sina weixin mail 回到顶部