标签:
import Foundation // 定义一个可选类型, 表示这个变量可以为Nil //var intNumber : Int? = 100 //// 在使用的时候, 在变量后加一个 ! 表示拆包, 可以获得为真正的值 //print(intNumber!) // //if var intNewNumber = intNumber{ //print(intNumber!) //}else{ //print("error") //} ///%%%%%%%%%%%%%%%%%%%%%%结构体%%%%%%%%%%%%%%%%%%%%%%%% // 使用struct定义一个结构体 // 格式: struct + 结构体名字 {结构体实现} struct Frame { // 存储属性 负责存储值的属性 var x : Float var y : Float var width : Float var height : Float // 计算属性 负责将存储属性进行运算获得值得属性 // get方法 :在属性类型后面添加{} 使用get关键字声明和实现get方法 // set方法 :同上 // set方法不可以单独出现, 必须搭配get方法.但是get可以 var centerX : Float{ get{ return x + width / 2 } } var centerY : Float{ return y + height / 2 } //结构体属性 static var myStruct = "我是一个结构体属性" //结构体中可以声明和实现一个函数 func sayHI(){ print("你好, 我是一颗大树") } // init方法 // Swift中结构体中可以声明和实现一个init方法 init(x newX : Float, y newY : Float, width newWidth : Float, height newHeight : Float){ x = newX y = newY width = newWidth height = newHeight } // 结构体方法 // 结构体方法中只能调用结构体属性 static func sayMy() { print(self.myStruct) } } print(Frame.myStruct) // 创建一个对象的方式 // 第一种 var frame : Frame = Frame.init(x: 10, y: 10, width: 100, height: 100) // 第二种 var frame1 : Frame = Frame(x: 10, y: 10, width: 100, height: 100) print(frame1.centerX) frame1.sayHI() // 用结构体调用的,不是用对象 Frame.sayMy() //&&&&&&&&&&&&&&&&&&&&&&&&&&&& 类 &&&&&&&&&&&&&&&&&&&&&&&&&&&& // calss + 累名 * {类的实现} class Person{ // 当在给一个类写属性的时候, 这个属性如果没有初值那就需要是可选类型:var name = String? var name = "hehehe" var gender = "你猜" var age = 108 var width : Float{ get{ return 100 } set { // set方法中newValue表示新值 self.width = newValue } } // static修饰的是类属性 static var hobby : String? = "三锰" // 普通函数里面不能调用类属性.类属性只能由类函数去调用. func sayHI() { print("你丫的\(self.width)") } init(name newName : String, gender newGender : String, age newAge : Int){ name = newName gender = newGender age = newAge } static func sayMy(){ print(self.hobby!) } } var person : Person = Person(name: "老大", gender: "老二", age: 3) print(person.name) person.sayHI() Person.sayMy() //class Dog { // var name : String? // var style : String? // static var hobby : String? = "嘿嘿嘿" // func sayHH(){ // print("汪汪汪") // } // init(name newName : String, style newStyle : String){ // name = newName // style = newStyle // } // static func sayMy(){ // // print(self.hobby!) // } //} //var dog : Dog = Dog(name: "wangcai", style: "bosimao") //print(dog.name!, dog.style!) //dog.sayHH() //Dog.sayMy() // // //class Student: Person { // // var number : Int? // // // 重写父类的方法 : 需要添加override修饰 // override func sayHI() { // //super.sayHI() 加super代表完全调用父类的方法. // } // // // 重写父类的init函数 // override init(name newName: String, gender newGender: String, age newAge: Int) { // super.init(name: newName, gender: newGender, age: newAge) // // // } // // 在重新创建一个init方法的时候 还是需要super.init // init(number newNumber : Int){ // super.init(name: "张三", gender: "男", age: 1) // number = newNumber // // } // //} //^^^^^^^^^^^^^^^^^^^^^^ 协议 ^^^^^^^^^^^^^^^^^^^^^^^\// 声明一个协议 // Protocol 声明的协议 是swift的协议 所有的方法都必须实现. protocol myDelegate{ // 一个协议方法 func test() // 使用Mutating修饰的函数 可以在结构体里面修改结构体的属性 // 在协议里面使用mutating修饰的函数. 在遵守协议的时候, 可以不使用mutating修饰 在类里没有影响,但是在结构体里面就不能修改属性的值了.. 没有使用mutating修饰的函数,在实现的时候 却使用了mutating修饰的结果是重新的声明了一个函数, 和协议没有关系. mutating func change() } // 使用@objc修饰的协议表示这个协议是OC的协议 // 可以声明可选实现的函数 在函数前面用optional修饰, 这个函数就是可选实现函数了 // 在实现这个函数的时候 ,在函数前面要加@objc修饰 // @objc 修饰的协议 ,不可以在结构体里面遵守 @objc protocol newDelegate{ // 可选实现 optional func newTest() func newChange() } // 类 class Teacher : Person, myDelegate, newDelegate{ func test() { print("aaa") } // 协议里使用mutating修饰之后的的函数 在类里面就是一个普通的函数 func change() { } @objc func newText(){ } @objc func newChange() { } } let teacher : Teacher = Teacher(name: "a", gender: "男", age: 111) // 结构体 struct myStruct : myDelegate // @objc 修饰的协议 ,不可以在结构体里面遵守 不用写 newDeleate { var name : String func test() { // 结构体里的函数不能直接更改结构体里的属性 } mutating func change() { name = "111" } } //$$$$$$$$$$$$$$$$$$$$$ 扩展 $$$$$$$$$$$$$$$$$$$$$$$$$$\// extension + 类名 表示你要对这个类做扩展. // extension 只可以扩展函数 不能扩展属性 // extension 可以给一个类扩展代理协议 extension Person : myDelegate{ func test() { } func change() { } func eat(){ } } // extension 可以给结构体扩展新的协议 //extension Frame : myDelegate{ // func text(){ // } // func change(){ // } //} //!#@@#$^%$%&^&*(&&^$%!^&^*&*)%$#$#@ 闭包 @%^%*%^#@$!@#Q@!^??@?? // 声明一个 闭包 var myBlock : (闭包色格式) var myBlock :((a : Int, b : Int) ->Int) // 实现闭包的第一种方法 myBlock = { (a : Int, b : Int) -> Int in return a > b ? a : b } // 第二种实现闭包方式, 省略参数类型和返回值 myBlock = { a, b in return a > b ? a :b } // 第三种方式实现闭包 省略参数类型 省略返回值 省略return关键字 myBlock = { a, b in a > b ? a : b } // 第四种方式 都省略了 使用$符号表示 取第几个参数. myBlock = { $0 > $1 ? $0 : $1 } // 第五种 苹果推荐 myBlock = { (a, b) -> Int in return a > b ? a : b }
标签:
原文地址:http://www.cnblogs.com/fubaodong/p/5396202.html