我有一个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
答案 0 :(得分:0)
已经有一种方法Sequence.joined(seperator:)
可以做到这一点。由于Set
和Array
都符合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
}
}
效果很好,再次感谢。