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

Swift报错:调用时缺少‘hours’参数的问题求助

Swift 结构体初始化错误及修复方案

问题概述

  1. 初始化SelectedRestaurantDetailViewInfoNotUsingCodable结构体时,报错:Missing argument for parameter ‘hours’ in call,触发代码行:var selectedVenue = SelectedRestaurantDetailViewInfoNotUsingCodable()
  2. 按提示添加hours: <#OpenHoursForDaysOfWeek#>后,出现新错误:Cannot convert value of type 'OpenHoursForDaysOfWeek.Type' to expected argument type ‘OpenHoursForDaysOfWeek’
  3. 隐藏问题:代码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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 03:35:41