Swift 2 自省
Swift 2 Introspection
我正在将一些 "old" Swift 代码转换为 Swift 2.0,我 运行 变成了一个我无法摆脱的错误。
我的函数接收一个类型(任意)的数组,returns一个相同类型的新数组。
此代码不再适用于 Swift 2.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
}
给出错误信息:"Initializing from a metatype value must reference 'init' explicitly".
更正代码:
var result = theType.init()
给出 "Type of expression is ambiguous without more context" 错误。
我错过了什么?
此代码是在 Swift 2.1 中编写的,并且确实按照您在评论中的要求使用了 map
函数。
func makePattern1<T>(list: [T]) -> [T] {
return list[0..<list.count-1]
.enumerate()
.map { [list[[=10=].index+1], list[[=10=].index]] }
.flatten()
.map { [=10=] as T }
}
更新#1
(感谢 Martin R)
func makePattern1<T>(list: [T]) -> [T] {
return list[0..<list.count-1]
.enumerate()
.flatMap { [list[[=11=].index+1], list[[=11=].index]] }
}
更新#2
func makePattern1<T>(list: [T]) -> [T] {
return [Int](1..<list.count).flatMap { [list[[=12=]], list[[=12=]-1]] }
}
测试
makePattern1([1,2,3,4,5]) // > [2, 1, 3, 2, 4, 3, 5, 4]
纯属娱乐:另一种解决方案:
func makePattern2<T>(list: [T]) -> [T] {
return zip(list.dropFirst(), list).flatMap { [[=10=], ] }
}
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[[=13=].i+1], list[[=13=].i])
个元组。
flatMap { [[=14=], ] }
再次将这些元组组合成一个数组。
我正在将一些 "old" Swift 代码转换为 Swift 2.0,我 运行 变成了一个我无法摆脱的错误。
我的函数接收一个类型(任意)的数组,returns一个相同类型的新数组。
此代码不再适用于 Swift 2.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
}
给出错误信息:"Initializing from a metatype value must reference 'init' explicitly".
更正代码:
var result = theType.init()
给出 "Type of expression is ambiguous without more context" 错误。
我错过了什么?
此代码是在 Swift 2.1 中编写的,并且确实按照您在评论中的要求使用了 map
函数。
func makePattern1<T>(list: [T]) -> [T] {
return list[0..<list.count-1]
.enumerate()
.map { [list[[=10=].index+1], list[[=10=].index]] }
.flatten()
.map { [=10=] as T }
}
更新#1
(感谢 Martin R)
func makePattern1<T>(list: [T]) -> [T] {
return list[0..<list.count-1]
.enumerate()
.flatMap { [list[[=11=].index+1], list[[=11=].index]] }
}
更新#2
func makePattern1<T>(list: [T]) -> [T] {
return [Int](1..<list.count).flatMap { [list[[=12=]], list[[=12=]-1]] }
}
测试
makePattern1([1,2,3,4,5]) // > [2, 1, 3, 2, 4, 3, 5, 4]
纯属娱乐:另一种解决方案:
func makePattern2<T>(list: [T]) -> [T] {
return zip(list.dropFirst(), list).flatMap { [[=10=], ] }
}
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[[=13=].i+1], list[[=13=].i])
个元组。flatMap { [[=14=], ] }
再次将这些元组组合成一个数组。