Swift의 Array와 List (Realm)를 비교하고 변환하는 방법

7190 단어 SwiftSwift5

소개



메모 앱에 여러 태그를 연결하는 기능을 구현했을 때,
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")
        }
    }
    
    

    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의 유형이라는 것을 깨닫는 데 시간이 걸렸기 때문에,
    자바에서 Swift 들어가는 사람은 조심하십시오 ^^;

    Array로 Realm에 넣으려고하면 nil이 들어가 처리가 떨어지지 않고
    저장에 실패하는 것도주의 포인트였습니다!

    *실장 베이스로 깨달은 것을 정리했으므로, 만약 실수나 지적이 있는 경우는
    확인 · 수정하므로 코멘트로 알려주십시오 mm

    좋은 웹페이지 즐겨찾기