Swift 2.0平面图的使用

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

我正在阅读苹果公司作为教程制作的文件(“Auto Layout Cookbook”)中的代码,这时我发现了以下几行代码:

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()