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
相关产品推荐
相关产品推荐

