当Element是元组时,Extend Array受约束

时间:2015-12-18 21:39:25

标签: arrays swift generics swift2

当元素是一种元组时,有没有办法扩展数组?

TableViewOne
  

此声明返回4个错误:

     
      
  • 语句不能以闭包表达式开头
  •   
  • 支撑块语句是未使用的闭包
  •   
  • 预期'{'在分机
  •   
  • 类型名称的预期标识符
  •   

我无法判断所显示的错误是否准确。 有什么想法吗?

4 个答案:

答案 0 :(得分:4)

appzYourLife答案的Swift 3 版本:

''

答案 1 :(得分:3)

由于(AFAIK)Tuple类型不符合Protocol(甚至没有名称),因此很难做到你所需要的。

这是我能得到的最接近的(也许其他人可以提供更优雅的解决方案)。

Typealias

首先让我们定义一些typealiases

typealias Tuple2 = (Any, Any)
typealias Tuple3 = (Any, Any, Any)
  

是的,有些读者现在明白我要去哪里,可能不喜欢它......

     

我不喜欢它

序列类型

现在,当序列的SequenceTypefoo时,让我们扩展协议Element添加Tuple2方法...

extension SequenceType where Generator.Element == Tuple2 {
    func foo() {}
}

Tuple3

extension SequenceType where Generator.Element == Tuple3 {
    func foo() {}
}

阵列

接下来,我们可以定义并填充Tuple2

数组
let list: [Tuple2] = [(1,2)]

现在应用了扩展程序,我们可以编写

list.foo()

免责声明:D

仅当数组显式声明为[Tuple2](或[Tuple3])时,此方法才有效。

这样的事情工作

let list = [(1,2)]
list.foo() // compile error

答案 2 :(得分:3)

现在可以在Swift 3.1中使用。

extension Array where Element == (String, String) {
    ...
}

答案 3 :(得分:1)

您无法添加extension Array where Element == Int之类的特定类型,因为这会将通用数据转换为非通用版本。

您会看到类似same-type requirement makes generic parameter 'Element' non-generic

的错误

修改

它确实看起来合法(至少在Swift 2.2中):

typealias tzTuple = (timeZoneName: String, formattedName: String)

extension Array where Element: tzTuple  {

}

你必须看看它是否在运行时工作。

我在Playground检查这个,目前,Playgrounds尚未完全使用Swift 2.2-dev

我建议这样做:

typealias tzTuple = (timeZoneName: String, formattedName: String)

extension Array {

  func formattedName(index: Int) -> String? {
    if self[index] is tzTuple {
      return (self[index] as! tzTuple).formattedName
    }
    return nil
  }
}

允许你这样做

let foo = [(timezoneName: "PST", formattedName: "Pacific Standard Time"),(timezoneName: "AEST", formattedName: "Australian Eastern Time")]
print(foo.formattedName(0))