Arrays 如何从文件夹中创建URL数组(swift、音频)

Arrays 如何从文件夹中创建URL数组(swift、音频),arrays,swift,url,Arrays,Swift,Url,我正在寻找一种方法,从包含声音文件的文件夹的内容中创建一个URL数组,以便稍后使用AVAudioplayer调用它们 我使用一个步进器和3个变量, 第一个称为nmbTracks,用于定义可播放声音文件的数量,并保存steppers maxvalue 第二个名为currentActiveTrack,定义播放器应该播放的文件。 第三个称为audioURL,用于向播放器提供信息,以及检索输出到标签的文件名。 然后,用户可以使用步进器逐步浏览声音文件 到目前为止,我所有的东西都在使用我的一些文件,但我不

我正在寻找一种方法,从包含声音文件的文件夹的内容中创建一个URL数组,以便稍后使用AVAudioplayer调用它们

我使用一个步进器和3个变量, 第一个称为nmbTracks,用于定义可播放声音文件的数量,并保存steppers maxvalue 第二个名为currentActiveTrack,定义播放器应该播放的文件。 第三个称为audioURL,用于向播放器提供信息,以及检索输出到标签的文件名。 然后,用户可以使用步进器逐步浏览声音文件

到目前为止,我所有的东西都在使用我的一些文件,但我不知道如何创建URL数组,也不知道如何从文件夹的内容中获取URL,下一步是让用户将自己的文件导入该文件夹


如果您能提供任何帮助,我将不胜感激。我相信还有一种更简单的方法可以做到这一点。

我有两种选择。第一个返回一个
URL
s数组,如果提取文件夹时出错,则返回一个空数组

func getFolderContentsURLs(_ folderPath: String) -> [URL] {
  let fm = FileManager()
  guard let contents = try? fm.contentsOfDirectory(atPath: folderPath) else { return [] }
  return contents.compactMap { URL.init(fileURLWithPath: $0) }
}
您可以如下方式显示结果:

let songsURLs = getFolderContentsURLs("/")
songsURLs.forEach {
  print($0.absoluteString)
}
if let songsURLs2 = getFolderContentsURLsOrNil("NotExistingPath") {
  songsURLs2.forEach {
    print($0.absoluteString)
  }
} else {
  print("Unable to fetch contents")
}
第二个选项返回一个可选的
URL
s数组,on error返回nil

func getFolderContentsURLsOrNil(_ folderPath: String) -> [URL]? {
  let fm = FileManager()
  guard let contents = try? fm.contentsOfDirectory(atPath: folderPath) else { return nil }
  return contents.compactMap { URL.init(fileURLWithPath: $0) }
}
要查看结果,您可以这样做:

let songsURLs = getFolderContentsURLs("/")
songsURLs.forEach {
  print($0.absoluteString)
}
if let songsURLs2 = getFolderContentsURLsOrNil("NotExistingPath") {
  songsURLs2.forEach {
    print($0.absoluteString)
  }
} else {
  print("Unable to fetch contents")
}
在回复@user12184258关于仅返回音频文件的评论时,您可以在获取文件夹内容后应用过滤器。过滤器可以使用
UTTypeConformsTo
MobileCoreServices

let contentsFolder = getFolderContentsURLs("/path/to/folder")
let audioFiles = contentsFolder
  .filter { path in
    // Try to create uniform type identifier using file's extension
    guard let uti =
      UTTypeCreatePreferredIdentifierForTag(
        kUTTagClassFilenameExtension,
        path.pathExtension as CFString, nil) else { return false }
    // Checks conformance of UTI with kUTTypeAudio (abstract type for audio) 
    return UTTypeConformsTo((uti.takeRetainedValue()), kUTTypeAudio)
  }

我找到了这个方法。苹果还有一个非常有用的功能,你可以检查一下,如果你只想要mp3文件,你可以使用
kuttypem3

如果我想让这个功能只显示音频文件的结果,可以用avaudioplayer播放呢?我刚刚编辑了答案,在文件夹的内容结果上使用了一个过滤器。