swift语法重温
适应语法.
UIKit框架,
去除NS前缀,
Class转化为struct.
没有isa指针.
取消预编译指令.
-
playground:代码画板,可以立马看到代码效果.看书和官方学习语法.
创建一个示例代码- @UIApplicationMain作为函数入口
- 只有.swift文件没有.h.m文件
- 所有的代码都包装在{}默认都有一个缩进.
-
创建一个简单程序
- UIView(frameCGRect())
- UIColor.red.类方法.的形式,取消[]了.
- 访问当前属性不用使用self.(建议都不用改过来闭包才用)
- 没有;目的是分割语句的.在swift中默认不需要.
- 枚举类型UIButtonContactAdd,swift中.contactAdd.
- @selector改成#selector.
- 实例方法加上@objc func () {
}
- nslog改为print.因为没ns前缀
- 热键cmd+opt+/, 热键color
- //MARK:- ,//MARK: //TODO //FIXME备注
- 添加代码块方法
- 快捷键control+5,快速查找同级对应文件,control+6快速查找文件中方法.
-
基础语法
变量和常量
1. 调用函数怎么写?
2. let,var作用
3. 自动推导,变量/常量的类型会根据右侧的推导结果,推导对应的类型.非常重要的热键,opt + click(鼠标)
4. 在swift对类型要求严格,不会做默认的隐式转换.(例子:let x,let y不能直接相加),所有的类型确定都要由程序员负责.需要怎么处理才能相加呢?
5. 不存在基本数据类型,都是结构体.
6. 如果需要指定变量/常量类型,可以使用let x : double = 值来给x指定类型.很少使用.
7. 关于var和let的选择?
不可变的更安全,开发的时候,通常先使用let,在需要变化的时候再改成var. -
可选项
Optional:
原始定义:some某一类值或none没有值
Int?:
类似Optional代表可能没有值可能有一个Int类型的值
'!':
强制解包'!'写在需要解包变量后,从可选值中去强行获取一个值.如果是nil就会崩溃.(程序员必须为'!'负责)
技巧:'?'在定义用,'!'在解包用.尽量少用'!'.
var的可选值默认值为nil,let可选值没有默认值.
'?'
非强制解包:解包出来的值可能为nil也可能为其值,所以进行计算一定不能使用nil不能计算,但是发送消息可以.有值就发消息没值就不发消息了 -
控制流(逻辑分支)
- if语句:if语句()去掉{}必须
//MARK:-if语句()去掉{}必须 let i = 10 if i > 5 { print("大于") } else { print("小于") }
- 三目运算符:常见.'??'是一个简单的三目运算符
代表可选类型如果有值,获取其值如果没有值取??后面的值,但是优先级较低,所以需要()将??内的解包包起来运算,提高优先级让其正常.
且??前后都需要空格,参与运算+前后不能有空格.
func demo (x:Int? ,y:Int?) { print((x ?? 0) + (y ?? 0)) }
- if let/var:不是if语句是连用语法.进行判断解包
if let 连用:判断对象传递值是否为nil.let后申明的变量作用域仅在{}中.
if var 连用:{}中的值修改时使用.
let oX :Int? = 10 let oName :String? = "哈哈" if let x = oX, var name = oName { name = "嘿嘿" print(String(x) + name) }
- guard let:英文守卫的意思,和if let/var刚好相反,但是也用于解包
守护一定有值,如果没有直接返回,代码执行到else{}结束后一定有值.用guard降低分支的层次,用的很多.
//MARK:-guard let oName:String? = "你好" guard let name = oName else { return } print(name)
- switch:
- swift中可以对任意类型的值分支,不再局限整型
- switch在swift中一般不需要break,如果有分支什么都不干,才使用break
- switch如果是多值使用','处理
//MARK:-<##>switch let num = "10" switch num { case "10","9": print("优秀") default: print("一般") }
-
for循环
//MARK:-for循环 func demo1() { //升序遍历 for i in 0...5 { print(i) } //倒序遍历 for i in (0...7).reversed() { print(i) } }
-
字符串
- 字符串遍历
- 字符串长度传
- 字符个数count(推荐使用)
- NSString中转,as关键字类型转化
- 字符串拼接:()斜线拼接,拼接字符串注意可选项,append好像无效
- 格式化:以前是StringWith...现在以前的with换成()
- 字符串的子串:直接用封装好的文件.
1. 打印出我爱你中国遍历 2. 打印出长度 3. 老王 18 岁 岁是可选值:还要看下 4. 打印敲代码的当前时间 5. 我爱你中国取子串中国.
- 集合
- 数组:OC使用@[],swift也是用[]但是没有@.swift基本数据类型不用包装,基本数据类型对应的也是结构体.
混合数组:开发中几乎不用.如果数组中类型不一致,自动推导的结果是NSObject,swift中可变数组var,不可变let
swift中有一个类型[AnyObject]->任意对象,swift中的一个类可以没有任何父类.- 定义
可变:var arr可变数组,let arr不可变数组 - 遍历
- 按下标遍历
- forin遍历
- 遍历下边和内容1:enumerated():遍历出来的元组数据结构.
- 遍历下边和内容2:(n,s).
- 反序遍历reversed().
- 反序加内容.
- 增删改.
增:append
删:remove等,删除所有等
改:下标直接修改 - 合并
arr1 += arr2 注意:不同类型的数组不能合并,需要进行转化为相同类型
- 定义
-
字典
- 定义:
可变:var dict可变字典,let dict不可变字典 - 遍历
- 遍历字典获取key和value,
let dict = ["name":"校长","age":"5","action":"run"]
for (key,value) in dict {
print(key,value)
}``` 2. 遍历获取元组结构,以及元组内的值 for e in dict { print(e) print("元组内容 \(e.key) \(e.value)")
}
-
增删改查
-
合并
- 定义:
- 数组:OC使用@[],swift也是用[]但是没有@.swift基本数据类型不用包装,基本数据类型对应的也是结构体.
```
改:dictV.updateValue("李四", forKey: "name")
删:dictV.removeValue(forKey:"head")
查:dict["name"]!(经过体统包装的都会变成可选值)
增:dictV.updateValue("李四", forKey: "name")
```
网友评论