Swift 3,如何将Set或Array作为参数。泛型,超载?

时间:2017-05-13 00:58:10

标签: arrays generics swift3 set overloading

我有一个func /方法,它接受一个字符串数组并返回一个连接的字符串。

我希望能够接受一个数组或一组字符串。我能够通过重载结构的init方法来实现这一点:

struct SetOrArr {

    var stringSet = Set<String>()
    var stringArr = [String]()

    init(_ stringSet: Set<String>) {
        self.stringSet = stringSet
    }

    init(_ stringArr: [String]) {
        self.stringArr = stringArr
    }
}

我查看了泛型文档并看到我可以接受任何类型的集合或数组,但是没有看到接受set / array的方法。那可能吗?或者有更好的方法来执行此操作吗?

TIA

2 个答案:

答案 0 :(得分:0)

已经有一种方法Sequence.joined(seperator:)可以做到这一点。由于SetArray都符合Sequence,因此它们会继承此默认方法。

以下是它的实现:

extension Sequence where Iterator.Element == String {
    func myJoined(seperator: String) -> String {
        var string = ""

        var iterator = this.makeIterator()

        if let first = iterator.next() {
            string += first
        }

        while let element = iterator.next() {
            string += seperator + element
        }

        return string
    }
}

let array = (0...10).map(String.init)
let joinedArray = array.myJoined(seperator: ", ")

let set = Set(array)
let joinedSet = set.myJoined(seperator: ", ")


print("Array: [\(joinedArray)]") // Array: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print("Set: {\(joinedSet)}")     // Set: {7, 8, 4, 1, 3, 6, 9, 10, 0, 2, 5}

答案 1 :(得分:-1)

感谢你指点我这个方向亚历山大,还没有得到扩展。

我一直在使用Sequence.joined(),但是想要同时使用Sets&amp;阵列。另外,我的func不仅需要分离,而且还要引用字符串(对于SQL语句)。

这是我想出的:

    extension Sequence where Iterator.Element == String {
    func getQuotedString(seperator: String, quote: String) -> String {

        var string = ""
        var iterator = makeIterator()

        if let first = iterator.next() {
            string += quote + first + quote + seperator
        }

        while let element = iterator.next() {
            string += quote + element + quote + seperator
        }

        string = String(string.characters.dropLast(seperator.characters.count))

        return string
    }
}

效果很好,再次感谢。