如何在Swift中从文件扩展名中分割文件名?

Joh*_*hnK 61 string ios swift

鉴于bundle中文件的名称,我想将文件加载到我的Swift应用程序中.所以我需要使用这个方法:

let soundURL = NSBundle.mainBundle().URLForResource(fname, withExtension: ext)
Run Code Online (Sandbox Code Playgroud)

无论出于何种原因,该方法需要将文件名与文件扩展名分开.很好,很容易在大多数语言中将两者分开.但到目前为止,我并没有在Swift中发现它.

所以这就是我所拥有的:

var rt: String.Index = fileName.rangeOfString(".", options:NSStringCompareOptions.BackwardsSearch)
var fname: String = fileName .substringToIndex(rt)
var ext = fileName.substringFromIndex(rt)
Run Code Online (Sandbox Code Playgroud)

如果我不在第一行包含输入,则会在后续两行中出现错误.有了它,我在第一行遇到错误:

Cannot convert the expression's type '(UnicodeScalarLiteralConvertible, options: NSStringCompareOptions)' to type 'UnicodeScalarLiteralConvertible'
Run Code Online (Sandbox Code Playgroud)

如何从扩展名中拆分文件名?有一些优雅的方式来做到这一点?

我对Swift感到很兴奋,因为它似乎比Objective C更优雅.但现在我发现它有自己的麻烦.


第二次尝试:我决定制作自己的字符串搜索方法:

func rfind(haystack: String, needle: Character) -> Int {
    var a = Array(haystack)

    for var i = a.count - 1; i >= 0; i-- {
        println(a[i])
        if a[i] == needle {
            println(i)
            return i;
        }
    }
    return -1
}
Run Code Online (Sandbox Code Playgroud)

但现在我收到错误var rt: String.Index = rfind(fileName, needle: "."):

'Int' is not convertible to 'String.Index'
Run Code Online (Sandbox Code Playgroud)

如果没有强制转换,我会在后续的两行中出错.

任何人都可以帮我分割这个文件名和扩展名吗?

gab*_*ler 88

正如评论中指出的那样,你可以使用它.

let filename: NSString = "bottom_bar.png"
let pathExtention = filename.pathExtension
let pathPrefix = filename.stringByDeletingPathExtension
Run Code Online (Sandbox Code Playgroud)

  • 要访问stringByDeletingPathExtension,必须将filename转换为NSString - let pathPrefix =(filename as NSString).stringByDeletingPathExtension.对于pathExtension也是如此. (4认同)

Jul*_*ian 69

这是使用Swift 2,Xcode 7:如果您已经有扩展名的文件名,那么您可以将完整文件名作为第一个参数传递,将空字符串作为第二个参数传递:

let soundURL = NSBundle.mainBundle()
    .URLForResource("soundfile.ext", withExtension: "")
Run Code Online (Sandbox Code Playgroud)

或者nil作为扩展参数也可以.

如果您有一个URL,并且由于某种原因想要获取文件的名称,那么您可以这样做:

soundURL.URLByDeletingPathExtension?.lastPathComponent
Run Code Online (Sandbox Code Playgroud)

斯威夫特4

let soundURL = NSBundle.mainBundle().URLForResource("soundfile.ext", withExtension: "")
soundURL.deletingPathExtension().lastPathComponent
Run Code Online (Sandbox Code Playgroud)


tes*_*sla 47

使用Swift 3/Swift 4.将这些行为添加到String类:

extension String {

    func fileName() -> String {
        return NSURL(fileURLWithPath: self).deletingPathExtension?.lastPathComponent ?? ""
    }

    func fileExtension() -> String {
        return NSURL(fileURLWithPath: self).pathExtension ?? ""
    }
}
Run Code Online (Sandbox Code Playgroud)

例:

let file = "image.png"
let fileNameWithoutExtension = file.fileName()
let fileExtension = file.fileExtension()
Run Code Online (Sandbox Code Playgroud)

  • 只是样式,但我更喜欢变体:`public var fileExtension:String {return NSURL(fileURLWithPath:self).pathExtension.lowercaseString ?? "}}`//假设我们想要.JPG Yahoos不区分大小写 (3认同)
  • 在Swift 3中,您应该使用“ URL”而不是“ NSURL”。 (2认同)

San*_*rar 28

在Swift 2.1中,String.pathExtension不再可用.相反,您需要通过NSURL转换来确定它:

NSURL(fileURLWithPath: filePath).pathExtension
Run Code Online (Sandbox Code Playgroud)


Lor*_*ore 28

解决方案Swift 4

此解决方案适用于所有实例,不依赖于手动解析字符串.

let path = "/Some/Random/Path/To/This.Strange.File.txt"

let fileName = URL(fileURLWithPath: path).deletingPathExtension().lastPathComponent

Swift.print(fileName)
Run Code Online (Sandbox Code Playgroud)

结果输出将是

This.Strange.File
Run Code Online (Sandbox Code Playgroud)


小智 13

在Swift中,您可以更改为NSString更快地获得扩展:

extension String {
    func getPathExtension() -> String {
        return (self as NSString).pathExtension
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 7

最新的 Swift 4.2 是这样工作的:

extension String {
    func fileName() -> String {
        return URL(fileURLWithPath: self).deletingPathExtension().lastPathComponent
    }

    func fileExtension() -> String {
        return URL(fileURLWithPath: self).pathExtension
    }
}
Run Code Online (Sandbox Code Playgroud)


Ane*_*eel 5

在Swift 2.1中,目前看来这样做的方法是:

let filename = fileURL.URLByDeletingPathExtension?.lastPathComponent
let extension = fileURL.pathExtension
Run Code Online (Sandbox Code Playgroud)


DNG*_*DNG 5

Swift 5与代码糖

extension String {
    var fileName: String {
       URL(fileURLWithPath: self).deletingPathExtension().lastPathComponent
    }

    var fileExtension: String{
       URL(fileURLWithPath: self).pathExtension
    }
}
Run Code Online (Sandbox Code Playgroud)


Fai*_*san 5

雨燕5

URL.deletingPathExtension().lastPathComponent
Run Code Online (Sandbox Code Playgroud)