【问题标题】:How to create typealias for completion handlers with named arguments如何使用命名参数为完成处理程序创建类型别名
【发布时间】:2021-04-06 13:55:04
【问题描述】:

到目前为止,我所拥有的是:

  1. 我已经定义了typealias 完成处理程序

    typealias UserCompletionHandler = (_ object: User?, _ error: ApiError?) -> Void
    
  2. 我创建了一个使用此类型别名的服务函数

    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 定义来实现这一点的方法。

【问题讨论】:

    标签: ios swift type-alias


    【解决方案1】:

    显然这是不可能的。你可以在 swift evolution 提案中找到这个选择背后的解释:0111-remove-arg-label-type-significance.md

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

    【讨论】:

      【解决方案2】:

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

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

      用法如下:

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

      【讨论】:

      • 我喜欢这种方法。它确实有额外的大括号,但它确实提供了更清晰的命名并提高了处理程序使用的可读性。谢谢爱德华!
      猜你喜欢
      • 1970-01-01
      • 2021-03-03
      • 2020-02-04
      • 1970-01-01
      • 2016-12-22
      • 2013-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多