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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 12:00:01