我一遍又一遍地使用以下代码将数据整形为JSON感到有点困惑,并希望有一个本机可重用的函数来实现可以传递任何东西的相同功能,它将检查它是否可编码,或者输出nil或字符串:
let encoder = JSONEncoder()
let formatter = DateFormatter()
formatter.dateStyle = .medium
encoder.dateEncodingStrategy = .formatted(formatter)
guard let jsonDateData = try? encoder.encode(dateOfApproval) else {return}
guard let myDateString = String(data: jsonDateData, encoding: .utf8) else {return}
问题的核心似乎是我无法检查发送的Any对象是否可编码,而让我检查特定类型(如下所示):
func shapeData(dataToShape: Any)-> String? {
let encoder = JSONEncoder()
let formatter = DateFormatter()
formatter.dateStyle = .medium
encoder.dateEncodingStrategy = .formatted(formatter)
if let hi = dataToShape as? String { // I'd prfer to be able to check if it's encodable here instead of a specific type
guard let jsonDateData = try? encoder.encode(hi) else {return nil}
guard let myDateString = String(data: jsonDateData, encoding: .utf8) else {return nil}
return myDateString
} else {
return nil
}
}
我尝试过,if dataToShape is Encodable
但是那也不起作用。
您可以使函数通用。这样,您的dataToShape
参数将具有某种通用类型,您可以将其限制为Encodable
:
func shapeData<T>(dataToShape: T) -> String? where T: Encodable {
let encoder = JSONEncoder()
let formatter = DateFormatter()
formatter.dateStyle = .medium
encoder.dateEncodingStrategy = .formatted(formatter)
guard let jsonDateData = try? encoder.encode(dataToShape) else {return nil}
guard let myDateString = String(data: jsonDateData, encoding: .utf8) else {return nil}
return myDateString
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句