Swift计算时间差代码Playground正常但Xcode12运行失败如何解决
问题说明
- 编译报错的核心原因是语法不符合规范:Swift 结构体的顶级作用域仅支持声明属性,不允许直接执行可执行语句。原代码在声明
formatter属性后直接写了formatter.dateFormat = "h:mma 'UTC'"这行修改属性的执行语句,iPad Playground语法容错性更高可正常运行,Xcode12严格遵循Swift编译规则会直接报错。 - 存在潜在运行时崩溃风险:原代码未给
DateFormatter指定固定地区,当系统语言为非英文时,默认地区会将AM/PM识别为本地化时段标识(如中文环境下的“上午/下午”),导致时间字符串解析失败,搭配强制解包!会直接触发闪退。
修复方案
将日期格式化、时间差计算的逻辑移到结构体的初始化方法中执行,同时为DateFormatter指定固定的英文地区规避适配问题,修复后的可运行代码如下:
import SwiftUI struct About: View { let time1 = "10:30AM" let time2 = "1:20PM" let hours: Int let minutes: Int init() { let formatter = DateFormatter() formatter.dateFormat = "h:mma 'UTC'" // 指定固定地区,避免系统语言变化导致解析失败 formatter.locale = Locale(identifier: "en_US_POSIX") let date1 = formatter.date(from: time1)! let date2 = formatter.date(from: time2)! let elapsedTime = date2.timeIntervalSince(date1) hours = Int(floor(elapsedTime / 3600)) minutes = Int(floor(elapsedTime.truncatingRemainder(dividingBy: 3600) / 60)) } var body: some View { Text("\(hours) hr and \(minutes) min") } } struct About_Previews: PreviewProvider { static var previews: some View { About() } }
内容的提问来源于stack exchange,提问作者Erwin
相关产品推荐
相关产品推荐

