1.可选类型和强制解包(?和!)
1> 可选类型(?)和强制解包(!)
在swift中,可选类型(?) 其根源是一个 枚举型,里面有 None 和 Some 两种类型。其实所谓的 nil 就是 Optional.None , 非 nil 就是 Optional.Some.
可选类型是的数据如果不进行解包的话,它是一个 Optional 类型的数据,如果我们想要使用原来类型的数据,必须进行解包
// 定义一个Int类型的可选类型变量var intNumber:Int? = 8// 把这个类型类型的变量赋值给另一个可选类型的变量var intNumberOne:Int? = intNumberprint(intNumberOne)// 打印出来以后是一个Optional类型的值,如果要取到8,必须对可选类型强制解包!var intNumberTwo:Int = intNumber!print(intNumberTwo)
打印结果:
images/loading.gif' data-original="data:image/png;base64,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
2> 可选绑定
可选类型分为有值和没值,如果可选类型的变量没值时对其强制解包,程序就会崩溃 。所以,强制解包是非常危险的
示例代码
// 定义一个Int类型的可选类型变量var intNumber:Int?// 把这个类型类型的变量赋值给另一个可选类型的变量var intNumberOne:Int? = intNumberprint(intNumberOne)var intNumberTwo:Int = intNumber!print(intNumberTwo)
崩溃信息:
// ! 隐式解析可选类型 : 有值,没值(nil)var intNum: Int! = 10// 如果隐式解析可选类型的变量没值,程序一样会崩溃//var intNumOne = intNum//print(intNumOne)// 可选绑定if var intNumTwo= intNum { print(intNumTwo)}
2.结构体
1> 概述
Swift的结构体对比OC来说,可以添加初始化方法、可以遵守代理协议等
声明一个结构体的格式:
struct + 结构体的名字 + {
声明成员变量等
}
2> 声明一个结构体代码
1 // 1. 声明一个结构体 2 struct Rect { 3 // 1.1 声明结构体变量的属性(存储属性) 4 var x:Float 5 var y:Float 6 var width:Float 7 var height:Float 8 9 // 1.2 声明结构体属性,要使用static10 static var desciption:String?11 12 // 1.3 声明计算属性(是用来专门计算结构体变量属性的setter和getter方法,其本身并没有存储功能)13 var centerX:Float {14 // setter方法15 set {16 // x = newValue17 x = x / 218 }19 20 // getter方法,必须要写的方法21 get {22 return x / 223 }24 }25 26 var centerY:Float {27 get {28 return y / 229 }30 }31 32 // 1.4 声明方法33 // 声明一个结构体变量方法(相当于OC中的实例方法)34 35 func frameInfor() {36 print("x:\(x),y:\(y),width:\(width),height:\(height)")37 }38 39 // 声明一个结构体方法(相当于OC中的类方法),使用static修饰40 static func infor() {41 print("这是结构体方法")42 }43 44 }45 46 // 1. 根据结构体去定义一个结构体变量47 var frame = Rect(x: 10, y: 10, width: 100, height: 100)48 49 // 2. 访问结构体变量中的属性50 // 注意:结构体变量的属性类型可以使用let去修饰,只不过访问的时候不能对其进行修改51 print(frame.x)52 53 // 3. 访问结构体属性54 Rect.desciption = "我是结构体属性"55 print(Rect.desciption)56 57 // 4. 访问计算属性58 frame.centerX = 20 // 这句话就相当于在调用centerX的setter方法59 60 let value = frame.centerX // 这句话就相当于在调用centerX的getter方法61 62 print(value)63 print(frame.centerY)64 65 // 5. 调用结构体变量方法66 frame.frameInfor()67 // 6. 调用结构体方法68 Rect.infor()
3> 代码解析
声明:代码 1 - 44行,定义一个结构体变量和对结构体的相关操作:代码46 - 68行
结构体不需要重写初始化方法,直接可以定义一个结构体变量,代码:46 - 47
声明:代码 3 - 7行,访问:代码49 - 50行
结构体变量的属性可以是变量(var),也可以是常量(let),以上代码以var为例
声明:代码 9 - 10行,访问:代码53 - 55行
要使用 static 修饰,必须由 结构体 进行访问
声明:代码 12 - 30行,访问:代码57 - 63行
用来专门计算结构体变量属性的 setter 和 getter 方法,其本身并没有存储功能,相当于OC中重写的 setter 和 getter 方法
声明:代码 33 - 37行,访问:代码65 - 66行
相当于OC中的实例方法
声明:代码 39 - 42行,访问:代码67 - 68行
使用 static 修饰,相当于OC中的类方法
注意:类方法中只能使用 类属性,不能使用 对象属性
3.类
1> 概述
类是人们构建代码所用的一种通用且灵活的构造体。我们可以使用与结构体完全相同的语法规则来为类定义属性(常量、变量)和添加方法。
我们通过关键字class来定义类,并在一对大括号中定义它们的具体内容:
class ClassName {
类的内部细节
}
2> 声明一个父类和子类的代码
1 class Person { 2 // 1.2 对象属性 3 var name:String? 4 var age:Int? 5 6 // 1.3 声明类属性 7 static var introduce:String? 8 9 // 1.4 计算属性10 var value:Int {11 set {12 age = newValue // 在写计算属性的时候,一定不能出现self,不然会出现死循环13 }14 15 get {16 return age!17 }18 }19 20 // 1.1 构造初始化方法21 init(name:String, age:Int) {22 self.name = name23 self.age = age24 }25 // 自定义初始化方法26 init(name:String) {27 self.name = name28 }29 30 // 1.5 声明一个类方法31 // 1.5.1 在类方法前面加上一个static修饰【虽然是一个类方法,但是该方法在子类中不能进行重写】32 static func sayHi() {33 print(introduce) // 注意:只能使用类属性,不能使用对象属性34 }35 // 1.5.2 在类方法前面加上class修饰【它是一个类方法,可以被子类重写】36 class func sayHello() {37 print(introduce)38 }39 40 // 1.6 声明一个实例(对象)方法41 func sayHi1() {42 print("我是实例方法")43 }44 }45 46 // 1. 创建对象(注意:要初始化方法)47 var per : Person = Person(name: "MBBoy", age: 20)48 49 // 2. 访问类中的属性50 // ! 解包后为原有属性(打印结果: MBBoy ),不解包为Optional属性(打印结果 Optional(20) )51 print(per.name!)52 print(per.age)53 54 // 3. 访问类属性55 Person.introduce = "我是xxx"56 57 // 4. 访问计算属性58 per.value = 2859 print(per.value)60 61 // 5. 访问类方法62 Person.sayHello()63 Person.sayHi()64 65 // 6. 访问实例方法66 per.sayHi1()67 68 // 定义一个子类Student,继承Person69 // Swift不支持多继承70 class Student:Person {71 // 重写父类的方法72 // 重写父类的类方法73 override class func sayHello() {74 print("我是子类Student,重写父类的类方法")75 }76 77 // 重写父类的实例方法78 override func sayHi1() {79 print("我是子类Student,重写父类的实例方法")80 }81 }82 83 // 初始化Student对象84 var stu = Student(name: "张三", age: 25)
3> 代码解析
声明:代码 1 - 44行,初始化对象和对对象的相关操作:46 - 66行
重写:代码 20 - 28行,创建对象:代码 46 - 47行
与结构体不同,类的初始化方法必须重写,不然不能创建对象
声明:代码 2 - 4行,访问:代码49 - 52行
对象的属性可以是变量(var),也可以是常量(let),以上代码以var为例
声明:代码 6 - 7行,访问:代码54 - 55行
要使用 static 修饰,必须由 类名 进行访问
声明:代码 9 - 18行,访问:代码57 - 59行
用来专门计算结构体变量属性的 setter 和 getter 方法,其本身并没有存储功能,相当于OC中重写的 setter 和 getter 方法
在写计算属性的时候,一定不能出现 self ,不然会出现死循环
· 存储属性就是 类 或 结构体 里 定义的变量(或常量)。存储属性可以是变量存储属性(用关键字 var定义),也可以是常量存储属性(用关键字let定义)。
· 除存储属性外,类、结构体和枚举可以定义计算属性。计算属性不直接存储值,而是提供一个 getter 和一个可选 的 setter,来间接获取和设置其他属性或变量的值。
声明:代码 30 - 38行,访问:代码61 - 63行
注意:类方法中只能使用 类属性,不能使用 对象属性
两种方式:
使用 class 修饰,它是一个类方法,可以被子类重写
使用 static 修饰,虽然是一个类方法,但是该方法在子类中不能进行重写
声明:代码 40 - 43行,访问:代码65 - 66行
相当于OC中的实例方法
声明:代码 68 - 81行
和OC相似,单继承,可以遵循协议,两者同时存在时,先在:后面写父类,后写协议,用逗号隔开
重写父类方法,使用 override 关键字
4. 值类型和引用值类型的区别
值类型
引用值类型
struct animal { // 值类型 var name:String? var age:Int? init(name:String, age:Int) { self.name = name self.age = age }}var dog = animal(name: "贝贝", age: 3)var dog1 = dog // 此时将dog的数据拷给dog1dog.name = "欢欢"print("dog.name:\(dog.name!), dog1.name:\(dog1.name!)")// 引用值类型class animal { var name:String? var age:Int? init(name:String, age:Int) { self.name = name self.age = age }}var dog = animal(name: "贝贝", age: 3)var dog1 = dog // 此时将dog的数据拷给dog1dog.name = "欢欢"print("dog.name:\(dog.name!), dog1.name:\(dog1.name!)")
打印结果:
值类型与引用类型使用情形
使用 == 运算符比较实例数据的时候。
你想单独复制一份实例数据的时候。
当在多线程环境下操作数据的时候。
当使用 === 运算符判断两个对象是否引用同一个对象实例的时候。
当上下文需要创建一个共享的、可变的对象时。
5.协议
1> 概述
协议定义了一个蓝图,规定了用来实现某一特定工作或者功能所必需的方法和属性
类,结构体或枚举类型都可以遵循协议,并提供具体实现来完成协议定义的方法和功能
任意能够满足协议要求的类型被称为遵循(conform)这个协议
2> 声明协议
- @objc 修饰的协议,其中的方法可以声明成可选实现(使用optional修饰)
@objc protocol SayHelloDelegate { optional func sayHello()}
protocol DescriptionDelegate { func description() -> String static func aClassMethod() ->String//表示声明了一个类方法}
3> 遵守协议
类遵守协议,直接写在本类名后面的冒号的后面,使用 "," 号分隔
class ErShiXiong: NSObject,SayHelloDelegate, DescripationDelegate {// 必须实现的协议方法,就必须实现,否则会报错 func test() { }// 可选协议方法,会报警告,可以添加 @objc, 或者继承NSObject @objc func test1() { }}
6.扩展(Extension)
1> 概述
extension + 类名(结构体名字)可以对一个类和结构体扩展方法,类似于 OC 的 Category 类目
extension 可以多次对一个类进行扩展,也可以给一个类扩展协议方法
2> 使用Extension给类扩充一个方法
extension ErShiXiong { func eat() { print("吃饭") }}let er = ErShiXiong()er.eat()
3> 给类扩展实现协议
//先声明一个协议MyProtocol@objc protocol MyProtocol { optional func test() //该法方法可选实现 func test()}extension ErShiXiong: MyProtocol { func test() { print("Hello") }}
7.闭包
1> 概述
2> 语法形式
{
(参数)-> 返回值类型 in
执行语句
}
3> 闭包的使用(五种方式)
// 声明var myBlock : ((num1:Int, num2:Int) ->Int)// 第一种使用方式myBlock = { (num1:Int,num2:Int)->Int in // 切记不能忘记 in return num1 > num2 ? num1 : num2}// 第二种使用方式myBlock = { (num1,num2)->Int in // 切记不能忘记 in return num1 > num2 ? num1 : num2}// 第三种使用方式(常用,见名知意)myBlock = { num1, num2 in return num1 > num2 ? num1 : num2}// 第四种使用方式myBlock = { num1, num2 in num1 > num2 ? num1 : num2}// 第五种使用方式myBlock = { $0 > $1 ? $0 : $1}let max = myBlock(num1: 88, num2: 69)print(max)
4> 闭包传值(和OC中的Block传值类型)
需求:创建一个工程,勾选swift语言,创建两个控制器给第一个控制器添加导航控制器,点击按钮push到第二个控制器,在第二个页面添加个按钮,点击返回第一个页面,并将第二页textField中输入的值传到第一页,并在第一页的textField中显示
在第二页声明参数为String,无返回值的闭包变量,用于传值
class SecondViewController: UIViewController { // 声明参数为String,无返回值的闭包变量 var block = { (str: String) -> Void in }...}
在第二页的返回按钮的方法实现闭包
fun buttonAction (){ // 闭包调用 self.block!("block返回值") self.navigationController?.popViewControllerAnimated(true)}
在第一页的push按钮中实现闭包
fun pushAction (){ let secondVC: SecondViewController = SecondViewController() secondVC.view.backgroundColor = UIColor.orangeColor() // 闭包实现,拿到传回的值 secondVC.block = { (str: String) -> Void in self.textField?.text = str } self.navigationController?.pushViewController(secondVC, animated: true)
注意:在class类中声明变量 最好立刻初始化 或 定义为可选变量,不然该类必须重写初始化方法
原标题:Swift之语法2(精简版)
关键词: