문서 메뉴
문서 홈
/ /
Atlas Device SDK
/ /

지원 유형 - Swift SDK

이 페이지의 내용

  • 컬렉션 유형
  • 결과 및 섹션별 결과
  • 속성으로서의 컬렉션
  • 라이브 컬렉션
  • 지원되는 속성 유형
  • 속성 치트 시트
  • 기본값 설정
  • 고유 식별자
  • 크기 제한
  • AnyRealmCollection
  • 변경 가능 세트
  • 지도/사전
  • AnyRealmValue
  • 혼합 컬렉션
  • 지리 공간 데이터
  • 지원되지 않는 형식을 지원되는 형식에 매핑
  • 유형 프로젝션 선언
  • 유형 프로젝션 프로토콜 준수
  • 모델에서 유형 프로젝션 사용

Realm에는 객체 그룹을 나타내는 여러 유형이 있으며 이를 collection 이라고 합니다. 컬렉션은 하나의 Realm 유형 인스턴스를 0개 이상 포함하는 객체입니다. Realm 컬렉션은 동질적 입니다: 컬렉션의 모든 객체는 동일한 유형입니다.

Realm의 쿼리 엔진을 사용하여 모든 컬렉션을 필터링하고 정렬할 수 있습니다. 컬렉션은 라이브 상태이므로 항상 현재 스레드에서 Realm 인스턴스의 현재 상태를 반영합니다. 컬렉션 알림을 구독하여 컬렉션의 변경 사항을 수신할 수도 있습니다.

모든 컬렉션 유형은 RealmCollection 프로토콜을 준수합니다. 이 프로토콜은 CollectionType 다른 표준 라이브러리 컬렉션과 마찬가지로 Realm 컬렉션을 사용할 수 있습니다.

RealmCollection 프로토콜을 사용하면 모든 Realm 에서 작동할 수 있는 일반 코드를 작성할 수 있습니다.

func operateOn<C: RealmCollection>(collection: C) {
// Collection could be either Results or List
print("operating on collection containing \(collection.count) objects")
}

Swift SDK 결과 컬렉션은 쿼리에서 검색된 객체를 나타내는 클래스입니다. 결과 컬렉션은 쿼리 작업의 지연 평가 결과를 나타냅니다. 결과는 변경할 수 없으므로 결과 컬렉션에 요소를 추가하거나 제거할 수 없습니다. 결과에는 해당 내용을 결정하는 관련 쿼리가 있습니다.

Swift SDK는 ResultsSection 를 요소로 포함하는 유형 안전 컬렉션인 SectionedResults 도 제공합니다. 각 ResultSection 은 지정된 섹션 키에 속하는 객체만 포함하는 결과 컬렉션입니다.

예를 들어 연락처 목록이 포함된 앱에서 SectionedResults를 사용하여 연락처 목록을 섹션으로 나누어 표시할 수 있으며, 각 섹션에는 이름이 지정된 문자로 시작하는 모든 연락처가 포함됩니다. 키가 'L' 인 ResultsSection에는 'Larry', 'Liam' 및 'Lisa' 포함됩니다.

다음도 참조하세요.

Swift SDK는 데이터 모델에서 속성으로 사용할 수 있는 여러 유형도 제공합니다.

  1. List 는 모델 의 다대다 관계 를 나타내는 클래스입니다.

  2. LinkingObjects - 모델의 역관계를 나타내는 클래스입니다.

  3. MutableSet - to-many 관계를 나타내는 클래스입니다.

  4. 지도는 고유 키가 있는 키-값 쌍의 연관 배열을 나타내는 클래스입니다.

  5. AnyRealmCollection은 결과, 목록, LinkingObjects와 같은 구체적인 Realm 컬렉션에 호출을 전달할 수 있는 유형 삭제 클래스입니다.

라이브 객체와 마찬가지로 Realm 컬렉션은 일반적으로 라이브 상태입니다.

  • 라이브 결과 컬렉션은 항상 관련 쿼리의 현재 결과를 반영합니다.

  • 라이브 목록은 항상 Realm 인스턴스 관계의 현재 상태를 반영합니다.

다음은 컬렉션이 라이브 상태가 아닌 두 가지 경우니다.

  • 컬렉션이 관리되지 않습니다. 예를 들어 아직 영역에 추가되지 않았거나 영역에서 복사된 Realm 객체의 목록 속성 라이브가 아닙니다.

  • 컬렉션이 동결되었습니다.

컬렉션 알림과 결합된 라이브 컬렉션을 사용하면 깔끔하고 반응성이 뛰어난 코드를 만들 수 있습니다. 예를 들어 뷰에 쿼리 결과가 표시된다고 가정해 보겠습니다. 뷰 클래스에 결과 컬렉션에 대한 참고를 유지할 수 있으며 결과 컬렉션을 새로 고치거나 최신 상태인지 확인할 필요 없이 필요에 따라 결과 컬렉션을 읽을 수 있습니다.

중요

결과 인덱스가 변경될 수 있습니다.

결과는 자동으로 업데이트되므로 컬렉션에 있는 객체의 위치 인덱스나 컬렉션에 있는 객체의 개수를 저장하지 않도록 합니다. 저장된 인덱스 또는 카운트 값은 사용 시점에 따라 이미 오래된 정보일 수 있습니다.

다음 형식을 사용하여 객체 모델 속성을 정의할 수 있습니다.

특정 데이터 유형이 App Services 스키마의 BSON 유형에 매핑되는 방법을 알아보려면 Atlas App Services 문서의 데이터 모델 매핑을 참조하세요.

Device Sync를 이용한 데이터 모델링 - Swift SDK도도 참조하세요.

버전 10.10.0에서 변경됨: @Persisted 속성 선언 구문

유형
필수 사항
옵션
Bool
@Persisted var boolName: Bool
@Persisted var optBoolName: Bool?
Int, Int8, Int16, Int32, Int64
@Persisted var intName: Int
@Persisted var optIntName: Int?
플 로트
@Persisted var floatName: Float
@Persisted var optFloatName: Float?
더블
@Persisted var doubleName: Double
@Persisted var optDoubleName: Double?
문자열
@Persisted var stringName: String
@Persisted var optStringName: String?
데이터
@Persisted var dataName: Data
@Persisted var optDataName: Data?
날짜
@Persisted var dateName: Date
@Persisted var optDateName: Date?
Decimal128
@Persisted var decimalName: Decimal128
@Persisted var optDecimalName: Decimal128?
@Persisted var uuidName: UUID
@Persisted var optUuidName: UUID?
@Persisted var objectIdName: ObjectId
@Persisted var optObjectIdName: ObjectId?
@Persisted var listName: List<MyCustomObjectType>
N/A
@Persisted var mutableSetName: MutableSet<String>
N/A
@Persisted var mapName: Map<String, String>
N/A
@Persisted var anyRealmValueName: AnyRealmValue
N/A
사용자 정의 객체
N/A
@Persisted var optObjectPropertyName: MyCustomObjectType?
사용자 정의 EmbeddedObject
N/A
@Persisted var optEmbeddedObjectPropertyName: MyEmbeddedObjectType?
사용자 정의 열거형
@Persisted var enumName: MyPersistableEnum
@Persisted var optEnumName: MyPersistableEnum?

CGFloat 유형이 플랫폼 독립적이지 않기 때문에 속성이 권장되지 않습니다.

@Persisted 구문에서 사용자 정의 객체와 함께 키-값 코딩을 사용하려면 @objc 속성을 추가합니다: @Persisted @objc var myObject: MyClass?

@Persisted 속성 선언 구문을 사용하면 다음에 대한 기본값을 설정할 때 성능에 영향을 미칠 수 있습니다.

  • List

  • MutableSet

  • Dictionary

  • Decimal128

  • UUID

  • ObjectId

@Persisted var listProperty: List<Int>@Persisted var listProperty = List<Int>() 은(는) 모두 유효하며 기능적으로 동일합니다. 그러나 두 번째 선언은 성능이 저하됩니다.

