Swift函数遍历挂载磁盘仅返回最后一项,如何返回全部?
修改方案:返回所有挂载磁盘路径
问题原因
原代码里的volumeURLString是单个字符串变量,每次循环都会用当前磁盘路径覆盖它的值,所以最终只能返回最后一个磁盘的路径。要收集所有路径,得用数组存储每一个符合条件的路径,之后可以选择返回数组本身,或者把数组拼接成字符串。
方案1:返回磁盘路径数组(推荐,更灵活)
把函数返回类型改成[String],用数组存储所有路径:
func checkMountedDrives() -> [String] { var volumePaths: [String] = [] // 初始化空数组存储路径 if let session = DASessionCreate(kCFAllocatorDefault) { // 用可选绑定替代强制解包,避免潜在崩溃 if let mountedVolumeURLs = FileManager.default.mountedVolumeURLs(includingResourceValuesForKeys: nil) { for volumeURL in mountedVolumeURLs { if let disk = DADiskCreateFromVolumePath(kCFAllocatorDefault, session, volumeURL as CFURL), let bsdName = DADiskGetBSDName(disk) { let path = volumeURL.path print("💾volumes ", path) volumePaths.append(path) // 将路径添加到数组中 } } } } return volumePaths // 返回所有路径的数组 }
使用示例:
let allDrives = checkMountedDrives() print("所有挂载磁盘路径:", allDrives) // 输出类似:["/", "/Volumes/ExternalDrive1", "/Volumes/ExternalDrive2"]
方案2:返回拼接后的字符串
如果需要返回用分隔符(比如逗号、换行)连接的字符串,基于数组版本修改即可:
func checkMountedDrives() -> String { var volumePaths: [String] = [] if let session = DASessionCreate(kCFAllocatorDefault) { if let mountedVolumeURLs = FileManager.default.mountedVolumeURLs(includingResourceValuesForKeys: nil) { for volumeURL in mountedVolumeURLs { if let disk = DADiskCreateFromVolumePath(kCFAllocatorDefault, session, volumeURL as CFURL), let bsdName = DADiskGetBSDName(disk) { let path = volumeURL.path print("💾volumes ", path) volumePaths.append(path) } } } } // 将数组用逗号+空格拼接成字符串,也可以换成"\n"换行符 return volumePaths.joined(separator: ", ") }
使用示例:
let driveString = checkMountedDrives() print("所有挂载磁盘路径:", driveString) // 输出类似:"/, /Volumes/ExternalDrive1, /Volumes/ExternalDrive2"
额外提示
原代码里的mountedVolumeURLs(includingResourceValuesForKeys: nil)!用了强制解包!,如果系统没返回挂载列表会导致程序崩溃。上面的方案改用if let可选绑定,更安全,适合新手学习规范写法。
内容的提问来源于stack exchange,提问作者moonmonkey
相关产品推荐
相关产品推荐

