将 NSNumber 更改为 Int/Double 后的错误
Posted
技术标签:
【中文标题】将 NSNumber 更改为 Int/Double 后的错误【英文标题】:Errors after changing NSNumber to Int/Double 【发布时间】:2020-12-23 18:09:06 【问题描述】:我有这个类从 Firestore 获取数据:
struct Spty: Identifiable
var id: String
var spty: String
var r: NSNumber
var g: NSNumber
var b: NSNumber
class SptyViewModel: NSObject, ObservableObject
@Published var specialities = [Spty]()
@Published var search = ""
func fetchData()
let db = Firestore.firestore()
db.collection("specialities").addSnapshotListener (querySnapshot, error) in
guard let documents = querySnapshot else return
self.specialities = documents.documents.compactMap (doc) -> Spty? in
let id = doc.documentID
if let spty = doc.get("spty") as? String,
let r = doc.get("r") as? NSNumber,
let g = doc.get("g") as? NSNumber,
let b = doc.get("b") as? NSNumber
return Spty(id: id, spty: spty, r: r , g: g , b: b )
else
return nil
我使用 ForEach 显示它:
ForEach(sptyModel.specialities) spty in
NavigationLink(destination: More())
HStack
Text(spty.spty).foregroundColor(.yellow)
.frame(width: UIScreen.main.bounds.width - 30)
.frame(height: 105)
.background(Color(UIColor(red: CGFloat(truncating: spty.r) / 255.0, green: CGFloat(truncating: spty.g) / 255.0, blue: CGFloat(truncating: spty.b) / 255.0, alpha: 1.0)))
.cornerRadius(38)
.padding(.bottom, 20)
由于Codable
的使用需要,我需要将NSNumber
改为Int/Double
。在 SptyViewModel 类中简单地更改它之后,我在ForEach
中得到以下错误
我该如何解决它们
【问题讨论】:
【参考方案1】:您的问题不在于 ForEach
,而在于 .background(...)
CGFloat(truncating:NSNumber)
只接受 NSNumber。
ForEach(sptyModel.specialities) spty in
NavigationLink(destination: Text("MORE"))
HStack
Text(spty.spty).foregroundColor(.yellow)
.frame(width: UIScreen.main.bounds.width - 30)
.frame(height: 105)
.background(Color(UIColor(red: CGFloat(truncating: NSNumber(value: spty.r)) / 255.0, green: CGFloat(truncating: NSNumber(value: spty.g)) / 255.0, blue: CGFloat(truncating: NSNumber(value: spty.b)) / 255.0, alpha: 1.0)))
.cornerRadius(38)
.padding(.bottom, 20)
【讨论】:
正是我想要的。谢谢【参考方案2】:Firebase 存储一个 NSNumber,但您可以简单地将其转换为 Double 或 Int。而不是强制转换“as?NSNumber”,只需将 NSNumber 更改为 Int 或 Double。您还需要更新 Spty 结构变量类型。
【讨论】:
以上是关于将 NSNumber 更改为 Int/Double 后的错误的主要内容,如果未能解决你的问题,请参考以下文章
在 CoreData 实体中将属性从 NSNumber 转换为 NSString - LightWeightMigration