이는 목록이 필요에 따라 느리게 생성되는 것이 아니라 상위 객체가 생성될 때 생성되기 때문입니다. 대부분의 유형에서 이는 차이가 너무 작아서 측정이 불가합니다. 여기에 나열된 유형의 경우 두 번째 선언 스타일을 사용하면 성능에 영향을 미칠 수 있습니다.

유형
필수 사항
옵션
부울
@property BOOL boolName;
@property NSNumber<RLMBool> *optBoolName;
Integer
@property int intName;
@property NSNumber<RLMInt> *optIntName;
플 로트
@property float floatName;
@property NSNumber<RLMFloat> *optFloatName;
더블
@property double doubleName;
@property NSNumber<RLMDouble> *optDoubleName;
문자열
@property NSString *stringName;
@property NSString *optStringName;
데이터
@property NSData *dataName;
@property NSData *optDataName;
날짜
@property NSDate *dateName;
@property NSDate *optDateName;
Decimal128
@property RLMDecimal128 *decimalName;
@property RLMDecimal128 *optDecimalName;
NSUUID
@property NSUUID *uuidName;
@property NSUUID *optUuidName;
@property RLMObjectId *objectIdName;
@property RLMObjectId *optObjectIdName;
@property RLMArray<MyObject *><MyObject> *arrayName;
N/A
@property RLMSet<RLMString> *setName;
N/A
@property RLMDictionary<NSString *, NSString *><RLMString, RLMString> *dictionaryName;
N/A
사용자 정의 RLM 객체
N/A
@property MyObject *optObjectPropertyName;
사용자 정의 RLMembeddedObject
N/A
@property MyEmbeddedObject *optEmbeddedObjectPropertyName;

또한 다음을 수행합니다.

  • 적분 유형 int, NSInteger, long, long long

CGFloat 유형이 플랫폼 독립적이지 않기 때문에 속성이 권장되지 않습니다.

버전 10.8.0의 변경된 기능: RealmProperty이(가) RealmOptional을(를) 대체합니다.

유형
필수 사항
옵션
Bool
@objc dynamic var value = false
let value = RealmProperty<Bool?>()
Int, Int8, Int16, Int32, Int64
@objc dynamic var value = 0
let value = RealmProperty<Int?>()
플 로트
@objc dynamic var value: Float = 0.0
let value = RealmProperty<Float?>()
더블
@objc dynamic var value: Double = 0.0
let value = RealmProperty<Double?>()
문자열
@objc dynamic var value = ""
@objc dynamic var value: String? = nil
데이터
@objc dynamic var value = Data()
@objc dynamic var value: Data? = nil
날짜
@objc dynamic var value = Date()
@objc dynamic var value: Date? = nil
Decimal128
@objc dynamic var decimal: Decimal128 = 0
@objc dynamic var decimal: Decimal128?
@objc dynamic var uuid = UUID()
@objc dynamic var uuidOpt: UUID?
@objc dynamic var objectId = ObjectId.generate()
@objc dynamic var objectId: ObjectId?
let value = List<Type>()
let value = MutableSet<Type>()
let value = Map<String, String>()
let value = RealmProperty<AnyRealmValue>()
N/A
사용자 정의 객체
N/A
@objc dynamic var value: MyClass?

또한 다음을 수행합니다.

RealmProperty <T?> 를 사용하여 정수, 이중 및 기타 유형을 선택 사항으로 나타낼 수 있습니다.

CGFloat 유형이 플랫폼 독립적이지 않기 때문에 속성이 권장되지 않습니다.

버전 10.8.0의 새로운 기능: UUID 유형

ObjectId 은(는) MongoDB 전용 12바이트 고유 값입니다. UUID은(는) 16 바이트 글로벌 고유 값입니다. 두 유형 모두 인덱싱할 수 있으며 둘 중 하나를 프라이머리 키로 사용할 수 있습니다.

참고

