如何与范围一起工作?
问题描述:
我的目的是:如何与范围一起工作?
我的第一个功能:
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>
{
...
}
我知道这里有其他协议缺少的,但我不知道该怎么跟他们具体化的范围。
答
我会尝试一点点不同,更多的“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"]
很快字符串将是人物的收集和生活会更容易...(然后只是删除部分代码)
正如你所看到的,函数子字符串几乎是多余的,可能更好地删除它。
你需要什么操作范围?它们都是“可以跨越的”。这不够吗? – Sulthan
当使用字符串时,'Range'是Swift 3中的自然类型。 –
@Sulthan我只需要访问下限和上限。 –