我正在将一些“旧”Swift代码转换为SWIFT2.0,我遇到了一个无法消除的错误。
我的函数接收类型的Array (不管什么),并返回相同类型的新Array。
这段代码不再适用于SWIFT2.0:
func makePattern1<T>(var list: Array<T>) -> Array<T> {
let theType = list.dynamicType
var result = theType()
for i in 1..<list.count {
result.append(list[i])
result.append(list[i-1])
}
return result
}提供错误信息:“从元类型值初始化必须显式引用'init‘”。
使用:var result = theType.init()纠正代码时会出现“表达式类型不明确而没有更多上下文”的错误。
我遗漏了什么?
发布于 2015-12-08 15:31:33
这段代码是用SWIFT2.1编写的,并按照您在注释中的要求使用了map函数。
func makePattern1<T>(list: [T]) -> [T] {
return list[0..<list.count-1]
.enumerate()
.map { [list[$0.index+1], list[$0.index]] }
.flatten()
.map { $0 as T }
}更新#1
(谢谢马丁R)
func makePattern1<T>(list: [T]) -> [T] {
return list[0..<list.count-1]
.enumerate()
.flatMap { [list[$0.index+1], list[$0.index]] }
}更新#2
func makePattern1<T>(list: [T]) -> [T] {
return [Int](1..<list.count).flatMap { [list[$0], list[$0-1]] }
}测试
makePattern1([1,2,3,4,5]) // > [2, 1, 3, 2, 4, 3, 5, 4]发布于 2015-12-08 16:22:20
只是为了好玩:另一种解决方案:
func makePattern2<T>(list: [T]) -> [T] {
return zip(list.dropFirst(), list).flatMap { [$0, $1] }
}
let m = makePattern2([1,2,3,4,5])
print(m) // [2, 1, 3, 2, 4, 3, 5, 4]备注:
list.dropFirst()是除第一个数组元素之外的所有数组元素的序列。zip(list.dropFirst(), list)是(list[$0.i+1], list[$0.i])元组的序列。flatMap { [$0, $1] }再次将这些元组组合到一个数组中。https://stackoverflow.com/questions/34158143
复制相似问题