Swift类实例同类型空属性赋值可行性及调试异常咨询
问题解答:赋值操作可行性确认与打印异常修复
一、赋值操作的可行性说明
向Swift类的String属性(包括初始为空的属性)赋值是完全合法可行的,你的代码赋值逻辑本身没有语法问题。但代码存在对象复用的逻辑错误:你始终复用同一个StartAndEndTimePairsAsStrings实例,每次修改属性后添加到数组,导致数组内所有元素指向同一个对象引用,后续修改会同步影响所有数组元素,这并非你需要的“成对存储”效果。
二、打印异常的原因与修复
打印仅显示类类型而非属性值,是因为自定义Swift类默认未实现CustomStringConvertible协议,Swift无法自动生成实例的可读字符串描述,和NSObjectProtocol无关(你的类也没有隐式遵守该协议)。
修复步骤:
1. 给自定义类添加CustomStringConvertible协议实现
修改StartAndEndTimePairsAsStrings类,让Swift知道如何输出实例的可读信息:
class StartAndEndTimePairsAsStrings: CustomStringConvertible { var startTimeInPairAsString: String var endTimeInPairAsString: String init(startTimeInPairAsString: String, endTimeInPairAsString: String) { self.startTimeInPairAsString = startTimeInPairAsString self.endTimeInPairAsString = endTimeInPairAsString } // 实现协议要求的description属性,自定义打印格式 var description: String { return "Start: \(startTimeInPairAsString), End: \(endTimeInPairAsString)" } }
2. 修正对象复用的逻辑错误
每次循环创建新的实例,而非复用同一个对象:
// 移除原来的全局实例声明 // var startAndEndTimePairsAsStringsForMonday = ... for element in mondayOpenBusinessHoursStartTimes12HourFormatWithColonAndAMOrPMAsStrings { // 每次循环创建新实例 let timePair = StartAndEndTimePairsAsStrings(startTimeInPairAsString: element, endTimeInPairAsString: "") print("startAndEndTimePairsAsStringsForMonday:", timePair) mondayOpenBusinessHoursStartAndEndTimePairs12HourFormatWithColonAndAMOrPMAsStrings.append(timePair) }
3. 优化结束时间赋值逻辑
原代码用append(element)是在空字符串后追加内容,直接赋值更符合业务逻辑:
for (index, element) in mondayOpenBusinessHoursEndTimes12HourFormatWithColonAndAMOrPMAsStrings.enumerated() { mondayOpenBusinessHoursStartAndEndTimePairs12HourFormatWithColonAndAMOrPMAsStrings[index].endTimeInPairAsString = element }
三、修复后的完整代码
import UIKit import Foundation class StartAndEndTimePairsAsStrings: CustomStringConvertible { var startTimeInPairAsString: String var endTimeInPairAsString: String init(startTimeInPairAsString: String, endTimeInPairAsString: String) { self.startTimeInPairAsString = startTimeInPairAsString self.endTimeInPairAsString = endTimeInPairAsString } var description: String { return "Start: \(startTimeInPairAsString), End: \(endTimeInPairAsString)" } } // 变量声明 var mondayOpenBusinessHoursStartTimes12HourFormatWithColonAndAMOrPMAsStrings = ["7:00 am", "12:00 pm", "5:00 pm"] var mondayOpenBusinessHoursEndTimes12HourFormatWithColonAndAMOrPMAsStrings = ["11:00 am", "4:00 pm", "10 pm"] var mondayOpenBusinessHoursStartAndEndTimePairs12HourFormatWithColonAndAMOrPMAsStrings: [StartAndEndTimePairsAsStrings] = [] // 添加开始时间到数组 for element in mondayOpenBusinessHoursStartTimes12HourFormatWithColonAndAMOrPMAsStrings { let timePair = StartAndEndTimePairsAsStrings(startTimeInPairAsString: element, endTimeInPairAsString: "") print("startAndEndTimePairsAsStringsForMonday:", timePair) mondayOpenBusinessHoursStartAndEndTimePairs12HourFormatWithColonAndAMOrPMAsStrings.append(timePair) } print("mondayOpenBusinessHoursStartAndEndTimePairs12HourFormatWithColonAndAMOrPMAsStrings:", mondayOpenBusinessHoursStartAndEndTimePairs12HourFormatWithColonAndAMOrPMAsStrings) // 添加结束时间到数组对应元素 for (index, element) in mondayOpenBusinessHoursEndTimes12HourFormatWithColonAndAMOrPMAsStrings.enumerated() { mondayOpenBusinessHoursStartAndEndTimePairs12HourFormatWithColonAndAMOrPMAsStrings[index].endTimeInPairAsString = element } print("mondayOpenBusinessHoursStartAndEndTimePairs12HourFormatWithColonAndAMOrPMAsStrings:", mondayOpenBusinessHoursStartAndEndTimePairs12HourFormatWithColonAndAMOrPMAsStrings)
四、关于打印中的objc警告
那些_PathPoint和_PointQueue的警告是Xcode模拟器的系统级重复类定义问题,和你的代码无关,无需处理,不影响功能。
内容的提问来源于stack exchange,提问作者coder
相关产品推荐
相关产品推荐

