72467


swiftを初めて２ヶ月程の初心者です。  
RealmにてListの下にある同じデータ型のデータをコピーしたいと思っているのですが、  
その方法が分からず困っております。どなたかお力を貸して頂けるとありがたいです。

実現したいこと  
Realmで下図のGroup.registmembersに登録されている内容をEvent.addmembersにコピーしたい。

[![Realm1](https://i.stack.imgur.com/5qEV1.png)](https://i.stack.imgur.com/5qEV1.png)

[![Realm2](https://i.stack.imgur.com/tnkKU.png)](https://i.stack.imgur.com/tnkKU.png)

[code]

    //Model
    class Group: Object {
        @objc dynamic var title: String = ""
        let events = List<Event>()
        let registmembers = List<Member>()
        }
    
    class Event: Object {
        @objc dynamic var title: String = ""
        var var addmembers = List<SelectMember>()
        var parentGroup = LinkingObjects(fromType: Group.self, property: "events")
    }
    
    class Member: Object {
        @objc dynamic var name: String = ""
        @objc dynamic var furigana: String = ""
        @objc dynamic var done: Bool = false
        @objc dynamic var gender: Bool = false
    }
    
    class SelectMember : Object {
        @objc dynamic var name: String = ""
        @objc dynamic var furigana: String = ""
        @objc dynamic var done: Bool = false
        @objc dynamic var gender: Bool = false
    }
    
[/code]

[code]

    //ViewController
        var appDelegate:AppDelegate = UIApplication.shared.delegate as! AppDelegate
        let realm = try! Realm()
        var selectedEvent : Event?
        var group : Group?
        var member : List<Member>?
        
    
    override func viewWillAppear(_ animated: Bool) {
        //選択したグループの値をappDelegateで持ってきて代入
        group = appDelegate.selectgroup
    　　//グループに登録されているメンバーの値をmemberに代入
    　　member? = group?.registmembers as! List<Member>
    　　try! realm.write {
    　　 //選択したイベントのメンバーにグループのメンバーを追加する
        selectedEvent?.addmembers.append(member)
    //ここでCannot convert value of type 'List<Member>?' to expected argument type 'SelectMember'というエラーが出ます。
    　　}
    }
    
[/code]

質問をご覧頂きありがとうございます。  
説明不足な点などありましたらすみません。  
回答をお持ちしています。


CC BY-SA 4.0
2020-12-04T16:23:22.843
72406
2020-12-07T02:00:24.763
2020-12-06T10:20:47.930
42956
42956
question
swift realm swift5
Realm List下のデータを写したい


> Cannot convert value of type 'List?' to expected argument type
> 'SelectMember'

というエラーが出ていると思いますが、エラーの通りで `Event.addmembers` の型は `List<SelectMember>`
となっており、一方 `Group.registmembers` は `List<Member>` となっているため `append` で代入することができる
`SelectMember` と型が一致しないためエラーになっています。

今回のエラーを解決するためには以下の方法が考えられます。

  * そもそも `Member` と `SelectMember` はほとんど同じ形なので、二つに分けず `Member` で統一する
  * どうしても分ける必要がある場合は `Member` から `SelectMember` に逐一変換して `append()` する

個人的には1つめの `Member` で統一する方法をお勧めします。

が、分けなければいけない場合もあると思うので、参考として変換する場合のコードを書いてみました。  
載せていただいたコードから推測する形で書かせていただいたので、こちらのミスで動かない場合もあると思います。

[code]

    override func viewWillAppear(_ animated: Bool) {
        // 選択したグループの値を appDelegate から持ってきて代入
        let selectGroup = appDelegate.selectgroup
    
        // グループに登録されているメンバー一覧の値を取り出し
        let registMembers = group.registmembers
        
        try! realm.write {
            // forEach で `List<Member>` の要素分ループを回し、`SelectMember` に変換して追加
            registMembers.forEach { member in
                // `SelectMember` に変換
                // 以下の部分は少し冗長なので `Member` に変換用のメソッドを持たせてもいいと思います.
                let selectMember = SelectMember()
                selectMember.name = member.name
                selectMember.furigana = member.furigana
                selectMember.done = member.done
                selectMember.gender = member.gender
    
                // 変換した `SelectMember` を `append()` で追加
                selectedEvent?.addmembers.append(selectMember)
            }
        }
    }
    
[/code]


CC BY-SA 4.0
2020-12-07T02:00:24.763
72467
2020-12-07T02:00:24.763
38230
72406
answer