如何在swift中声明带参数的块?

 奥黛丽凵赫本 发布于 2023-01-11 18:57

很难搞清楚如何使用swift正确声明/使用块.什么是以下代码的快速等价物?

谢谢.

^(PFUser *user, NSError *error) {
if (!user) {
    NSLog(@"Uh oh. The user cancelled the Facebook login.");
} else if (user.isNew) {
    NSLog(@"User signed up and logged in through Facebook!");
} else {
    NSLog(@"User logged in through Facebook!");
}

Gabriele Pet.. 14

Objective-C块的等价物是快速闭包,因此它将如下所示

{ (user: PFUser, error: NSError) in
  if (!user) {
    println("Uh oh. The user cancelled the Facebook login.");
  } else if (user.isNew) {
    println("User signed up and logged in through Facebook!");
  } else {
    println("User logged in through Facebook!");
  }
}


Francescu.. 7

你有很多方法可以在Swift中传递一个等效于函数的块.

我发现了三个.

为了理解这一点,我建议你在游乐场测试这段小代码.

func test(function:String -> String) -> String
{
    return function("test")
}

func funcStyle(s:String) -> String
{
    return "FUNC__" + s + "__FUNC"
}
let resultFunc = test(funcStyle)

let blockStyle:(String) -> String = {s in return "BLOCK__" + s + "__BLOCK"}
let resultBlock = test(blockStyle)

let resultAnon = test({(s:String) -> String in return "ANON_" + s + "__ANON" })


println(resultFunc)
println(resultBlock)
println(resultAnon)

更新:匿名函数有2个特例.

首先是可以推断出函数签名,因此您不必重写它.

let resultShortAnon = test({return "ANON_" + $0 + "__ANON" })

第二种特殊情况仅在块是最后一个参数时起作用,它称为尾随闭包

这是一个例子(与推断签名合并以显示Swift电源)

let resultTrailingClosure = test { return "TRAILCLOS_" + $0 + "__TRAILCLOS" }

最后:

使用所有这些功能,我要做的是混合尾随闭包和类型推断(为了便于阅读命名)

PFFacebookUtils.logInWithPermissions(permissions) {
    user, error in
    if (!user) {
        println("Uh oh. The user cancelled the Facebook login.")
    } else if (user.isNew) {
        println("User signed up and logged in through Facebook!")
    } else {
        println("User logged in through Facebook!")
    }
}

IMO它比ObjC更漂亮

2 个回答
  • Objective-C块的等价物是快速闭包,因此它将如下所示

    { (user: PFUser, error: NSError) in
      if (!user) {
        println("Uh oh. The user cancelled the Facebook login.");
      } else if (user.isNew) {
        println("User signed up and logged in through Facebook!");
      } else {
        println("User logged in through Facebook!");
      }
    }
    

    2023-01-11 18:59 回答
  • 你有很多方法可以在Swift中传递一个等效于函数的块.

    我发现了三个.

    为了理解这一点,我建议你在游乐场测试这段小代码.

    func test(function:String -> String) -> String
    {
        return function("test")
    }
    
    func funcStyle(s:String) -> String
    {
        return "FUNC__" + s + "__FUNC"
    }
    let resultFunc = test(funcStyle)
    
    let blockStyle:(String) -> String = {s in return "BLOCK__" + s + "__BLOCK"}
    let resultBlock = test(blockStyle)
    
    let resultAnon = test({(s:String) -> String in return "ANON_" + s + "__ANON" })
    
    
    println(resultFunc)
    println(resultBlock)
    println(resultAnon)
    

    更新:匿名函数有2个特例.

    首先是可以推断出函数签名,因此您不必重写它.

    let resultShortAnon = test({return "ANON_" + $0 + "__ANON" })
    

    第二种特殊情况仅在块是最后一个参数时起作用,它称为尾随闭包

    这是一个例子(与推断签名合并以显示Swift电源)

    let resultTrailingClosure = test { return "TRAILCLOS_" + $0 + "__TRAILCLOS" }
    

    最后:

    使用所有这些功能,我要做的是混合尾随闭包和类型推断(为了便于阅读命名)

    PFFacebookUtils.logInWithPermissions(permissions) {
        user, error in
        if (!user) {
            println("Uh oh. The user cancelled the Facebook login.")
        } else if (user.isNew) {
            println("User signed up and logged in through Facebook!")
        } else {
            println("User logged in through Facebook!")
        }
    }
    

    IMO它比ObjC更漂亮

    2023-01-11 19:00 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有