【问题标题】:Swift 3, how to take either Set or Array as argument. Generics, overload?Swift 3,如何将 Set 或 Array 作为参数。泛型,过载?
【发布时间】:2017-05-13 00:58:10
【问题描述】:

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

我希望能够获取一个数组或一组字符串。我可以通过重载结构的 init 方法来做到这一点:

struct SetOrArr {

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

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

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

我查看了泛型文档,发现我可以接受任何类型的集合或数组,但看不到接受任何集合/数组的方法。那可能吗?或者有没有更好的方法来执行这个?

TIA

【问题讨论】:

  • 您可以接受收藏。

标签: arrays generics swift3 set overloading


【解决方案1】:

已经有一个方法,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}

【讨论】:

  • 认为您忘记在上面的代码中添加“迭代器”的声明。应该是 'var iterator = makeIterator()' ??
  • @bigswifty Yeeep。复制出错
【解决方案2】:

感谢您为我指明这个方向,Alexander,还没有接触到扩展。

我一直在使用 Sequence.joined(),但想同时使用 Sets 和 Arrays。此外,我的 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
    }
}

效果很好,再次感谢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-25
    • 1970-01-01
    • 2017-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多