はじめに
メモアプリに複数のタグを紐付ける機能を実装していた際に、
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>
に変換するという実装で対応しました。
Array<=>Listの変換方法
Array→List
ArrayからListに変換するときは、Modelで List<Object>
を指定しておき、
append(objectsIn:)
を使えば List
としてRealmに入れることできました。
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")
}
}
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:)
を用いるようです。
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