Swfit初学6--协议--结构体--枚举--继承
发布时间:2020-12-15 07:05:39 所属栏目:百科 来源:网络整理
导读:/*---------------我是帅气的分割线--------*//*** 协议*/@objc protocol Description { func description() - String // mutating func amutatingMethod() //这里可以改变属性的值 class func aTypeMethod()//类方法需要用class关键字 @optional func anOpt
/*---------------我是帅气的分割线--------*/ /** * 协议 */ @objc protocol Description { func description() -> String // mutating func amutatingMethod() //这里可以改变属性的值 class func aTypeMethod()//类方法需要用class关键字 @optional func anOptionalMethod() } //如果声明可选择实现方法. 需要在func前加@optional声明,而且协议前面要加@objc 这样协议结构体不能遵守,所以也不允许matating方法的存在 //protocol Description{ // func description() -> String // mutating func aMutatingMethod() // class func aTypeMethod() //类型方法需要用class关键字 // @optional func anOptionalMethod() // //} /*---------------我是帅气的分割线--------*/ /*------- 结构体 -------*/ struct Point { var x = 0.0 var y = 0.0 } struct Size { var width = 0.0 var height = 0.0 } // Swift中结构体也可以创建("对象")实例 var point = Point() var size = Size() //创建两个空的数组 var anEmptyArrayA = Array<String>() // or var anEmptyArrayB = String[]() struct Rect{ ///------------>遵守协议,下面实现方法 var origin = Point() var size = Size() //计算属性必须是变量 var center: Point{ get{ let centerX = origin.x + size.width / 2 let centerY = origin.y + size.height / 2 return Point(x: centerX,y:centerY) } set (getCenter){ //--------> setter方法会提供一个默认的新值,newValue let originX = getCenter.x - size.width / 2 let originY = getCenter.y - size.height / 2 origin = Point(x: originX,y: originY) } } mutating func moveBy(deltaX:Double,deltaY: Double){ let newX = origin.x + deltaX let newY = origin.y + deltaY origin = Point(x:newX,y:newY) } //------实现协议方法 func description() -> String{ return "((origin.x),(origin.y),(size.width),(size.height))" } mutating func aMutatingMethod(){ //这里可以改变属性的值 } // 如果是现实协议中的类型方法,虽然在协议中使用了class关键字,但是在结构体 static func aTypeMethod() { } } var frame = Rect() frame.origin.x = 10 frame.origin.y = 10 //frame.size.width = 10 //frame.size.height = 10 frame.size = Size(width: 100,height:100) println("frame = ((frame.origin.x),(frame.origin.y),(frame.size.width),(frame.size.height))") println("frame.center = ((frame.center.x),(frame.center.y))") println(frame.description()) /*---------------我是帅气的分割线--------*/ /** * 枚举值 */ enum PersonIdeentify: String { case Teacher = "teacher" case Student = "student" } class Person{ var name:String? var sex:String? var identify:PersonIdeentify? //构造器中,第一个参数依然会创建一个和局部参数名称相同的外部参数名称 init(name: String,sex: String,identify: PersonIdeentify){ self.name = name self.sex = sex self.identify = identify } //实现协议方法 func description() -> String{ // 调用枚举值的toRow()方法可以获取到枚举值的初值 return "(name = (name) sex = (sex) identify = (identify!.toRaw()))" } // 在类中如果实现协议中定义的mutating方法,那么不需要加"mutating"关键字 func aMutatingMethod(){ } } //前面声明枚举,直接可以用" .Student "再次说明自动类型推断 var personA = Person(name: "张三",sex :"m",identify: .Student) var personB = Person(name: "lisi",sex :"f",identify: .Teacher) switch (personA.identify!){ case .Teacher: println("I am teacher") case .Student: println("I am Student") } /*---------------我是帅气的分割线--------*/ /** * 继承 */ class Student: Person { var number: String? // 在类中,类型属性只可以是计算属性,但是在枚举和结构体中,既可以是计算属性,也可以是存值属性 // 在类中声明一个类型属性的关键字class,在结构体和枚举中是static class var attendClassTime: String { return "9:30" } init(name: String,sex:String,number:String){ super.init(name:name,sex:sex,identify:.Student) //继承父类 self.number = number //自己的初始化 } } var studentA = Student(name: "李莉",sex: "f",number:"312321") var studentB = Student(name: "李莉",number:"312321") println("Student attendClassTime = (Student.attendClassTime)") class Teacher:Person { var course:String? init(name: String,course:String){ super.init(name:name,identify:.Student) self.course = course } override func description() -> String{ ///----------我重写之前的方法(协议中),加上关键字 override return super.description() + "" + "course = (course)" } } var teacherA = Teacher(name:"张阳",sex:"男",course:"Swfit") println() (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |