当元素是一种元组时,有没有办法扩展数组?
TableViewOne
此声明返回4个错误:
- 语句不能以闭包表达式开头
- 支撑块语句是未使用的闭包
- 预期'{'在分机
- 类型名称的预期标识符
我无法判断所显示的错误是否准确。 有什么想法吗?
答案 0 :(得分:4)
appzYourLife答案的Swift 3 版本:
''
答案 1 :(得分:3)
由于(AFAIK)Tuple
类型不符合Protocol
(甚至没有名称),因此很难做到你所需要的。
这是我能得到的最接近的(也许其他人可以提供更优雅的解决方案)。
首先让我们定义一些typealiases
typealias Tuple2 = (Any, Any)
typealias Tuple3 = (Any, Any, Any)
是的,有些读者现在明白我要去哪里,可能不喜欢它......
我不喜欢它
现在,当序列的SequenceType
为foo
时,让我们扩展协议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()
仅当数组显式声明为[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))