Swift3 什么';斯威夫特&x27;s";fromAfter“的缩写;调用数组切片?
Swift 3具有至和至 分别为非结论性和包容性 func前缀(最多:Int)Swift3 什么';斯威夫特&x27;s";fromAfter“的缩写;调用数组切片?,swift3,slice,Swift3,Slice,Swift 3具有至和至 分别为非结论性和包容性 func前缀(最多:Int) 返回从集合开始到指定位置(但不包括)的子序列 func前缀(通过:Int) 返回从集合开始到指定位置的子序列 对于另一端,它具有来自的 func后缀(from:Int) 返回从指定位置到集合结尾的子序列 这似乎是包容性的 远端的非包容性呼叫是什么 // sum the numbers before, and after, an index i... let lo = A.prefix(upTo:
返回从集合开始到指定位置(但不包括)的子序列 func前缀(通过:Int)
返回从集合开始到指定位置的子序列 对于另一端,它具有来自的 func后缀(from:Int)
返回从指定位置到集合结尾的子序列 这似乎是包容性的 远端的非包容性呼叫是什么
// sum the numbers before, and after, an index i...
let lo = A.prefix(upTo: i).reduce(0,+) // means noninclusive
let hi = A.suffix(from: i+1).reduce(0,+) // 'from' seems to mean inclusive
我不知道怎么回事?必须从+1开始写入非常糟糕。目前,stdlib中的
集合类型没有非包容性的后缀方法,但是对于这个用例,您可以通过将后缀(from:)
与dropFirst(:)
(与idx+1中的相比,imho更能显示意图),例如
应用于您的示例(在给定分区编号(或,索引of)之前和之后分别求和编号,不包括分区编号):
但是,我认为拆分版本有点冗长,而且在显示代码意图方面语义也较差。Swift标准库参考中没有包含非包容性签名,后缀(\)
和后缀(from:)
引用显示了包含性示例,因此在本版本中不可用。我也没有看到任何引用非包含性后缀的讨论,因此不太可能很快可用。啊-精彩的信息。也许应该粘贴它作为决定性的答案,@Gelliot181?我是一个短暂的swift用户,所以我通常更愿意留下一个实际的向能够提供细节的人发誓,就像@dfri制作的那样。壮观。我必须承认我不明白SubSequence==SubSequence.SubSequence在哪里,我也不可能在文档或任何教程中找到它的解释。也许你可以慷慨地添加一行解释它,供凡人阅读;)Tak@JoeBlow这并不像人们乍一看所想的那么棘手。后缀(after:)
方法的返回类型是Self.SubSequence
。现在,对于某些给定的序列,例如seq
,现有的后缀(from:)
方法(我们在方法的return子句中调用)返回。本身是类型Self.SubSequence
的实例(其中Self
是seq
的类型:符合序列的某些类型)。因此,如果return
语句看起来像return后缀(from:start)
,我们就不需要其中SubSequence==SubSequence.SubSequence
规范,因为return
子句的类型匹配。。。。。。我们在后缀(after:)
方法中指定的返回类型,即Self.SubSequence
。然而,在我们的例子中,我们对从后缀(from:)
调用返回的Self.SubSequence
实例应用dropFirst(:)
方法。dropFirst(:)
的返回类型也是Self.SubSequence
,其中Self
是调用方的类型。因为在我们的例子中,调用方是Self.SubSequence
(其中Self
是seq
的类型),所以链式调用的类型是后缀(from:start)。dropFirst(1)
是Self.SubSequence.SubSequence
。由于该方法的返回类型为Self.SubSequence
。。。。。。我们需要确定Self.SubSequence
确实是与Self.SubSequence.SubSequence
相同的类型,因此在扩展的“签名”中指定了,其中SubSequence==SubSequence.SubSequence
。因此,最后,它简单地归结为确定我们返回了由后缀(after:)
的方法签名指定的正确类型。希望这能把事情弄清楚!这需要一些思考:哦
extension Collection where SubSequence == SubSequence.SubSequence {
public func suffix(after start: Index) -> SubSequence {
return suffix(from: start).dropFirst(1)
}
}
/* in this example, invalid indices will yield a full-array sum into
lo or hi, depending on high or low index out of bounds, respectively */
func splitSum(of arr: [Int], at: Int) -> (Int, Int) {
guard at < arr.count else { return (arr.reduce(0, +), 0) }
guard at >= 0 else { return (0, arr.reduce(0, +)) }
let lo = arr.prefix(upTo: at).reduce(0, +)
let hi = arr.suffix(after: at).reduce(0, +)
return (lo, hi)
}
// example usage
let arr = [Int](repeating: 1, count: 10)
print(splitSum(of: arr, at: 4)) // (4, 5)
func splitSum(of arr: [Int], at: Int) -> (Int, Int) {
guard at < arr.count else { return (arr.reduce(0, +), 0) }
guard at >= 0 else { return (0, arr.reduce(0, +)) }
let sums = arr.enumerated()
.split (omittingEmptySubsequences: false) { $0.0 == at }
.map { $0.reduce(0) { $0 + $1.1 } }
guard let lo = sums.first, let hi = sums.last else { fatalError() }
return (lo, hi)
}
// example: same as above