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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 21:45:28