平时经常用的为什么手写不出来,因为模板根本没放心里记住,很难么,并不是,显然是懒惰的原因.
(返回值类型)(^block名称)(参数类型) = ^(参数) {};
OC写法
NSDictionary *dic = @{@"1":@"abc",@"2":@"234"};
NSString *(^MHBlock)(NSDictionary *) = ^(NSDictionary * dic) {
NSArray *keys = dic.allKeys;
NSMutableArray *valueArray = [NSMutableArray array];
for (NSString *item in keys) {
[valueArray addObject:[NSString stringWithFormat:@"%@=%@",item,dic[item]]];
}
NSString *resultStr = [valueArray componentsJoinedByString:@"&"];
return resultStr;
};
MHBlock(dic);
Swift写法
{(参数) ->(返回值类型) in statements }
// 第一个不重复的字符
let dic = ["1":"abc", "2":"cdf"];
let mhfBlock:((Dictionary<String, String>)->(String))!
mhfBlock = {(result) ->(String) in
let mhf = result.keys
var strArray = [String]()
for item in mhf {
strArray.append("\(item)=\(dic[item]!)")
}
let str = strArray.joined(separator: "&")
return str
}
mhfBlock(dic)
闭包格式
{(parameters) -> returnType in
statements
}
func testMhfClosure() {
let names = ["chari", "alex", "Ea"];
func backward(_ str1: String, _ str2: String) -> Bool {
return str1 > str2
}
// sorted函数的参数是一个闭包,下面传了一个方法名,由此说明:嵌套函数是一个有名字但并可以捕获其封闭函数域内值的闭包
var reversedName = names.sorted(by:backward)
// 普通闭包格式:(参数: 参数类型,...) -> 返回值类型 in ...
reversedNames = names.sorted(by:{(_ str1: String, _ str2: String) -> Bool in return str1 > str2})
// 根据Swift的类型推断,参数类型及参数括号可以去掉,返回值类型可以去掉
reversedNames = names.sorted(by:{str1, str2 in return str1 > str2})
// 单行表达式:可以去掉return
reversedNames = names.sorted(by:{str1, str2 in str1 > str2})
// 使用参数名缩写:参数和in也可以去掉
reversedNames = names.sorted(by:{$0 > $1})
// 使用运算符:因为Swift中为字符串重载了大于号小于号
reversedNames = names.sorted(by:>)
// 使用尾随闭包:前提是闭包必须是函数的最后一个参数
reversedNames = names.sorted(){$0 > $1}
// 使用尾随闭包:闭包是函数唯一参数时,可以省掉参数括号
reversedNames = names.sorted {$0 < $1}
}