@Persisted UUID 또는 객체 ID 속성 특성의 기본값을 선언할 때는 다음 구문 유형이 모두 유효합니다.

  • @Persisted var value: UUID

  • @Persisted var value = UUID()

그러나 두 번째 유형은 성능이 저하됩니다. 후자는 영역에서 객체를 읽을 때마다 사용되지 않는 새로운 식별자를 생성하는 반면 전자는 필요할 때만 생성하기 때문입니다.

@Persisted var id: ObjectId @objc dynamic var _id = ObjectId.generate()와 동일한 동작을 합니다. 두 유형 모두 임의의 ObjectId를 만듭니다.

@Persisted var _id = ObjectId() @objc dynamic var _id = ObjectId()와 동일한 동작을 합니다. 두 유형 모두 0으로 초기화된 ObjectId를 만듭니다.

데이터 및 문자열 속성은 16 MB를 초과할 수 없습니다. 더 많은 양의 데이터를 저장하려면 다음 중 하나를 수행합니다.

  • 데이터를 16 MB 청크로 나누거나

  • 데이터를 파일 시스템에 직접 저장하고 Realm의 파일 경로를 저장합니다.

앱이 단일 속성에 16 MB 이상을 저장하려고 하면 Realm은 런타임 예외를 발생시킵니다.

크기 제한과 성능 영향을 방지하려면 이미지 및 비디오 파일과 같은 큰 블럽을 Realm에 직접 저장하지 않는 것이 좋습니다. 대신 파일을 파일 저장소에 저장하고 Realm의 파일 위치와 관련 메타데이터만 보관하세요.

구체적인 컬렉션 유형을 알 필요 없이 컬렉션을 속성이나 변수로 저장하려면 Swift의 유형 시스템에는 AnyRealmCollection과 같은 유형 삭제 래퍼가 필요합니다.

class ViewController {
// let collection: RealmCollection
// ^
// error: protocol 'RealmCollection' can only be used
// as a generic constraint because it has Self or
// associated type requirements
//
// init<C: RealmCollection>(collection: C) where C.ElementType == MyModel {
// self.collection = collection
// }
let collection: AnyRealmCollection<MyModel>
init<C: RealmCollection & _ObjcBridgeable>(collection: C) where C.ElementType == MyModel {
self.collection = AnyRealmCollection(collection)
}
}

버전 10.8.0의 새로운 기능

MutableSet 컬렉션은 고유한 값을 포함하는 일대다 관계 를 나타냅니다. MutableSet 는 다음 유형(및 해당 선택적 버전)을 지원합니다.

  • Bool

  • 데이터

  • 날짜

  • Decimal128

  • 더블

  • 플 로트

  • Int

  • Int8

  • Int16

  • Int32

  • Int64

  • 개체

  • ObjectId

  • 문자열

  • UUID

Swift의 세트 처럼 MutableSet 는 저장하는 유형에 따라 매개변수화된 일반 유형입니다. 네이티브 Swift 컬렉션 과 달리 Realm 가변 세트는 값 유형(구조체)과 달리 참조 유형입니다.

쓰기 트랜잭션 중에는 MutableSets 변형 메서드만 호출할 수 있습니다. 따라서 관리 Realm을 읽기 전용 Realm으로 열면 MutableSets는 변경되지 않습니다.

결과동일한 조건자를 사용하여 를 필터링하고 정렬할 수 있습니다.MutableSet 다른 Realm 컬렉션과 마찬가지로 MutableSet변경 리스너를 등록 할 수 있습니다.

예를 들어 Dog 클래스 모델에는 citiesVisited에 대한 MutableSet이(가) 포함될 수 있습니다.

class Dog: Object {
@Persisted var name = ""
@Persisted var currentCity = ""
@Persisted var citiesVisited: MutableSet<String>
}

참고

@Persisted MutableSet 속성 특성의 기본값을 선언할 때는 다음 구문 유형이 모두 유효합니다.

  • @Persisted var value: MutableSet<String>

  • @Persisted var value = MutableSet<String>()

