首页 文章

不理解Swift中的闭包示例

提问于
浏览
8

我正在努力学习快速和闭合 . 我坚持这个例子 .

numbers.map({
    (number: Int) -> Int in
    let result = 3 * number
    return result
 })

什么是(数字:国际) - >国际?这是一个功能吗?它在哪里定义? https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/GuidedTour.html#//apple_ref/doc/uid/TP40014097-CH2-ID1

关键字“in”有什么作用?文档说使用“将参数和返回类型从主体中分离” . 我不确定我明白这一点 . 为什么“in”不用于将“let result = 3 * number”与“return result”分开 .

3 回答

  • 1

    闭包只是一个函数,参数在括号内移动,关键字 in 将参数与函数体分开 . 以下两个示例定义了等效函数:

    func myFunc(number: Int) -> Int {
        let result = 3 * number
        return result
    }
    
    let myClosure = { (number: Int) -> Int in
        let result = 3 * number
        return result
    }
    

    实际上你可以用完全相同的方式调用它们:

    let x = myFunc(2)       // x == 6
    let y = myClosure(2)    // y == 6
    

    请注意第二个示例与第一个示例完全相同,仅在第一个示例中,参数 (number: Int) -> Int 在括号外,在第二个示例中,参数在括号内,后跟关键字 in .

    map 通过获取一个数组(在您的示例中为 numbers )并创建一个新数组,该数组是将闭包函数应用于 numbers 中每个元素的结果 . 因此,如果 numbers[1, 2, 3] ,则上面的示例将以 1 开头 . 它将应用闭包函数,它将产生一个 3 (因为它所做的只是将第一个数组中的元素乘以3) . 它为 numbers 中的每个元素执行此操作,直到它生成一个新数组 [3, 6, 9] .

    如果您愿意,可以使用上述函数或上述闭包的名称调用 map ,或者在 map 中明确写出来 . 以下所有示例都完全等效:

    let numbers = [1, 2, 3]
    
    // Example 1
    let times3 = numbers.map(myFunc)        // times3 == [3, 6, 9]
    
    // Example 2
    let timesThree = numbers.map(myClosure) // timesThree == [3, 6, 9]
    
    // Example 3
    let xThree = numbers.map({ (number: Int) -> Int in
        let result = 3 * number
        return result                       // xThree == [3, 6, 9]
    })
    

    注意,示例3与示例2相同,仅在示例3中,闭包在 map 内明确拼写,而在示例2中,闭包已分配给名为 myClosure 的常量,并且常量已提供给 map .

    希望这会有所帮助 - 关闭很有趣,但令人困惑 .

  • 0

    您正在调用的函数将闭包作为其参数:

    numbers.map({...})
    

    提供给函数的闭包应该在您调用的函数执行时接收参数 . 此参数在闭包中定义:

    (number: Int) -> Int in
    

    您现在可以在闭包的内容中使用该参数

    let result = 3 * number
      return result
    
  • 32

    闭包是自包含的功能块,可以在代码中传递和使用 .

    Syntax:

    {(parameterName: ParameterType) -> returnType in
        //Statements
    }
    

    实际场景:当用户想要应用过滤器并想要选择超过300的值时(在这种情况下),我们可以使用闭包来实现这一点 .

    var elements: [Int] = [Int]() //Declaring Empty array
    elements = [1001, 999, 555, 786, 988, 322, 433, 128, 233, 222, 201, 276, 133]
    
    var filteredElements = elements.map({(num: Int) -> Int? in
        return num > 300 ? num : nil
    })
    
    output:
    [Optional(1001), Optional(999), Optional(555), Optional(786), Optional(988), Optional(322), Optional(433), nil, nil, nil, nil, nil, nil]
    

    从下面的代码中你可以清楚地看到我们正在将closure传递给elements.map()函数 .

    Closure:

    {(num: Int) -> Int? in
            return num > 300 ? num : nil
        }
    

    (num:Int) 是参数 . 诠释?我们要返回Optional Integer Type .

    in 之后,我们可以编写你的逻辑 .

    您可以阅读有关closure here的更多信息 .

相关问题