1.新增可选项
Optional 可选项 成为可选值 修饰符 ‘?’
- 概念 如果我们定义的常量或者变量 他可能有值 也可能为nil 我们就需要把该常量或者变量定义为optional
- 当程序员输入可选项的时候 系统会加上Optional 告知程序员你当前打印的常量或者变量为可选项
- 可选项不能直接参与运算
- 解决方法
- 01 使用‘!’ 强行解包(程序员向系统保证我的可选项一定有值 肯定不为nil)
fatal error: unexpectedly found nil while unwrapping an Optional value
- 缺点: 如果我们对一个可选项进行解包的时候如果该可选项为nil 的 会造成程序崩溃
- 02 使用‘??’ 运算符
- 可选项 格式 let 或者 var 常量或者变量名: 数据类型?
- 使用场景举例
- sex 男 0 女 1 人妖 nil 泰国
- sex 男 0 女 1 太监 nil 清朝
- 开发中
-后台 头像 url 第一次登陆 nil 如果不为nil
2.if语句相比于oc,可以省略()小括号,可是不可以省略大括弧,而且也没有oc中非零即真的概念,只有ture和flase
func demo1(){
let a:Int? = 20
//这里可以省去小括号
if a > 5 {
print(a)
}
}
3.可选项判断
- 可选项判断 if-let 和 if-var
- 使用if-let 或者 if-var 对可选项进行判断 如果他不为nil 程序员自己定义一个常量或者变量记录他 然后在 我们当前的if-let 或者if-var 的{} 作用于中直接使用我们自己定义好的常量或者变量
func demo1(){
let url = NSURL(string: "http://www.baidu.com")
if let _ = url{
let request = NSURLRequest(URL: url!)
print(request)
}
4.guard
-可选项判断 使用 guard 英文 守护
- 守护程序员定义好的常量或者变量 是否有值 如果为nil 的 完成return
- 判断与if let 相反
- guard 配合 else 使用 还有 return
- 与if-let比较少了一层代码嵌套
func demo(){
let url = NSURL(string: "http://www.baidu.com")
guard let a = url else{
return
}
let request = NSURLRequest(URL: a)
print(request)
}
5.函数的定义
// 定义一个有参数没有返回值的函数
func demo2(num1 a:Int ,num2 b:Int)->Void{
print(a + b)
}
// 定义一个有参数有返回值的函数
func demo1(num1 a:Int , num2 b: Int)->Int{
return a+b
}
//定义一个没有参数没有返回值的函数
func demo()->Void{
}
6.闭包
1.闭包的定义
- 概念
- Swift中的闭包与OC中block 相似
- 闭包是一个代码块 在我们需要的时候执行
- 闭包可以作为参数 还可以作为返回值
- 闭包中使用‘self’ 注意循环引用
//定义一个有参数有返回值的闭包函数,用"in"
func demo3 (){
let closure = {(a:Int , b:Int) -> Int in
return (a + b)
}
print(closure(5,5))
}
//定义一个有参数有返回值的闭包函数
func sum (a :Int,b: Int)->Int{
return (a + b)
}
//定义一个有参数无返回值的闭包
func demo1(){
func sum(a: Int , b : Int){
print(a + b)
}
sum(10, b: 10)
}
// 定义一个没有参数没有返回值的闭包
func demo(){
let closure = {
print("哈哈")
}
closure()
}
}
2.闭包的演练
override func viewDidLoad() {
super.viewDidLoad()
demo { (result) -> () in
print(result)
}
}
func demo(callback:(result:String)->Void){
dispatch_async(dispatch_get_global_queue(0, 0)) { () -> Void in
NSThread.sleepForTimeInterval(2)
let str = "返回数据"
dispatch_async(dispatch_get_main_queue(), { () -> Void in
callback(result : str)
})
}
}
3.闭包的循环引用
和oc的block循环引用的解决方式大抵相同
override func viewDidLoad() {
super.viewDidLoad()
weak var weakSelf = self
closure = {()->() in
print(weakSelf?.view)
}
}
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
closure?()
}
deinit{
print("没了")
}
网友评论