在swift中替换文件名的扩展名

时间:2014-11-27 12:09:16

标签: ios swift

给定格式为filename.fileextension的字符串我想用newextension替换fileextension。我该怎么办?

在java中它将是

foo.substring(0, foo.lastIndexOf(".")) + ".newextension"

4 个答案:

答案 0 :(得分:10)

Swift 4中的字面翻译将是:

let path2 = path[..<path.range(of: ".", options: .backwards)!.lowerBound] + ".newextension"

但Apple一直在将我们从String路径转移出去,而是希望我们URL获取本地文件系统中的文件。

例如,假设我们在文档目录中引用了一些文件:

let fileURL = try! FileManager.default
    .url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: true)   // nowadays, you might even prefer `.applicationSupportDirectory
    .appendingPathComponent("test.png")

如果您想将.png替换为.jpg,请执行以下操作:

let jpgURL = fileURL
    .deletingPathExtension()
    .appendingPathExtension("jpg")

对于之前的Swift版本,请参阅previous revision of this answer

答案 1 :(得分:1)

stringByAppendingPathExtension不再适用于Swift 2.0(如果您使用的是String)。但它确实仍适用于NSString。所以你可以这样做:

var storePath = (NSSearchPathForDirectoriesInDomains(.DocumentDirectory , .UserDomainMask, true)[0]) as NSString
storePath = storePath.stringByAppendingPathExtension("model.sqlite")!

答案 2 :(得分:1)

我完全同意@Rob's answer(Swift 3 Section)。但是,因为:

  

Swift叠加到Foundation框架提供了URL   结构,桥接到NSURL类。

     

<子> NSURL Documentation.

使用URL结构应该可以实现,如下所示:

let fileURL = URL(fileURLWithPath: path)
let destinationURL = fileURL.deletingPathExtension().appendingPathExtension("newextension")

所以deletingPathExtension()现在是一个实例方法(而不是NSURL中声明的可选变量):

  

如果网址有空路径(例如http://www.example.com),那么这就是   函数将返回不变的URL。

这意味着您不必处理if的展开,即如果路径无效则不会崩溃 - 如文档中所述 - 。

答案 3 :(得分:0)

在Objective C和Swift中,我们必须找到NSRange .个字符来替换文件的扩展名。然后用新的扩展名替换子字符串。请参阅以下代码:

var foo : NSString!
foo = "filename.txt"

var mutableFile = NSMutableString.stringWithString(foo)

var range = mutableFile.rangeOfString(".")
var length = mutableFile.length - range.location

mutableFile .replaceCharactersInRange(NSMakeRange(range.location, length), withString: ".newExtension")
println(mutableFile)

foo = NSString.stringWithString(mutableFile)
mutableFile = nil
println(foo)