记录一下一些想法:今天写swift和oc互相调用时的代码,些许心得,有不足之处还请各位大佬批评指正,不胜感激!!!
一、OC中Block的使用
1.1 block 作为函数参数
- `有参数的block`
- 函数本身如果想把自身的东西传给外界调用者
- 就需要以block参数的形式传递给外界
// 想把内部的东西回调给外界:(用的是block的参数、而非返回值)
- (void)animalWithName:(void(^)(int))name {
NSLog(@"zhe shi yi ge block !");
!name ?: name(1);
}
// 用的是里面回传出来的参数、不是返回值;
[mao animalWithName:^(int idx) {
NSLog(@"mao = %d", idx);
}];
- 声明时候的细节
- 如果声明时候带有(int idx) ,调用的时候会自动带上idx
- 但是在实现中、idx不会带上(因为在实现中idx没有作用)
// (int idx)这里`idx`是方法调用时、默认给外界生成的变量名称、
// 也可以省略、但是外界在调用时候、必须自己加上参数名称;
- (void)animalWithName:(void(^)(int idx))name;
1.2 有返回值的block 作为函数参数
- `有返回值的block`
- ` ^ 后面 没有小括号`,代表block有返回值
-
// 这里 ^ 后面 `没有小括号`,
[mao animalWithName:^int {
return 10;
}];
1.3 有返回值有参数的block 作为函数参数
- `有返回值的block`
- ` ^ 后面 紧跟的是block的返回值,`小括号里`,代表block传出来的参数
// 这里 ^ 后面 `没有小括号`,
[mao animalWithName:^int(int idx) {
return 10;
}];
二、swift中闭包的使用
2.1 闭包表达式
- 用闭包表达式声明一个函数
var fn = {
// 参数列表 -> 返回值类型 in
// 函数体代码
(v1: Int, v2: Int) -> Int in
return v1 + v2
}
- 外界在使用的时候
fn(1, 2)
- 用闭包表达式定义的函数,调用的时候不需要加参数标签;
2.2 闭包表达式 作为函数参数
- 这里闭包表达式作为函数的参数
- 有两个参数,并且有
int类型返回值
func sum(fn: (Int, Int) -> Int) {
// 接收block从外界传回来的值,并打印
print(fn(1, 2))
}
- 外界在使用的时候
- 这里相当于从`函数内部传出来2个参数`,在sum的block中做计算,
- 然后将返回值回传给sum函数的block
sum() {
(v1: Int, v2: Int) -> Int
in return v1 + v2
}
尾随闭包- 如果将很长的闭包表达式作为函数的最后一个实参,使用尾随闭包语法可以增强函数的可读性;
- 这里
尾随闭包:指的是在函数掉用的时候,声明的时候是没有这种说法的 - 尾随闭包是一个被书写在函数调用
括号外面(后面)的闭包表达式
2.3 其余闭包的相关内容参见:
闭包 https://www.jianshu.com/p/042490a85c89









网友评论