Blocca i cittadini di seconda classe in Objective-C (vs Ruby)?

2

Mi sono sentito leggermente spiritoso l'altro giorno, ho scritto un metodo eachWithIndex: in una categoria NSArray . Ha un typedef come questo:

typedef void (^processItem)(id item, int index);

e il metodo assomiglia a questo:

- (void)eachWithIndex:(processItem)block {
    for (int i=0; i<self.count; i++) {
        id item = [self objectAtIndex:i];
        block(item, i);
    }
}

Tuttavia, se il mio blocco contiene un return in qualsiasi punto, non salta fuori dal metodo chiamante (né dal blocco). Considera questo codice in Ruby:

def blah
    %w{one two three}.each_with_index {|thing, i| puts "#{i}=#{thing}"; return "hello!" if i==1 }
    puts "blah does more stuff"
end

quando i raggiunge uno, il metodo blah terminerà. Questo non succede in Obj-C, e penso che dovrebbe. I blocchi sono più integrati in Ruby rispetto a Objective-C?

    
posta Dan Rosenstark 05.11.2011 - 09:02
fonte

1 risposta

2

Non è davvero una questione di integrazione o di cittadini di seconda classe. Semplicemente lavorano in modi diversi. I blocchi sono funzioni separate in effetti, quindi hanno il loro ambito in cui funziona il ritorno. Il ritorno uscirà dal blocco, ma non il metodo / funzione di chiamata, proprio come se si chiamasse un altro metodo o funzione. Questo fornisce molta coerenza

Per interrompere il tuo metodo devi passare un puntatore BOOL che può essere impostato su Sì per fermare la matrice. Guarda NSArray's enumerateObjectsUsingBlock: metodo che fa essenzialmente la stessa cosa di ognuno con il metodo index (ed è probabilmente meglio usarlo come già esiste e molto probabilmente sarà meglio ottimizzato).

    
risposta data 05.11.2011 - 10:21
fonte

Leggi altre domande sui tag