ファイルパスの一部を千のファイルに分割する必要があります。だから、私は速い機能が必要です。私は自分でこれを書いたが、それは非常に遅く実行されるようだ:スイフト3:高速ファイルパス分離
// find string in "str", split at the position, delivers left and right side
func revFindSplit_(str : String, searchString : String) -> (String, String) {
let strr = String(str.characters.reversed()) // reverse main string
let searchStringr = String(searchString.characters.reversed()) // reverse search string too
if let strrindex = strr.range(of: searchStringr) { // now we can search from back to front
let rangeOfS2 = strr.characters.startIndex..<strrindex.lowerBound // we got search result: part 1 (front)
let rangeOfS1 = strrindex.lowerBound..<strr.characters.endIndex // part 2 (back)
let S2 = String(strr[rangeOfS2].characters.reversed()) // put together and reverse again
let S1 = String(strr[rangeOfS1].characters.reversed())
// here we have to remove search string
let S1M1 = String(S1.characters.prefix(S1.characters.count - searchString.characters.count))
return (S1M1, S2)
}
else {
return (str, "") // without splitting
}
}
// split path of filename into all 3 part: directory name, filename without extension, extension (without dot)
// in one call (faster than the 3 functions separatly)
func splitFilename_(str: String) -> (directory: String, filenameOnly: String, ext: String) {
let url = NSURL(fileURLWithPath: str)
let path = url.path!
// split path and filename
let (directory, filenameExt) = revFindSplit_(str: path, searchString: "/")
// split filename in filenameOnly and extension
let (filenameOnly, ext) = revFindSplit_(str: filenameExt, searchString: ".")
return (directory, filenameOnly, ext)
}
それを劇的にスピードアップする方法はありますか? (おそらくライブラリ関数を使用して)
を私は@vardianによるソリューションを使用しているときにパフォーマンスの問題を持っている疑い。しかし、それが本当に速くなく、スピードアップが必要な場合は、文字列 'import Glibc'または' import Darwin'からUTF8を取得し、C関数を使用します( 'basename'、' strstr'等。)。 – hnh