【问题标题】:Check existence of Swift Array item with Generic使用 Generic 检查是否存在 Swift Array 项
【发布时间】:2015-07-13 23:53:02
【问题描述】:

我想创建一个 Swift 数组的扩展,它返回随机 N 个元素。

extension Array {
  func getRandomItems(max:Int) -> [T] {
    var randomItems = [T]()

    repeat
    {
      let randomNumber = Int(arc4random_uniform(UInt32(self.count)))
      if contains(randomItems, self[randomNumber]) {
        randomItems.append(self[randomNumber])
      }
    } while (randomItems.count < max)

    return randomItems
  }

}


print(["Canada","Brazil","China","Japan","U.S"].getRandomNumbers(3))

编译器说“不能使用类型为 '([T], T)' 的参数列表调用 'contains' 如何让这个功能发挥作用?

【问题讨论】:

    标签: ios arrays swift generics xcode6


    【解决方案1】:

    您需要确保只扩展符合Equatable 的数组。此外,在最新的测试版中,T 已替换为 Element

    extension Array where Element : Equatable {
      func getRandomItems(max:Int) -> [Element] {
        var randomItems = [Element]()
    
        repeat
        {
          let randomNumber = Int(arc4random_uniform(UInt32(self.count)))
          if randomItems.contains(self[randomNumber]) {
            randomItems.append(self[randomNumber])
          }
        } while (randomItems.count < max)
    
        return randomItems
      }
    
    }
    

    你的if randomItems.contains(self[randomNumber]) 应该是if !randomItems.contains(self[randomNumber])

    【讨论】:

    • 非常感谢。我用 Xcode 7.0 beta 尝试了这段代码,但它抱怨“尾随'where'子句用于扩展非协议类型'Array'”而且.contains 函数调用抱怨“不能调用'contains'类型的参数列表'( T)'" 不知道如何解决这个问题。
    • 您必须使用 beta 1 或 2,所以。使用 where 子句扩展数组的功能在 beta 3 中。The new version is here.
    猜你喜欢
    • 1970-01-01
    • 2023-01-24
    • 2016-11-19
    • 1970-01-01
    • 1970-01-01
    • 2019-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多