mirror of
https://github.com/JohnEstropia/CoreStore.git
synced 2026-03-25 19:01:41 +01:00
Deprecation of legacy ValueContainer and RelationshipContainer properties in favor of @Field propertyWrapper counterpart
This commit is contained in:
@@ -27,45 +27,15 @@ import CoreData
|
||||
import Foundation
|
||||
|
||||
|
||||
// MARK: - RelationshipContainer
|
||||
// MARK: - Deprecated
|
||||
|
||||
@available(*, deprecated, message: """
|
||||
Legacy `Value.*`, `Transformable.*`, and `Relationship.*` declarations will soon be obsoleted. Please migrate your models and stores to new models that use `@Field.*` property wrappers. See: https://github.com/JohnEstropia/CoreStore?tab=readme-ov-file#new-field-property-wrapper-syntax
|
||||
""")
|
||||
extension RelationshipContainer {
|
||||
|
||||
// MARK: - ToManyUnordered
|
||||
|
||||
/**
|
||||
The containing type for to-many unordered relationships. Any `CoreStoreObject` subclass can be a destination type. Inverse relationships should be declared from the destination type as well, using the `inverse:` argument for the relationship.
|
||||
```
|
||||
class Dog: CoreStoreObject {
|
||||
let master = Relationship.ToOne<Person>("master")
|
||||
}
|
||||
class Person: CoreStoreObject {
|
||||
let pets = Relationship.ToManyUnordered<Dog>("pets", inverse: { $0.master })
|
||||
}
|
||||
```
|
||||
- Important: `Relationship.ToManyUnordered` properties are required to be stored properties. Computed properties will be ignored, including `lazy` and `weak` properties.
|
||||
*/
|
||||
public final class ToManyUnordered<D: CoreStoreObject>: ToManyRelationshipKeyPathStringConvertible, RelationshipProtocol {
|
||||
|
||||
/**
|
||||
Initializes the metadata for the relationship. All relationships require an "inverse", so updates to to this object's relationship are also reflected on its destination object. Make sure to declare this relationship's inverse relationship on its destination object. Due to Swift's compiler limitation, only one of the relationship and its inverse can declare an `inverse:` argument.
|
||||
```
|
||||
class Dog: CoreStoreObject {
|
||||
let master = Relationship.ToOne<Person>("master")
|
||||
}
|
||||
class Person: CoreStoreObject {
|
||||
let pets = Relationship.ToManyOrdered<Dog>("pets", inverse: { $0.master })
|
||||
}
|
||||
```
|
||||
- parameter keyPath: the permanent name for this relationship.
|
||||
- parameter minCount: the minimum number of objects in this relationship UNLESS THE RELATIONSHIP IS EMPTY. This means there might be zero objects in the relationship, which might be less than `minCount`. If the number of objects in the relationship do not satisfy `minCount` and `maxCount`, the transaction's commit (or auto-commit) would fail with a validation error.
|
||||
- parameter maxCount: the maximum number of objects in this relationship. If the number of objects in the relationship do not satisfy `minCount` and `maxCount`, the transaction's commit (or auto-commit) would fail with a validation error.
|
||||
- parameter inverse: the inverse relationship that is declared for the destination object. All relationships require an "inverse", so updates to to this object's relationship are also reflected on its destination object.
|
||||
- parameter deleteRule: defines what happens to relationship when an object is deleted. Valid values are `.nullify`, `.cascade`, and `.delete`. Defaults to `.nullify`.
|
||||
- parameter versionHashModifier: used to mark or denote a relationship as being a different "version" than another even if all of the values which affect persistence are equal. (Such a difference is important in cases where the properties are unchanged but the format or content of its data are changed.)
|
||||
- parameter renamingIdentifier: used to resolve naming conflicts between models. When creating an entity mapping between entities in two managed object models, a source entity property and a destination entity property that share the same identifier indicate that a property mapping should be configured to migrate from the source to the destination. If unset, the identifier will be the property's name.
|
||||
- parameter affectedByKeyPaths: a set of key paths for properties whose values affect the value of the receiver. This is similar to `NSManagedObject.keyPathsForValuesAffectingValue(forKey:)`.
|
||||
*/
|
||||
|
||||
public convenience init(
|
||||
_ keyPath: KeyPathString,
|
||||
deleteRule: DeleteRule = .nullify,
|
||||
@@ -86,26 +56,7 @@ extension RelationshipContainer {
|
||||
affectedByKeyPaths: affectedByKeyPaths()
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
Initializes the metadata for the relationship. All relationships require an "inverse", so updates to to this object's relationship are also reflected on its destination object. Make sure to declare this relationship's inverse relationship on its destination object. Due to Swift's compiler limitation, only one of the relationship and its inverse can declare an `inverse:` argument.
|
||||
```
|
||||
class Dog: CoreStoreObject {
|
||||
let master = Relationship.ToOne<Person>("master")
|
||||
}
|
||||
class Person: CoreStoreObject {
|
||||
let pets = Relationship.ToManyOrdered<Dog>("pets", inverse: { $0.master })
|
||||
}
|
||||
```
|
||||
- parameter keyPath: the permanent name for this relationship.
|
||||
- parameter minCount: the minimum number of objects in this relationship UNLESS THE RELATIONSHIP IS EMPTY. This means there might be zero objects in the relationship, which might be less than `minCount`. If the number of objects in the relationship do not satisfy `minCount` and `maxCount`, the transaction's commit (or auto-commit) would fail with a validation error.
|
||||
- parameter maxCount: the maximum number of objects in this relationship. If the number of objects in the relationship do not satisfy `minCount` and `maxCount`, the transaction's commit (or auto-commit) would fail with a validation error.
|
||||
- parameter inverse: the inverse relationship that is declared for the destination object. All relationships require an "inverse", so updates to to this object's relationship are also reflected on its destination object.
|
||||
- parameter deleteRule: defines what happens to relationship when an object is deleted. Valid values are `.nullify`, `.cascade`, and `.delete`. Defaults to `.nullify`.
|
||||
- parameter versionHashModifier: used to mark or denote a relationship as being a different "version" than another even if all of the values which affect persistence are equal. (Such a difference is important in cases where the properties are unchanged but the format or content of its data are changed.)
|
||||
- parameter renamingIdentifier: used to resolve naming conflicts between models. When creating an entity mapping between entities in two managed object models, a source entity property and a destination entity property that share the same identifier indicate that a property mapping should be configured to migrate from the source to the destination. If unset, the identifier will be the property's name.
|
||||
- parameter affectedByKeyPaths: a set of key paths for properties whose values affect the value of the receiver. This is similar to `NSManagedObject.keyPathsForValuesAffectingValue(forKey:)`.
|
||||
*/
|
||||
|
||||
public convenience init(
|
||||
_ keyPath: KeyPathString,
|
||||
inverse: @escaping (D) -> RelationshipContainer<D>.ToOne<O>,
|
||||
@@ -127,26 +78,7 @@ extension RelationshipContainer {
|
||||
affectedByKeyPaths: affectedByKeyPaths()
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
Initializes the metadata for the relationship. All relationships require an "inverse", so updates to to this object's relationship are also reflected on its destination object. Make sure to declare this relationship's inverse relationship on its destination object. Due to Swift's compiler limitation, only one of the relationship and its inverse can declare an `inverse:` argument.
|
||||
```
|
||||
class Dog: CoreStoreObject {
|
||||
let master = Relationship.ToOne<Person>("master")
|
||||
}
|
||||
class Person: CoreStoreObject {
|
||||
let pets = Relationship.ToManyOrdered<Dog>("pets", inverse: { $0.master })
|
||||
}
|
||||
```
|
||||
- parameter keyPath: the permanent name for this relationship.
|
||||
- parameter minCount: the minimum number of objects in this relationship UNLESS THE RELATIONSHIP IS EMPTY. This means there might be zero objects in the relationship, which might be less than `minCount`. If the number of objects in the relationship do not satisfy `minCount` and `maxCount`, the transaction's commit (or auto-commit) would fail with a validation error.
|
||||
- parameter maxCount: the maximum number of objects in this relationship. If the number of objects in the relationship do not satisfy `minCount` and `maxCount`, the transaction's commit (or auto-commit) would fail with a validation error.
|
||||
- parameter inverse: the inverse relationship that is declared for the destination object. All relationships require an "inverse", so updates to to this object's relationship are also reflected on its destination object.
|
||||
- parameter deleteRule: defines what happens to relationship when an object is deleted. Valid values are `.nullify`, `.cascade`, and `.delete`. Defaults to `.nullify`.
|
||||
- parameter versionHashModifier: used to mark or denote a relationship as being a different "version" than another even if all of the values which affect persistence are equal. (Such a difference is important in cases where the properties are unchanged but the format or content of its data are changed.)
|
||||
- parameter renamingIdentifier: used to resolve naming conflicts between models. When creating an entity mapping between entities in two managed object models, a source entity property and a destination entity property that share the same identifier indicate that a property mapping should be configured to migrate from the source to the destination. If unset, the identifier will be the property's name.
|
||||
- parameter affectedByKeyPaths: a set of key paths for properties whose values affect the value of the receiver. This is similar to `NSManagedObject.keyPathsForValuesAffectingValue(forKey:)`.
|
||||
*/
|
||||
|
||||
public convenience init(
|
||||
_ keyPath: KeyPathString,
|
||||
inverse: @escaping (D) -> RelationshipContainer<D>.ToManyOrdered<O>,
|
||||
@@ -168,26 +100,7 @@ extension RelationshipContainer {
|
||||
affectedByKeyPaths: affectedByKeyPaths()
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
Initializes the metadata for the relationship. All relationships require an "inverse", so updates to to this object's relationship are also reflected on its destination object. Make sure to declare this relationship's inverse relationship on its destination object. Due to Swift's compiler limitation, only one of the relationship and its inverse can declare an `inverse:` argument.
|
||||
```
|
||||
class Dog: CoreStoreObject {
|
||||
let master = Relationship.ToOne<Person>("master")
|
||||
}
|
||||
class Person: CoreStoreObject {
|
||||
let pets = Relationship.ToManyOrdered<Dog>("pets", inverse: { $0.master })
|
||||
}
|
||||
```
|
||||
- parameter keyPath: the permanent name for this relationship.
|
||||
- parameter minCount: the minimum number of objects in this relationship UNLESS THE RELATIONSHIP IS EMPTY. This means there might be zero objects in the relationship, which might be less than `minCount`. If the number of objects in the relationship do not satisfy `minCount` and `maxCount`, the transaction's commit (or auto-commit) would fail with a validation error.
|
||||
- parameter maxCount: the maximum number of objects in this relationship. If the number of objects in the relationship do not satisfy `minCount` and `maxCount`, the transaction's commit (or auto-commit) would fail with a validation error.
|
||||
- parameter inverse: the inverse relationship that is declared for the destination object. All relationships require an "inverse", so updates to to this object's relationship are also reflected on its destination object.
|
||||
- parameter deleteRule: defines what happens to relationship when an object is deleted. Valid values are `.nullify`, `.cascade`, and `.delete`. Defaults to `.nullify`.
|
||||
- parameter versionHashModifier: used to mark or denote a relationship as being a different "version" than another even if all of the values which affect persistence are equal. (Such a difference is important in cases where the properties are unchanged but the format or content of its data are changed.)
|
||||
- parameter renamingIdentifier: used to resolve naming conflicts between models. When creating an entity mapping between entities in two managed object models, a source entity property and a destination entity property that share the same identifier indicate that a property mapping should be configured to migrate from the source to the destination. If unset, the identifier will be the property's name.
|
||||
- parameter affectedByKeyPaths: a set of key paths for properties whose values affect the value of the receiver. This is similar to `NSManagedObject.keyPathsForValuesAffectingValue(forKey:)`.
|
||||
*/
|
||||
|
||||
public convenience init(
|
||||
_ keyPath: KeyPathString,
|
||||
inverse: @escaping (D) -> RelationshipContainer<D>.ToManyUnordered<O>,
|
||||
@@ -209,10 +122,7 @@ extension RelationshipContainer {
|
||||
affectedByKeyPaths: affectedByKeyPaths()
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
The relationship value
|
||||
*/
|
||||
|
||||
public var value: ReturnValueType {
|
||||
|
||||
get {
|
||||
@@ -225,33 +135,18 @@ extension RelationshipContainer {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// MARK: AnyKeyPathStringConvertible
|
||||
|
||||
public var cs_keyPathString: String {
|
||||
|
||||
return self.keyPath
|
||||
}
|
||||
|
||||
|
||||
// MARK: KeyPathStringConvertible
|
||||
|
||||
public typealias ObjectType = O
|
||||
public typealias DestinationValueType = D
|
||||
|
||||
|
||||
// MARK: RelationshipKeyPathStringConvertible
|
||||
|
||||
public typealias ReturnValueType = Set<DestinationValueType>
|
||||
|
||||
|
||||
// MARK: PropertyProtocol
|
||||
|
||||
internal let keyPath: KeyPathString
|
||||
|
||||
|
||||
// MARK: RelationshipProtocol
|
||||
|
||||
internal let entityDescriptionValues: () -> RelationshipProtocol.EntityDescriptionValues
|
||||
internal var rawObject: CoreStoreManagedObject?
|
||||
|
||||
@@ -304,9 +199,6 @@ extension RelationshipContainer {
|
||||
return Set(self.value.map({ $0.objectID() }))
|
||||
}
|
||||
|
||||
|
||||
// MARK: Private
|
||||
|
||||
private init(keyPath: KeyPathString, inverseKeyPath: @escaping () -> KeyPathString?, deleteRule: DeleteRule, minCount: Int, maxCount: Int, versionHashModifier: @autoclosure @escaping () -> String?, renamingIdentifier: @autoclosure @escaping () -> String?, affectedByKeyPaths: @autoclosure @escaping () -> Set<String>) {
|
||||
|
||||
self.keyPath = keyPath
|
||||
@@ -328,30 +220,21 @@ extension RelationshipContainer {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// MARK: - Convenience
|
||||
|
||||
@available(*, deprecated, message: """
|
||||
Legacy `Value.*`, `Transformable.*`, and `Relationship.*` declarations will soon be obsoleted. Please migrate your models and stores to new models that use `@Field.*` property wrappers. See: https://github.com/JohnEstropia/CoreStore?tab=readme-ov-file#new-field-property-wrapper-syntax
|
||||
""")
|
||||
extension RelationshipContainer.ToManyUnordered: Sequence {
|
||||
|
||||
/**
|
||||
The number of elements in the set.
|
||||
*/
|
||||
public var count: Int {
|
||||
|
||||
return self.nativeValue.count
|
||||
}
|
||||
|
||||
/**
|
||||
A Boolean value indicating whether the range contains no elements.
|
||||
*/
|
||||
|
||||
public var isEmpty: Bool {
|
||||
|
||||
return self.nativeValue.count == 0
|
||||
}
|
||||
|
||||
|
||||
// MARK: Sequence
|
||||
|
||||
public typealias Iterator = AnyIterator<D>
|
||||
|
||||
public func makeIterator() -> Iterator {
|
||||
@@ -361,96 +244,36 @@ extension RelationshipContainer.ToManyUnordered: Sequence {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// MARK: - Operations
|
||||
|
||||
@available(*, deprecated, message: """
|
||||
Legacy `Value.*`, `Transformable.*`, and `Relationship.*` declarations will soon be obsoleted. Please migrate your models and stores to new models that use `@Field.*` property wrappers. See: https://github.com/JohnEstropia/CoreStore?tab=readme-ov-file#new-field-property-wrapper-syntax
|
||||
""")
|
||||
extension RelationshipContainer.ToManyUnordered {
|
||||
|
||||
/**
|
||||
Assigns a sequence of objects to the relationship. The operation
|
||||
```
|
||||
person.pets .= [dog, cat]
|
||||
```
|
||||
is equivalent to
|
||||
```
|
||||
person.pets.value = [dog, cat]
|
||||
```
|
||||
*/
|
||||
public static func .= <S: Sequence>(_ relationship: RelationshipContainer<O>.ToManyUnordered<D>, _ newValue: S) where S.Iterator.Element == D {
|
||||
|
||||
relationship.nativeValue = NSSet(array: newValue.map({ $0.rawObject! }))
|
||||
}
|
||||
|
||||
/**
|
||||
Assigns a sequence of objects to the relationship. The operation
|
||||
```
|
||||
person.pets .= anotherPerson.pets
|
||||
```
|
||||
is equivalent to
|
||||
```
|
||||
person.pets.value = anotherPerson.pets.value
|
||||
```
|
||||
*/
|
||||
|
||||
public static func .= <O2>(_ relationship: RelationshipContainer<O>.ToManyUnordered<D>, _ relationship2: RelationshipContainer<O2>.ToManyUnordered<D>) {
|
||||
|
||||
relationship.nativeValue = relationship2.nativeValue
|
||||
}
|
||||
|
||||
/**
|
||||
Assigns a sequence of objects to the relationship. The operation
|
||||
```
|
||||
person.pets .= anotherPerson.pets
|
||||
```
|
||||
is equivalent to
|
||||
```
|
||||
person.pets.value = anotherPerson.pets.value
|
||||
```
|
||||
*/
|
||||
|
||||
public static func .= <O2>(_ relationship: RelationshipContainer<O>.ToManyUnordered<D>, _ relationship2: RelationshipContainer<O2>.ToManyOrdered<D>) {
|
||||
|
||||
relationship.nativeValue = NSSet(set: relationship2.nativeValue.set)
|
||||
}
|
||||
|
||||
/**
|
||||
Compares the if the relationship's objects and a set of objects have the same elements.
|
||||
```
|
||||
if person.pets .== Set<Animal>([dog, cat]) { ... }
|
||||
```
|
||||
is equivalent to
|
||||
```
|
||||
if person.pets.value == Set<Animal>([dog, cat]) { ... }
|
||||
```
|
||||
*/
|
||||
|
||||
public static func .== (_ relationship: RelationshipContainer<O>.ToManyUnordered<D>, _ set: Set<D>) -> Bool {
|
||||
|
||||
return relationship.nativeValue.isEqual(to: Set(set.map({ $0.rawObject! })))
|
||||
}
|
||||
|
||||
/**
|
||||
Compares if a set of objects and a relationship's objects have the same elements.
|
||||
```
|
||||
if Set<Animal>([dog, cat]) .== person.pets { ... }
|
||||
```
|
||||
is equivalent to
|
||||
```
|
||||
if Set<Animal>([dog, cat]) == person.pets.value { ... }
|
||||
```
|
||||
*/
|
||||
|
||||
public static func .== (_ set: Set<D>, _ relationship: RelationshipContainer<O>.ToManyUnordered<D>) -> Bool {
|
||||
|
||||
return relationship.nativeValue.isEqual(to: Set(set.map({ $0.rawObject! })))
|
||||
}
|
||||
|
||||
/**
|
||||
Compares if a relationship's objects and another relationship's objects have the same elements.
|
||||
```
|
||||
if person.pets .== anotherPerson.pets { ... }
|
||||
```
|
||||
is equivalent to
|
||||
```
|
||||
if person.pets.value == anotherPerson.pets.value { ... }
|
||||
```
|
||||
*/
|
||||
|
||||
public static func .== <O2>(_ relationship: RelationshipContainer<O>.ToManyUnordered<D>, _ relationship2: RelationshipContainer<O2>.ToManyUnordered<D>) -> Bool {
|
||||
|
||||
return relationship.nativeValue.isEqual(relationship2.nativeValue)
|
||||
|
||||
Reference in New Issue
Block a user