Swift天气APP实现动态图标报错:字符串插值仅能在字符串字面量内使用
解决SwiftUI动态天气图标报错及代码优化
1. 直接修复报错
你写的Image(systemName: \(icon))是错误用法:字符串插值\()仅用于字符串字面量内部(比如Text("今天是\(date)")这种场景),而Image(systemName:)的参数直接接受字符串变量,所以改成:
Image(systemName: icon)
2. 修正代码逻辑问题
你的dIcon()方法无法在SwiftUI View中正常工作:SwiftUI的View是值类型,body是计算属性,不能调用mutating方法修改结构体的存储属性。正确做法是把icon改成计算属性,自动根据天气数据生成图标名称:
struct WeatherView: View { var weather: ResponseBody // 计算属性:自动根据天气返回对应SF Symbols图标名 private var icon: String { weather.weather[0].main == "Clouds" ? "cloud" : "sun.max" // 注意:SF Symbols没有"clouds"图标,建议用"cloud"/"cloud.fill",可在Xcode的SF Symbols app中查询 } var body: some View { ZStack(alignment: .leading){ VStack{ VStack(alignment: .leading, spacing: 5){ Text(weather.name) .bold().font(.title) Text("Today, \(Date().formatted(.dateTime.month().day().hour().minute()))") .fontWeight(.light) } .frame(maxWidth: .infinity, alignment: .leading) Spacer() VStack{ HStack{ VStack(spacing: 20){ Image(systemName: icon) .font(.system(size: 40)) // 补充剩余代码 } } } } } } }
额外提示
SF Symbols库中没有名为clouds的图标,你可以通过Xcode自带的「SF Symbols」应用搜索合适的天气图标,比如阴天用cloud,多云用cloud.sun,晴天用sun.max等,确保图标名称匹配。
内容的提问来源于stack exchange,提问作者Kyle Morgan
相关产品推荐
相关产品推荐

