Can I use the concept of reducing the array from fast in the lens c?

I have these lines of code in Swift:

let graphPoints:[Int] = [4, 2, 6, 4, 5, 8, 3] let average = graphPoints.reduce(0, combine: +) / graphPoints.count 

Is it possible to "translate" these lines of code into object code c?

It’s not very clear to me how the concept of combined combining works. I read about it, but it is still unclear.

I took the code from this lesson: http://www.raywenderlich.com/90693/modern-core-graphics-with-swift-part-2

Please, help. Thanks.

+7
arrays ios swift reduce
source share
5 answers

let's say that you have an NSNumber stored in NSArray , you can use this KVC collection statement:

 NSArray *someNumbers = @[@0, @1.1, @2, @3.4, @5, @6.7]; NSNumber *average = [someNumbers valueForKeyPath:@"@avg.self"]; 
+7
source share

The reduce function is not standard in Objective-C. You can implement it as an extension of NSArray , though.

In your case, you have an Int array in Swift. You cannot have this in Objective-C, you need an NSNumber array.

Here is a reduce implementation that should work in your case:

 @implementation NSArray (Helpers) - (NSInteger)reduceInt:(NSInteger)initial combine:(NSInteger (^)(NSInteger acum, NSInteger element))block { if (!self) { return initial; } NSInteger acum = initial; for (id element in self) { if ([element isKindOfClass:[NSNumber class]]) { acum = block(acum, [(NSNumber *)element integerValue]); } } return acum; } @end 

You can use it with your array, something like this:

 NSArray *a = @[@1, @2, @3]; NSInteger result = [a reduceInt:0 combine:^NSInteger(NSInteger acum, NSInteger element) { return acum + element; }]; 
+1
source share

how to translate the abbreviation to ObjC (or better say how to solve your "average problem" in Objective-C), Andre Slotta answered perfectly. quick cuts are much more. I will try to answer the second part of your question, how does the concept work in quick

 func reduce<T>(initial: T, @noescape combine: (T, Self.Generator.Element) throws -> T) rethrows -> T 

To return the result of a multiple call are combined with the accumulated value, initialized initial and each element of "I", in turn, i.e. return combination (combination (... combination (combination (initial, independent [0]), self [1]), ... self [count-2]), self [count-1]).

 let arr: Array<Int> = [1,2,3,4,5] let sum = arr.reduce(0) { (sum, i) -> Int in return sum + i } print(sum) // 15 // this is an quasi equivalent of var sum1 = 0 // ..... reduce(0).... arr.forEach { (elementValue) -> Void in sum1 = sum1 + elementValue // ...{ return sum + i } } print(sum1) // 15 reduce function will return accumulated inital value // reduce is part of SequenceType protocol, that is why let arr1 = ["H","e","l","l","o"," ","w","o","r","l","d"] let str = arr1.reduce("") { (str, s) -> String in str + s } // works the same way print(str) // "Hello world" // let have a litle bit more complex example, to see how powerful, useful and easy to use reduce can be let dict = arr1.reduce([:]) { (var dict, s) -> Dictionary<Int,String> in let i = dict.count dict.updateValue(s, forKey: i+1) return dict } print(dict) // [11: "d", 10: "l", 2: "e", 4: "l", 9: "r", 5: "o", 6: " ", 7: "w", 3: "l", 1: "H", 8: "o"] 
0
source share

Burn NSArray extension

 - (NSInteger)reduceStart:(NSInteger)start combine:(NSInteger(^)(NSInteger x, NSInteger y))combine { for (NSNumber* n in self) { if ([n isKindOfClass:[NSNumber class]]) { start = combine (start, n.integerValue); } } return start; } 

to fix all the mistakes that I made, and what it is. Only less flexible than Swift.

0
source share

For Objective-C, I would add higher order functions to this list of answers: https://github.com/fanpyi/Higher-Order-Functions

 #import <Foundation/Foundation.h> typedef id (^ReduceBlock)(id accumulator,id item); @interface NSArray (HigherOrderFunctions) -(id)reduce:(id)initial combine:(ReduceBlock)combine; @end #import "NSArray+HigherOrderFunctions.h" @implementation NSArray (HigherOrderFunctions) -(id)reduce:(id)initial combine:(ReduceBlock)combine{ id accumulator = initial; for (id item in self) { accumulator = combine(accumulator, item); } return accumulator; } @end 

Example:

  NSArray *numbers = @[@5,@7,@3,@8]; NSNumber *sum = [numbers reduce:@0 combine:^id(id accumulator, id item) { return @([item intValue] + [accumulator intValue]); }]; NSNumber *multiplier = [numbers reduce:@1 combine:^id(id accumulator, id item) { return @([item intValue] * [accumulator intValue]); }]; NSLog(@"sum=%@,multiplier=%@",sum,multiplier); 
0
source share

All Articles