17
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

SwiftのArrayとList(Realm)の比較と変換方法

Last updated at Posted at 2020-03-29

はじめに

メモアプリに複数のタグを紐付ける機能を実装していた際に、
SwiftのArrayとListという型がそれぞれ別の役割であることに気づかなかったので、
それぞれの役割と変換方法について簡潔にまとめようと思います!

環境

  • xcode 11.3.1
  • swift 5.1.3

ArrayとListの違い

ArrayもListも複数要素を扱うという点では共通ですが
ArrayはSwiftで配列として使われる型です。
Listは「RealmSwift」というRealmを扱うためのライブラリで扱える型です。

List型とArray型を使い分ける

今回はViewControllerで List<Tag>を扱おうとしたところ、
「Listとなんて型は定義されていないよ!」
と怒られたので、 Array<Tag>に変更しました。

そうしたら今度は、Model→Realmに変換できず nilになって、
保存されないという事象が発生しました!
nilになってもエラーにはならずただDBに値が入らないので要注意

なので、
ロジックは Array<Tag>にキャスト
データ格納時は List<Tag>に変換するという実装で対応しました。

イメージ図
ListとArrayの変換.jpg

Array<=>Listの変換方法

Array→List

ArrayからListに変換するときは、Modelで List<Object>を指定しておき、
append(objectsIn:)を使えば ListとしてRealmに入れることできました。

Model

import Foundation
import RealmSwift

class Memo: RObject {
    @objc dynamic var title : String = ""
    @objc dynamic var content : String = ""
    @objc dynamic var createdDate : Date = NSDate() as Date
    @objc dynamic var updatedDate : Date = NSDate() as Date
    
    var tags = List<Tag>() // ここをList型にする
}

class Tag: Object {
    @objc dynamic var tagName = ""
    
    var memos: LinkingObjects<Memo> {
        return LinkingObjects(fromType: Memo.self, property: "tags")
    }
}

ViewController

import UIKit
import RealmSwift


class MemoTableViewController: UITableViewController {
    // 一部抜粋
            let memoModel = Memo()
            let realm = try! Realm()
            try! realm.write {
                memoModel.title = memo
                memoModel.content = memo
                memoModel.tags.removeAll()
                memoModel.tags.append(objectsIn: tags) // Listに追加                
    // 一部省略
            }
}

List→Array

ListをArrayに変化するときは Array()で変換してあげれば大丈夫です!
また、 Array型に入れるときは append(contentsOf:)を用いるようです。

ListToArray
let testList = List<Tag>() //List型
var testArray = Array<Any>() // Array型

testArray.append(contentsOf: Array(testList)) // Array()でListを変換

まとめ

 今回はListとArrayを変換しましたが、
RealmSwiftをimportし、使い回すという方法もありかもしれないです。

 Javaだと、配列もListも存在するので、Swiftも似た感じかと思い
ListがRealmSwiftの型ということに気づくのに時間かかってしまったので、
javaからSwift入る人は注意してください^^;

 ArrayでRealmに入れようとするとnilが入り、処理が落ちずに
保存に失敗するのも注意ポイントでした!

*実装ベースで気づいたことをまとめたので、もし間違いや指摘がある場合は
確認・修正するのでコメントでお知らせくださいmm

17
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?