Swift Xcode 12打印命令不';不显示类字段
我最近搬到了一家新的MacBookPro。在新机器和Xcode 12上,打印命令的工作方式与以前不同。我有点困惑到底发生了什么变化。新的Xcode安装在MacOSX 10.15.7上,我正在运行Xcode 12.4。我已经确保在控制台中选择了正确的选项,左侧没有应用过滤器,右侧选择了“所有输出” 我在控制台中得到的是“trans:apitest.Transaction”,它是项目的名称和类的名称。我的问题是:为什么Xcode突然打印出项目名称?还有,为什么它不显示类的任何属性?有没有一种方法可以不手动枚举类实例的所有属性?谢谢你的耐心和帮助 这是我的课Swift Xcode 12打印命令不';不显示类字段,swift,xcode,Swift,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
也出现在另一个包中,就不会出现名称空间混乱。