Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 如何在文本文件中存储自定义对象的快速数组?_Arrays_Swift_Location - Fatal编程技术网

Arrays 如何在文本文件中存储自定义对象的快速数组?

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?

我有一个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?
    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)
}