1.常量和变量
定义一个常量:let 常量初始化赋值后 不能再次赋值
定义一个变量:var 赋值后 可以在此修改 后面一定要修改 否则选择let
2.Swift有数据类型推导 根据后面的值直接推出来的类型(option加鼠标左键4)
3.显示指定类型 let c:Double = 20.5
4.在swift中没有隐式类型转换
类型不同 不能参与运算
5.let&var 选择
建议先使用let 在哪需要修改时 再改成var
6.optional可选类型定义的常量或者变量可能有值 可能没有值(空,nil)
(1)定义的常量或者变量不能 直接参与计算
格式:可选类型- 类型后面加上 “ ?”
eg:var a:Int ?
定义的可选类型的变量默认值是nil
(2)‘ Optional ’表明 定义的变量或者常量是一个可选类型
‘ unwrapped ’ 表明可选类型没有进行解包
(3)let result = a !+ b
‘ !’ 对可选类型的变量或者常量进行强制解包(告诉系统这个值一定存在 你去用吧 ) 如果这个值不存在(unexpectedly found nil while unwrapping an Optional value 对一个可选值为nil 强制解包 崩溃)
在swift里面操作符空格要匹配
(4)??运算符
let result = (a ?? 0)+ b
使用 空合并运算符 ‘ ?? ‘ 判断前面的可选类型的变量或者常量是否有值 如果有值 直接使用 a参与计算 如果a为nil 使用??后面的值参与计算
7.if控制流
(1)if num > 5{
}
‘ ()’ 可以省略
在swift 里面 只有一行代码 也不能省略‘ {}’ 在swift里面 没有‘ 非0即真‘的概念 条件语句的值 只能有true / false 需要一个bool类型的值
(2) 可选类型的判断
-unexpectedly found nil while unwrapping an Optional value
-对一个可选类型的值为nil 强制解包 报错
(3)if let 判断
它的意思是 判断可选类型的变量或者常量(URL)是否有值 有值 就使用前面定义的常量或者变量去记录这个值 如果这个可选类型的变量或者常量为nil 就不执行 if let语句
if let u = url{
//再次就可以使用u 而且这个u是一定存在的
let request = NSURLRequest(URL:u)
(4)多个可选类型的判断
let name:String ?=“张三”
let age : Int ? = 20
//也可以使用var进行判断
if let n = name,(var)a = age
{
print()
}
(5)guard let判断 与if let相反的语法
//在循环里面可以使用break continue,不在循环里面使用return
//guard let 判断可选类型的常量或者变量是否有值 如果有值 则赋值给定义的常量或者变量 否则没有值 执行else语句里面的
guard let u = url else{
(6)可选类型条件的判断
if let …. where….
where子句没有智能提示,子句可以使用&&
8.switch判断
swift 可以判断任意类型 可以省略break 可以省略大括号 case后必须有可执行语句
OC 只能判断整型
9.for循环
for ,while, do while,for in
0..<3 意思是 区间-[0,3)
0…3 意思是闭区间 -[0,3]
10.字符串的定义
(1)定义:swift :string这个类型 是一个结构体它的量级轻 速度是比NSString要快 它可以跟NSString无缝转换 支持字符串的遍历
OC NSString 它是一个对象 不支持字符串的遍历
(2)字符串的拼接
使用“ + ”可以拼接字符串
(3)‘ \()’ 可以拼接字符串
可以不用强制类型转换
(4)字符串长度
//统计字符串字符的个数
characters.count
//统计字节数
一个汉字在UTF8编码格式下占用3个字节
(5)字符串的格式化
(6)字符串的截取
11.集合
(1)数组
定义数组:let 不可变数组 ;var 对应的可变数组
let array = [1,2,3,4]
let array1 = [“张三”,“李四”]
var array2:[string] = [string]()
//添加元素
array2.append(“苹果”)
//数组的遍历
for
for value in array
for (index,value) in array.enumerate
//数组的合并 +
两数组直接相加
类型不匹配 不能直接合并
//数组删除 remove
//数组的容量 capacity
容量是成倍扩展的 是2的倍数
(2)字典
字典的定义 [string :NSObject]这种字典类型是最常用 字典是无序的 数组是有序的
let定义的字典是不可变的 var 是可变的
//合并字典
不同类型的字典不能合并
//字典的删除remove 或者 dict[“age”]= nil
12.函数
(1)//无参数 无返回值
func demo1()
//在swift2.0里面函数的第一个参数默认省略
//有两个参数 无返回值
func demo2(a:Int,b:Int)
//有两个参数 无返回值的函数 num1 num2是外部参数 (是给调用方解释参数是什么意思 参数是干嘛的)
func demo3(num1 a :Int,num2 b:Int){}
//有参数有返回值的函数
func sum(a:Int,b:Int)->Int { return a + b }
(2))函数格式
func 函数名(参数名:参数类型…)->返回值类型{}
(3)没有返回值的三种类型
<1>func demo(num1 a:Int,num2 b:Int){}
<2>func demo(num1 a:Int,num2 b:Int)->Void{}
<3>func demo(num1 a:Int,num2 b:Int)->( ){}
(4)swift中可以使用函数的嵌套
13.闭包
(1)和OC中的block是非常类似的 是一个预先定义好的代码块 可以作为函数的参数传递 也可以作为函数的返回值 在需要的时候调用‘ ( ) ’ 在使用self的时候需要注意循环引用
(2)闭包定义格式
闭包名 = { (参数名 :参数类型,…)->返回值类型 in 执行代码 }
(3)没有返回值的闭包可以直接去掉‘ ->( ) ’
(4)定义一个没有参数 没有返回值的闭包可以直接去掉()->() ()->Void
(5)???尾随闭包
//如果闭包作为函数的最后一个参数的话 则小括号‘()’ 在闭包前面(小括号‘ ()’提前关闭 )
//如果闭包没有参数和返回值 可以省略‘ ()->Void in’
14.OC block循环引用
//加载网络数据的方法
//模拟耗时操作 获取网络数据
15.解决block循环引用
//使用__weak 解决block的循环引用
//对象销毁后 weakSelf指向的地址为nil
__weak typeof(self)weakSelf = self;
//使用__unsafe_unretained解决block的循环引用
//对象销毁后 weakSelf指向地址不变 地址对应对象已经销毁了 崩溃了报野指针
__unsafe_unretained typeof(self)weakSelf = self