2016-06-01 16 views
0

Ich habe versucht, versucht und fangen im folgenden CodeVersuchen und Fangen mit NSURL (fileURLWithPath)

if let s = songId {  
    let track: NSURL! 
    track = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource(s, ofType: "mp3")!) 
    ............. 
} 

ich mit dem folgenden Code kam zu implementieren:

do { 
    track = try NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource(s, ofType: "mp3")!) 
} 
catch let error as NSError { 
    print("NSURL Error: \(error.localizedDescription)") 
} 

Aber ich die folgenden Warnungen:

keine Anrufe zu werfen Funktionen treten innerhalb ‚versuchen‘ Ausdruck

und

'fängt' Block ist nicht erreichbar, da keine Fehler in 'do' Block

Und das ist mir fremd geworfen werden, weil diese Konstruktion in der Regel funktioniert. Nur mit NSURL funktioniert diese Konstruktion nicht. Und ich kann nicht herausfinden, warum das passiert. Vielleicht hat es etwas damit zu tun, dass es optional ist, aber ich bin mir nicht sicher. Ich kann nicht herausfinden, wie man das löst. Ich muss versuchen/fangen oder etwas ähnliches, aber ich kann es nicht herausfinden, wie es funktioniert.

Ich sah einige ähnliche Probleme bei Google, aber es gab mir keine Antwort. Also meine Frage ist: Wie kann ich eine Try/Catch-Konstruktion oder etwas ähnliches mit NSURL implementieren?

Vielen Dank im Voraus.

Antwort

4

Es gibt keine Methoden, die mit throws Schlüsselwort bei der Definition markiert sind. Es macht also wirklich keinen Sinn, den Code mit try-catch zu verpacken. Ich würde empfehlen, dies zu berücksichtigen:

let s = "song" 
guard let trackURL = NSBundle.mainBundle().URLForResource(s, withExtension: "mp3") else { 
    print("File not found in the app bundle: \(s).mp3") 
    return false 
} 

Hilft es?

+0

Vielen Dank, das ist eine schöne Lösung! – Bas

+2

Warum nicht einmal 'guard let trackURL = NSBundle.mainBundle(). URLForResource (s, mitErweiterung:" mp3 ") else {...? – vadian

+0

@vadian vernünftige Beobachtung. Wird aktualisiert, sobald ich meinen Laptop bekomme. –

2

Dieser Initialisierer schlägt nicht fehl und wirft oder versagt nicht, so dass ein try/catch-Block nicht notwendig ist. Die Erklärung ist:

public init(fileURLWithPath path: String) 

Wenn es einen Fehler aus, könnte als deklariert werden würde:

public init(fileURLWithPath path: String) throws 

Oder wenn es ohne werfen einen Fehler fehlschlagen könnte, es würde als deklariert werden:

public init?(fileURLWithPath path: String) 

Wenn Sie sicher sind, dass das Paket immer die gewünschte Spur enthält, können Sie einfach

verwenden
+0

Es ist möglich, dass die Variable einen Titelnamen enthält, der nicht existiert. Also muss ich nachsehen. Danke für die Antwort. Der Deklarationsteil ist hilfreich! – Bas