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
的用法。可能有更好的方法来构建代码。