给定格式为filename.fileextension
的字符串我想用newextension
替换fileextension。我该怎么办?
在java中它将是
foo.substring(0, foo.lastIndexOf(".")) + ".newextension"
答案 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)