Swift如何将URLResourceValue的.tagNames值正确转换为String
问题原因
URLResourceValues的tagNames属性原生返回类型为[String]?(可选字符串数组),并非Data类型。你使用专用于解码Data为String的String(decoding:as:)方法处理数组类型,会触发类型不匹配,导致编译器抛出“表达式类型模糊,缺少上下文信息”的报错。
另外你原代码中的包含判断逻辑也存在错误:(pastilleSousRp.tagNames?.contains("Specific tagname")) != nil 仅能判断tagNames是否为非空,无法正确判断数组中是否存在目标标签。
修正方案
基础读取逻辑实现
do { let srcURL: URL = nsurl2 as URL let pastilleSousRp = try srcURL.resourceValues(forKeys: [.tagNamesKey]) // 安全解包标签数组 guard let tagArray = pastilleSousRp.tagNames else { // 无标签时的处理逻辑 continue } // 若需要将所有标签拼接为单个字符串,自定义分隔符即可 let test = tagArray.joined(separator: ", ") // 正确判断是否包含指定标签 if tagArray.contains("Specific tagname") { // 匹配到标签后的业务逻辑 } } catch { continue }
标签修改回写逻辑
如果需要修改获取到的标签并同步保存到原URL,可使用以下逻辑:
do { let srcURL: URL = nsurl2 as URL let pastilleSousRp = try srcURL.resourceValues(forKeys: [.tagNamesKey]) var updatedTags = pastilleSousRp.tagNames ?? [] // 执行标签修改操作,示例为新增标签 updatedTags.append("自定义新标签") // 移除指定标签示例 updatedTags.removeAll { $0 == "需要删除的标签" } // 将修改后的标签回写到URL var resourceValues = URLResourceValues() resourceValues.tagNames = updatedTags var mutableSrcURL = srcURL try mutableSrcURL.setResourceValues(resourceValues) } catch { continue }
内容的提问来源于stack exchange,提问作者Fredo
相关产品推荐
相关产品推荐

