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

Swift调用格式化对象属性为字符串函数时代码崩溃EXC_BAD_ACCESS报错

故障原因

触发EXC_BAD_ACCESS崩溃的核心原因有两个:

  1. 存在占位符笔误:格式化字符串中账户余额对应的位置写的是$@,正确的格式化占位符起始符号为%而非$。
  2. 占位符与传入参数类型不匹配:%@是仅用于匹配Objective-C对象/Swift引用类型(比如String)的占位符,你传入的accountNumber(整数)、interestRate(浮点数)、accountBalance(浮点数)、year(整数)全是值类型,C风格的String(format:)方法不会做编译期类型校验,运行时会按照占位符约定的类型把传入的整数值、浮点数值当成对象指针去读取内存,访问到非法地址就会触发崩溃。
修复代码

将description属性的实现替换为如下代码,对应不同类型的属性使用匹配的占位符即可:

public var description: String {
    return String(
        format: "\nName: %@\nAccount Number: %ld\nInterest Rate: %.2f\nAccount Balance: %.2f\nYear: %ld",
        customerName,
        accountNumber,
        interestRate,
        accountBalance,
        year
    )
}

常用占位符匹配规则参考:

  • %@:匹配String/NSString类型,对应字符串属性customerName
  • %ld:匹配Int类型整数,对应账号、年份这类整数属性
  • %.2f:匹配Double/Float类型浮点数,.2f表示保留2位小数,适合利率、余额这类金额/比率场景

补充:如果不需要严格控制输出格式,直接用Swift字符串插值更简单,完全不会出现这类占位符类型不匹配的问题,写法参考:

public var description: String {
    return """
    Name: \(customerName)
    Account Number: \(accountNumber)
    Interest Rate: \(interestRate)
    Account Balance: \(accountBalance)
    Year: \(year)
    """
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 03:12:23