Swift - 一个函数可以接受一个 returns 一个元组作为参数的抛出函数吗?

Swift - can a function accept a throwing function that returns a tuple as a parameter?

在 Swift 中有没有办法让参数接受一个 returns 元组作为参数的抛出函数?

例如,我有这段代码,其中 sendNewInvitation 是一个抛出函数 returns 一个元组 (UserProfile, [GroupMembership]).

我的意思是将其作为 updateUserMemberships, 的参数传递,我能想到的最简单的方法是设置一个单独的变量作为 sendNewInvitation 的结果,然后设置元组的每个部分。

但我打算 updateUserMemberships 接受其他几个函数的结果,我想知道是否有办法在一行中完成所有这些?

当前代码:

            do {
                let userAndMembership = try sendNewInvitation(user: user, group: group)
                try updateUserMemberships(user: userAndMembership.0, groupMemberships: userAndMembership.1)
            } catch {
                print(error.localizedDescription)
                return
            }

理想情况下,我想知道是否有办法做这样的事情 (在 do 块内): try updateUserMemberships(tuple: try sendNewInvitation) (而且我可以重新声明函数以接受参数作为单独的参数或作为这种类型的元组)。

在对另一个函数的调用中调用抛出函数没有问题,如果第一个函数抛出 catch 子句将进入,第二个函数永远不会被调用。您可以简单地重新定义函数来代替元组

func updateUserMemberships(userInfo: (UserProfile, [GroupMembership])) throws {
    ...
}

并在对 `updateUserMemberships

的调用中调用另一个函数
do {
    try updateUserMemberships(userInfo: try sendNewInvitation(user: user, group: group))
} catch {
    print(error.localizedDescription)
    return
}

如果有助于提高可读性,您可以为元组创建类型别名

typealias UserInfo = (UserProfile, [GroupMembership])

func sendNewInvitation(user: String, group: String) throws -> UserInfo {
    ...
}

func updateUserMemberships(userInfo: UserInfo) throws {}

但是如果这是你要在很多地方使用的类型,那么我建议你将它包装在一个结构中

struct UserInfo {
    var userProfile: UserProfile
    var groupMembership: [GroupMembership])
}

您可以将抛出函数的结果作为参数传递给另一个函数,try 整个表达式只需要一次。在下面的示例中,如果 foo() 抛出,则不会调用 bar() 并且执行转到 catch 块:

func foo(n: Int) throws -> (Int, Int, Int) {
    if n == 0 {
        throw NSError(domain: "domain", code: 13, userInfo: nil)
    }
    return (1, 2, 3)
}

func bar(tuple: (Int, Int, Int)) {
    print(tuple)
}

do {
    try bar(tuple: foo(n: 0))
    print("success")
} catch {
    print(error)
}

rethrows 救援!

func sendNewInvitation(...) throws -> (UserProfile, [GroupMembership])  {
    ...
}

func updateUserMemebership(yourFunction: (...) throws -> (UserProfile, [GroupMembership])) rethrows {
    try yourFunction(...)
}


try updateUserMemebership(yourFunction: sendNewInvitation(...))

注:此例只是为了说明rethrows的用法。可能有更好的方法来构建您的代码。