我的意图如下:
我的第一个功能:
public func substringsOfLength(_ length: Int, inRange range: CountableClosedRange) -> Array<String>
{
...
}
我的第二个:
public func substringsOfLength(_ length: Int, inRange range: CountableRange) -> Array<String>
{
...
}
如何在一个功能中实现这两个功能?我知道Ranges是结构,所以我不能使用泛化范式。我也知道,CountableRanges符合RandomAccessCollection协议,并且它们的边界为Comparable,_Strideable和SignedInteger(Bound.Stride)。因此,我搜索通用解决方案,对吗?
所以我尝试了类似的东西:
public func substringsOfLength<T: RandomAccessCollection>(_ length: Int, inRange range: T) -> Array<String>
{
...
}
我知道这里缺少其他协议,但我不知道如何将它们与它们具体化。
答案 0 :(得分: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"]
String很快就会成为角色的集合,生活会更容易......(然后只删除部分代码)
正如您所看到的,函数子字符串几乎是多余的,可能最好将其删除。