常量和变量
- let 常量,只有一次赋值机会,不能够被修改
- var 变量,可以被修改
- swift会自动推导数据类型
- 整数的默认类型是int
- 小数的默认类型是Double
- 不同类型之间不能够直接计算,OC可以,因为有隐式转换
- 类型转换:调用构造函数转换类型
- Swift要求运算符对称
- let 和 var 的选择
- 选择let更加的安全
可选类型
一个对象有两面性:有值或者为nil
-
声明
- 在类型的后面添加'?'声明可选类型 例:
var a:Int?
- 常量的可选类型是没有意义的,因为只有一次赋值机会
- 必选类型,一定要有值,并且一定不能为nil
- 在类型的后面添加'?'声明可选类型 例:
-
可选类型计算
- 可选类型不能够直接参与计算
-
'?'
- 表示可选类型
- 在打印的时候会自动带上Optional字样
-
'!'
- 可选类型不能够直接计算,如果参与计算系统会自动提示添加'!'强制解包
- 将'可选类型'的值,解包
报错
fatal(致命的) error: unexpectedly found nil while unwrapping() an Optional value- '!'存在风险,如果为nil,程序就会
boom
- 提示程序员在这个地方可能存在风险需要考虑是否需要判断为nil
-
'??'
- 空合并运算符得到的结果是必选类型
- 运算符的优先级比较低,在使用的时候需要使用
()
来提高优先级 - 相当于三目运算符
- 快速判断对象是够为nil,如果为nil,就去
??
后面设置的默认值
-
带有红圈白点的错误提示,一般都是系统能够自动修改的错误
if判断
- 特点
- 添加判断,不需要
()
可以添加 - 执行分支必须有
{}
- Swift没有非零即真的概念,只有true和false
- 添加判断,不需要
- 三目运算
- 和OC没有任何区别
- guard(守护)
- 作用和
if!()
类似,给判断条件取反
- 作用和
- if let/var
- 快速给一个对象赋值并且判断是否为nil
- 如果对象不为nil,就进入分支执行
- 在分支中可以直接使用必选类型的对象,更加方便,不需要每次都强制解包
- guard let/var ...else
- 快速给一个对象赋值并且判断是否为nil
- 如果对象不为nil,就进入else分支执行
- 在分支中可以直接使用必选类型的对象,更加方便,不需要每次都强制
- switch..case
- 判断任意类型的对象
- 不需要写break,默认不穿透,如果需要穿透需要添加fallthrouth关键字
- 定义临时变量不需要添加
{}
限制作用域 - 一次性可以判断多个值
可选类型判断总结
??
空合并运算符,适用于判断,基本数据类型
和字符串
- if let/var
- guard let/var ..else{break or return}
循环
- 和C的不同
++
语法废弃,改为+=
- c风格的循环被废弃
- for in
- 0..<9 范围 0 - 8
- 0...9 范围 0 - 9
- '_'
- 编译忽略
字符串
-
特点
- String字符串类型,通过结构体实现的,更加轻量级,支持快速遍历,NSString中的并不支持,String可以和NSString无缝的转换
- NSString继承NSObiect是一个对象,不支持遍历
-
声明
- var str:String = "Hello World"
-
长度的计算
let str: String = "听说爱笑的人运气都不会太差哟!" let len = str.lengthOfBytes(using: .utf8) print(len) let length = str.characters.count print(length)
- 遍历
let str: String = "听说爱笑的人运气都不会太差哟" for s in str.characters { print(s) }
- 合并,转换,格式化
let str1 = "你若安好" let str2 = "便是晴天" let str = str1 + str2 print(str) let name = "蛋蛋" let age = 18 //调用构造函数通过传入数字得到字符串 let des1 = name + String(age) //"()" 将对象转义为字符串 let des2 = name + "(age)" print(des2) //字符串的格式化 // 09:10:02 let h = 9 let m = 10 let s = 2 let time = String(format: "%02d:%02d:%02d", h,m,s) print(time)
数组
-
格式
- 使用
[]
定义数组 [String]
是一个泛型数组只能够存放字符串对象
- 使用
-
空数组
- String
-
可变or不可变
- let 声明的是不可变的数组
- var 是可变的数组
-
增/删/改/遍历
var array = ["张三","姜丝"] //增 array.append("外婆") array.insert("杰克", at: 0) //改 array[0] = "肉丝" //删 //array.remove(at: 0) //array.removeFirst() //print(array) //array.removeLast(2) //遍历 for name in array { print(name) } for index in 0..<array.count { let name = array[index] print(name) } //遍历角标和元素 print("------------------------") for (offset,value) in array.enumerated() { print(offset,value) } //倒序遍历 for name in array.reversed() { print(name) }
字典
-
格式
- 使用
[:]
定义字典 [String : String]
是一个泛型字典类型
- 使用
-
空数组
-
可变or不可变
- let 不可变的字典
- var 可变的字典
-
增/删/改/遍历
var dict = ["name" : "磊哥", "age" : "18"] dict["des"] = "每天都被自己帅醒" print(dict) dict.removeValue(forKey: "des") print(dict) //遍历 for (key,value) in dict { print(key,value) } //合并 let dict1 = ["title" : "帅哥"] for (key,value) in dict1 { dict[key] = value } print(dict)