加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

如何使用Swift的第一个/头部和休息/尾部?

发布时间:2020-12-14 04:37:50 所属栏目:百科 来源:网络整理
导读:为了在函数式中使用 Swift,我们应该如何处理列表的尾部和尾部? Arrays和ArraySlices是否合适(似乎是因为ArraySlice是获取子列表的有效机制)?是将Array转换为ArraySlice并使用.first的正确机制!和.dropFirst()作为头尾的等价物? 作为添加数字列表的示例:
为了在函数式中使用 Swift,我们应该如何处理列表的尾部和尾部? Arrays和ArraySlices是否合适(似乎是因为ArraySlice是获取子列表的有效机制)?是将Array转换为ArraySlice并使用.first的正确机制!和.dropFirst()作为头尾的等价物?

作为添加数字列表的示例:

func add(_ nums: ArraySlice<Int>) -> Int {
    if nums.count == 0 {
        return 0
    } else {
        return nums.first! + add(nums.dropFirst())
    }
}

解决方法

Array具有初始化器( init(_:)),其可以从任何 Sequence生成阵列,例如 ArraySlice.

func sum(_ nums: [Int]) -> Int {
    guard let head = nums.first else { return 0; } //base case,empty list.
    return head + sum(Array(nums.dropFirst()))
}

let input = Array(1...10)
let output = sum(input)
print(output)

但真的,正如matt所说,不要这样做.编程的头/尾方法在一种语言中很有意义,它可以很好地利用模式匹配,良好的编译器优化,尾调用优化等.Swift的设计鼓励使用reduce.它不仅更短,更易读,而且性能更高.

为了比较,以下是典型的Swift方法:

extension Sequence where Iterator.Element: Integer {
    func sum() -> Iterator.Element {
        return self.reduce(0,+)
    }
}

>它更简单,更短.
>它是多态的,所以它适用于任何序列,而不仅仅局限于数组
>它在任何Integer类型上都是通用的,而不仅仅是Int.所以这些都有效:

print(Array<UInt  >(1...10).sum())
print(Array<UInt8 >(1...10).sum())
print(Array<UInt16>(1...10).sum())
print(Array<UInt32>(1...10).sum())
print(Array<UInt64>(1...10).sum())
print(Array< Int  >(1...10).sum())
print(Array< Int8 >(1...10).sum())
print(Array< Int16>(1...10).sum())
print(Array< Int32>(1...10).sum())
print(Array< Int64>(1...10).sum())

但是,如果你坚持采用这种头/尾方法,试试这个:

extension Array {
    func HeadTail<ReturnType>(_ closure: (Element?,[Element]) -> ReturnType) -> ReturnType {
        return closure(self.first,Array(self.dropFirst()))
    }
}

func sum(_ nums: [Int]) -> Int {
    return nums.HeadTail { head,tail in
        guard let head = head else { return 0 } //base case,empty list
        return head + sum(tail)
    }
}

print(sum(Array(1...10)))

HeadTail(_ :)抽象出如何将列表拆分成它的尾部的详细信息,让你只需要担心为你提供的头部和尾部来编写总和.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读