【问题标题】:Instantiate array of associated type in Swift在 Swift 中实例化关联类型的数组
【发布时间】:2016-04-25 06:00:25
【问题描述】:

我正在浏览 Swift 2.2 附带的“Guided Tour”游乐场。在泛型章节中,你会得到这个非常麻烦的函数声明:

func anyCommonElements <T: SequenceType, U: SequenceType where
    T.Generator.Element: Equatable,
    T.Generator.Element == U.Generator.Element>
    (lhs: T, _ rhs: U) -> Bool {

  for lhsItem in lhs {
      for rhsItem in rhs {
          if lhsItem == rhsItem {
              return true
          }
      }
  }
 return false

}
anyCommonElements([1, 2, 3], [3])

该函数返回两个序列是否有任何共同的元素,这很简单。

本章的练习是修改函数以返回两个序列之间的公共元素的数组。从这里我知道该函数需要有一个返回类型,如

(lhs: T, _ rhs: U) -> [T.Generator.Element]

这似乎很简单,创建一个数组并将公共元素放入其中,然后返回它。但是到目前为止,本书中没有任何内容教会我如何制作[T.Generator.Element] 类型的新数组,所以我真的不知道如何进行。我很自然地认为这样的事情会起作用:

var result = [T.Generator.Element]()

但是,是的,这不会编译。那么我该如何解决这个练习呢? (这对于第一次引入泛型来说是不是有点高级?)

【问题讨论】:

    标签: swift generics


    【解决方案1】:

    你是对的,它应该可以工作。它不是a known bug in the Swift compiler。您有多种解决方法:

    • var result: [T.Generator.Element] = []

    • var result = [] as [T.Generator.Element]

    • var result = Array&lt;T.Generator.Element&gt;()

    (诀窍是为编译器提供足够的上下文,让它知道它正在尝试在那里解析类型名称。在[T.Generator.Element]() 语法中,它错误地将括号中的部分解析为数组文字。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-14
      • 2021-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多