如何使用范围通用?

时间:2017-06-25 09:42:45

标签: swift generics swift3 range protocols

我的意图如下:

我的第一个功能:

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>
{
    ...
}

我知道这里缺少其他协议,但我不知道如何将它们与它们具体化。

1 个答案:

答案 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很快就会成为角色的集合,生活会更容易......(然后只删除部分代码)

正如您所看到的,函数子字符串几乎是多余的,可能最好将其删除。