web-dev-qa-db-ja.com

セット(コレクション)-複数の要素を挿入する

Set は、一意の要素の順不同のコレクションです。配列とほとんど同じです。

SetStringに複数の要素を追加/挿入したい。ただし、要素を1つだけ挿入できる単一のメソッドしかなく(パラメーターの引数として単一のSet要素を受け入れます)、文字列(id)のコレクションを持っています。

挿入(_:)

_@discardableResult mutating func insert(_ newMember: Set.Element) -> (inserted: Bool, memberAfterInsert: Set.Element)
_

どうやってやるの?

私が試したこと:
insert(_:)メソッドと非常によく似た拡張機能を作成しようとしましたが、複数のSet要素を受け入れることができます。これはコレクションの反復の使用と同じですが、どこでも手動で処理する必要はありません。

_extension Set {

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

        newMembers.forEach { (member) in
            self.insert(member)
        }
    }
}
_

期待どおりにタプルを返すが、どのように、どこで(どの行)、何を値を返すかがわからない場合は、機能するはずです。

ここにエラーメッセージがあります。

'(挿入された:Bool、memberAfterInsert:Set.Element)'を返すことが期待される関数に戻り値がありません

enter image description here

これに対する解決策は何か。この操作を処理するためのより良い解決策/アプローチはありますか?

15
Krunal

それは質問の下のコメントで指摘されましたが、私はそれと同じ目的のための方法があることを明確に述べたいです:

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

使用法:

var attendees: Set = ["Alicia", "Bethany", "Diana"]
let visitors = ["Diana", "Marcia", "Nathaniel"]
attendees.formUnion(visitors)
print(attendees)
// Prints "["Diana", "Nathaniel", "Bethany", "Alicia", "Marcia"]"

出典: Apple Developer


ユニオンを含む新しいインスタンスを返す不変のバリアントもあります。

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

使用法:

let attendees: Set = ["Alicia", "Bethany", "Diana"]
let visitors = ["Marcia", "Nathaniel"]
let attendeesAndVisitors = attendees.union(visitors)
print(attendeesAndVisitors)
// Prints "["Diana", "Nathaniel", "Bethany", "Alicia", "Marcia"]"

出典: Apple Developer

23
Arkadii

基本セット演算

enter image description here

union不変関数。これと指定されたセットの両方の要素を持つ新しいセットを返します。

func union(_ other: Self) -> Self 

formUnionunionInPlace up to Swift version 3)可変関数。指定されたセットの要素をセットに追加します。

mutating func formUnion(_ other: Self)
1
yoAlex5