1. ホーム
  2. ios

[解決済み] Swiftでファイル拡張子からファイル名を分割する方法は?

2023-03-19 05:32:58

質問

バンドル内のファイル名を指定して、そのファイルをSwiftアプリにロードしたい。だから私はこのメソッドを使用する必要があります。

let soundURL = NSBundle.mainBundle().URLForResource(fname, withExtension: ext)

何らかの理由で、このメソッドはファイル名とファイル拡張子を分離する必要があります。すばらしい、それはほとんどの言語で2つを分離するのに十分簡単です。しかし、今のところ、私はSwiftでそうであることを発見していません。

だから、ここに私が持っているものがあります。

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

1行目にタイピングを入れないと、その後の2行でエラーになります。入れると、1行目でエラーになります。

Cannot convert the expression's type '(UnicodeScalarLiteralConvertible, options: NSStringCompareOptions)' to type 'UnicodeScalarLiteralConvertible'

拡張子からファイル名を分割するにはどうすればよいですか?これを行うには、いくつかのエレガントな方法がありますか?

SwiftはObjective Cよりもずっとエレガントな言語のように思えたので、私はすっかり興奮していました。しかし今、私はそれ自身の面倒さがあることを発見しています。


2度目の挑戦 文字列検索の方法を自作することにしました。

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
}

しかし、次の行でエラーが発生します。 var rt: String.Index = rfind(fileName, needle: ".") :

'Int' is not convertible to 'String.Index'

キャストがないと、その後の2行でエラーになります。

どなたかこのファイル名と拡張子を分割するのを手伝っていただけませんか?

どのように解決するには?

これはSwift 2、Xcode 7での話です。拡張子がすでに付いているファイル名がある場合、最初のパラメータとして完全なファイル名を渡し、2番目のパラメータとして空文字列を渡せばよいのです。

let soundURL = NSBundle.mainBundle()
    .URLForResource("soundfile.ext", withExtension: "")

拡張パラメータとしてnilを指定しても動作します。

URLがあり、何らかの理由でファイル名そのものを取得したい場合、このような方法があります。

soundURL.URLByDeletingPathExtension?.lastPathComponent

スウィフト4

let soundURL = NSBundle.mainBundle().URLForResource("soundfile.ext", withExtension: "")
soundURL.deletingPathExtension().lastPathComponent