그러나 두 번째 유형은 성능이 크게 저하됩니다. 이는 MutableSet가 필요에 따라 지연되는 것이 아니라 상위 객체가 생성될 때 생성되기 때문입니다.

버전 10.8.0의 새로운 기능

은 고유 키가 있는 키-값 쌍을 포함하는 연관 배열입니다.

Swift의 사전 Map 처럼 는 키 및 값 유형이 매개변수화된 일반 유형입니다. 네이티브 Swift 컬렉션 과 달리 , Realm 맵은 값 유형(구조체)이 아닌 참조 유형(클래스)입니다.

지도를 객체의 속성으로 선언할 수 있습니다.

class Dog: Object {
@Persisted var name = ""
@Persisted var currentCity = ""
// Map of city name -> favorite park in that city
@Persisted var favoriteParksByCity: Map<String, String>
}

Realm에서는 지도 키에 . 또는 $ 문자를 사용할 수 없습니다. 백분율 인코딩 및 디코딩을 사용하여 허용되지 않는 문자 중 하나가 포함된 지도 키를 저장할 수 있습니다.

// Percent encode . or $ characters to use them in map keys
let mapKey = "New York.Brooklyn"
let encodedMapKey = "New York%2EBrooklyn"

참고

@Persisted 지도 속성 특성의 기본값을 선언할 때 다음 구문 유형이 모두 유효합니다.

  • @Persisted var value: Map<String, String>

  • @Persisted var value = Map<String, String>()

그러나 두 번째 유형은 성능이 크게 저하됩니다. 이는 지도가 필요에 따라 느리게 생성되는 것이 아니라 상위 객체가 생성될 때 생성되기 때문입니다.

버전 10 에서 변경되었습니다.51.0: AnyRealmValue 속성은 혼합 데이터의 목록 또는 맵을 보유할 수 있습니다.

버전 10.8.0의 새로운 기능

AnyRealmValue 은(는) 다양한 데이터 유형을 보유할 수 있는 Realm 속성 유형입니다. 지원되는 AnyRealmValue 데이터 유형은 다음과 같습니다.

  • Int

  • 플 로트

  • 더블

  • Decimal128

  • ObjectID

  • UUID

  • Bool

  • 날짜

  • 데이터

  • 문자열

  • 목록

  • Map

  • 개체

AnyRealmValue MutableSet 또는 포함된 객체를 보유 할 수 없습니다 .

혼합 데이터 유형인덱싱 이 가능하지만 프라이머리 키로 사용할 수 없습니다. null 는 허용되는 값이므로 AnyRealmValue 을 선택 사항으로 선언할 수 없습니다.

class Dog: Object {
@Persisted var name = ""
@Persisted var currentCity = ""
@Persisted var companion: AnyRealmValue
}

버전 10.51.0 이상에서는 AnyRealmValue 데이터 유형에 AnyRealmValue 요소의 컬렉션(세트가 아닌 목록 또는 맵)을 포함할 수 있습니다. 혼합 컬렉션을 사용하여 구조화되지 않은 데이터 또는 가변 데이터를 모델링할 수 있습니다. 자세한 내용은 구조화되지 않은 데이터 정의를 참조하세요.

  • 혼합 컬렉션을 최대 100 수준까지 중첩할 수 있습니다.

  • 일반 컬렉션과 마찬가지로 혼합 컬렉션 속성을 쿼리 하고 변경 사항에 대한 리스너를 등록 할 수 있습니다.

  • 개별 혼합 컬렉션 요소를 찾고 업데이트할 수 있습니다.

  • 혼합 컬렉션에는 세트 또는 포함된 객체를 저장할 수 없습니다 .

앱에서 혼합 컬렉션을 사용하려면 데이터 모델에서 AnyRealmValue 유형 속성을 정의합니다. 그런 다음 다른 혼합 데이터 값과 마찬가지로 목록 또는 매핑 컬렉션을 만들 수 있습니다.

버전 10.47.0에 새로 추가되었습니다.

