2016-03-24 12 views
0

Ich mag die Struktur dieses Codes.Runtime Overhead von Blöcken für die sofortige Zuweisung von Variablen

NSString *source = ^{ 
    switch ([picker sourceType]) { 
     case UIImagePickerControllerSourceTypeCamera: 
      return @"camera"; 
     case UIImagePickerControllerSourceTypePhotoLibrary: 
     case UIImagePickerControllerSourceTypeSavedPhotosAlbum: 
      return @"library"; 
    } 
}(); 

es zwingt den Compiler einen Fehler zu werfen, wenn Sie einen neuen Fall zu einem Enum hinzufügen und darüber hier vergessen. dieser Code würde nicht

NSString *source = nil; 
switch ([picker sourceType]) { 
    case UIImagePickerControllerSourceTypeCamera: 
     source = @"camera"; 
     break; 
    case UIImagePickerControllerSourceTypePhotoLibrary: 
    case UIImagePickerControllerSourceTypeSavedPhotosAlbum: 
     source = @"library"; 
     break; 
} 

ich weiß nicht, wie teuer der Block Ansatz. ¿weiß jemand den Overhead davon?

+0

Sie können den zweiten Codeblock aufrufen, um eine Compilerwarnung zu verursachen, indem Sie die Warnoption "Check Switch Statements" unter den Buildeinstellungen aktivieren. Dies betrifft natürlich alle "switch" -Anweisungen in Ihrem Code, die Sie möglicherweise nicht möchten. – rmaddy

+0

Warum hat das erste Formular einen Fehler für einen verpassten Fall ausgegeben? – Avi

+0

@Avi Da keine 'Return'-Anweisung erreicht wurde. – rmaddy

Antwort

1

Ihr Code ist stark beschädigt. Du scheinst zwischen Swift und Objective-C verwirrt zu sein. Ihr Problem ist, dass Sie Break-Anweisungen im zweiten Code vergessen haben. Vergleichen Sie nicht ungebrochenen Code mit defektem Code. Korrigieren Sie das zweite Beispiel und prüfen Sie, ob es wirklich einen Fehler gibt, wenn Sie einen Enum-Wert hinzufügen.

+1

Dies ist die richtige Antwort, wenn Sie nicht alle möglichen Werte der Enumeration oder den 'default'-Fall implementieren, wird der Compiler eine Warnung ausgeben, die den Block unnötig macht. –

+0

Ich habe vergessen, die 'Break'-Anweisungen zu setzen, nur einen Fehler in der Transkription. Nicht das Herz der Frage. Aktualisiert – calql8edkos