如何为具有命名参数的完成处理程序创建 typealias

6

我目前的进展是这样的:

  1. I've defined typealias completion handler

    typealias UserCompletionHandler = (_ object: User?, _ error: ApiError?) -> Void
    
  2. And I've created a service function that is using this typealias

    func login(email: String, password: String, completion: UserCompletionHandler) {
       // ...
       // this part here handles API call and parsing logic
       // ...
    
       completion(user, nil)
    }
    
我想要实现的是通过引入命名参数使回调函数的参数更易读。我的想法是最终得到这样的代码:
   completion(object: user, error: nil)

甚至更好的做法是使错误参数可选,这样我只需调用

   completion(object: user)

问题在于我找不到一种改变typealias定义以实现这一目的的方法。

2个回答

4

显然这是不可能的。您可以在 Swift 演进提案中找到此选择背后的解释: 0111-remove-arg-label-type-significance.md

函数类型只能根据形式参数和返回值类型进行定义。将包含参数标签的函数类型写出将被禁止。


3

我不确定这个答案是否理想,但你可以使用元组作为输入参数:

typealias UserCompletionHandler = ((object: User?, error: ApiError?)) -> Void

使用方法如下:

completion((object: user, error: nil))

我喜欢这种方法。虽然它有额外的大括号,但它确实提供了更清晰的命名和改进了处理程序使用的可读性。谢谢Edward! - Aleksandar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接