美文网首页
Swift 闭包传值和O-C block对比

Swift 闭包传值和O-C block对比

作者: HotRay | 来源:发表于2017-07-25 11:58 被阅读0次

    研究了一天闭包,然后发现尾随闭包,捕获值 这些东西!还有方法里面带闭包,在网上找了些代码,都不是看的特别明白,感觉语法很怪。然后自己写了个闭包传值。

    第一个Viewcontrollrl的显示Label

        self.BlockLable = UILabel.init(frame: CGRect.init(x: 50, y: 150, width: 300, height: 44))
        self.BlockLable?.text = "block传过来的值"
        self.BlockLable?.backgroundColor = UIColor.red
        self.view.addSubview(self.BlockLable!)
    

    接收方法闭包传值

    func nextpage(){
        
        let NextVc = NextController()
        
        NextVc.delegate = self
        NextVc.Blockclek = {
            (text:String) in
            self.BlockLable?.text = text
            
        }
        
        self.navigationController?.pushViewController(NextVc, animated: true)
    

    //第二个VIewConrtollr
    声明闭包,定义闭包
    typealias BlockAction = (String)->(Void)
    var Blockclek:BlockAction?

    func goBack()  {
       
            if   (self.Blockclek != nil)  {
                self.Blockclek!((_textField?.text!)!)
                
      
            self.navigationController?.popViewController(animated: true)
            
            
        }
    }
    

    当我写Swift 写到这里都时候,然后我遇到了闭包作为函数参数,说实在的我用block基本上都是写属性的,作为函数参数一时半会想不出来,然后自己写了一个,很简单的!很久没敲OC代码了,哎 看下我这个简单的block 做为参数!

    第一个控制器.m

    - (void)buttonclilke {

    myViewController *v = [[myViewController alloc]init];
    [v testone:^(NSString *url) {
        NSLog(@"%@",url);
    }];
    [self.navigationController pushViewController:v animated:YES];
    

    第二个控制器.h

    //这是一个类型,返回类型^ 标志,参数

    typedef void(^TestBlock)(NSString*url);

    @interface myViewController : UIViewController

    @property (nonatomic,copy) TestBlock block;

    - (void)testone:(TestBlock)test;

    .m方法实现

    -(void)testone:(TestBlock)test{

    NSString *s = [[NSString alloc]init];
    //这个就可以用来下载! 返回yes 或者no !在block 后面继续在参数
    test(@"This is a block parameter.");
    

    }

    现在对比下OC和Swift

    OC

    typedef void(^TestBlock)(NSString*url);

    • (void)testone:(TestBlock)test;
      test(@"This is a block parameter.");
      [v testone:^(NSString *url) {
      NSLog(@"%@",url);
      }];

    Swift

    @objc public func testss(Head: (String)->(Void)) -> Void {
    Head("hehe")
    }

    vc.testss { (s:String) -> (Void) in
    print("s = (s)")
    }

    很明显 Swift更加简单!原理就是block是一个类型,记住格式!原理我暂且不说,网上一大把。

    记住
    OC 返回类型,^命名 ,参数
    Swift 名字 : 类型 (参数类型)->(返回值)

    相关文章

      网友评论

          本文标题:Swift 闭包传值和O-C block对比

          本文链接:https://www.haomeiwen.com/subject/hejwkxtx.html