【问题标题】:In Swift, how do I explicitly specify a return value for map with anonymous closure arguments?在 Swift 中,如何使用匿名闭包参数显式指定 map 的返回值?
【发布时间】:2020-02-19 15:51:53
【问题描述】:

假设我这样调用map,使用匿名闭包参数$0

array.map {
  return $0.description
}

如何明确定义该映射返回string?这不起作用:

array.map { -> String
  return $0.description
}

闭包参数列表的上下文类型需要 1 个参数,不能隐式忽略

这是否意味着如果我想指定一个返回值我必须命名我的参数?

[编辑:我知道我在这里不需要明确的返回类型;还是想怎么指定]

【问题讨论】:

  • “这是否意味着如果我想指定一个返回值,我必须命名我的参数?” 是的。或者,如果您的闭包只有一行,编译器将能够自行推断返回类型。
  • 描述不是字符串吗?

标签: swift dictionary return arguments


【解决方案1】:

您可以使用as 来识别匿名附件的类型。在这种情况下,您还需要指定输入的类型:

let result = array.map({ $0.description } as (CustomStringConvertible) -> String)

注意:您可以使用array 中的任何类型作为输入类型。这里我只使用了CustomStringConvertible 协议,因为这是访问.description 属性所需要的。

或者正如你提到的,如果你给输入参数一个名字,你可以指定输出类型:

let result = array.map { value -> String in value.description }

另一种看待它的方式是注意map 返回一个Array,无论map 闭包返回什么类型。您可以指定映射的结果是 [String],然后 Swift 会推断出 map 闭包返回 String

let result = array.map({ $0.description }) as [String]

let result: [String] = array.map { $0.description }

【讨论】:

    【解决方案2】:

    如果是字符串,类型会自动推断,否则你需要像这样的强制转换

    array.map { String($0.description) }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-23
      • 1970-01-01
      • 2013-02-21
      • 2016-11-12
      • 2012-05-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多