编译Swift源文件会挂在大型数组reduce-combine +表达式上

时间:2016-01-20 22:03:48

标签: arrays swift

在我的测试中,我习惯用不同的行编写字符串,如

    let jsonString = ["{"
        ,"\"url\": \"http://localhost:8090/rest/api/3\","
        , "\"id\": \"3\","
        , "\"description\": \"A test that needs to be done.\","
        , "\"name\": \"Test\","
        , "\"subtest\": false,"
        , "\"avatar\": 1"
        ,"}"].reduce("", combine: +)

工作正常,我的数组仍然获得145行大型测试json字符串。 有145行(或者更少,没有逐行尝试),构建任务在“编译Swift源文件”时挂起。

首先,这有点疯狂。 30行是好的,145不行?什么?

第二,在Swift中多行编写String的更好的解决方案是什么? - 我不想加载json并从外部文件解析它。

1 个答案:

答案 0 :(得分:4)

这可能是因为类型推断。

尝试为数组变量提供显式[String]类型以帮助编译器计算出来,然后将reduce应用于变量。

let arrayOfStrings: [String] = ["{"
    ,"\"url\": \"http://localhost:8090/rest/api/3\","
    , "\"id\": \"3\","
    , "\"description\": \"A test that needs to be done.\","
    , "\"name\": \"Test\","
    , "\"subtest\": false,"
    , "\"avatar\": 1"
    ,"}"] // etc

let jsonString = arrayOfStrings.reduce("", combine: +)

无论如何,要创建JSON,您应该创建一个字典,然后使用NSJSONSerialization将其序列化,这不容易出错:

Swift 2

do {
    // Create a dictionary.
    let dict = ["url": "http://localhost:8090/rest/api/3", "id": "3"]  // etc

    // Encode it to JSON data.
    let jsonData = try NSJSONSerialization.dataWithJSONObject(dict, options: [])

    // Get the object back.
    if let jsonObject = try NSJSONSerialization.JSONObjectWithData(jsonData, options: []) as? [String:String] {
        print(jsonObject)
    }

    // Get it as a String.
    if let jsonString = String(data: jsonData, encoding: NSUTF8StringEncoding) {
        print(jsonString)
    }

} catch let error as NSError {
    print(error)
}

Swift 3

do {
    // Create a dictionary.
    let dict = ["url": "http://localhost:8090/rest/api/3", "id": "3"]  // etc

    // Encode it to JSON data.
    let jsonData = try JSONSerialization.data(withJSONObject: dict, options: [])

    // Get the object back.
    if let jsonObject = try JSONSerialization.jsonObject(with: jsonData, options: []) as? [String:String] {
        print(jsonObject)
    }

    // Get it as a String.
    if let jsonString = String(data: jsonData, encoding: String.Encoding.utf8) {
        print(jsonString)
    }

} catch let error as NSError {
    print(error)
}