Swift 机具落下(n)和收进(n)
我已经在swift中实现了数组的拖放。期望行为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> {
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已经有了前缀和后缀
全局函数来完成这些功能。如果你看他们的签名,他们甚至比我的签名更一般。应该是公认的答案-前缀
和后缀
应该是公认的答案-前缀
和后缀
应该是公认的答案