gpt4 book ai didi

xcode - Swift:如何编写自定义切片函数(Range/Sliceable/ForwardIndexType hell )

转载 作者:行者123 更新时间:2023-11-28 05:34:23 39 4
gpt4 key购买 nike

XCode 6,Beta 5:enumerate()、Sliceable 和 ForwardIndexType

我正在尝试编写采用闭包而不是索引的切片函数,但已陷入切片和范围 hell 。我想找到第一个通过适应度闭包测试的元素,然后从该元素返回一个切片到序列中的最后一个元素等。

我的具体问题是我需要传递开始和结束索引,但无法桥接到 Sliceable.Index 或从 Sliceable.Index aka ForwardIndexType 来执行此操作。这是我目前所拥有的:

func slice<S:Sliceable>(s: S,
#from: (S.Generator.Element) -> Bool) -> S.SubSlice {

let l:Int = s.endIndex // error: cannot convert S.Index to Int
for (i, e) in enumerate(s) {
if (from(e)) {
var f:S.Index = i // error: cannot convert Int to S.Index
return s[i..<s.endIndex]
// error: HalfOpenInterval<T> is not convertable to Range<S.Index>
}
}

return s[s.startIndex..<s.endIndex]
}

我认为有多个库错误导致了这一点: - Sliceable.Index 是 ForwardIndexType,Int 应该支持这个协议(protocol) - 枚举函数应该采用 Sliceable.Index 类型而不是 Int

我确实在 Beta 5 发行说明中看到 Apple 重新设计了 Slices 和 Ranges,但在那段话中没有看到任何可操作的内容。

感谢任何见解 - 提前致谢。

最佳答案

你不需要Int。只需遍历索引:

func slice<S:Sliceable>(s: S,
#from: (S.Generator.Element) -> Bool) -> S.SubSlice {

for i in s.startIndex ..< s.endIndex {
if from(s[i]) {
return s[i..<s.endIndex]
}
}

return s[s.endIndex..<s.endIndex]
}

或:

func slice<S:Sliceable>(s: S,
#from: (S.Generator.Element) -> Bool) -> S.SubSlice {

var i = s.startIndex
while i != s.endIndex && !from(s[i]) {
i = advance(i, 1)
}
return s[i..<s.endIndex]
}

例子:

let a = [2, 7, 3, 1, 9]
let b = slice(a) { $0 == 3 }
println(b) // [3, 1, 9]

关于xcode - Swift:如何编写自定义切片函数(Range/Sliceable/ForwardIndexType hell ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25252185/

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