Ios 集合(集合)-插入多个元素

Ios 集合(集合)-插入多个元素,ios,swift,set,tuples,swift-extensions,Ios,Swift,Set,Tuples,Swift Extensions,是独特元素的无序集合。几乎类似于数组 我想在字符串的集合中添加/插入多个元素。但这里只提供了一个方法,它只能插入一个元素(接受单个Set元素作为参数参数),并且我已经创建了一个string(id)集合 我该怎么做 我所尝试的: 我试图创建一个非常类似于insert(:)方法的扩展,但它可以接受多个Set元素。这与在集合上使用迭代相同,但不需要在任何地方手动处理 extension Set { @discardableResult mutating func insert(_ newM

是独特元素的无序集合。几乎类似于数组

我想在
字符串的
集合中添加/插入多个元素。但这里只提供了一个方法,它只能插入一个元素(接受单个Set元素作为参数参数),并且我已经创建了一个string(id)集合

我该怎么做

我所尝试的:
我试图创建一个非常类似于
insert(:)
方法的扩展,但它可以接受多个Set元素。这与在集合上使用迭代相同,但不需要在任何地方手动处理

extension Set {

    @discardableResult mutating func insert(_ newMembers: [Set.Element]) -> (inserted: Bool, memberAfterInsert: Set.Element) {

        newMembers.forEach { (member) in
            self.insert(member)
        }
    }
}
如果我像预期的那样返回一个元组,但不知道如何、在哪里(哪一行)以及返回什么值,那么它应该可以工作

下面是错误消息

预期返回的函数中缺少返回“(inserted:Bool,memberAfterInsert:Set.Element)”


解决这个问题的办法是什么。是否有更好的解决方案/方法来处理此操作?

您的
insert
声明声明该方法正在返回元组:
(insert:Bool,memberAfterInsert:Set.Element)
,但您的方法不返回任何内容

只需使用:

@discardableResult mutating func insert(_ newMembers: [Set.Element]) {

    newMembers.forEach { (member) in
        self.insert(member)
    }
}
更新

最接近的是我相信:

extension Set {
    
    @discardableResult mutating func insert(_ newMembers: [Set.Element]) -> [(inserted: Bool, memberAfterInsert: Set.Element)] {
        var returnArray: [(inserted: Bool, memberAfterInsert: Set.Element)] = []
        newMembers.forEach { (member) in
            returnArray.append(self.insert(member))
        }
        return returnArray
    }
}
理由:

插入语的作者说:

返回值

(true,newMember)
如果
newMember
未包含在集合中。如果集合中已包含等于
newMember
的元素,则该方法返回
(false,oldMember)
,其中
oldMember
是等于
newMember
的元素。在某些情况下,
oldMember
可以通过身份比较或其他方式与
newMember
区分开来

例如,对于set
{1,2,3}
,如果尝试插入
2
,元组将返回
(false,2)
,因为
2
已经存在。元组的第二项是集合中的对象,而不是您提供的对象-在这里使用Ints是不可区分的,因为只有数字
2
等于
2
,但是根据
equalable
实现,您可以有两个不同的对象,它们的计算结果相同。在这种情况下,第二个论点可能对我们很重要

无论如何,我想说的是,一个元组因此对应于一个您尝试插入的
newMember
。如果尝试插入多个新成员,则不能仅使用一个元组来描述该插入-其中一些新成员可能已经存在,因此对于第一个参数为
false
,其他一些成员可能已成功插入,因此,对于他们来说,tuple的第一个参数是
true


因此,我认为正确的方法是返回一个元组数组
[(insert:Bool,memberAfterInsert:Set.Element)]

这是在问题下的评论中指出的,但我想明确指出,有一种方法可以达到同样的目的:

mutating func formUnion<S>(_ other: S) where Element == S.Element, S : Sequence
资料来源:


还有一个不可变的变量,它返回一个包含联合的新实例:

func union<S>(_ other: S) -> Set<Set.Element> where Element == S.Element, S : Sequence
来源:

a.union(b)-
a∪ b
-结果集包含
a
b

联合
-不可变函数
unionInPlace
(截至Swift 3)=>
formUnion
-可变功能


阅读更多内容

我想你想要的是:

extension Set {
    
    mutating func insert(_ elements: Element...) {
        insert(elements)
    }
    
    mutating func insert(_ elements: [Element]) {
        for element in elements {
            insert(element)
        }
    }
}
您问题中的示例是违反了两个好的软件编程原则,例如单一责任规则。您的函数似乎试图修改当前集并返回一个新集。这真让人困惑。你为什么要这么做

如果尝试从多个集合创建新集合,则可以执行以下操作:

extension Set { 

    /// Initializes a set from multiple sets. 
    /// - Parameter sets: An array of sets. 
    init(_ sets: Self...) {
        self = []
        for set in sets {
            for element in set {
                insert(element)
            }
        }
    }
}

为什么要返回元组?它是单个集合元素的方法
insert(:)
的默认/实际定义。我想创建一个相同的函数,但它应该接受多个集合元素。但是您希望该行为是什么?在什么情况下,它将返回
插入:true
?当插入一个值时?不存在行为不同的“相同功能”。由您决定函数返回什么。当插入所有值时?您的用例需要什么
formUnion
没有提供的?在任何情况下,正如米兰所指出的,如果你想归还,你需要实际归还。很好。。谢谢你的回答,但我做到了。我想使它非常类似于单个集合元素的方法insert(:)的实际定义。我想创建一个相同的函数,但它应该接受多个集合元素。非常感谢!formUnion函数是我的选择)
let attendees: Set = ["Alicia", "Bethany", "Diana"]
let visitors = ["Marcia", "Nathaniel"]
let attendeesAndVisitors = attendees.union(visitors)
print(attendeesAndVisitors)
// Prints "["Diana", "Nathaniel", "Bethany", "Alicia", "Marcia"]"
extension Set {
    
    mutating func insert(_ elements: Element...) {
        insert(elements)
    }
    
    mutating func insert(_ elements: [Element]) {
        for element in elements {
            insert(element)
        }
    }
}
extension Set { 

    /// Initializes a set from multiple sets. 
    /// - Parameter sets: An array of sets. 
    init(_ sets: Self...) {
        self = []
        for set in sets {
            for element in set {
                insert(element)
            }
        }
    }
}