如果我想将格式化的日期写入类值,则该值将为零。但是我之前声明的变量获得了日期。如果我想将其设置为类值,它将为nil。我不知道这是我的代码:
do {
let data = try String(contentsOfFile: path,
encoding: .utf8)
//print(data)
let df = DateFormatter()
df.dateFormat = "dd.MM.yyyy HH:mm:ss"
if let jsonData = data.data(using: .utf8) {
let jsonDecoder = JSONDecoder()
let json = try jsonDecoder.decode(coreJSON.self, from: jsonData)
for r in json.activities! {
let run = Runs()
let start = df.date(from: r.timestampStart!)!
print(start)
run.timestampStart = start
run.timestampEnd = df.date(from: r.timestampEnd!)!
var locations: [RunsLocations] = []
for l in r.locations! {
let loc = RunsLocations()
loc.timestamp = df.date(from: l.timestamp!)
loc.latitude = l.latitude
loc.longitude = l.longitude
loc.altitude = l.altitude
locations.append(loc)
}
run.locations = locations
run.workoutID = r.workoutID
run.workouttype = r.workoutType
run.distance = r.distance
run.duration = r.duration
run.avgpace = r.avgpace
run.maxspeed = r.maxspeed
run.avgspeed = r.avgspeed
run.pausetime = r.pausetime
run.calories = r.calories
coreData.setWorkoutsLocal(_workout: run)
}
} catch {
print(error)
}
}
如果我从头开始打印日期,那么我在那里会得到日期。在r.timestampStart中,我有一个值(参见图片)。但由于没有错误,我没有收到错误。
所有其他数据将正确地传递到类值。
在您的结构或类中将timestampStart
,timestampEnd
和timestamp
声明为Date
然后创建JSONDecoder
let jsonDecoder = JSONDecoder()
let dateFormatter = DateFormatter()
dateFormatter.locale = Locale(identifier: "en_US_POSIX")
dateFormatter.dateFormat = "dd.MM.yyyy HH:mm:ss"
decoder.dateDecodingStrategy = .formatted(dateFormatter)
并删除其他日期格式化程序。它将所有字符串日期即时解码为Date
。
注意:
从文件中读取Data
,并使用URL而不是字符串路径。
let data = try Data(contentsOf: url)
将结构/类中的所有属性声明为非可选,您将强制拆开并删除不必要的感叹号。