Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 机具落下(n)和收进(n)_Swift - Fatal编程技术网

Swift 机具落下(n)和收进(n)

Swift 机具落下(n)和收进(n),swift,Swift,我已经在swift中实现了数组的拖放。期望行为 let list = [1,2,3,4] list.drop(1) // [2,3,4] list.take(2) // [1,2] list.drop[1].take[2] // [2,3] 遇到了下标数组是“切片”的问题,因此我似乎必须扩展数组和切片: extension Slice { func take(num: Int) -> Slice<T> {

我已经在swift中实现了数组的拖放。期望行为

let list = [1,2,3,4]
list.drop(1)            // [2,3,4]
list.take(2)            // [1,2]
list.drop[1].take[2]    // [2,3]
遇到了下标数组是“切片”的问题,因此我似乎必须扩展数组和切片:

extension Slice {
    func take(num: Int) -> Slice<T> {
        let n = (num < self.count) ? num : self.count
        return self[0..n]
    }

    func drop(num: Int) -> Slice<T> {
        let n = (num < self.count) ? num : self.count
        return self[n..self.count]
    }
}

// Extend array to use the Slice extension
extension Array {
    func take(num: Int) -> Slice<T> {
        let slice = Slice(self)
        return slice.take(num)
    }
    func drop(num: Int) -> Slice<T> {
        let slice = Slice(self)
        return slice.drop(num)
    }
}
扩展片{
func take(num:Int)->Slice{
设n=(numSlice{
设n=(numSlice{
让切片=切片(自身)
返回片数(num)
}
func drop(num:Int)->Slice{
让切片=切片(自身)
返回slice.drop(num)
}
}
这很有效。

=>有没有更好的方法使用Swift的类型系统来实现这一点?

我觉得您的实现非常好!出于性能原因,基于范围的离开下标是
切片
类型。它不复制指定的子数组,而是指向由您提供给下标的
范围定义的范围。

您的实现在我看来非常好!出于性能原因,基于范围的离开下标是
切片
类型。它不复制指定的子数组,而是指向由您提供给下标的
范围定义的范围。

您会注意到,Swift one中的许多函数预期是方法,实际上是全局函数,例如
包含
首先
,等等。如果您想以真正通用的方式实现
take
drop
,则必须遵循此技术。诀窍是创建对可切片的
值进行操作的函数。不幸的是,您无法在
Sliceable
上编写扩展,因为它使用
Self
并具有关联的类型

因此,您想要实现的目标应该如下所示:

func take<T: Sliceable where T.Index == Int>(sliceable: T, end: Int) -> T.SubSlice {
    return sliceable[0..<end]
}

func drop<T: Sliceable where T.Index == Int>(sliceable: T, start: Int) -> T.SubSlice {
    return sliceable[start..<countElements(sliceable)]
}
与更流畅的

array.drop(3).take(7)
我认为Swift的类型系统在达到最佳状态之前还有一段路要走,但它比Objective-C有所改进

使现代化
自从我写这篇文章以来,我开始意识到Swift的
前缀
后缀
全局函数。应该使用这些函数。

您会注意到,Swift one中的许多函数都应该是全局函数,例如
包含
首先
,等等。如果您想以真正通用的方式实现
take
drop
,则必须遵循此技术。诀窍是创建对可切片的
值进行操作的函数。不幸的是,您无法在
Sliceable
上编写扩展,因为它使用
Self
并具有关联的类型

因此,您想要实现的目标应该如下所示:

func take<T: Sliceable where T.Index == Int>(sliceable: T, end: Int) -> T.SubSlice {
    return sliceable[0..<end]
}

func drop<T: Sliceable where T.Index == Int>(sliceable: T, start: Int) -> T.SubSlice {
    return sliceable[start..<countElements(sliceable)]
}
与更流畅的

array.drop(3).take(7)
我认为Swift的类型系统在达到最佳状态之前还有一段路要走,但它比Objective-C有所改进

使现代化
自从我写这篇文章以来,我开始意识到Swift的
前缀
后缀
全局函数。在研究我的答案(并尝试实现
dropWhile
takeWhile
)后,我发现Swift已经有了
前缀和
后缀
全局函数来完成这些功能。如果你看看他们的签名,他们甚至比我的签名更一般。我在研究我的答案(并尝试实现
dropWhile
takeWhile
)后发现,Swift已经有了
前缀和
后缀
全局函数来完成这些功能。如果你看他们的签名,他们甚至比我的签名更一般。应该是公认的答案-
前缀
后缀
应该是公认的答案-
前缀
后缀
应该是公认的答案