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)
}
}
}
}