지리 공간적 데이터 또는 "지리 데이터"는 지구 표면의 지점과 기하학적 객체를 지정합니다.

지리 공간적 데이터를 유지하려면 GeoJSON 사양을 준수해야 합니다.

Swift SDK를 사용하여 지리 공간적 데이터를 유지하려면 데이터 모델에서 사용할 수 있는 GeoJSON 호환 내장형 클래스를 생성합니다.

내장된 사용자 지정 객체에는 GeoJSON 사양에서 요구하는 두 개의 필드가 포함되어야 합니다.

  • 값이 "Point"type 속성에 매핑되는 유형 String 속성의 필드: @Persisted var type: String = "Point"

  • 위도/경도 쌍을 포함하는 coordinates 속성에 매핑되는 유형 List<Double>의 필드: @Persisted private var coordinates: List<Double>

class CustomGeoPoint: EmbeddedObject {
@Persisted private var type: String = "Point"
@Persisted private var coordinates: List<Double>
public var latitude: Double { return coordinates[1] }
public var longitude: Double { return coordinates[0] }
convenience init(_ latitude: Double, _ longitude: Double) {
self.init()
// Longitude comes first in the coordinates array of a GeoJson document
coordinates.append(objectsIn: [longitude, latitude])
}
}

버전 10.20.0의 새로운 기능

유형 프로젝션을 사용하여 Realm에서 지원되지 않는 유형을 지원하는 유형으로 유지할 수 있습니다. 이렇게 하면 Realm이 지원하지 않는 Swift 유형을 사용하여 작업할 수 있지만 Realm이 지원하는 유형으로 저장할 수 있습니다. 예를 들어 URL을 String(으)로 저장하더라도 Realm에서 읽을 수 있고 애플리케이션에서 URL인 것처럼 사용할 수 있습니다.

Realm과 함께 유형 프로젝션을 사용하려면 다음을 수행합니다.

  1. Realm의 사용자 지정 유형 프로토콜 중 하나를 사용하여 지원되지 않는 데이터 유형을 Realm이 지원하는 유형에 매핑합니다.

  2. Realm 객체 모델에서 프로젝션 유형을 @Persisted 속성으로 사용합니다.

Realm 유형 프로젝션 프로토콜 중 하나를 사용하여 지원되지 않는 데이터 유형을 Realm이 지원하는 유형에 매핑할 수 있습니다.

Swift SDK는 두 가지 유형의 프로젝션 프로토콜을 제공합니다.

  • CustomPersistable

  • FailableCustomPersistable

변환이 실패할 가능성이 없는 경우 CustomPersistable 을 사용합니다.

변환이 실패할 가능성이 있는 경우 FailableCustomPersistable 을 사용합니다.

// Extend a type as a CustomPersistable if if is impossible for
// conversion between the mapped type and the persisted type to fail.
extension CLLocationCoordinate2D: CustomPersistable {
// Define the storage object that is persisted to the database.
// The `PersistedType` must be a type that Realm supports.
// In this example, the PersistedType is an embedded object.
public typealias PersistedType = Location
// Construct an instance of the mapped type from the persisted type.
// When reading from the database, this converts the persisted type to the mapped type.
public init(persistedValue: PersistedType) {
self.init(latitude: persistedValue.latitude, longitude: persistedValue.longitude)
}
// Construct an instance of the persisted type from the mapped type.
// When writing to the database, this converts the mapped type to a persistable type.
public var persistableValue: PersistedType {
Location(value: [self.latitude, self.longitude])
}
}
// Extend a type as a FailableCustomPersistable if it is possible for
// conversion between the mapped type and the persisted type to fail.
// This returns nil on read if the underlying column contains nil or
// something that can't be converted to the specified type.
extension URL: FailableCustomPersistable {
// Define the storage object that is persisted to the database.
// The `PersistedType` must be a type that Realm supports.
public typealias PersistedType = String
// Construct an instance of the mapped type from the persisted type.
// When reading from the database, this converts the persisted type to the mapped type.
// This must be a failable initilizer when the conversion may fail.
public init?(persistedValue: String) { self.init(string: persistedValue) }
// Construct an instance of the persisted type from the mapped type.
// When writing to the database, this converts the mapped type to a persistable type.
public var persistableValue: String { self.absoluteString }
}

