FilterMethode

  • FilterMethode

    Hallo alle zusammen :)
    So nun möchte ich mich auch ein wenig an der iOS-Programmierung veruschen. Allerdings ist das ganze nicht ganz freiwillig sondern vom Studium aus.
    Da ich ein ganzer Neuling bin habe ich leider ein paar kleinere und größere Probleme.

    Aber kurz mal zu unserer Anwendung die wir in der Vorlesung schreiben.
    Im Moment ist es eine kleine toDo Liste in dieser ein paar Tasks gelistet sind (im Moment hart Gecodet)
    sprich : Task 1 Task 2 ..... usw. wenn man auf einen Task drückt, kommt man auf den nächsten View und kann dort in einem Textfield den Namen dieser Task ändern.

    So.... nun soll das ganze um eine Filter Methode erweitert werden. Hier dazu die Aufgabe:

    Aufgabe 1a:

    Erweitern Sie die bestehende List-Klasse um eine Filter-Funktion:

    - (NSArray *)filterTasks:(BOOL (^)(Task *task)filter;

    Die Methode soll eine Liste der gefilterten Tasks zurückliefern.

    Die Art der Filterung überlasse ich Ihnen.


    Das habe ich wie folgt umgesetzt.

    list.h

    Quellcode

    1. #import <Foundation/Foundation.h>
    2. #import "Task.h"
    3. #import "NSArray_Filter.h"
    4. @interface List : NSObject
    5. @property (nonatomic, strong) NSString *title;
    6. @property (nonatomic, strong) NSDate *deadline;
    7. @property (nonatomic, strong) NSArray *tasks;
    8. - (void)addTask:(Task *)task;
    9. - (void)diplayTasks;
    10. - (NSInteger)numberOfTasks;
    11. - (NSArray *)filterTasks:(BOOL (^)(Task *task))filter;
    12. @end
    Alles anzeigen


    Quellcode

    1. [b]List.m[/b]
    2. #import "List.h"
    3. @interface List ()
    4. @end
    5. @implementation List
    6. - (void)addTask:(Task *)task {
    7. NSMutableArray *newTasks = [[NSMutableArray alloc] initWithArray:self.tasks];
    8. if (task) {
    9. [newTasks addObject:task];
    10. }
    11. self.tasks = [NSArray arrayWithArray:newTasks];
    12. }
    13. - (void)diplayTasks {
    14. for (int i = 0; i < self.tasks.count; i++) {
    15. Task *task = self.tasks[i];
    16. NSLog(@"Task: %@", task.title);
    17. self.tasks = [self.tasks filter:^BOOL(Task *task) {
    18. return [task.title hasPrefix:@"Task"];
    19. }];
    20. }
    21. }
    22. - (NSInteger)numberOfTasks {
    23. return [self.tasks count];
    24. }
    25. //hier ist Aufgabe 1
    26. [b]- (NSArray *)filterTasks:(BOOL (^)(Task *task))filter {
    27. NSMutableArray *result = [self.tasks mutableCopy];
    28. for (Task *task in self.tasks) {
    29. BOOL res = filter(task);
    30. if (res)
    31. [result addObject:result];
    32. }
    33. return result;
    34. }[/b]
    35. @end
    Alles anzeigen


    Aufgabe 1b:

    Erweitern Sie die Klasse NSArray um eine allgemeine Filter-Funktion, die auf alle Arrays angewendet werden kann:

    - (NSArray *)filter:(BOOL (^)(id object))filterBlock;


    Quellcode

    1. [b]NSArray_Filter.h[/b]
    2. #import <Foundation/Foundation.h>
    3. @interface NSArray (Filter)
    4. - (NSArray *)filter:(BOOL (^)(id object))filterBlock;
    5. @end



    Quellcode

    1. [b]NSArray_Filter.m[/b]
    2. #import "NSArray_Filter.h"
    3. @implementation NSArray(Filter)
    4. - (NSArray *)filter:(BOOL (^)(id object))filterBlock {
    5. NSMutableArray *result = [self mutableCopy];
    6. for (id obj in self) {
    7. BOOL res = filterBlock(obj);
    8. if (res)
    9. [result addObject:result];
    10. }
    11. return result;
    12. }
    13. @end
    Alles anzeigen



    Aufgabe 1c:
    Verwenden Sie die Filter-Methode aus 1b in 1a.


    Nun wenn ich die Filter Methode in List.m verwende passiert nichts.

    Quellcode

    1. self.tasks = [self.tasks filter:^BOOL(Task *task) {
    2. return [task.title hasPrefix:@"Task"];
    3. }];




    wäre wirklich dankbar, wenn mir da jemand unter die Arme greifen könnte.

    Liebe Grüße
  • Also bei mir crashed es irgendwann, wenn das mit dem Prefix nicht mehr stimmt.
    Hältst Du es eigentlich für sinnvoll, das Tasks-Array bei jedem Schleifendurchlauf zu filtern? Wäre es nicht sinnvoller, die Filterung vor dem Schleifendurchlauf zu machen?

    Hältst Du es generell für sinnvoll, das Tasks-Array komplett durch das Filterergebnis zu ersetzen?

    Und was noch wichtiger ist: Was sollte Deiner Meinung nach passieren, dass dann nicht passiert?
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • Schnelle Lösungsansätze:

    1) Umbau der NSArray-internen Filtermethode

    Quellcode

    1. - (NSArray *)filter:(BOOL (^)(id object))filterBlock {
    2. NSMutableArray *result = [NSMutableArray array]; // Creating a mutable copy leads to having an array with the existing items. It's better to start from scratch.
    3. for (id obj in self) {
    4. BOOL res = filterBlock(obj);
    5. if (res == YES) {
    6. [result addObject:obj];
    7. }
    8. }
    9. return result;
    10. }


    2) Entzerren der Display-Methode

    Quellcode

    1. - (void)displayTasks {
    2. [self outputArray:[self tasks]];
    3. }
    4. - (void)displayTasksStartingWithString:(NSString*)startString {
    5. NSArray * filteredTasks = [self.tasks filter:^BOOL(Task *task) {
    6. return [task.title hasPrefix:startString];
    7. }];
    8. [self outputArray:filteredTasks];
    9. }
    10. - (void)outputArray:(NSArray*)array {
    11. for (Task * item in array) {
    12. NSLog(@"Item: %@", [item title]);
    13. }
    14. }
    Alles anzeigen


    3) Die - (NSArray *)filterTasks:(BOOL (^)(Task *task))filter; der Task wird nie benutzt – warum ist die überhaupt da?

    Jedenfalls sollten diese Änderungen ausreichend sein, um das gewünschte Resultat zu erleben:

    Quellcode

    1. #import <Foundation/Foundation.h>
    2. #import "Task.h"
    3. #import "List.h"
    4. int main(int argc, const char * argv[])
    5. {
    6. @autoreleasepool {
    7. List * list = [[List alloc] init];
    8. [list addTask:[Task taskWithTitle:@"Task 1"]];
    9. [list addTask:[Task taskWithTitle:@"untasked"]];
    10. [list addTask:[Task taskWithTitle:@"Task 2"]];
    11. [list addTask:[Task taskWithTitle:@"Do something"]];
    12. [list addTask:[Task taskWithTitle:@"Task 3"]];
    13. [list addTask:[Task taskWithTitle:@"Task 4"]];
    14. [list addTask:[Task taskWithTitle:@"stupid quicker"]];
    15. [list addTask:[Task taskWithTitle:@"with more energy"]];
    16. [list addTask:[Task taskWithTitle:@"Task 5"]];
    17. [list displayTasks];
    18. NSLog(@"\n\n\t---\n\n\n");
    19. [list displayTasksStartingWithString:@"Task"];
    20. }
    21. return 0;
    22. }
    Alles anzeigen

    2014-05-14 13:59:22.056 SimpleToDoList[7094:303] Item: Task 1
    2014-05-14 13:59:22.058 SimpleToDoList[7094:303] Item: untasked
    2014-05-14 13:59:22.058 SimpleToDoList[7094:303] Item: Task 2
    2014-05-14 13:59:22.059 SimpleToDoList[7094:303] Item: Do something
    2014-05-14 13:59:22.059 SimpleToDoList[7094:303] Item: Task 3
    2014-05-14 13:59:22.059 SimpleToDoList[7094:303] Item: Task 4
    2014-05-14 13:59:22.059 SimpleToDoList[7094:303] Item: stupid quicker
    2014-05-14 13:59:22.060 SimpleToDoList[7094:303] Item: with more energy
    2014-05-14 13:59:22.060 SimpleToDoList[7094:303] Item: Task 5
    2014-05-14 13:59:22.060 SimpleToDoList[7094:303]

    ---


    2014-05-14 13:59:22.061 SimpleToDoList[7094:303] Item: Task 1
    2014-05-14 13:59:22.061 SimpleToDoList[7094:303] Item: Task 2
    2014-05-14 13:59:22.061 SimpleToDoList[7094:303] Item: Task 3
    2014-05-14 13:59:22.062 SimpleToDoList[7094:303] Item: Task 4
    2014-05-14 13:59:22.062 SimpleToDoList[7094:303] Item: Task 5


    Den Code saubermachen darfst Du selbst. ;)
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P