You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 11:05:16