gpt4 book ai didi

arrays - 将数组扩展转换为 SequenceType?

转载 作者:搜寻专家 更新时间:2023-11-01 06:40:29 24 4
gpt4 key购买 nike

我将我在我的应用程序中使用的一些常用功能放在一起,并提出了以下扩展:

public extension CollectionType {
public func toArray() -> [Self.Generator.Element] {
return self.map { $0 }
}
}

public extension Array {

public func any(fn: (Element) -> Bool) -> Bool {
return self.filter(fn).count > 0
}

public func all(fn: (Element) -> Bool) -> Bool {
return self.filter(fn).count == self.count
}

public func take(count:Int) -> [Element] {
var to = [Element]()
var i = 0
while i < self.count && i < count {
to.append(self[i++])
}
return to
}

public func skip(count:Int) -> [Element] {
var to = [Element]()
var i = count
while i < self.count {
to.append(self[i++])
}
return to
}
}

它们可以应用于较低级别的类型,如 SequenceType 吗?另外,我是否必须将 @noescape 放在这些函数的任何位置?

最佳答案

一般来说,@noescape 应该在闭包未保存供以后使用的任何时候使用,它似乎适用于您这里的两个闭包。

“可以将它们应用于较低级别的类型”是什么意思并不十分清楚 或多或少显然,您可以为其他一些协议(protocol)创建这些扩展的版本,但是您现有的 skip 函数只能应用于 Array(顺便说一句,SequenceType 上有一个现有函数 dropFirst 做完全相同的事情)

对于 takeskip 你可能想要实际考虑返回一个 ArraySlice 因为这避免了复制原始数组:

extension Array {
func take(count:Int) -> ArraySlice<Element> {
return self[0..<count]
}

func drop(count:Int) -> ArraySlice<Element> {
return self[count..<self.count]
}
}

请注意,对于这两种情况,您可能(可能)想要添加一些错误检测/处理,因为如果 count > self.count,它们会崩溃。

同样,使用contains 来实现anyall 可能更有效,因为它不会导致仅为计数:

extension Array {
func any(@noescape predicate:(Element)->Bool) -> Bool {
return contains(predicate)
}
func all(@noescape predicate:(Element)->Bool) -> Bool {
return !contains { !predicate($0) }
}
}

作为将其中一些定义为 SequenceType 的扩展的示例:

extension SequenceType {
func any(@noescape predicate:(Generator.Element)->Bool) -> Bool {
return contains(predicate)
}
func all(@noescape predicate:(Generator.Element)->Bool) -> Bool {
return !contains { !predicate($0) }
}
func drop(count:Int) -> Self.SubSequence {
return self.dropFirst(count)
}
}

并且,作为实现作为序列扩展的示例:

struct TakeFromSequenceSequence<S:SequenceType> : SequenceType {
var limit : Int
var sequence : S

func generate() -> AnyGenerator<S.Generator.Element> {
var generator = sequence.generate()
var limit = self.limit

return anyGenerator {
guard limit > 0 else {
return nil
}

limit = limit - 1

return generator.next()
}
}
}


extension SequenceType {
func take(count:Int) -> TakeFromSequenceSequence<Self> {
return TakeFromSequenceSequence(limit: count, sequence: self)
}
}

关于arrays - 将数组扩展转换为 SequenceType?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36043218/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com