首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >斯威夫特2反思

斯威夫特2反思
EN

Stack Overflow用户
提问于 2015-12-08 14:15:23
回答 2查看 173关注 0票数 0

我正在将一些“旧”Swift代码转换为SWIFT2.0,我遇到了一个无法消除的错误。

我的函数接收类型的Array (不管什么),并返回相同类型的新Array。

这段代码不再适用于SWIFT2.0:

代码语言:javascript
复制
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()纠正代码时会出现“表达式类型不明确而没有更多上下文”的错误。

我遗漏了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-08 15:31:33

这段代码是用SWIFT2.1编写的,并按照您在注释中的要求使用了map函数。

代码语言:javascript
复制
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)

代码语言:javascript
复制
func makePattern1<T>(list: [T]) -> [T] {
    return list[0..<list.count-1]
        .enumerate()
        .flatMap { [list[$0.index+1], list[$0.index]] }
}

更新#2

代码语言:javascript
复制
func makePattern1<T>(list: [T]) -> [T] {
    return [Int](1..<list.count).flatMap { [list[$0], list[$0-1]] }
}

测试

代码语言:javascript
复制
makePattern1([1,2,3,4,5]) // > [2, 1, 3, 2, 4, 3, 5, 4]
票数 3
EN

Stack Overflow用户

发布于 2015-12-08 16:22:20

只是为了好玩:另一种解决方案:

代码语言:javascript
复制
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] }再次将这些元组组合到一个数组中。
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34158143

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档