Swift报错:inOut String无法转换为String,日期后缀函数加月份遇问题
解决Swift中"inOut String is not convertible to String"日期格式化错误
看起来你是在Swift里扩展日期后缀函数、添加月份返回时遇到了类型不兼容问题,我来帮你拆解一下原因和解决办法:
错误原因分析
你遇到的inOut String is not convertible to String错误,几乎都是因为混淆了普通String值和inout参数的使用方式:
- 如果你的函数用了
inout类型的参数来返回结果,你不能直接把一个常量字符串(比如你的monthString)或者字面量赋值给它,inout需要的是变量的引用,而不是固定的字符串值。 - 也有可能是你在switch语句里错误地把
inout变量当作普通String来匹配,导致类型不匹配。
修正后的代码方案
假设你的目标是返回类似May 21st这样的「月份+带后缀日期」格式,这里提供两种清晰的实现方式:
方案1:直接返回String(推荐)
这种方式不需要用inout参数,逻辑更直观,也避免了类型混淆:
func formattedDateWithMonthAndDaySuffix(from inputDate: String) -> String? { // 初始化日期格式化器(根据你的实际输入格式调整dateFormat) let inputFormatter = DateFormatter() inputFormatter.dateFormat = "yyyy-MM-dd" let monthFormatter = DateFormatter() monthFormatter.dateFormat = "MMMM" // 输出完整月份名,比如"January" let dayFormatter = DateFormatter() dayFormatter.dateFormat = "d" // 输出日期数字,比如"1" // 先解析输入字符串为Date类型 guard let date = inputFormatter.date(from: inputDate) else { return nil // 解析失败返回nil } // 获取月份和日期数字字符串 let monthString = monthFormatter.string(from: date) let dayString = dayFormatter.string(from: date) // 确定日期后缀 let daySuffix: String switch dayString { case "1", "21", "31": daySuffix = "st" case "2", "22": daySuffix = "nd" case "3", "23": daySuffix = "rd" default: daySuffix = "th" } // 拼接最终结果 return "\(monthString) \(dayString)\(daySuffix)" } // 使用示例 if let formattedDate = formattedDateWithMonthAndDaySuffix(from: "2024-05-21") { print(formattedDate) // 输出:May 21st }
方案2:保留inout参数(如果必须用)
如果你因为某些原因需要用inout参数传递结果,确保你赋值给它的是完整的String变量值,而不是直接传递常量:
func formatDateWithMonthAndSuffix(_ inputDate: String, inout result: String) { result = "" // 先清空结果变量 let inputFormatter = DateFormatter() inputFormatter.dateFormat = "yyyy-MM-dd" let monthFormatter = DateFormatter() monthFormatter.dateFormat = "MMMM" let dayFormatter = DateFormatter() dayFormatter.dateFormat = "d" guard let date = inputFormatter.date(from: inputDate) else { return } let monthString = monthFormatter.string(from: date) let dayString = dayFormatter.string(from: date) var daySuffix = "" switch dayString { case "1", "21", "31": daySuffix = "st" case "2", "22": daySuffix = "nd" case "3", "23": daySuffix = "rd" default: daySuffix = "th" } // 正确赋值给inout参数:拼接完整字符串 result = "\(monthString) \(dayString)\(daySuffix)" } // 使用示例 var resultString = "" formatDateWithMonthAndSuffix("2024-05-21", inout: &resultString) print(resultString) // 输出:May 21st
关键注意点
- 永远不要直接把常量字符串赋值给
inout参数,inout需要的是变量的引用(调用时要加&符号)。 - 拆分逻辑:把日期解析、月份获取、后缀判断分开处理,代码更清晰,也更容易排查类型问题。
内容的提问来源于stack exchange,提问作者Rob
相关产品推荐
相关产品推荐

