Arrays 如何在文本文件中存储自定义对象的快速数组?
我有一个2D通用数组,其中大约有50个:Arrays 如何在文本文件中存储自定义对象的快速数组?,arrays,swift,location,Arrays,Swift,Location,我有一个2D通用数组,其中大约有50个: [string, string, string, string, double, double] 这些值的顺序都相同,我有一个自定义类: class tramStop { var tramDirection: String? var stopCode: String? var nameEnglish: String? var nameChinese: String? var latitude: Double?
[string, string, string, string, double, double]
这些值的顺序都相同,我有一个自定义类:
class tramStop {
var tramDirection: String?
var stopCode: String?
var nameEnglish: String?
var nameChinese: String?
var latitude: Double?
var longitude: Double?
init(direction: String, code: String, nameEn: String, nameCn: String, lat: Double, lon: Double) {
tramDirection = direction
stopCode = code
nameEnglish = nameEn
nameChinese = nameCn
latitude = lat
longitude = lon
}
}
我想将数组存储为文件中的自定义对象数组。如果不创建每次都附加一个空数组的东西,我似乎不知道如何做到这一点。我觉得有一个简单(和适当)的方法来做到这一点,但我不能想出它
最后,我想做的是获取设备位置,找到最近的纬度和经度对象,并从中检索字符串。您需要在数组中循环,获取每组6个元素,并初始化一个
tramStop
以放入一个新的tramStop
数组。或者,更好的做法是,首先初始化tramstats,而不创建临时数组
有几种方法可以保存到文件,具体取决于您要对其执行的操作。NSCoding可能是适用的,并且使您的类符合它相当容易。看看这篇文章
编辑:以下是创建新tramStop阵列的方法:
var newArray: [tramStop] = []
for i in stride(from: 0, to: oldArray.count, by: 6) {
newArray.append(tramStop(
direction: oldArray[i] as! String,
code: oldArray[i + 1] as! String,
nameEn: oldArray[i + 2] as! String,
nameCn: oldArray[i + 3] as! String,
lat: oldArray[i + 4] as! Double,
lon: oldArray[i + 5] as! Double
))
}
但是,正如我所说,我将研究如何彻底消除oldArray
另外,当我建议使用NSCoding时,我不知道你想要一个文本文件,因为NSCoding不会给你一个文本文件。首先,用大写字母命名类和结构是Swift的惯例。我建议使用结构而不是类。开始声明所有属性常量,并添加一个自定义初始值设定项,该初始值设定项接受任何类型对象的数组(在我看来,您应该使用字典作为源)。添加guard语句以确保数组计数等于6,并正确初始化每个结构属性。要允许持久性,您可以添加一个computed属性来创建一个包含自己信息的字典,并添加另一个属性来将json对象转换为数据:
struct TramStop {
let tramDirection: String
let stopCode: String
let nameEnglish: String
let nameChinese: String
let latitude: Double
let longitude: Double
init?(array: [Any]) {
guard array.count == 6 else { return nil }
tramDirection = array[0] as? String ?? ""
stopCode = array[1] as? String ?? ""
nameEnglish = array[2] as? String ?? ""
nameChinese = array[3] as? String ?? ""
latitude = array[4] as? Double ?? 0
longitude = array[5] as? Double ?? 0
}
init(_ dictionary: [String: Any]) {
tramDirection = dictionary["tramDirection"] as? String ?? ""
stopCode = dictionary["stopCode"] as? String ?? ""
nameEnglish = dictionary["nameEnglish"] as? String ?? ""
nameChinese = dictionary["nameChinese"] as? String ?? ""
latitude = dictionary["latitude"] as? Double ?? 0
longitude = dictionary["longitude"] as? Double ?? 0
}
var dictionary: [String: Any] {
return [ "tramDirection" : tramDirection,
"stopCode" : stopCode,
"nameEnglish" : nameEnglish,
"nameChinese" : nameChinese,
"latitude" : latitude,
"longitude" : longitude
]
}
var data: Data { return (try? JSONSerialization.data(withJSONObject: dictionary)) ?? Data() }
var json: String { return String(data: data, encoding: .utf8) ?? String() }
}
并创建一个结构来保存tramStops数组和适当的初始值设定项(array2D和jsonData):
操场测试
let array2D = [["a1", "a2", "a3", "a4", 1.0, 2.0],
["b1", "b2", "b3", "b4", 3.0, 4.0]]
let stops = Stops(array2D)
print(stops.json) // "[{"nameEnglish":"a3","latitude":1,"tramDirection":"a1","longitude":2,"stopCode":"a2","nameChinese":"a4"},{"nameEnglish":"b3","latitude":3,"tramDirection":"b1","longitude":4,"stopCode":"b2","nameChinese":"b4"}]"
let jsonURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!.appendingPathComponent("TramStop.json")
stops.data // 209 bytes
for tramStop in stops.tramStops {
print(tramStop.dictionary)
print(tramStop.stopCode)
print(tramStop.nameEnglish)
print(tramStop.nameChinese)
print(tramStop.latitude)
print(tramStop.longitude)
}
do {
try stops.data.write(to: jsonURL)
print("json data saved")
} catch {
print(error)
}
正在从fileURL读取json数据:
do {
let data = try Data(contentsOf: jsonURL)
print(String(data: data, encoding: .utf8) ?? "")
if let stops = Stops(data) {
for tramStop in stops.tramStops {
print(tramStop.tramDirection)
print(tramStop.stopCode)
print(tramStop.nameEnglish)
print(tramStop.nameChinese)
print(tramStop.latitude)
print(tramStop.longitude)
}
}
} catch {
print(error)
}
是否要将它们存储在文本文件中?这篇文章的标题和你提到的不一样。请说明clearly@user1046037是的,这是一个更好的提问方式,编辑标题。@Kevin你有没有尝试过我的建议,将你的结构保存为json?@LeoDabus有。最后我用Gloss绘制了地图Json@Kevin阅读底部的反射图,这就是我想做的,在一个满是电车站的阵列中,但我似乎无法理解。
do {
let data = try Data(contentsOf: jsonURL)
print(String(data: data, encoding: .utf8) ?? "")
if let stops = Stops(data) {
for tramStop in stops.tramStops {
print(tramStop.tramDirection)
print(tramStop.stopCode)
print(tramStop.nameEnglish)
print(tramStop.nameChinese)
print(tramStop.latitude)
print(tramStop.longitude)
}
}
} catch {
print(error)
}