zoukankan      html  css  js  c++  java
  • Block作为参数时的使用

    Block作为参数使用,常见于各框架之中,比如在封装一个类时,当做什么事情由外界去决定,什么时候调用由自己的类决定时,这时候就需要将block作为参数使用。


    下面我们模仿AFNetworking的manager,以自定义一个简单的工具类CalculatorManager为例:
    1.CalculatorManager.h文件

    #import <Foundation/Foundation.h>
    
    @interface CalculatorManager : NSObject
    
    /** 计算结果值*/
    @property(assign, nonatomic) int result;
    +(instancetype)sharedCalculatorManager;
    
    //block作为参数时格式与其它类型定义时一致,都是(类型)变量名,看起来有些晕人
    -(void)calculate:(int(^)(int))calculateBlock;
    
    @end
    

    2.CalculatorManager.m文件

    #import "CalculatorManager.h"
    
    static CalculatorManager *instance = nil;
    
    @implementation CalculatorManager
    //单例(可忽略)
    +(instancetype)allocWithZone:(struct _NSZone *)zone
    {
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            if (instance == nil) {
                instance = [super allocWithZone:zone];
            }
        });
        return instance;
    }
    
    +(instancetype)sharedCalculatorManager
    {
        return [[self alloc] init];
    }
    
    //方法中定义了一个block数据类型参数(返回值为int类型的,且带有一个int类型的形参)
    -(void)calculate:(int (^)(int))calculateBlock
    {
        //calculateBlock接受外界传入的代码块,也就意味着怎么去操作是由外界调用者决定的
        _result = calculateBlock(_result);//将_result的值作为实参传入
    }
    
    @end
    

    3.外界控制器调用

    -(void)viewDidLoad {
        [super viewDidLoad];
        
        CalculatorManager *manager = [CalculatorManager sharedCalculatorManager];
        [manager calculate:^int(int i) {
            //参数i自加1,然后返回
            i++;
            return i;
        }];
        NSLog(@"%d",manager.result);//输出结果为1
    }
    

    可以看到,工具类CalculcatorManager的计算方法calculate:^int(int)calculateBlock其具体实现,交由了外界的控制器调用者去决定了。虽然有些许绕,但只要搞清楚block的作为参数使用时的格式,理解起来也很快的,如果先前对这类型的用法在理解上抱有疑惑的话,希望这个小例子能帮到您:)

  • 相关阅读:
    LeetCode Path Sum II
    LeetCode Longest Palindromic Substring
    LeetCode Populating Next Right Pointers in Each Node II
    LeetCode Best Time to Buy and Sell Stock III
    LeetCode Binary Tree Maximum Path Sum
    LeetCode Find Peak Element
    LeetCode Maximum Product Subarray
    LeetCode Intersection of Two Linked Lists
    一天一个设计模式(1)——工厂模式
    PHP迭代器 Iterator
  • 原文地址:https://www.cnblogs.com/ShaRuru/p/5149801.html
Copyright © 2011-2022 走看看