方法
定义方法
OC:
// Demo.h
#import <Foundation/Foundation.h>
@interface Demo : NSObject
-(void)sayHelloTo:(NSString*)name;
@end
// Demo.m
#import "Demo.h"
@implementation Demo
-(void)sayHelloTo:(NSString*)name{
NSLog(@"hello, %@", name);
}
@end
ruby:
def say_hello_to(name)
puts "hello, #{name}"
end
调用方法
OC:
// main.m
#import <Foundation/Foundation.h>
#import "Demo.h"
int main(int argc, char *argv[]) {
@autoreleasepool {
[[Demo new] sayHelloTo:@"帅哥"];
}
}
ruby:
say_hello_to("帅哥")
参数的默认值
OC:
// Demo.h
#import <Foundation/Foundation.h>
@interface Demo : NSObject
-(void)sayHelloTo:(NSString*)name;
@end
// Demo.m
#import "Demo.h"
@implementation Demo
-(void)sayHelloTo:(NSString*)name{
if (!name) {
name = @"美女";
}
NSLog(@"hello, %@", name);
}
@end
// main.m
#import <Foundation/Foundation.h>
#import "Demo.h"
int main(int argc, char *argv[]) {
@autoreleasepool {
[[Demo new] sayHelloTo:nil];
}
}
# ruby:
def say_hello_to(name="美女")
puts "hello, #{name}"
end
方法的返回值
OC:
// Demo.h
#import <Foundation/Foundation.h>
@interface Demo : NSObject
-(NSString*)sayHelloTo:(NSString*)name;
@end
// Demo.m
#import "Demo.h"
@implementation Demo
-(NSString*)sayHelloTo:(NSString*)name{
return name;
}
@end
// main.m
#import <Foundation/Foundation.h>
#import "Demo.h"
int main(int argc, char *argv[]) {
@autoreleasepool {
NSLog(@"%@", [[Demo new] sayHelloTo:@"美女"]);
}
}
ruby:
def say_hello_to(name="美女")
return "hello, #{name}"
end
p say_hello_to
代码块
声明和调用块
OC:
dispatch_block_t sayHello;
sayHello = ^(){
NSLog(@"这里是 Block");
};
NSLog(@"开始");
sayHello();
NSLog(@"结束");
ruby:
def say_hello
puts "开始"
yield # 把控制权暂时让给 Block
puts "结束"
end
say_hello {
puts "这里是 Block"
}
传参数给块
OC:
-(void)someMethodThatTakesABlock:(void (^)(NSInteger x)) sayHello{
NSLog(@"开始");
sayHello(123);
NSLog(@"结束");
}
[self someMethodThatTakesABlock:^(NSInteger x) {
NSLog(@"这里是 Block,我收到了%ld", x);
}];
ruby:
def say_hello
puts "开始"
yield 123 # 把控制权暂时让给 Block
puts "结束"
end
say_hello { |x|
puts "这里是 Block,我收到了#{x}"
}
块的回调
OC:
// 逻辑部分
typedef BOOL (^LogicBlock)(NSNumber *);
LogicBlock logic = ^BOOL(NSNumber * num){
if (num.integerValue % 2==0) {
return YES;
}else {
return NO;
}
};
// Block
typedef NSArray* (^PickBlock)(NSArray*, LogicBlock);
PickBlock pick = ^(NSArray* list, LogicBlock logic){
NSMutableArray * result = @[].mutableCopy;
[list enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSNumber * num = obj;
if (logic(num)) {
[result addObject:num];
}
}];
return [result copy];
};
// 得到结果
NSArray * dataList = @[@(1), @(2), @(3), @(4), @(5), @(6), @(7), @(8), @(9),@(10)];
NSLog(@"%@", pick(dataList, logic));// => (2, 4, 6, 8, 10)
ruby:
def pick(list)
result = []
list.each do |i|
result << i if yield(i) # 如果 yield 的返回值是 true 的話...
end
return result
end
p pick([*1..10]) {
|x| x % 2 == 0 # 逻辑部分
}
# => [2, 4, 6, 8, 10]
- 代码块的本质,就是将一块代码抽离出来
-
ruby
的block
是代码的直接替换代码,简单而又直观 -
objC
的block
是代码的间接来回指向,强调一来一回
参考资料:
railsbook
goshdarnblocksyntax
- 持续更新。
- 若有更好的资料,感谢交流。
- 若有错误的内容,感谢斧正。