Swift调用格式化对象属性为字符串函数时代码崩溃EXC_BAD_ACCESS报错
故障原因
触发EXC_BAD_ACCESS崩溃的核心原因有两个:
- 存在占位符笔误:格式化字符串中账户余额对应的位置写的是
$@,正确的格式化占位符起始符号为%而非$。 - 占位符与传入参数类型不匹配:
%@是仅用于匹配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
相关产品推荐
相关产品推荐

