将结果加入一个字符串

时间:2016-02-06 13:46:34

标签: swift loops

我将核心数据存储在名为" Places"的实体中。它有一个名为" name"的属性。我当前的for循环返回每个名称的效果很好,控制台中的print会按预期显示所有名称。目前,控制台将每个显示在一个单独的行上,因为它们来自不同的位置。是否可以从每个地方获取所有名称,然后存储在单个字符串中。这是当前的代码:

    do {
        let results = try myContext.executeFetchRequest(fetchRequest) as! [Places]

            for places in results{         
                let array = [places.name!].joinWithSeparator(", ")
                print(array)
            }

    } catch let error as NSError {
        // failure
        print("Fetch failed: \(error.localizedDescription)")
    }
}

这是输出,即每行(显示它们是单独的对象),但我希望它们在一个字符串中(并用逗号分隔符打印在同一行上)

Output

我想要输出的输出是: 法国,德国,波兰,匈牙利,塞尔维亚

感谢您的阅读,希望您能帮助我!

4 个答案:

答案 0 :(得分:1)

您可以使用reduce方法。

let placeNames = results.reduce("") { (placeNames, place) -> String in
    return placeNames + place.name + " "
}

现在你有一个String,其中包含所有地名的连接。

简短符号

您也可以按照以下方式编写

let placeNames = results.reduce("") { $0 + $1.name + " " }

实施例

让我们说Place定义如下(我使用的是Struct,但Class也能正常工作)

struct Place {
    let name: String
}

现在让我们将results定义为Place(s)

的数组
let results = [Place(name: "Italy"), Place(name: "UK"), Place(name: "USA")]

最后让我们测试一下代码

let placeNames = results.reduce("") { $0 + " " + $1.name }
print(placeNames) // "Italy UK USA "

删除最后一个空格

您可能已经注意到生成的String附加了一个空格。我们可以摆脱更新代码,如下所示

let placeNames = String(
    places
        .reduce("") { $0 + $1.name + " " }
        .characters
        .dropLast()
)

为什么这个解决方案比for循环更好?

我在这里建议的代码确实遵循功能编程范例。与经典for循环相比有几个优点:

  1. 它的线程安全:由于我只使用不可变值,因此您不必担心在使用它们时可能会改变您的值的其他线程。
  2. 它不易出错,因为它更具说明性:我们描述的是结果应该如何,而不是如何构建它。
  3. 那就是:)

答案 1 :(得分:1)

如果你想把结果放到一个字符串中,你可以这样做:

let results = (try? myContext.executeFetchRequest(fetchRequest)) as? [Places] ?? []
let places = results.flatMap { $0.name }.joinWithSeparator(" ")

答案 2 :(得分:0)

你可以在没有循环的情况下完成:('$ 0'是闭包中的参数)

results.forEach{ print($0, terminator:" ") }

答案 3 :(得分:0)

我想指定两件事

FRP

您可以在序列类型上使用函数样式。 在这种情况下,您可以在Places个地方的数组中转换name数组。

为此,您可以使用map功能。

places.map{$0.name}将返回一个名字数组。

由于名称是可选的,请使用flatMap代替删除nil

let string = places.flatMap{$0.name}.joinWithSeparator(", ")

抛出错误

您正在使用as!进行投射。如果失败,您将无法恢复错误。

您可能希望以简单的方式在代码中添加安全性。

投掷unwraping

您可以声明一个在展开时抛出错误的函数。

enum UnwrapError: ErrorType {
    case Failed
}

func unwrap<A>(optional: A?) throws -> A {
    guard let unwrap = optional else {
        throw UnwrapError.Failed
    }
    return unwrap
}


do {
    let results = try unwrap(myContext.executeFetchRequest(fetchRequest) as? [Places])
    print(places.flatMap{$0.name}.joinWithSeparator(", "))

} catch let error as NSError {
    // failure
    print("Fetch failed: \(error.localizedDescription)")
}

然后,您可能需要对fetchRequest进行单元测试,以检查其是否返回[Places]

相关问题