Swift学习笔记基础语法-常量与变量
常量与变量 //定义变量 var x = 1.1, y = 2.1 , z = 1.3 //定义常量 let PI = 3.1415926, SPEEDOFLIGHT = 300_000 //类型标注 /** *1.在常量或者变量名后面加上一个冒号和空格,然后加上类型名称,表示常量或者变量中要存储的值的类型 *2.一般来说很少需要写类型标注,Swift可以推断出这个常量或者变量的类型 */ var str: String = "Hello user" //常量和变量的命名 /** *1.可以用任何字符作为常量和变量名,包括 Unicode 字符 *2.尽量避免使用Swift保留关键字命名,非得用需反引号(`)将关键字包围起来 *3.常量与变量名不能包含数学符号,箭头,保留的(或者非法的)Unicode 码位,连线与制表符,也不能以数字开头 */ let 最大登录次数 = 5 var 当前登录次数 = 3 //在控制台打印常量和变量 print(str) //字符串插值(string interpolation),把常量名或者变量名当做占位符加入到长字符串中,并在开括号前使用反斜杠将其转义 print("当前访问次数:\(当前登录次数)") //分号 /** *1.Swift 并不强制要求你在每条语句的结尾处使用分号(;) *2.必须要用分号的情况,在同一行内写多条独立的语句: */ print(str);print("登录成功!\(str)") 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 整数与浮点数 //整数范围 /** *1.Int长度与当前平台的原生字长相同,即32位机同Int32,64同Int64 *2.一般使用Int,可以提高代码一致性和可复用性 */ let min = UInt32.min let max = UInt32.max let min2 = Int.min let max2 = Int.max print(min) print(max) print(min2) print(max2) //浮点数 /** *Double表示64位浮点数;Float表示32位浮点数。 */ let PI:Float = 3.141592689793 let PI2: Double = 3.141592689793 print(PI)//输出3.14159 print(PI2)//输出3.141592689793 //类型推断 /** *当声明常量或者变量的时候赋给它们一个字面量即可触发类型推断。 *编译器可以在编译代码的时候自动推断出表达式的类型。 *因为有类型推断,Swift 很少需要显式指定类型。 */ let PI3 = 3 + 0.14159// PI3 会被推测为 Double 类型 //数值型字面量 let decimalInteger = 10 let binaryInteger = 0b10 // 二进制的2 let octalInteger = 0o10 // 八进制的8 let hexadecimalInteger = 0x10 // 十六进制的16 //十进制数 科学记数法 let 一百万 = 1e6 let 二百万分之一 = 2e-6 //十六进制数 科学记数法 let 十五的16进制2次方 = 0xFp2 //15 × 2^2 /** *数值类字面量可以包括额外的格式来增强可读性。 *整数和浮点数都可以添加额外的零并且包含下划线。 */ let 十亿 = 1_000_000_000 let 八元 = 0_000_000_008 //整数和浮点数之间的转换 /** *1.整数和浮点数的转换必须显式指定类型 *2.加号两边的数类型须相同。如果不进行转换,两者无法相加 */ let three = 3 let point14159 = 0.14159 let PI4 = Double(three) + point14159 print(PI4) //浮点数转换为整数 /** *用浮点数初始化一个新的整数值时,浮点值会被截断。3.1会变成3,-3.5会变成-3 */ let intPI4 = Int(PI4) print(intPI4) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 Bool类型 /** *与OC,C不同,Swift的布尔值只能用true,false表示 */ let trueValue = true let falseValue = false if trueValue{ /* let i = 1 if i { 会报错 } */ } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 元组tuple /** *1.把多个值组合成一个复合值,元组内的值可以是任意类型 *2.数据结构并不是临时使用时,使用类或者结构体而不是元组。 */ let http404Error = (404, "Not Found")// 类型是 (Int, String) let shirt = (88,"red",true) //分解元组的每个元素(方法一:) let (money,color,isNice) = shirt print("money is :\(money)") print("color is :\(color)") print("it is nice :\(isNice)") /* 输出: money is :88 color is :red it is nice :true */ //分解元组的每个元素(方法二:) print("money is :\(shirt.0)") print("color is :\(shirt.1)") print("it is nice :\(shirt.2)") //分解元组的部分元素 let (justMoney,_,_) = shirt print("The $ is:\(justMoney)") //定义元组的时候给单个元素命名,通过名字来获取这些元素的值 let shirt2 = (length : 80,isNice :false ) print("length is :\(shirt2.0)") print("it is nice :\(shirt2.isNice)") 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 nil /** *1.声明一个可选常量或者变量但是没有赋值,它们会自动被设置为nil *2.Swift 的nil和 Objective-C 中的nil并不一样。 * 在 Objective-C 中,nil是一个指向不存在对象的指针。 * 在 Swift 中,nil不是指针——它是一个确定的值,用来表示值缺失。 * 任何类型的可选状态都可以被设置为nil,不只是对象类型。 */ var defaultValue: String? print(defaultValue) 1 2 3 4 5 6 7 8 9 可选类型之强制解析(强制拆包) /** *可选类型(optionals)用来处理值可能缺失的情况 */ let 彩票 = "50000" let 中奖金额 = Int(彩票) if 中奖金额 != nil { print("恭喜您中了:\(中奖金额)") } //输出 恭喜您中了:Optional(50) /** *1.使用!拆包,前提是被拆包的可选类型一定有值 *2.确定可选类型确实包含值,后面加一个感叹号,被称为可选值的强制解析(强制拆包) */ if 中奖金额 != nil { print("恭喜您中了:\(中奖金额!)") //输出 恭喜您中了:50 } /** *使用!拆包,如果可选类型值为nil,会有运行时错误 */ let 彩票2 = "谢谢惠顾" let 中奖金额2 = Int(彩票2) //直接使用 print("恭喜您又中了:\(中奖金额2)") //恭喜您中了:nil print("恭喜您又中了:\(中奖金额2!)") //运行时报错:fatal error: unexpectedly found nil while unwrapping an Optional value // if 中奖金额2 != nil { print("恭喜您中了:\(中奖金额2)") }else{ print("再接再厉") } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 可选绑定 /** *判断可选类型是否包含值,如果包含就把值赋给一个临时常量或者变量 */ if var temMoney = 中奖金额{ print("恭喜您中了:\(temMoney),税后\(Double(temMoney) * 0.8))") }else{ print("再接再厉") } 1 2 3 4 5 6 7 8 隐式解析(间接拆包) /** *如果在变量的生命周期中判断是否nil的话,即变量可能变成nil使用普通可选类型 *如果变量一直有值,则可用间接拆包 */ let 新彩票1: String! = "50" print("此次中奖:\(新彩票1)") //此次中奖:50 let 新彩票2: String? = "50" print("此次中奖:\(新彩票2)") //此次中奖:Optional("50") let 新彩票3: String? = "50" print("此次中奖:\(新彩票3!)") //此次中奖:50 if let tempMoney = 新彩票1{ print("此次中奖金额是:\(tempMoney)") } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 错误处理 /** *当一个函数遇到错误条件,它会报错。调用函数的地方能抛出错误消息并合理处理。 */ func divideOperations() throws { // 这个函数有可能抛出错误 } /** *通过在声明中添加throws关键词来抛出错误消息。当你的函数能抛出错误消息时, 你应该在表达式中前置try关键词。 */ do { try divideOperations() // 没有错误消息抛出 } catch { // 有一个错误消息抛出 } /** *do语句创建了一个新的包含作用域,能使错误被传播到一个或多个catch中,例如: */ func divideOperations() throws { // ... } do { try divideOperations() outputResult() } catch Error.DivdeByZero { reTryDivideOperations() } catch Error.WrongNumber(let num) { alert(num) } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 断言(Assertion)调试 在某些情况下,如果值缺失或者值并不满足特定的条件,代码可能没办法继续执行。 这时可以在代码中触发一个断言(assertion)来结束代码运行并通过调试来找到值缺失的原因。 1 2 3 使用断言的情况 1.整数类型的下标索引被传入一个自定义下标脚本实现,但是下标索引值可能太小或者太大。 2.需要给函数传入一个值,但是非法的值可能导致函数不能正常执行。 3.一个可选值现在是nil,但是后面的代码运行需要一个非nil值 var age = 0 assert(age >= 18,"年龄未满18才可进入")//代码到此出会停止执行