2017-06-25 50 views
1

我的目的是:如何与范围一起工作?

我的第一个功能:

public func substringsOfLength(_ length: Int, inRange range: CountableClosedRange) -> Array<String> 
{ 
    ... 
} 

我的第二个:

public func substringsOfLength(_ length: Int, inRange range: CountableRange) -> Array<String> 
{ 
    ... 
} 

我怎样才能实现两者的功能之一?我知道范围是结构,所以我不能使用泛化范式。我也知道,CountableRanges符合RandomAccessCollection协议,并且它们的边界为Comparable,_Strideable和SignedInteger(Bound.Stride)。因此,我寻找一个通用的解决方案,对吧?

所以,我想这样的事情:

public func substringsOfLength<T: RandomAccessCollection>(_ length: Int, inRange range: T) -> Array<String> 
{ 
    ... 
} 

我知道这里有其他协议缺少的,但我不知道该怎么跟他们具体化的范围。

+0

你需要什么操作范围?它们都是“可以跨越的”。这不够吗? – Sulthan

+0

当使用字符串时,'Range '是Swift 3中的自然类型。 –

+0

@Sulthan我只需要访问下限和上限。 –

回答

0

我会尝试一点点不同,更多的“SWIFTY”的方法...

import Foundation 

let str = "1234 567 890 1 23456" 

extension String { 
    subscript(bounds: CountableClosedRange<Int>) -> String { 
     get { 
      return self[self.index(self.startIndex, offsetBy: bounds.lowerBound)...self.index(str.startIndex, offsetBy: bounds.upperBound)] 
     } 
    } 
    subscript(bounds: CountableRange<Int>) -> String { 
     get { 
      return self[bounds.lowerBound...bounds.upperBound] 
     } 
    } 
    var count: Int { 
     get { 
      return self.characters.count 
     } 
    } 

    func substrings(separatedBy: CharacterSet, isIncluded: (String) -> Bool)->[String] { 
     return self.components(separatedBy: separatedBy).filter(isIncluded) 
    } 
} 



let a0 = str[2..<14].components(separatedBy: .whitespacesAndNewlines).filter { 
    $0.count == 3 
} 
let a1 = str[2...13].substrings(separatedBy: .whitespacesAndNewlines) { 
    $0.count == 3 
} 

打印

["567", "890"] ["567", "890"] 

很快字符串将是人物的收集和生活会更容易...(然后只是删除部分代码)

正如你所看到的,函数子字符串几乎是多余的,可能更好地删除它。