A guide on how to translate Objective-C blocks into Ruby blocks.
block = lamda { |param| ... }
block = lamda do |param|
...
end
block = -> param { ... }
block = -> param do
...
end
block = Proc.new{ |param| ... }
block = Proc.new do |name|
....
end
block = proc { ... }
block = proc do |name|
...
end
+ animateWithDuration:(NSTimeInterval)duration
animations:(void (^)(void))animations
this method takes two arguments duration and animations, where animations is a block (lambda) that takes no arguments
[UIView animateWithDuration:0.2 animations:^{view.alpha = 0.0;}]
UIView.animateWithDuration(0.2, animations:-> { view.alpha = 0.0 })
animateWithDuration:(NSTimeInterval)duration
animations:(void (^)(void))animations
completion:(void (^)(BOOL finished))completion
this method takes three arguments duration, animations and completion where animations and completion are blocks. the animations block does not take an argument, but completion does.
[UIView animateWithDuration:0.2
animations:^{view.alpha = 0.0;}
completion:^(BOOL finished){ [view removeFromSuperview]; }];
# Using the Ruby 1.9 Lambda sytax
UIView.animateWithDuration(0.2,
animations:-> { view.alpha = 0.0 },
completion:-> finished { view.removeFromSuperview })
Since we don't use the finished variable, we could also do it in Ruby this way:
# Using the Ruby 1.9 Lambda sytax
UIView.animateWithDuration(0.2,
animations:-> { view.alpha = 0.0 },
completion:-> _ { view.removeFromSuperview })
enumerateObjectsUsingBlock:(void (^)(id obj, BOOL *stop))block
This NSSet method is an enumeration method that takes a block with two arguments.
NSSet *aSet = [NSSet setWithObjects: @"X", @"Y", @"Z", @"Pi", nil];
NSString *aString = @"z";
[aSet enumerateObjectsUsingBlock:^(id obj, BOOL *stop){
if ([obj localizedCaseInsensitiveCompare:aString]==NSOrderedSame) {
NSLog(@"Object Found: %@", obj);
*stop = YES;
}
} ];
the_set = NSSet.setWithObjects("X", "Y", "Z", "Pi", nil)
the_str = "z"
the_set.enumerateObjectsUsingBlock(lambda do |obj, stop|
if obj.localizedCaseInsensitiveCompare(the_str) == NSOrderedSame
NSLog("Object Found: %@", obj)
stop.assign(true)
end
end)
(void)enumerateObjectsWithOptions:(NSEnumerationOptions)opts
usingBlock:(void (^)(id obj, NSUInteger idx, BOOL *stop))block
This NSArray method uses Block-based Enumeration
NSArray *anArray = [NSArray arrayWithObjects:@"A", @"B", @"D", @"M", nil];
NSString *string = @"c";
[anArray enumerateObjectsUsingBlock:^(id obj, NSUInteger index, BOOL *stop){
if ([obj localizedCaseInsensitiveCompare:string] == NSOrderedSame) {
NSLog(@"Object Found: %@ at index: %i",obj, index);
*stop = YES;
}
} ];
the_array = ["A", "B" ,"D", "C", "M"]
the_str = "c"
the_array.enumerateObjectsUsingBlock(-> obj, index, stop {
if (obj.localizedCaseInsensitiveCompare(the_str) == NSOrderedSame)
NSLog("Object Found: %@ at index: %@", obj, index)
stop.assign(true)
end
})
strings = ["string 1", "String 21", "string 12", "String 11", "String 02"]
comparison_opts = NSCaseInsensitiveSearch | NSNumericSearch | NSWidthInsensitiveSearch | NSForcedOrderingSearch
current_locale = NSLocale.currentLocale
result = strings.sortedArrayUsingComparator(lambda do |first, second|
first_range = NSMakeRange(0, first.length)
first.compare(second, options:comparison_opts, range:first_range, locale:current_locale)
end
)
NSLog("finderSortArray: %@", result)