【发布时间】:2018-10-12 07:50:41
【问题描述】:
这是我第一次使用 swift(macOS 命令行应用程序)进行开发。
我正在遍历一个文件夹中的所有 jpeg 文件,获取那些在 EXIF 数据中没有 GPS 信息的文件,并为每个图像找到时间最接近的 GPS 数据( Exif 时间戳)。然后我想从图像中复制 GPS 数据。
我有一个包含文件名(字符串)、日期(日期)和 GPS(字典)的结构,并为所有文件创建了一个数组(我没有在此处粘贴函数 getFiles())。
struct stFile {
var name : String
var date : Date
var gps : [String : AnyObject]?
}
然后我按日期字段对数组进行排序:
var files = getFiles(folder: "files://FolderToJpegs/")
var filesSorted = files.sorted(by: { $0.date.compare($1.date) == .orderedDescending })
到目前为止,我所能想到的只是一个查找日期完全相同的文件的函数(跳过名称相同的文件,因为这是我们当前正在迭代的同一个文件):
for file in filesSorted {
if (file.gps == nil) {
if let closesdate = filesSorted.first(where: { $0.date.compare(file.date) == ComparisonResult.orderedAscending && $0.name != file.name }) {
print("The closest date to \(file.date) is \(closesdate.date).")
}
}
}
由于我是 swift 新手,我想知道版本 4 中是否已经有一种简单的方法可以完成此操作。我猜一种方法是在第一个迭代中嵌套另一个迭代并计算时间差。
谢谢!
编辑
好的,到目前为止,我想出了一个解决方案,可以计算一个元素与具有 gps 数据的其他每个元素之间的时间差 (.gps != nil):
for (index, _) in filesSorted.enumerated()
{
if filesSorted[index].gps == nil
{
var timeDiffPrev = Double.greatestFiniteMagnitude
var closestFile:stFile?
for fileWithGPS in filesSorted
{
if(filesSorted[index].name != fileWithGPS.name && fileWithGPS.gps != nil)
{
let timeDiff = abs(filesSorted[index].date.timeIntervalSince(fileWithGPS.date))
if(timeDiff < timeDiffPrev)
{
closestFile = fileWithGPS
}
timeDiffPrev = timeDiff
}
}
if(closestFile != nil)
{
filesSorted[index].gps = closestFile?.gps
}
}
}
【问题讨论】: