文件路径Swift3中可选

时间:2016-11-02 00:05:56

标签: ios swift3

在swift3中,我无法访问我下载的本地文件,然后解压缩。

路径包含“可选”:

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

创建此路径的代码是:

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

MyObj类是:

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") }
    ....
}

如何在没有“Optional?

的情况下构建路径

1 个答案:

答案 0 :(得分:1)

看到"可选"在您的字符串输出中意味着您传入可选,这是一个可能包含值或可能包含nil的变量。如果您确定在使用它时不是nil,则可以通过在其名称中添加!强制解包使它不再是可选的。如果对nil的变量执行此操作,则会出现运行时错误。或者,您可以使用let解包。

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'

Swift docs中有关于选项的更多内容。

在你提供的MyObj类定义中,fileNamefolder实例变量被设置为隐式解包的Optionals (它们有一个!在他们的名字定义之后),过去工作正常,但现在给你这个问题。

在Swift 3中,Apple改变了Implicitly Unwrapped Optionals的工作方式,这是导致问题的原因。在this answer中有一个完整的解释,但是短版本是字符串插值不再将它们视为隐式展开。

解决方法是使用!手动解包它们,或使用其他方法构建字符串。您可以使用+运算符连接字符串和字符串文字,我认为这看起来很干净:

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