swift002

有来写学习swift的笔记了。。。。

函数的默认值
func sum3(x: Int = 1, y: Int = 2) -> Int {
    return x + y;
}
print(sum3()) // 3
//print(sum(x: 10)) // 以前的版本,现在不能用了
没有返回值的函数
//MARK: 函数无返回值, 用于闭包时
/*
 1.直接省略
 2.()
 3. Void
 */
func demo1() {
    print("哈哈")
}
func demo2()-> () {
    print("hehe")
}
func demo3() -> Void {
    print("嘻嘻")
}
使用常量记录函数
func sum(x: Int, y: Int) -> Int {
    return x + y
}
// 1>定义一个常量记录函数
let f = sum  // f的格式  (Int, Int) -> Int
// 2>在需要的时候执行
print(f(20, 40))    // 60

//f(<#T##Int#>, <#T##Int#>)   sum(x: <#T##Int#>, y: <#T##Int#>)   这两个调用是这样的
闭包

在OC中block是匿名的函数
在swift中函数是特殊的闭包

闭包:

  1. 提前准备好代码
  2. 在需要的时候执行
  3. 可以当做参数传递

闭包的应用场景:

  1. 异步执行完成回调
  2. 控制器间回调
  3. 自定义视图回调

回调特点:

  1. 以参数回调处理结果
  2. 返回值为Void
// 1>最简单的闭包

let b1 = {  // b1 的类型  () -> ()    没有参数没有返回值的函数     如果没哟参数,没有返回值,可以省略, 连 in 都一起省略
    print("hello")
}
// 执行闭包
b1()     // hello

 // 最简单的 block
 void(^b1)() = ^{
 NSLog(@"Hello");
 };
 b1();
 

// 2>带参数的闭包 
// 闭包中, 参数、返回值、实现代码 都是写在{}中
// 使用关键字 in  分隔定义和实现
// {形参列表 -> 返回值类型 // 实现代码 }
let b2 = { (x: Int) -> () in
    print(x)
}
b2(3)  // 3
// 3>带参数/ 返回值的闭包

let b3 = {
    (x: Int) -> Int in
    return x + 250
}
print(b3(111));  // 361

// 示例
func loadData(completion:@escaping (_ result:[String])->()) -> () {
        
        // GCD: 将任务添加到队列,指定执行任务的函数
        // ‘队列’调度任务(block/闭包), 以同步/异步的方式执行
 
        // 在异步执行任务,获取结果,通过block/闭包 回调
        
        DispatchQueue.global().async { 
            print("耗时操作 \(Thread.current)")  // 耗时操作 <NSThread: 0x600000071900>{number = 3, name = (null)}
            
            // 休眠
            Thread.sleep(forTimeInterval: 1.0)
            //获得结果
            let json = ["头条", "八卦", "粗大事了"]
            
            // 主队列回调
            DispatchQueue.main.async(execute: { 
                print("主线程更新 UI \(Thread.current)")  // 主线程更新 UI <NSThread: 0x600000067300>{number = 1, name = main}
                //回调 ->执行 闭包(通过参数传递的)
                completion(json)
            })
        }
        
    }
//在另外一个方法里调用
// 尾随闭包
loadData { (result) in
            print("获取的新数据 \(result)")   // 获取的新数据 ["头条", "八卦", "粗大事了"]
        }

        // ‘尾’随闭包
        // 如果函数的最后一个参数是闭包, 函数参数可以提前结束,最后一个参数直接使用{}包装闭包的代码。
        // 嵌套的GCD闭包,系统不会把里面的尾随闭包自动处理,可以自己处理

        //按函数本身编写的结果
        loadData(completion: {
            (result) -> () in
            print(result)
        })
{}的坑
let l = UILabel()
        //(l) 参数结束{尾随闭包}
        view.addSubview(l)
        //报错: Extra argument in call
        // 调用了额外的参数       {}是闭包
        {
            let l = UILabel()
            view.addSubview(l)
        }
闭包的循环引用
class ViewController: UIViewController {

    var completionCallBack:(()->())?   // 定义一个属性
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // 闭包对self进行了copy, 闭包执行完以后, 会自动销毁, 同时释放self的引用
        
        // 使用weakSelf打破循环引用
        weak var weakSelf = self      // 只能用var修饰
        // weak 可能会在运行时被修改  -> 指向的对象一旦被释放,会自动设置为 nil
        loadData {
            // 解包两种方式
            // ? 可选解包  如果self已经被释放,不会项对象发送view的消息,更安全合理
            // ! 强制解包  如果self已经被释放,强行解包会崩溃
            
            /*
                weakSelf.view - 只是单纯的发送消息, 没有计算
                强行解包,因为需要计算,可选项不能直接参与运算
            */
            print(weakSelf?.view ?? "")
        }
        
        
        
        // 方法二:swift推荐方法
        // [weak self] 表示 {}中所有self 都是弱引用, 需要注意解包
        loadData { [weak self] in
            print(self?.view ?? "")
        }
        
        // 方法三:
        // [weak self] 表示 {}中所有self 都是assign的,不会强引用,但是,如果对象释放,指针地址不会变化
        // 如果对象被释放,继续调用,就会出现野指针的问题
        loadData { [unowned self] in
            print(self.view)
        }
        
    }

    
    
    func loadData(completion:@escaping () -> ()) -> (){
        
        // 使用属性记录闭包  ->  self对闭包引用了 
        // 循环引用了
        completionCallBack = completion
        
        DispatchQueue.global().async {
            print("耗时操作")
            DispatchQueue.main.async{
             // 回调, 执行闭包
            }
        }
    }
    
    deinit {
        print("over")
    }

}

oc中解决循环引用的两种方法

__weak typeof (self) weakSelf = self;
    [self loadData:^{
        NSLog(@"%@", weakSelf.view);
    }];
    
    /*
     __unsafe_unretained  同样是assign的引用(MRC 中没有 weak)
     在MRC中如果弱引用队形都是使用assign ,不会增加引用计数,但是一旦对象被销毁,地址不会改变,继续访问,会出现野指针错误
     在 ARC weak本质上是一个观察者模式,一旦发现对象不释放,会自动将地址设置为nil, 更加安全
     */
    __unsafe_unretained typeof (self) weakSelf = self;
    [self loadData:^{
        NSLog(@"%@", weakSelf.view);
    }];
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 11,943评论 4 60
  • Swift 介绍 简介 Swift 语言由苹果公司在 2014 年推出,用来撰写 OS X 和 iOS 应用程序 ...
    大L君阅读 3,162评论 3 25
  • 86.复合 Cases 共享相同代码块的多个switch 分支 分支可以合并, 写在分支后用逗号分开。如果任何模式...
    无沣阅读 1,320评论 1 5
  • 曾经有人问我:什么时候我会发自内心的开心?而不是由于社交、或是习惯了微笑而微笑。 我认真去想了想,给出了这样的答案...
    四叶草风铃_阅读 226评论 0 0
  • 我急匆匆地赶到这个陌生的地方,是在一个雨天,那所著名花园的地址揣在我的怀里。 “顺着飘出清香的街走,你就会来到它的...
    厚灵阅读 132评论 0 0