다음도 참조하세요.

PersistedTypeSwift SDK가 지원 하는 모든 기본 유형을 사용할 수 있습니다. 포함된 객체일 수도 있습니다.

PersistedType 은(는) 선택 사항이나 컬랙션일 수 없습니다. 하지만 매핑된 유형을 객체 모델의 옵션 속성 또는 컬렉션 속성으로 사용할 수 있습니다.

extension URL: FailableCustomPersistable {
// The `PersistedType` cannot be an optional, so this is not a valid
// conformance to the FailableCustomPersistable protocol.
public typealias PersistedType = String?
...
}
class Club: Object {
@Persisted var id: ObjectId
@Persisted var name: String
// Although the `PersistedType` cannot be optional, you can use the
// custom-mapped type as an optional in your object model.
@Persisted var url: URL?
}

유형 프로젝션 프로토콜 중 하나를 준수하는 유형은 Swift SDK 버전 10.10.0에 도입된 @Persisted 속성 선언 구문과 함께 사용할 수 있습니다. @objc dynamic 구문에서는 작동하지 않습니다.

프로젝션 유형을 사용할 수 있는 대상은 다음과 같습니다.

  • 최상위 유형

  • 유형의 선택적 버전

  • 의 유형

FailableCustomPersistable을(를) 속성으로 사용하는 경우 이를 선택 속성으로 정의합니다. 선택 사항인 경우 FailableCustomPersistable 프로토콜은 유효하지 않은 값을 nil에 매핑합니다. 필수 속성인 경우 강제로 래핑 해제됩니다. 프로젝션된 유형으로 변환할 수 없는 값이 있는 경우 해당 속성을 읽으면 래핑되지 않은 실패 예외가 발생합니다.

class Club: Object {
@Persisted var id: ObjectId
@Persisted var name: String
// Since we declared the URL as a FailableCustomPersistable,
// it must be optional.
@Persisted var url: URL?
// Here, the `location` property maps to an embedded object.
// We can declare the property as required.
// If the underlying field contains nil, this becomes
// a default-constructed instance of CLLocationCoordinate
// with field values of `0`.
@Persisted var location: CLLocationCoordinate2D
}
public class Location: EmbeddedObject {
@Persisted var latitude: Double
@Persisted var longitude: Double
}

모델에 프로젝션된 유형이 포함된 경우 지속된 유형을 사용하거나 프로젝션된 유형을 사용하여 초기화된 객체의 필드 속성에 할당하여 값으로 객체를 생성할 수 있습니다.

// Initialize objects and assign values
let club = Club(value: ["name": "American Kennel Club", "url": "https://akc.org"])
let club2 = Club()
club2.name = "Continental Kennel Club"
// When assigning the value to a type-projected property, type safety
// checks for the mapped type - not the persisted type.
club2.url = URL(string: "https://ckcusa.com/")!
club2.location = CLLocationCoordinate2D(latitude: 40.7509, longitude: 73.9777)

유형이 유형 프로젝션 프로토콜을 준수한다고 선언할 때 Realm에서 유지되어야 하는 유형을 지정합니다. 예를 들어 사용자 지정 유형 URL을(를) 지속형 유형 String에 매핑하는 경우 URL 속성은 스키마에서 String(으)로 표시되고 속성에 대한 동적 액세스는 문자열에 적용됩니다.

스키마는 매핑된 유형을 직접 나타내지 않습니다. 속성을 영구 유형에서 매핑된 유형으로 변경하거나 그 반대로 변경하는 경우 마이그레이션할 필요가 없습니다.

영구 유형을 사용하는 필드 유형을 보여주는 Realm Studio 스크린샷

돌아가기

관계

다음

객체 모델 변경