我将核心数据存储在名为" 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)")
}
}
这是输出,即每行(显示它们是单独的对象),但我希望它们在一个字符串中(并用逗号分隔符打印在同一行上)
我想要输出的输出是: 法国,德国,波兰,匈牙利,塞尔维亚
感谢您的阅读,希望您能帮助我!
答案 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循环相比有几个优点:
那就是:)
答案 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)
我想指定两件事
您可以在序列类型上使用函数样式。
在这种情况下,您可以在Places
个地方的数组中转换name
数组。
为此,您可以使用map
功能。
places.map{$0.name}
将返回一个名字数组。
由于名称是可选的,请使用flatMap
代替删除nil
值
let string = places.flatMap{$0.name}.joinWithSeparator(", ")
您正在使用as!
进行投射。如果失败,您将无法恢复错误。
您可能希望以简单的方式在代码中添加安全性。
您可以声明一个在展开时抛出错误的函数。
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]