Swift-函数是否可以接受将元组作为参数返回的抛出函数



Swift中有没有一种方法可以让参数接受将元组作为参数返回的抛出函数?

例如,我有这样的代码,其中sendNewInvitation是一个抛出函数,返回一个元组(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的用法。可能有更好的方法来构建代码。

最新更新