Swift Xcode 12打印命令不';不显示类字段

Swift Xcode 12打印命令不';不显示类字段,swift,xcode,Swift,Xcode,我最近搬到了一家新的MacBookPro。在新机器和Xcode 12上,打印命令的工作方式与以前不同。我有点困惑到底发生了什么变化。新的Xcode安装在MacOSX 10.15.7上,我正在运行Xcode 12.4。我已经确保在控制台中选择了正确的选项,左侧没有应用过滤器,右侧选择了“所有输出” 我在控制台中得到的是“trans:apitest.Transaction”,它是项目的名称和类的名称。我的问题是:为什么Xcode突然打印出项目名称?还有,为什么它不显示类的任何属性?有没有一种方法可以

我最近搬到了一家新的MacBookPro。在新机器和Xcode 12上,打印命令的工作方式与以前不同。我有点困惑到底发生了什么变化。新的Xcode安装在MacOSX 10.15.7上,我正在运行Xcode 12.4。我已经确保在控制台中选择了正确的选项,左侧没有应用过滤器,右侧选择了“所有输出”

我在控制台中得到的是“trans:apitest.Transaction”,它是项目的名称和类的名称。我的问题是:为什么Xcode突然打印出项目名称?还有,为什么它不显示类的任何属性?有没有一种方法可以不手动枚举类实例的所有属性?谢谢你的耐心和帮助

这是我的课

import Foundation

final class Transaction: Codable {
        
    var id: Int?
    var date: Date
    var amount: Int
    var planeID: Int
    var userID: UUID
    var month: Int
    var year: Int

    init(date: Date, amount: Int, planeID: Int, userID: UUID, month: Int, year: Int) {
        self.date = date
        self.amount = amount
        self.planeID = planeID
        self.userID = userID
        self.month = month
        self.year = year
    }
}
在我的应用程序中有一个按钮,我试图打印这个对象


                let trans = Transaction(date: now, amount: 5, planeID: 5, userID: id, month: month, year: year)
        
        print("trans: \(trans)")

如果你把它变成一个结构而不是一个类,你将免费得到这个行为。但是,也许有理由它必须是一个类。在这种情况下,您可以使用反射打印密钥,而无需手动执行:


final class Transaction: Codable, ReflectedStringConvertible {
        
    var id: Int?
    var date: Date
    var amount: Int
    var planeID: Int
    var userID: UUID
    var month: Int
    var year: Int

    init(date: Date, amount: Int, planeID: Int, userID: UUID, month: Int, year: Int) {
        self.date = date
        self.amount = amount
        self.planeID = planeID
        self.userID = userID
        self.month = month
        self.year = year
    }
}

public protocol ReflectedStringConvertible : CustomStringConvertible { }

extension ReflectedStringConvertible {
  public var description: String {
    let mirror = Mirror(reflecting: self)
    
    var str = "\(mirror.subjectType)("
    var first = true
    for (label, value) in mirror.children {
      if let label = label {
        if first {
          first = false
        } else {
          str += ", "
        }
        str += label
        str += ": "
        str += "\(value)"
      }
    }
    str += ")"
    
    return str
  }
}

这个想法来源于:

如果你把它变成一个结构而不是一个类,你将免费得到这个行为。但是,也许有理由它必须是一个类。在这种情况下,您可以使用反射打印密钥,而无需手动执行:


final class Transaction: Codable, ReflectedStringConvertible {
        
    var id: Int?
    var date: Date
    var amount: Int
    var planeID: Int
    var userID: UUID
    var month: Int
    var year: Int

    init(date: Date, amount: Int, planeID: Int, userID: UUID, month: Int, year: Int) {
        self.date = date
        self.amount = amount
        self.planeID = planeID
        self.userID = userID
        self.month = month
        self.year = year
    }
}

public protocol ReflectedStringConvertible : CustomStringConvertible { }

extension ReflectedStringConvertible {
  public var description: String {
    let mirror = Mirror(reflecting: self)
    
    var str = "\(mirror.subjectType)("
    var first = true
    for (label, value) in mirror.children {
      if let label = label {
        if first {
          first = false
        } else {
          str += ", "
        }
        str += label
        str += ": "
        str += "\(value)"
      }
    }
    str += ")"
    
    return str
  }
}

想法来自:

谢谢。但是为什么现在打印出项目的名称呢?打印的类的默认行为是它所属的包(在本例中正好是项目的名称),然后是类名本身。这意味着如果
Transaction
也出现在另一个包中,就不会出现名称空间混乱。谢谢。但是为什么现在打印出项目的名称呢?打印的类的默认行为是它所属的包(在本例中正好是项目的名称),然后是类名本身。这意味着,如果
Transaction
也出现在另一个包中,就不会出现名称空间混乱。