2016-11-02 3 views
2

In swift3 habe ich Probleme beim Zugriff auf lokale Dateien, die ich heruntergeladen und dann entpackt habe.Optional in Dateipfad Swift3

Der Pfad enthält "Optional":

Users/name/Library/Developer/CoreSimulator/Devices/..../data/Containers/Data/Application/... 
/Documents/Optional("folder-name")/Optional("file-name") 

Mein Code, diesen Weg zu schaffen ist:

let videoPath = fileManager!.appendingPathComponent("\(MyObj.folder)/\(MyObj.fileName)") 
SpeedLog.print(videoPath.path) 

Die Klasse MyObj ist:

class MyObj : NSObject, NSCoding { 
var fileName:String! 
var folder:String! 

required convenience init?(coder decoder: NSCoder) { 
    self.init() 
    self.fileName = decoder.decodeObject(forKey: "fileName") as! String 
    .... 
} 
convenience init(id:Int,fileName:String,...) { 
    self.init() 
    self.fileName = fileName 
    .... 
} 
func encode(with coder: NSCoder) { 
    if let fileName = fileName { coder.encode(fileName, forKey: "fileName") } 
    .... 
} 

Wie der Weg bauen ohne "Optional?

Antwort

1

Wenn Sie in Ihrer String-Ausgabe "Optional" sehen, bedeutet dies, dass Sie eine optionale übergeben, eine Variable, die einen Wert enthalten könnte oder nil enthalten könnte. Wenn Sie sicher sind, dass es nicht nil ist, wenn Sie es verwenden möchten, können Sie erzwingen es durch Hinzufügen ! zu seinem Namen, was es nicht mehr optional macht. Wenn Sie dies mit einer Variablen tun, die nil ist, erhalten Sie einen Laufzeitfehler. Alternativ können Sie mit let auspacken.

var optional:String?   // optional, contains nil 
print(optional)     // 'nil' 
optional = "something"   // still optional, contains "something" 
print(optional)     // 'Optional("something")' 
print(optional!)    // 'something' 
let nonOptional = optional!  // not optional, contains "something" 
print(nonOptional)    // 'something' 

Es gibt viel mehr über Extras im Swift docs.

In der MyObj Klassendefinition Sie es wie die fileName und folder Instanzvariablen sieht zur Verfügung gestellt werden als Implizit Unwrapped Optionals (sie haben eine ! nach ihrem Namen, wenn sie definiert sind) eingerichtet, die fein gearbeitet, aber ist Ich gebe Ihnen jetzt dieses Problem.

In Swift 3 hat Apple Änderungen an der Funktionsweise von Implicitly Unwrapped Optionals vorgenommen, was die Ursache für Ihr Problem ist. Es gibt eine vollständige Erklärung in this answer, aber die kurze Version ist, dass die String-Interpolation sie nicht mehr als implizit unwrapped behandelt.

Die Problemumgehung besteht darin, sie manuell unter Verwendung ! auszupacken, oder eine andere Methode zu dem Erstellen Ihrer Zeichenfolge zu verwenden. Sie können Zeichenfolgen und Zeichenfolgenliterale verketten, indem Sie den Operator + verwenden, der meiner Meinung nach ziemlich sauber aussieht:

let path = obj.folder + "/" + obj.fileName 
+0

Vielen Dank für die Erläuterungen. Tatsächlich ist MyObj eine Instanz von MyObj, ich habe es im Beispiel einfach umbenannt. Also habe ich mich in fileManager! .appendingPathComponent ("\ (MyObj.folder!)/\ (MyObj.fileName!)" Geändert) und es funktioniert, aber ich verstehe nicht wirklich, warum ich hinzufügen muss! wie vorher es funktionierte und da ist es schon! in der Klassendefinition – Ludo

+0

@Ludo Eigentlich sieht es so aus, als ob du alles richtig gemacht hast, aber Apple hat die Art und Weise geändert, wie Swift implizit ausgepackte Optionen in der String-Interpolation behandelt. Ich fügte eine Erklärung und eine alternative Weise hinzu, Strings zu meiner Antwort zu verursachen. – Robert