Swift报错:调用时缺少‘hours’参数的问题求助
Swift 结构体初始化错误及修复方案
问题概述
- 初始化
SelectedRestaurantDetailViewInfoNotUsingCodable结构体时,报错:Missing argument for parameter ‘hours’ in call,触发代码行:var selectedVenue = SelectedRestaurantDetailViewInfoNotUsingCodable() - 按提示添加
hours: <#OpenHoursForDaysOfWeek#>后,出现新错误:Cannot convert value of type 'OpenHoursForDaysOfWeek.Type' to expected argument type ‘OpenHoursForDaysOfWeek’ - 隐藏问题:代码else分支尝试将字符串赋值给
hours属性(类型为OpenHoursForDaysOfWeek),存在严重类型不匹配。
错误原因
- 第一个错误:
SelectedRestaurantDetailViewInfoNotUsingCodable中的hours是非可选结构体类型,Swift结构体的默认成员初始化器要求必须为所有非可选属性传入有效值,空初始化无法通过编译。 - 第二个错误:你直接传入了
OpenHoursForDaysOfWeek类型本身(比如写了hours: OpenHoursForDaysOfWeek),而非该类型的实例对象。 - 隐藏错误:字符串与
OpenHoursForDaysOfWeek结构体类型完全不兼容,else分支的赋值逻辑必然报错。
修复方案(三种可选)
方案一:将hours改为可选类型(快速解决)
修改结构体定义,把hours设为可选类型,默认初始化器即可正常使用,后续再赋值:
struct SelectedRestaurantDetailViewInfoNotUsingCodable { var name: String? // 其他属性保持不变 var hours: OpenHoursForDaysOfWeek? // 改为可选类型 }
同时调整else分支的赋值逻辑:
else { // 方式1:设为nil,后续UI层处理空值 selectedVenue.hours = nil // 方式2:创建表示不可用状态的实例 selectedVenue.hours = OpenHoursForDaysOfWeek( mondayOpenHoursWithoutDay: "暂无法获取营业时间", tuesdayOpenHoursWithoutDay: "暂无法获取营业时间", wednesdayOpenHoursWithoutDay: "暂无法获取营业时间", thursdayOpenHoursWithoutDay: "暂无法获取营业时间", fridayOpenHoursWithoutDay: "暂无法获取营业时间", saturdayOpenHoursWithoutDay: "暂无法获取营业时间", sundayOpenHoursWithoutDay: "暂无法获取营业时间", numberOfOpenHoursTimeRangesAsStringTypeOfTableViewCellToUse: "0" ) }
方案二:给hours属性添加默认值
在结构体定义时给hours指定默认实例,默认初始化器无需传参即可使用:
struct SelectedRestaurantDetailViewInfoNotUsingCodable { var name: String? // 其他属性保持不变 var hours: OpenHoursForDaysOfWeek = OpenHoursForDaysOfWeek( mondayOpenHoursWithoutDay: "", tuesdayOpenHoursWithoutDay: "", wednesdayOpenHoursWithoutDay: "", thursdayOpenHoursWithoutDay: "", fridayOpenHoursWithoutDay: "", saturdayOpenHoursWithoutDay: "", sundayOpenHoursWithoutDay: "", numberOfOpenHoursTimeRangesAsStringTypeOfTableViewCellToUse: "0" ) }
同样需要调整else分支,确保赋值为OpenHoursForDaysOfWeek实例而非字符串。
方案三:先处理数据再初始化结构体
调整代码逻辑,先处理好hours实例,再用带参数的初始化器创建结构体:
do { let json = try JSONSerialization.jsonObject(with: data, options: []) guard let responseDictionary = json as? NSDictionary else { return nil } // 先处理营业时间数据 var venueHours: OpenHoursForDaysOfWeek if let hoursDictionaries = responseDictionary.value(forKey: "hours") as? [NSDictionary] { venueHours = manipulateSelectedRestaurantHoursInfoAndRecieveFormattedHoursInfoToUse(selected_restaurant_business_hours: hoursDictionaries) } else { // 创建不可用状态的实例 venueHours = OpenHoursForDaysOfWeek( mondayOpenHoursWithoutDay: "暂无法获取营业时间", tuesdayOpenHoursWithoutDay: "", wednesdayOpenHoursWithoutDay: "", thursdayOpenHoursWithoutDay: "", fridayOpenHoursWithoutDay: "", saturdayOpenHoursWithoutDay: "", sundayOpenHoursWithoutDay: "", numberOfOpenHoursTimeRangesAsStringTypeOfTableViewCellToUse: "0" ) } // 直接用带参数的初始化器创建实例 let selectedVenue = SelectedRestaurantDetailViewInfoNotUsingCodable( name: responseDictionary.value(forKey: "name") as? String, hours: venueHours // 其他属性按需传入 ) return selectedVenue } catch { print("捕获错误:\(error)") return nil }
额外提示
- 建议使用Swift原生的
[String: Any]替代NSDictionary,类型安全性更高。 - 可以给
OpenHoursForDaysOfWeek添加静态方法,快速创建表示“不可用”的实例,减少重复代码。
内容的提问来源于stack exchange,提问作者cg1000
相关产品推荐
相关产品推荐

