2016-06-28 3 views
1

スウィフトのコレクションタイプの拡張を実装しています。コレクションのサブシーケンスを見つけ出し、そのサブシーケンスの範囲を見つける機能を提供しています。遊び場で働いている私のコードはこれです:スウィフトインデックス、範囲、距離の理解

シンプルな遊び場のテストケースがこれらは

extension CollectionType where Generator.Element:Equatable, Index:ForwardIndexType, SubSequence.Generator.Element == Generator.Element { 
    func search<S: CollectionType where S.Generator.Element == Generator.Element, S.Index:ForwardIndexType>(pattern: S) -> Self.Index? { 
     return self.lazy.indices.indexOf{ 
      self[$0..<self.endIndex].startsWith(pattern) 
     } 
    } 

    func rangeOf<S: CollectionType where S.Generator.Element == Generator.Element, S.Index:ForwardIndexType, Index:ForwardIndexType>(pattern: S) -> Range<Index>? { 
     if let start = self.search(pattern) { 
      var end = start 
      for _ in pattern.startIndex..<pattern.endIndex { 
       end = end.advancedBy(1) 
      } 
      return start..<end 
     } else { 
      return nil 
     } 
    } 
} 

let fibs = [1, 1, 2, 3, 5, 8, 13] 
if let fidx = fibs.search([3, 5]) { 
    print(fibs[..<fidx])       // prints "[1, 1, 2]\n" 
    print(fidx..<fidx.advancedBy([1,1,5].count)) // prints "3..<6\n" 
} 
if let rng = fibs.rangeOf([5,8,13]) { 
    print(rng)         // prints "4..<7\n" 
} 

しかし、rangeOf機能では、代わりにループの

  for _ in pattern.startIndex..<pattern.endIndex { 
       end = end.advancedBy(1) 
      } 

Iこの声明を使用できると期待されている

  end = start.advancedBy(pattern.count, limit: self.endIndex) 

または多分

  end = start.advancedBy(pattern.endIndex - pattern.startIndex, limit: self.endIndex) 

(Iが限界パラメータが冗長であることを認識しません。これを省略すると次の点で違いはありません。)最後の2つのコンパイルでエラーはcannot invoke 'advancedBy' with an argument list of type '(S.Index.Distance, limit: Self.Index)'となりません。私の質問は、なぜこれらの2つの形式のどちらも受け入れられないのでしょうか? (私は私が適切に拡張のための種類の制約を形成してきたかどうか、および機能のための他の有効な質問があると仮定し、しかし、1つのバージョン以来、私は今のところそれを無視してる作品。)

答えて

1
end = start.advancedBy(pattern.count, limit: self.endIndex) 

selfpatternのコレクションにはタイプがないので のコレクションがないためコンパイルされません。

S.Index == Indexという制約をrangeOf()メソッドに追加するとコンパイルされます。

+0

これを修正して、私は他の制約の多くを取り除くことができたことを発見しました。ニース。 – Feldur