将 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 后的错误的主要内容,如果未能解决你的问题,请参考以下文章

核心数据迁移丢失 NSNumber 值

在 CoreData 实体中将属性从 NSNumber 转换为 NSString - LightWeightMigration

对包含 NSNumber 变量的 NSobjects 的 NSArray 进行排序

NSNumber 丢失十进制数字

试图输出数学方程的解总是导致 0

将字符串转换为可空类型(int、double 等...)