2016-06-29 53 views
-2

Gemäß der Dokumentation von XCode (Alt-Klick) gibt removeItemAtPath true oder false zurück. Der folgende Code gibt jedoch den folgenden Fehler:Überprüfen, ob die Datei erfolgreich gelöscht wurde

Wert des Typs '()' kann nicht in den angegebenen Typ 'Bool' konvertiert werden.

let result: Bool = try NSFileManager.defaultManager().removeItemAtPath(<my file path here>) 

Ist die Dokumentation falsch? Wie überprüfe ich, ob die Datei erfolgreich gelöscht wurde? Wird die Ausführung des folgenden Codes übersprungen, wenn der Fehler in removeItemAtPath ausgelöst wird?

Beispiel:

try NSFileManager.defaultManager().removeItemAtPath(<my file path here>) 
doOtherStuff() 

Will doOtherStuff aufgerufen werden, wenn ein Fehler ausgelöst wurde?

+1

siehe Dokumentation über do/try/catch pattern. – user3441734

+1

In Swift wird der in Objective-C verwendete BOOL-Rückgabewert durch einen Do/Try/Catch-Block ersetzt. Also in Swift 'removeItemAtPath' throws, aber in Objective-C' removeItemAtPath' gibt einen BOOL –

+0

wenn es erfolgreich ist, alles unter Ihrem Versuch wird ausgeführt, wenn es fehlschlägt, wird alles unter Ihrem Versuch nicht ausgeführt, aber wenn Sie einen Haken haben, alles unter fang wird bei fehlschlag ausgeführt – MichaelQ

Antwort

1

Will doOtherStuff be called if an error was thrown?

Nein, der ganze Sinn der try das ist, wenn sie es verlässt sofort aus dem aktuellen Bereich ausfällt. Das ist warum Sie das Ergebnis und/oder einen NSError-Zeiger nicht erfassen und testen müssen (und das nicht tun können).

0

Laut den Kommentaren möchten Sie einen Do/Try/Catch-Block verwenden.

do { 
     try NSFileManager.defaultManager().removeItemAtPath("<my file path here>") 
    } catch { 
     print ("The file could not be removed") 
    } 

Wenn die Datei entfernt wird, wird der Code im try-Block ausgeführt. Wenn die Datei nicht entfernt wird, wird der Code im catch-Block ausgeführt.

Wenn Sie zum Beispiel print ("Success") in Ihren try-Block setzen, wird diese print-Anweisung ausgeführt, wenn die Datei erfolgreich entfernt wurde.

Ebenso können Sie im catch-Block den Code eingeben, den Sie ausführen möchten, wenn die Datei nicht entfernt wird. Ich gebe eine einfache Druckanweisung, aber Sie können setzen, was Sie wollen.

0

hier ist eine Methode, die ich mit try/catch verwenden:

func deleteFileFromDocumentsDirectory(fileName : String) ->() { 

    // Optional 1: split file by dot "." 
    let fullName = fileName.componentsSeparatedByString(".") 
    let fileName = fullName[0]; 
    let fileExtension = fullName[1]; 

    let documentsFolder : String = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory,NSSearchPathDomainMask.UserDomainMask, true)[0] 
    let fileManager = NSFileManager.defaultManager() 
    let destinationPath = documentsFolder + "/" + fileName + "." + fileExtension 
    // Optional 2: check, if file exits 
    let fileExists = fileManager.fileExistsAtPath(destinationPath) 

    if fileExists { 
     do { 
      try fileManager.removeItemAtPath(destinationPath) 
     } catch let error as NSError { 
      print("Could not delete \(error), \(error.userInfo)") 
     } 
    } 
} 
+0

Sie sollten 'let error: NSErrorPointer = nil;' entfernen, es ist nutzlos, der catch-Block generiert selbst die 'error'-Konstante. – Moritz

+0

@Eric D sicher, du hast Recht. Ich habe es entfernt. U siehst alles ;-) –

Verwandte Themen