在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?
的情况下构建路径答案 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类定义中,fileName
和folder
实例变量被设置为隐式解包的Optionals (它们有一个!
在他们的名字定义之后),过去工作正常,但现在给你这个问题。
在Swift 3中,Apple改变了Implicitly Unwrapped Optionals的工作方式,这是导致问题的原因。在this answer中有一个完整的解释,但是短版本是字符串插值不再将它们视为隐式展开。
解决方法是使用!
手动解包它们,或使用其他方法构建字符串。您可以使用+运算符连接字符串和字符串文字,我认为这看起来很干净:
let path = obj.folder + "/" + obj.fileName