2016-10-28 4 views
2

スウィフト3は、FUNCプレフィックス(件まで:INT) Swiftの「fromAfter」コールは配列スライスで呼び出されますか?

それぞれ包括的、
件までとnoninclusiveある


、最大収集の開始からシーケンスを返します指定された位置であるは含まれません。

FUNCプレフィックス(経由:INT)
が指定された位置によって収集の開始からシーケンスを返します。もう一方の端のための

それは(から:INT)

からFUNCサフィックスあり
は、コレクションの末尾に指定された位置からシーケンスを返します。包括的であるように思わ

遠端で非包括コールは何ですか?

// 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で書き込みをしなければならない。

+1

非標準的な署名はSwift標準ライブラリリファレンスにはなく、接尾辞(_ :)と接尾辞(from:)の両方の参照は包括的な例を示しているので、このバージョンでは利用できません。私はまた、非包括的な接尾辞を参照する議論を見ていないので、すぐに利用可能になる可能性は低いです。 – gelliott181

+0

ああ - 華麗な情報。決定的な答え、@ gelliott181として貼り付けるべきでしょうか? – Fattie

+1

私は一過性の素早いユーザーですので、通常は@dfriと同じように詳細を伝える人に実際の答えを残したいと考えています。 – gelliott181

答えて

3

ありSTDLIBでCollectionタイプのためには非包括的suffix方法は現在ありませんが、このユースケースのために、あなたは容易にdropFirst(_:)(これは、from: idx+1より私見、優れた番組の意図)とsuffix(from:)を組み合わせることにより、独自のものを実装することができ、例えば

/* 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) 

の主題を残す:あなたの例に適用

extension Collection where SubSequence == SubSequence.SubSequence { 
    public func suffix(after start: Index) -> SubSequence { 
     return suffix(from: start).dropFirst(1) 
    } 
} 

(別々にパーティショニングも含めない)のインデックスを与えられた分割数の前後数を合計(または)非包括的なsuffixメソッドでは、分割合計計算の別のアプローチは、the split(...) methodsタイプのCollectionタイプのいずれかを使用することです。

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 

しかし、splitバージョンはもう少し冗長であり、コードの意図を示す意味的に貧弱だと思います。

+0

壮観。私は** SubSequence == SubSequence.SubSequence **を理解できないことを認めなければなりません。また、docoやチュートリアルで実際に説明されているとは思えません。多分あなたはそれを説明する行を寛大に追加することができます。 – Fattie

+0

@JoeBlow一見一見考えるほど難しいことではありません。 '接尾辞(after:)'メソッドの戻り値の型は 'Self.SubSequence'です。さて、いくつかの与えられたシーケンスについて、 'seq'と言うと、既存の' suffix(from:) 'メソッド(私たちのメソッドのreturn句で呼ぶ)が返されます。 'Self.SubSequence'型のインスタンス(' Self'は 'seq'の型:' Sequence'に従う型)です。したがって、 'return'文が' return suffix(from:start) 'のように見える場合、' return'節の型が一致するので、 'where SubSequence == SubSequence.SubSequence'仕様は必要ありません。 – dfri

+0

... '接尾辞(after:)'メソッドで指定した戻り値の型、つまり 'Self.SubSequence'です。しかし、我々のケースでは、 'suffix(from:)' call_から返された 'Self.SubSequence'インスタンスを' dropFirst(_ :) 'メソッド_uponに適用します。 'dropFirst(_ :)'の戻り値の型は 'Self.SubSequence'でもあり、' Self'は呼び出し元の型です。私たちの場合、呼び出し元が 'Self.SubSequence'(' self'が 'seq'の型である)であるため、連鎖呼び出しの接尾辞(from:start).dropFirst(1)の_type_は' Self .SubSequence.SubSequence'。メソッドの戻り値の型が 'Self.SubSequence'であるので... – dfri

関連する問題