Swift 基础04 —— Objective-C转战Swift

目录

  • 闭包
    • OC的block用法回顾
    • 闭包的使用
  • 懒加载
  • 访问权限
  • 注释

闭包

  • OC中的block是匿名的函数
  • Swift中的闭包是一个特殊的函数
  • block和闭包都经常用于回调

OC的block用法回顾

#import "ViewController.h"
#import "HttpTools.h"

@interface ViewController ()

@property (nonatomic, strong) HttpTools *tools;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.tools = [[HttpTools alloc]init];
}

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    
    __weak ViewController *weakSelf = self;
    
    [self.tools loadData:^(NSString * jsonData) {
        NSLog(@"在控制器中,拿到数据:%@", jsonData);
        weakSelf.view.backgroundColor = [UIColor redColor];
    }];
    
}

- (void)dealloc {
    NSLog(@"ViewController --- dealloc");
}

@end
#import 

NS_ASSUME_NONNULL_BEGIN

@interface HttpTools : NSObject

- (void)loadData:(void(^)(NSString *))finishedCallback;

@end

NS_ASSUME_NONNULL_END
  

#import "HttpTools.h"

@interface HttpTools()

@property(nonatomic, copy) void (^finishedCallback)(NSString *);

@end

@implementation HttpTools

- (void)loadData:(void (^)(NSString * _Nonnull))finishedCallback{
    
    self.finishedCallback = finishedCallback;
    // 1.发送网络的异步请求
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        NSLog(@"已经发送了网络请求:%@", [NSThread currentThread]);
        // 2.回到主线程
        dispatch_sync(dispatch_get_main_queue(), ^{
            NSLog(@"回到主线程:%@", [NSThread currentThread]);
            // 3.获取数据,并且将数据回调出去
            finishedCallback(@"json数据");
        });
        
    });
    
}

@end

闭包的使用

//
//  HttpTools.swift
//  02-闭包的使用

import UIKit

class HttpTools {
    
    var finishedCallback : ((_ jsonData : String) -> ())?
    
    // 闭包类型: (参数列表) -> (返回值类型)
    func loadData(_ finishedCallback : @escaping (_ jsonData : String) -> ()) {
        
        self.finishedCallback = finishedCallback
        
        // 1.发送网络的异步请求
        DispatchQueue.global().async {
            print("发送异步网络请求:\(Thread.current)")
            
            // 2.回到主线程
            DispatchQueue.main.async {
                print("回到主线程:\(Thread.current)")
                
                // 3.进行回调
                finishedCallback("json数据")
            }
        }
    }
    
}
//
//  ViewController.swift
//  02-闭包的使用

import UIKit

class ViewController: UIViewController {
    
    var httpTools : HttpTools?

    override func viewDidLoad() {
        super.viewDidLoad()
        
        httpTools = HttpTools()
        
    }
    
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        /*
         self. 一般可以省略
         1> 如果该方法中有局部变量和成员属性有歧义,那么不能省略
         2> 在闭包中使用成员属性,不能省略
        */
        // 解决方案一
        /*
        weak var weakself : ViewController? = self
        
        httpTools?.loadData({ (jsonData : String) in
            print("在ViewController获取到数据:\(jsonData)")
            
            weakself?.view.backgroundColor = UIColor.red
        })
        */
        // 解决方案二 推荐
        httpTools?.loadData({[weak self] (jsonData : String) in
            print("在ViewController获取到数据:\(jsonData)")
            
            self?.view.backgroundColor = UIColor.red
        })
        // 解决方案三
        /* unowned --> unsafe_unretained (野指针)
        httpTools?.loadData({[unowned self] (jsonData : String) in
            print("在ViewController获取到数据:\(jsonData)")
            
            self.view.backgroundColor = UIColor.red
        })
        */
        // 尾随闭包:如果在函数中,闭包是最后一个参数,那么可以写成尾随闭包
        httpTools?.loadData(){[unowned self] (jsonData : String) in
            print("在ViewController获取到数据:\(jsonData)")
            
            self.view.backgroundColor = UIColor.red
        }
        
    }
    
    deinit {
        print("ViewController ---- deinit")
    }
}

懒加载

import UIKit

/*
 懒加载的两个特点
 1> 用到时再加载
 2> 多次使用只会加载一次
 */

class ViewController: UIViewController {
    
    //lazy var names : [String] = ["aaa", "bbb", "ccc"]
    lazy var names : [String] = {
        let names = ["aaa", "bbb", "ccc"]
        print("懒加载了...")
        return names
    }()
    
    //lazy var btn : UIButton = UIButton()
    lazy var btn : UIButton = {
        let btn = UIButton()
        
        btn.setTitle("按钮", for: .normal)
        btn.setImage(UIImage(named: ""), for: .normal)
        
        return btn
    }()

    override func viewDidLoad() {
        super.viewDidLoad()
        
    }

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        print(names.count)
    }

}

访问权限

/*
 1> internal 内部的
    1.默认情况下所有的类&属性&方法的访问权限都是internal
    2.在本模块(项目/target)中可以访问
 2> private 私有的
    1.只有在本类中可以访问
 3> open 公开的
    1.可以跨模块(项目/target)都是可以访问的
 4> fileprivate
    1.只要是在本文件中都是可以访问的
 */

注释

// 一、单行、多行注释
// 注释和反注释的快捷键都是“command + /”,即“⌘ + /”。(如果是 Windows 键盘则为“Win键 + /”)
/*
	这是注释
*/

// 二、注释提示
// MARK: - 
/// 把光标定位到需要添加注释文档的对象起始行,或上方的空白行。按下“command + Option + /”,即“⌘ + ⌥ + /”。(如果是 Windows 键盘则为“Win键 + ALT + /”)

你可能感兴趣的:(IOS开发之路,iOS,Swift)