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

Swift中如何为嵌套结构体的成员变量赋值?

问题解决与优化方案

一、正确为hour和minute赋值的方式

你当前创建Class实例的代码存在错误:startTime: Time, endTime: Time传入的是Time类型本身,而非它的实例。要给hour和minute赋值,需要在创建Time实例时直接传入对应数值,修改后的代码如下:

struct Time {
  var hour: Int
  var minute: Int
}

struct Class {
  var title: String //name of class
  var room: Int //room number
  var building: String
  var teacher: String //name of teacher
  var block: Character
  var startTime: Time
  var endTime: Time
}

// 创建Time实例时直接为hour和minute赋值
var math = Class(title: "Math", room: 801, building: "Math Building", teacher: "Ms. Teacher", block: 'G', 
                 startTime: Time(hour: 9, minute: 0), 
                 endTime: Time(hour: 10, minute: 30))

// 后续也可以修改已创建实例的hour和minute
math.startTime.hour = 8
math.startTime.minute = 45

二、更优实现方式

1. 为Time添加数据验证逻辑

避免传入非法时间数值(如hour超过23、minute超过59),可自定义初始化器做校验:

struct Time {
  var hour: Int
  var minute: Int
  
  init?(hour: Int, minute: Int) {
    guard hour >= 0 && hour <= 23, minute >= 0 && minute <= 59 else {
      return nil
    }
    self.hour = hour
    self.minute = minute
  }
}

// 仅当时间合法时才创建实例
if let startTime = Time(hour: 9, minute: 0), let endTime = Time(hour: 10, minute: 30) {
  var math = Class(title: "Math", room: 801, building: "Math Building", teacher: "Ms. Teacher", block: 'G', 
                   startTime: startTime, 
                   endTime: endTime)
}

2. 让Time支持友好的字符串描述

遵守CustomStringConvertible协议,方便打印和查看时间:

struct Time: CustomStringConvertible {
  var hour: Int
  var minute: Int
  
  var description: String {
    // 格式化输出,比如将9:00转为"09:00"
    String(format: "%02d:%02d", hour, minute)
  }
}

// 使用示例
let startTime = Time(hour: 9, minute: 0)
print(startTime) // 输出 "09:00"

3. 简化Class实例创建流程

给Class添加默认值或便捷初始化器,减少重复参数输入:

struct Class {
  var title: String
  var room: Int
  var building: String = "Math Building" // 设置默认教学楼
  var teacher: String
  var block: Character
  var startTime: Time
  var endTime: Time
  
  // 便捷初始化器,仅传入必填参数
  init(title: String, room: Int, teacher: String, block: Character, startTime: Time, endTime: Time) {
    self.title = title
    self.room = room
    self.teacher = teacher
    self.block = block
    self.startTime = startTime
    self.endTime = endTime
    self.building = "Math Building"
  }
}

// 创建实例时可省略building参数
if let startTime = Time(hour: 9, minute: 0), let endTime = Time(hour: 10, minute: 30) {
  var math = Class(title: "Math", room: 801, teacher: "Ms. Teacher", block: 'G', 
                   startTime: startTime, 
                   endTime: endTime)
}

4. 用属性包装器统一处理时间合法性(可选)

通过属性包装器封装校验逻辑,避免重复代码:

@propertyWrapper
struct ValidatedTimeComponent {
  private var value: Int
  let range: ClosedRange<Int>
  
  var wrappedValue: Int {
    get { value }
    set {
      value = range.contains(newValue) ? newValue : range.lowerBound
    }
  }
  
  init(wrappedValue: Int, range: ClosedRange<Int>) {
    self.range = range
    self.value = range.contains(wrappedValue) ? wrappedValue : range.lowerBound
  }
}

struct Time: CustomStringConvertible {
  @ValidatedTimeComponent(range: 0...23) var hour: Int
  @ValidatedTimeComponent(range: 0...59) var minute: Int
  
  var description: String {
    String(format: "%02d:%02d", hour, minute)
  }
}

// 非法值会自动修正为合法范围
let invalidTime = Time(hour: 25, minute: 65)
print(invalidTime) // 输出 "00:00"

内容的提问来源于stack exchange,提问作者Person

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 09:58:12