Swift 2.0平面图的使用
我正在阅读苹果公司作为教程制作的文件(“Auto Layout Cookbook”)中的代码,这时我发现了以下几行代码:Swift 2.0平面图的使用,swift,Swift,我正在阅读苹果公司作为教程制作的文件(“Auto Layout Cookbook”)中的代码,这时我发现了以下几行代码: let recipies: [Recipe] = fileContents.flatMap { recipeData in // Fetch the recipe information. guard let title = recipeData["Title"], descriptionFile
let recipies: [Recipe] = fileContents.flatMap { recipeData in
// Fetch the recipe information.
guard let title = recipeData["Title"],
descriptionFileName = recipeData["Document"],
identifierString = recipeData["Identifier"] else {
assertionFailure("Unable to fetch recipe information.")
return nil
}
// Convert the identifier string to an `Identifier` type.
guard let identifier = CookbookStoryboardIdentifier(rawValue: identifierString) else {
assertionFailure("Invalid recipe identifier: \(identifierString).")
return nil
}
// Read the recipe description from the associated file.
var description: String
do {
guard let descriptionURL = bundle.URLForResource(descriptionFileName, withExtension: nil) else {
fatalError("Unable to determine recipe description URL from fileName: \(descriptionFileName).")
}
try description = NSString(contentsOfURL: descriptionURL, encoding: NSUTF8StringEncoding) as String
}
catch {
fatalError("Unable to read recipe description from file")
}
return Recipe(title: title, identifier: identifier, description: description)
}
我查看了文档,发现如果我理解得很好,当需要将二维数组的内容转换为线性数组时,基本上可以使用flatMap
如果是这样,我不明白:
recipeData在
中的作用:我想它就像一个foreach李>
配方
(配方
是一个结构
)李>
flatMap
(他们在展平什么?)李>
非常感谢您提供的任何帮助、提示和(为什么不?)西红柿。
flatMap
还将删除nil值,如果您使用Haskell(例如),这有点奇怪
回答您的问题:
recipeData所做的:我想它就像一个foreach
forEach接受一个函数:T->Void
,这与那里发生的事情有点不同。您基本上有一个[AnyObject]
,您正在将其转换为[Recipe]
为什么他们使用平面图(他们在展平什么?)
回到我最初的解释,从代码片段中,我想说他们正在删除nil
Recipe
s,因此您只有能够创建的Recipe
s 这不是对你问题的完整回答,但我努力澄清一个潜在的误解:
如果我理解的很好,当需要将二维数组的内容转换为线性数组时,基本上可以使用flatMap
在目前的情况下可能是这样。然而,map
和flatMap
是更“抽象”的方法,将应用于某种“容器”。map
和flatMap
执行的实际操作取决于容器类型或上下文
例如,为数组、字典和可选项定义了map
和flatMap
。呃,是可选的
容器吗?是的,有点像。
以及一些通用的-例如Foo
。这里,“上下文”是一个泛型类或结构Foo
。它的“element”是类型为T
的值。此“容器”中的元素数量可能只有一个或多个。因此,map
和flatMap
的实际功能取决于上下文
flatMap
可以用map
和flatten
来定义。也就是说,将实现flatMap
,以便它获取map
的结果并将flatte
应用于它:
container.map { f($0) }.flatten()
map
和flatMap
是所谓的组合器-函数式编程中的一个术语。组合符可以应用于这些类型的容器,并返回一个相同类型的新容器——但可能具有另一种元素类型
组合器——顾名思义——可以组合在一起,形成更复杂的操作
您现在可以阅读
map
、flatMap
和flatte
的文档,了解定义它的各种类型,并了解它们的含义。好的,我提到了foreach来传递“循环”的概念,我应该直接编写“循环”。我指定了Recipe是什么,因为我没有粘贴相关代码(我不知道是否有人认为Recipe是内置类型,但是…;-)@IanBell我想可以从上下文中推断出,菜谱
是你自己的类型。当然,但我经常发现人们问“这是什么/那是什么”。。。这一次我更愿意具体说明:-)@IanBell让我从我的答案中删除这一部分。别担心,你已经写了你认为写得对的东西,就这样吧,非常感谢你的帮助
container.map { f($0) }.flatten()