mirror of
https://github.com/JohnEstropia/CoreStore.git
synced 2026-04-24 17:48:32 +02:00
work around issue that crashes the Swift 3.2 compiler (fixes #171)
This commit is contained in:
@@ -85,7 +85,7 @@ class ObjectObserverDemoViewController: UIViewController, ObjectObserver {
|
|||||||
|
|
||||||
// MARK: ObjectObserver
|
// MARK: ObjectObserver
|
||||||
|
|
||||||
func objectMonitor(_ monitor: ObjectMonitor<Palette>, didUpdateObject object: Palette, changedPersistentKeys: Set<KeyPath>) {
|
func objectMonitor(_ monitor: ObjectMonitor<Palette>, didUpdateObject object: Palette, changedPersistentKeys: Set<RawKeyPath>) {
|
||||||
|
|
||||||
self.reloadPaletteInfo(object, changedKeys: changedPersistentKeys)
|
self.reloadPaletteInfo(object, changedKeys: changedPersistentKeys)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ class Palette: NSManagedObject {
|
|||||||
}
|
}
|
||||||
set {
|
set {
|
||||||
|
|
||||||
self.setValue(newValue.cs_toImportableNativeType(), forKvcKey: #keyPath(Palette.colorName))
|
self.setValue(newValue.cs_toQueryableNativeType(), forKvcKey: #keyPath(Palette.colorName))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -131,7 +131,7 @@ class TransactionsDemoViewController: UIViewController, MKMapViewDelegate, Objec
|
|||||||
// none
|
// none
|
||||||
}
|
}
|
||||||
|
|
||||||
func objectMonitor(_ monitor: ObjectMonitor<Place>, didUpdateObject object: Place, changedPersistentKeys: Set<KeyPath>) {
|
func objectMonitor(_ monitor: ObjectMonitor<Place>, didUpdateObject object: Place, changedPersistentKeys: Set<RawKeyPath>) {
|
||||||
|
|
||||||
if let mapView = self.mapView {
|
if let mapView = self.mapView {
|
||||||
|
|
||||||
|
|||||||
@@ -36,33 +36,33 @@ class ImportTests: BaseTestDataTestCase {
|
|||||||
@objc
|
@objc
|
||||||
dynamic func test_ThatAttributeProtocols_BehaveCorrectly() {
|
dynamic func test_ThatAttributeProtocols_BehaveCorrectly() {
|
||||||
|
|
||||||
XCTAssertEqual(NSNumber.cs_fromImportableNativeType(NSNumber(value: true))?.boolValue, true)
|
XCTAssertEqual(NSNumber.cs_fromQueryableNativeType(NSNumber(value: true))?.boolValue, true)
|
||||||
XCTAssertEqual(NSNumber.cs_fromImportableNativeType(NSNumber(value: Int16.max))?.int16Value, Int16.max)
|
XCTAssertEqual(NSNumber.cs_fromQueryableNativeType(NSNumber(value: Int16.max))?.int16Value, Int16.max)
|
||||||
XCTAssertEqual(NSNumber.cs_fromImportableNativeType(NSNumber(value: Int32.max))?.int32Value, Int32.max)
|
XCTAssertEqual(NSNumber.cs_fromQueryableNativeType(NSNumber(value: Int32.max))?.int32Value, Int32.max)
|
||||||
XCTAssertEqual(NSNumber.cs_fromImportableNativeType(NSNumber(value: Int64.max))?.int64Value, Int64.max)
|
XCTAssertEqual(NSNumber.cs_fromQueryableNativeType(NSNumber(value: Int64.max))?.int64Value, Int64.max)
|
||||||
XCTAssertEqual(NSNumber.cs_fromImportableNativeType(NSNumber(value: MAXFLOAT))?.floatValue, MAXFLOAT)
|
XCTAssertEqual(NSNumber.cs_fromQueryableNativeType(NSNumber(value: MAXFLOAT))?.floatValue, MAXFLOAT)
|
||||||
XCTAssertEqual(NSNumber.cs_fromImportableNativeType(NSNumber(value: Double(MAXFLOAT)))?.doubleValue, Double(MAXFLOAT))
|
XCTAssertEqual(NSNumber.cs_fromQueryableNativeType(NSNumber(value: Double(MAXFLOAT)))?.doubleValue, Double(MAXFLOAT))
|
||||||
|
|
||||||
XCTAssertEqual(NSDecimalNumber.cs_fromImportableNativeType(NSDecimalNumber(string: "1"))?.boolValue, true)
|
XCTAssertEqual(NSDecimalNumber.cs_fromQueryableNativeType(NSDecimalNumber(string: "1"))?.boolValue, true)
|
||||||
XCTAssertEqual(NSDecimalNumber.cs_fromImportableNativeType(NSDecimalNumber(string: Int16.max.description))?.int16Value, Int16.max)
|
XCTAssertEqual(NSDecimalNumber.cs_fromQueryableNativeType(NSDecimalNumber(string: Int16.max.description))?.int16Value, Int16.max)
|
||||||
XCTAssertEqual(NSDecimalNumber.cs_fromImportableNativeType(NSDecimalNumber(string: Int32.max.description))?.int32Value, Int32.max)
|
XCTAssertEqual(NSDecimalNumber.cs_fromQueryableNativeType(NSDecimalNumber(string: Int32.max.description))?.int32Value, Int32.max)
|
||||||
XCTAssertEqual(NSDecimalNumber.cs_fromImportableNativeType(NSDecimalNumber(string: Int64.max.description))?.int64Value, Int64.max)
|
XCTAssertEqual(NSDecimalNumber.cs_fromQueryableNativeType(NSDecimalNumber(string: Int64.max.description))?.int64Value, Int64.max)
|
||||||
XCTAssertEqual(NSDecimalNumber.cs_fromImportableNativeType(NSDecimalNumber(string: MAXFLOAT.description))?.doubleValue, NSDecimalNumber(string: MAXFLOAT.description).doubleValue)
|
XCTAssertEqual(NSDecimalNumber.cs_fromQueryableNativeType(NSDecimalNumber(string: MAXFLOAT.description))?.doubleValue, NSDecimalNumber(string: MAXFLOAT.description).doubleValue)
|
||||||
XCTAssertEqual(NSDecimalNumber.cs_fromImportableNativeType(NSDecimalNumber(string: MAXFLOAT.description))?.floatValue, NSDecimalNumber(string: MAXFLOAT.description).floatValue)
|
XCTAssertEqual(NSDecimalNumber.cs_fromQueryableNativeType(NSDecimalNumber(string: MAXFLOAT.description))?.floatValue, NSDecimalNumber(string: MAXFLOAT.description).floatValue)
|
||||||
|
|
||||||
XCTAssertEqual(NSNumber.cs_fromImportableNativeType(NSDecimalNumber(string: "1"))?.boolValue, true)
|
XCTAssertEqual(NSNumber.cs_fromQueryableNativeType(NSDecimalNumber(string: "1"))?.boolValue, true)
|
||||||
XCTAssertEqual(NSNumber.cs_fromImportableNativeType(NSDecimalNumber(string: Int16.max.description))?.int16Value, Int16.max)
|
XCTAssertEqual(NSNumber.cs_fromQueryableNativeType(NSDecimalNumber(string: Int16.max.description))?.int16Value, Int16.max)
|
||||||
XCTAssertEqual(NSNumber.cs_fromImportableNativeType(NSDecimalNumber(string: Int32.max.description))?.int32Value, Int32.max)
|
XCTAssertEqual(NSNumber.cs_fromQueryableNativeType(NSDecimalNumber(string: Int32.max.description))?.int32Value, Int32.max)
|
||||||
XCTAssertEqual(NSNumber.cs_fromImportableNativeType(NSDecimalNumber(string: Int64.max.description))?.int64Value, Int64.max)
|
XCTAssertEqual(NSNumber.cs_fromQueryableNativeType(NSDecimalNumber(string: Int64.max.description))?.int64Value, Int64.max)
|
||||||
XCTAssertEqual(NSNumber.cs_fromImportableNativeType(NSDecimalNumber(string: MAXFLOAT.description))?.doubleValue, NSDecimalNumber(string: MAXFLOAT.description).doubleValue)
|
XCTAssertEqual(NSNumber.cs_fromQueryableNativeType(NSDecimalNumber(string: MAXFLOAT.description))?.doubleValue, NSDecimalNumber(string: MAXFLOAT.description).doubleValue)
|
||||||
XCTAssertEqual(NSNumber.cs_fromImportableNativeType(NSDecimalNumber(string: MAXFLOAT.description))?.floatValue, NSDecimalNumber(string: MAXFLOAT.description).floatValue)
|
XCTAssertEqual(NSNumber.cs_fromQueryableNativeType(NSDecimalNumber(string: MAXFLOAT.description))?.floatValue, NSDecimalNumber(string: MAXFLOAT.description).floatValue)
|
||||||
|
|
||||||
XCTAssertNil(NSDecimalNumber.cs_fromImportableNativeType(NSNumber(value: true)))
|
XCTAssertNil(NSDecimalNumber.cs_fromQueryableNativeType(NSNumber(value: true)))
|
||||||
XCTAssertNil(NSDecimalNumber.cs_fromImportableNativeType(NSNumber(value: Int16.max)))
|
XCTAssertNil(NSDecimalNumber.cs_fromQueryableNativeType(NSNumber(value: Int16.max)))
|
||||||
XCTAssertNil(NSDecimalNumber.cs_fromImportableNativeType(NSNumber(value: Int32.max)))
|
XCTAssertNil(NSDecimalNumber.cs_fromQueryableNativeType(NSNumber(value: Int32.max)))
|
||||||
XCTAssertNil(NSDecimalNumber.cs_fromImportableNativeType(NSNumber(value: Int64.max)))
|
XCTAssertNil(NSDecimalNumber.cs_fromQueryableNativeType(NSNumber(value: Int64.max)))
|
||||||
XCTAssertNil(NSDecimalNumber.cs_fromImportableNativeType(NSNumber(value: MAXFLOAT)))
|
XCTAssertNil(NSDecimalNumber.cs_fromQueryableNativeType(NSNumber(value: MAXFLOAT)))
|
||||||
XCTAssertNil(NSDecimalNumber.cs_fromImportableNativeType(NSNumber(value: Double(MAXFLOAT))))
|
XCTAssertNil(NSDecimalNumber.cs_fromQueryableNativeType(NSNumber(value: Double(MAXFLOAT))))
|
||||||
|
|
||||||
XCTAssertEqual(true.cs_toQueryableNativeType(), NSNumber(value: true))
|
XCTAssertEqual(true.cs_toQueryableNativeType(), NSNumber(value: true))
|
||||||
XCTAssertEqual(Int16.max.cs_toQueryableNativeType(), NSNumber(value: Int16.max))
|
XCTAssertEqual(Int16.max.cs_toQueryableNativeType(), NSNumber(value: Int16.max))
|
||||||
|
|||||||
@@ -198,60 +198,58 @@ class ListObserverTests: BaseTestDataTestCase {
|
|||||||
return events == 0
|
return events == 0
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
for _ in 1 ... 2 {
|
|
||||||
|
let didUpdateObjectExpectation = self.expectation(
|
||||||
let didUpdateObjectExpectation = self.expectation(
|
forNotification: "listMonitor:didUpdateObject:atIndexPath:",
|
||||||
forNotification: "listMonitor:didUpdateObject:atIndexPath:",
|
object: observer,
|
||||||
object: observer,
|
handler: { (note) -> Bool in
|
||||||
handler: { (note) -> Bool in
|
|
||||||
|
XCTAssert(events == 1 || events == 2)
|
||||||
|
|
||||||
|
let userInfo = note.userInfo
|
||||||
|
XCTAssertNotNil(userInfo)
|
||||||
|
XCTAssertEqual(
|
||||||
|
Set(userInfo?.keys.map({ $0 as! String }) ?? []),
|
||||||
|
["indexPath", "object"]
|
||||||
|
)
|
||||||
|
|
||||||
|
let indexPath = userInfo?["indexPath"] as? NSIndexPath
|
||||||
|
let object = userInfo?["object"] as? TestEntity1
|
||||||
|
|
||||||
|
switch object?.testEntityID {
|
||||||
|
|
||||||
XCTAssert(events == 1 || events == 2)
|
case NSNumber(value: 101)?:
|
||||||
|
XCTAssertEqual(indexPath?.index(atPosition: 0), 1)
|
||||||
|
XCTAssertEqual(indexPath?.index(atPosition: 1), 0)
|
||||||
|
|
||||||
let userInfo = note.userInfo
|
XCTAssertEqual(object?.testBoolean, NSNumber(value: true))
|
||||||
XCTAssertNotNil(userInfo)
|
XCTAssertEqual(object?.testNumber, NSNumber(value: 11))
|
||||||
XCTAssertEqual(
|
XCTAssertEqual(object?.testDecimal, NSDecimalNumber(string: "11"))
|
||||||
Set(userInfo?.keys.map({ $0 as! String }) ?? []),
|
XCTAssertEqual(object?.testString, "nil:TestEntity1:11")
|
||||||
["indexPath", "object"]
|
XCTAssertEqual(object?.testData, ("nil:TestEntity1:11" as NSString).data(using: String.Encoding.utf8.rawValue)!)
|
||||||
)
|
XCTAssertEqual(object?.testDate, self.dateFormatter.date(from: "2000-01-11T00:00:00Z")!)
|
||||||
|
|
||||||
let indexPath = userInfo?["indexPath"] as? NSIndexPath
|
case NSNumber(value: 102)?:
|
||||||
let object = userInfo?["object"] as? TestEntity1
|
XCTAssertEqual(indexPath?.index(atPosition: 0), 0)
|
||||||
|
XCTAssertEqual(indexPath?.index(atPosition: 1), 0)
|
||||||
|
|
||||||
switch object?.testEntityID {
|
XCTAssertEqual(object?.testBoolean, NSNumber(value: false))
|
||||||
|
XCTAssertEqual(object?.testNumber, NSNumber(value: 22))
|
||||||
case NSNumber(value: 101)?:
|
XCTAssertEqual(object?.testDecimal, NSDecimalNumber(string: "22"))
|
||||||
XCTAssertEqual(indexPath?.index(atPosition: 0), 1)
|
XCTAssertEqual(object?.testString, "nil:TestEntity1:22")
|
||||||
XCTAssertEqual(indexPath?.index(atPosition: 1), 0)
|
XCTAssertEqual(object?.testData, ("nil:TestEntity1:22" as NSString).data(using: String.Encoding.utf8.rawValue)!)
|
||||||
|
XCTAssertEqual(object?.testDate, self.dateFormatter.date(from: "2000-01-22T00:00:00Z")!)
|
||||||
XCTAssertEqual(object?.testBoolean, NSNumber(value: true))
|
|
||||||
XCTAssertEqual(object?.testNumber, NSNumber(value: 11))
|
default:
|
||||||
XCTAssertEqual(object?.testDecimal, NSDecimalNumber(string: "11"))
|
XCTFail()
|
||||||
XCTAssertEqual(object?.testString, "nil:TestEntity1:11")
|
|
||||||
XCTAssertEqual(object?.testData, ("nil:TestEntity1:11" as NSString).data(using: String.Encoding.utf8.rawValue)!)
|
|
||||||
XCTAssertEqual(object?.testDate, self.dateFormatter.date(from: "2000-01-11T00:00:00Z")!)
|
|
||||||
|
|
||||||
case NSNumber(value: 102)?:
|
|
||||||
XCTAssertEqual(indexPath?.index(atPosition: 0), 0)
|
|
||||||
XCTAssertEqual(indexPath?.index(atPosition: 1), 0)
|
|
||||||
|
|
||||||
XCTAssertEqual(object?.testBoolean, NSNumber(value: false))
|
|
||||||
XCTAssertEqual(object?.testNumber, NSNumber(value: 22))
|
|
||||||
XCTAssertEqual(object?.testDecimal, NSDecimalNumber(string: "22"))
|
|
||||||
XCTAssertEqual(object?.testString, "nil:TestEntity1:22")
|
|
||||||
XCTAssertEqual(object?.testData, ("nil:TestEntity1:22" as NSString).data(using: String.Encoding.utf8.rawValue)!)
|
|
||||||
XCTAssertEqual(object?.testDate, self.dateFormatter.date(from: "2000-01-22T00:00:00Z")!)
|
|
||||||
|
|
||||||
default:
|
|
||||||
XCTFail()
|
|
||||||
}
|
|
||||||
defer {
|
|
||||||
|
|
||||||
events += 1
|
|
||||||
}
|
|
||||||
return events == 1 || events == 2
|
|
||||||
}
|
}
|
||||||
)
|
defer {
|
||||||
}
|
|
||||||
|
events += 1
|
||||||
|
}
|
||||||
|
return events == 1 || events == 2
|
||||||
|
}
|
||||||
|
)
|
||||||
let didChangeExpectation = self.expectation(
|
let didChangeExpectation = self.expectation(
|
||||||
forNotification: "listMonitorDidChange:",
|
forNotification: "listMonitorDidChange:",
|
||||||
object: observer,
|
object: observer,
|
||||||
@@ -453,38 +451,35 @@ class ListObserverTests: BaseTestDataTestCase {
|
|||||||
return events == 0
|
return events == 0
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
for _ in 1 ... 2 {
|
let didUpdateObjectExpectation = self.expectation(
|
||||||
|
forNotification: "listMonitor:didDeleteObject:fromIndexPath:",
|
||||||
let didUpdateObjectExpectation = self.expectation(
|
object: observer,
|
||||||
forNotification: "listMonitor:didDeleteObject:fromIndexPath:",
|
handler: { (note) -> Bool in
|
||||||
object: observer,
|
|
||||||
handler: { (note) -> Bool in
|
XCTAssert(events == 1 || events == 2)
|
||||||
|
|
||||||
|
let userInfo = note.userInfo
|
||||||
|
XCTAssertNotNil(userInfo)
|
||||||
|
XCTAssertEqual(
|
||||||
|
Set(userInfo?.keys.map({ $0 as! String }) ?? []),
|
||||||
|
["indexPath", "object"]
|
||||||
|
)
|
||||||
|
|
||||||
|
let indexPath = userInfo?["indexPath"] as? NSIndexPath
|
||||||
|
|
||||||
|
XCTAssertEqual(indexPath?.section, 0)
|
||||||
|
XCTAssert(indexPath?.index(atPosition: 1) == 0 || indexPath?.index(atPosition: 1) == 1)
|
||||||
|
|
||||||
|
let object = userInfo?["object"] as? TestEntity1
|
||||||
|
XCTAssertEqual(object?.isDeleted, true)
|
||||||
|
|
||||||
|
defer {
|
||||||
|
|
||||||
XCTAssert(events == 1 || events == 2)
|
events += 1
|
||||||
|
|
||||||
let userInfo = note.userInfo
|
|
||||||
XCTAssertNotNil(userInfo)
|
|
||||||
XCTAssertEqual(
|
|
||||||
Set(userInfo?.keys.map({ $0 as! String }) ?? []),
|
|
||||||
["indexPath", "object"]
|
|
||||||
)
|
|
||||||
|
|
||||||
let indexPath = userInfo?["indexPath"] as? NSIndexPath
|
|
||||||
|
|
||||||
XCTAssertEqual(indexPath?.section, 0)
|
|
||||||
XCTAssert(indexPath?.index(atPosition: 1) == 0 || indexPath?.index(atPosition: 1) == 1)
|
|
||||||
|
|
||||||
let object = userInfo?["object"] as? TestEntity1
|
|
||||||
XCTAssertEqual(object?.isDeleted, true)
|
|
||||||
|
|
||||||
defer {
|
|
||||||
|
|
||||||
events += 1
|
|
||||||
}
|
|
||||||
return events == 1 || events == 2
|
|
||||||
}
|
}
|
||||||
)
|
return events == 1 || events == 2
|
||||||
}
|
}
|
||||||
|
)
|
||||||
let didDeleteSectionExpectation = self.expectation(
|
let didDeleteSectionExpectation = self.expectation(
|
||||||
forNotification: "listMonitor:didDeleteSection:fromSectionIndex:",
|
forNotification: "listMonitor:didDeleteSection:fromSectionIndex:",
|
||||||
object: observer,
|
object: observer,
|
||||||
@@ -531,10 +526,11 @@ class ListObserverTests: BaseTestDataTestCase {
|
|||||||
stack.perform(
|
stack.perform(
|
||||||
asynchronous: { (transaction) -> Bool in
|
asynchronous: { (transaction) -> Bool in
|
||||||
|
|
||||||
transaction.deleteAll(
|
let count = transaction.deleteAll(
|
||||||
From<TestEntity1>(),
|
From<TestEntity1>(),
|
||||||
Where(#keyPath(TestEntity1.testBoolean), isEqualTo: false)
|
Where(#keyPath(TestEntity1.testBoolean), isEqualTo: false)
|
||||||
)
|
)
|
||||||
|
XCTAssertEqual(count, 2)
|
||||||
return transaction.hasChanges
|
return transaction.hasChanges
|
||||||
},
|
},
|
||||||
success: { (hasChanges) in
|
success: { (hasChanges) in
|
||||||
|
|||||||
@@ -219,7 +219,7 @@ class TestObjectObserver: ObjectObserver {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
func objectMonitor(_ monitor: ObjectMonitor<TestEntity1>, didUpdateObject object: TestEntity1, changedPersistentKeys: Set<KeyPath>) {
|
func objectMonitor(_ monitor: ObjectMonitor<TestEntity1>, didUpdateObject object: TestEntity1, changedPersistentKeys: Set<String>) {
|
||||||
|
|
||||||
NotificationCenter.default.post(
|
NotificationCenter.default.post(
|
||||||
name: NSNotification.Name(rawValue: "objectMonitor:didUpdateObject:changedPersistentKeys:"),
|
name: NSNotification.Name(rawValue: "objectMonitor:didUpdateObject:changedPersistentKeys:"),
|
||||||
|
|||||||
@@ -1446,7 +1446,7 @@ class MyViewController: UIViewController, ObjectObserver {
|
|||||||
// ...
|
// ...
|
||||||
}
|
}
|
||||||
|
|
||||||
func objectMonitor(monitor: ObjectMonitor<MyPersonEntity>, didUpdateObject object: MyPersonEntity, changedPersistentKeys: Set<KeyPath>) {
|
func objectMonitor(monitor: ObjectMonitor<MyPersonEntity>, didUpdateObject object: MyPersonEntity, changedPersistentKeys: Set<RawKeyPath>) {
|
||||||
// ...
|
// ...
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ public final class CSGroupBy: NSObject, CSQueryClause, CoreStoreObjectiveCType {
|
|||||||
The list of key path strings to group results with
|
The list of key path strings to group results with
|
||||||
*/
|
*/
|
||||||
@objc
|
@objc
|
||||||
public var keyPaths: [KeyPath] {
|
public var keyPaths: [RawKeyPath] {
|
||||||
|
|
||||||
return self.bridgeToSwift.keyPaths
|
return self.bridgeToSwift.keyPaths
|
||||||
}
|
}
|
||||||
@@ -52,7 +52,7 @@ public final class CSGroupBy: NSObject, CSQueryClause, CoreStoreObjectiveCType {
|
|||||||
- parameter keyPath: a key path string to group results with
|
- parameter keyPath: a key path string to group results with
|
||||||
*/
|
*/
|
||||||
@objc
|
@objc
|
||||||
public convenience init(keyPath: KeyPath) {
|
public convenience init(keyPath: RawKeyPath) {
|
||||||
|
|
||||||
self.init(GroupBy(keyPath))
|
self.init(GroupBy(keyPath))
|
||||||
}
|
}
|
||||||
@@ -63,7 +63,7 @@ public final class CSGroupBy: NSObject, CSQueryClause, CoreStoreObjectiveCType {
|
|||||||
- parameter keyPaths: a list of key path strings to group results with
|
- parameter keyPaths: a list of key path strings to group results with
|
||||||
*/
|
*/
|
||||||
@objc
|
@objc
|
||||||
public convenience init(keyPaths: [KeyPath]) {
|
public convenience init(keyPaths: [RawKeyPath]) {
|
||||||
|
|
||||||
self.init(GroupBy(keyPaths))
|
self.init(GroupBy(keyPaths))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ public final class CSSectionBy: NSObject, CoreStoreObjectiveCType {
|
|||||||
- returns: a `CSSectionBy` clause with the key path to use to group `CSListMonitor` objects into sections
|
- returns: a `CSSectionBy` clause with the key path to use to group `CSListMonitor` objects into sections
|
||||||
*/
|
*/
|
||||||
@objc
|
@objc
|
||||||
public static func keyPath(_ sectionKeyPath: KeyPath) -> CSSectionBy {
|
public static func keyPath(_ sectionKeyPath: RawKeyPath) -> CSSectionBy {
|
||||||
|
|
||||||
return self.init(SectionBy(sectionKeyPath))
|
return self.init(SectionBy(sectionKeyPath))
|
||||||
}
|
}
|
||||||
@@ -58,7 +58,7 @@ public final class CSSectionBy: NSObject, CoreStoreObjectiveCType {
|
|||||||
- returns: a `CSSectionBy` clause with the key path to use to group `CSListMonitor` objects into sections
|
- returns: a `CSSectionBy` clause with the key path to use to group `CSListMonitor` objects into sections
|
||||||
*/
|
*/
|
||||||
@objc
|
@objc
|
||||||
public static func keyPath(_ sectionKeyPath: KeyPath, sectionIndexTransformer: @escaping (_ sectionName: String?) -> String?) -> CSSectionBy {
|
public static func keyPath(_ sectionKeyPath: RawKeyPath, sectionIndexTransformer: @escaping (_ sectionName: String?) -> String?) -> CSSectionBy {
|
||||||
|
|
||||||
return self.init(SectionBy(sectionKeyPath, sectionIndexTransformer))
|
return self.init(SectionBy(sectionKeyPath, sectionIndexTransformer))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -48,7 +48,7 @@ public final class CSSelectTerm: NSObject, CoreStoreObjectiveCType {
|
|||||||
- parameter keyPath: the attribute name
|
- parameter keyPath: the attribute name
|
||||||
*/
|
*/
|
||||||
@objc
|
@objc
|
||||||
public convenience init(keyPath: KeyPath) {
|
public convenience init(keyPath: RawKeyPath) {
|
||||||
|
|
||||||
self.init(.attribute(keyPath))
|
self.init(.attribute(keyPath))
|
||||||
}
|
}
|
||||||
@@ -65,7 +65,7 @@ public final class CSSelectTerm: NSObject, CoreStoreObjectiveCType {
|
|||||||
- returns: a `CSSelectTerm` to a `CSSelect` clause for querying the average value of an attribute
|
- returns: a `CSSelectTerm` to a `CSSelect` clause for querying the average value of an attribute
|
||||||
*/
|
*/
|
||||||
@objc
|
@objc
|
||||||
public static func average(_ keyPath: KeyPath, as alias: KeyPath?) -> CSSelectTerm {
|
public static func average(_ keyPath: RawKeyPath, as alias: RawKeyPath?) -> CSSelectTerm {
|
||||||
|
|
||||||
return self.init(.average(keyPath, as: alias))
|
return self.init(.average(keyPath, as: alias))
|
||||||
}
|
}
|
||||||
@@ -82,7 +82,7 @@ public final class CSSelectTerm: NSObject, CoreStoreObjectiveCType {
|
|||||||
- returns: a `SelectTerm` to a `Select` clause for a count query
|
- returns: a `SelectTerm` to a `Select` clause for a count query
|
||||||
*/
|
*/
|
||||||
@objc
|
@objc
|
||||||
public static func count(_ keyPath: KeyPath, as alias: KeyPath?) -> CSSelectTerm {
|
public static func count(_ keyPath: RawKeyPath, as alias: RawKeyPath?) -> CSSelectTerm {
|
||||||
|
|
||||||
return self.init(.count(keyPath, as: alias))
|
return self.init(.count(keyPath, as: alias))
|
||||||
}
|
}
|
||||||
@@ -99,7 +99,7 @@ public final class CSSelectTerm: NSObject, CoreStoreObjectiveCType {
|
|||||||
- returns: a `CSSelectTerm` to a `CSSelect` clause for querying the maximum value for an attribute
|
- returns: a `CSSelectTerm` to a `CSSelect` clause for querying the maximum value for an attribute
|
||||||
*/
|
*/
|
||||||
@objc
|
@objc
|
||||||
public static func maximum(_ keyPath: KeyPath, as alias: KeyPath?) -> CSSelectTerm {
|
public static func maximum(_ keyPath: RawKeyPath, as alias: RawKeyPath?) -> CSSelectTerm {
|
||||||
|
|
||||||
return self.init(.maximum(keyPath, as: alias))
|
return self.init(.maximum(keyPath, as: alias))
|
||||||
}
|
}
|
||||||
@@ -116,7 +116,7 @@ public final class CSSelectTerm: NSObject, CoreStoreObjectiveCType {
|
|||||||
- returns: a `CSSelectTerm` to a `CSSelect` clause for querying the minimum value for an attribute
|
- returns: a `CSSelectTerm` to a `CSSelect` clause for querying the minimum value for an attribute
|
||||||
*/
|
*/
|
||||||
@objc
|
@objc
|
||||||
public static func minimum(_ keyPath: KeyPath, as alias: KeyPath?) -> CSSelectTerm {
|
public static func minimum(_ keyPath: RawKeyPath, as alias: RawKeyPath?) -> CSSelectTerm {
|
||||||
|
|
||||||
return self.init(.minimum(keyPath, as: alias))
|
return self.init(.minimum(keyPath, as: alias))
|
||||||
}
|
}
|
||||||
@@ -133,7 +133,7 @@ public final class CSSelectTerm: NSObject, CoreStoreObjectiveCType {
|
|||||||
- returns: a `CSSelectTerm` to a `CSSelect` clause for querying the sum value for an attribute
|
- returns: a `CSSelectTerm` to a `CSSelect` clause for querying the sum value for an attribute
|
||||||
*/
|
*/
|
||||||
@objc
|
@objc
|
||||||
public static func sum(_ keyPath: KeyPath, as alias: KeyPath?) -> CSSelectTerm {
|
public static func sum(_ keyPath: RawKeyPath, as alias: RawKeyPath?) -> CSSelectTerm {
|
||||||
|
|
||||||
return self.init(.sum(keyPath, as: alias))
|
return self.init(.sum(keyPath, as: alias))
|
||||||
}
|
}
|
||||||
@@ -150,7 +150,7 @@ public final class CSSelectTerm: NSObject, CoreStoreObjectiveCType {
|
|||||||
- returns: a `SelectTerm` to a `Select` clause for querying the sum value for an attribute
|
- returns: a `SelectTerm` to a `Select` clause for querying the sum value for an attribute
|
||||||
*/
|
*/
|
||||||
@objc
|
@objc
|
||||||
public static func objectIDAs(_ alias: KeyPath? = nil) -> CSSelectTerm {
|
public static func objectIDAs(_ alias: RawKeyPath? = nil) -> CSSelectTerm {
|
||||||
|
|
||||||
return self.init(.objectID(as: alias))
|
return self.init(.objectID(as: alias))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -85,7 +85,7 @@ public final class CSWhere: NSObject, CSFetchClause, CSQueryClause, CSDeleteClau
|
|||||||
- parameter value: the arguments for the `==` operator
|
- parameter value: the arguments for the `==` operator
|
||||||
*/
|
*/
|
||||||
@objc
|
@objc
|
||||||
public convenience init(keyPath: KeyPath, isEqualTo value: CoreDataNativeType?) {
|
public convenience init(keyPath: RawKeyPath, isEqualTo value: CoreDataNativeType?) {
|
||||||
|
|
||||||
self.init(value == nil || value is NSNull
|
self.init(value == nil || value is NSNull
|
||||||
? Where("\(keyPath) == nil")
|
? Where("\(keyPath) == nil")
|
||||||
@@ -99,7 +99,7 @@ public final class CSWhere: NSObject, CSFetchClause, CSQueryClause, CSDeleteClau
|
|||||||
- parameter list: the array to check membership of
|
- parameter list: the array to check membership of
|
||||||
*/
|
*/
|
||||||
@objc
|
@objc
|
||||||
public convenience init(keyPath: KeyPath, isMemberOf list: [CoreDataNativeType]) {
|
public convenience init(keyPath: RawKeyPath, isMemberOf list: [CoreDataNativeType]) {
|
||||||
|
|
||||||
self.init(Where("\(keyPath) IN %@", list as NSArray))
|
self.init(Where("\(keyPath) IN %@", list as NSArray))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -43,7 +43,7 @@
|
|||||||
#define CORESTORE_RETURNS_RETAINED __attribute__((ns_returns_retained))
|
#define CORESTORE_RETURNS_RETAINED __attribute__((ns_returns_retained))
|
||||||
|
|
||||||
|
|
||||||
#pragma mark - KeyPath Utilities
|
#pragma mark - RawKeyPath Utilities
|
||||||
|
|
||||||
#define CSKeyPath(type, property) ({ \
|
#define CSKeyPath(type, property) ({ \
|
||||||
type *_je_keypath_dummy __attribute__((unused)); \
|
type *_je_keypath_dummy __attribute__((unused)); \
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ import CoreData
|
|||||||
@objc internal class CoreStoreManagedObject: NSManagedObject {
|
@objc internal class CoreStoreManagedObject: NSManagedObject {
|
||||||
|
|
||||||
@nonobjc
|
@nonobjc
|
||||||
internal class func cs_setKeyPathsForValuesAffectingKeys(_ keyPathsForValuesAffectingKeys: [KeyPath: Set<KeyPath>], for managedObjectClass: CoreStoreManagedObject.Type) {
|
internal class func cs_setKeyPathsForValuesAffectingKeys(_ keyPathsForValuesAffectingKeys: [RawKeyPath: Set<RawKeyPath>], for managedObjectClass: CoreStoreManagedObject.Type) {
|
||||||
|
|
||||||
Static.queue.sync(flags: .barrier) {
|
Static.queue.sync(flags: .barrier) {
|
||||||
|
|
||||||
@@ -44,5 +44,5 @@ import CoreData
|
|||||||
private enum Static {
|
private enum Static {
|
||||||
|
|
||||||
static let queue = DispatchQueue.concurrent("com.coreStore.coreStoreManagerObjectBarrierQueue")
|
static let queue = DispatchQueue.concurrent("com.coreStore.coreStoreManagerObjectBarrierQueue")
|
||||||
static var cache: [ObjectIdentifier: [KeyPath: Set<KeyPath>]] = [:]
|
static var cache: [ObjectIdentifier: [RawKeyPath: Set<RawKeyPath>]] = [:]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -270,7 +270,7 @@ public final class CoreStoreSchema: DynamicSchema {
|
|||||||
entityDescription.versionHashModifier = entity.versionHashModifier
|
entityDescription.versionHashModifier = entity.versionHashModifier
|
||||||
entityDescription.managedObjectClassName = "\(NSStringFromClass(CoreStoreManagedObject.self)).\(NSStringFromClass(entity.type)).\(entity.entityName)"
|
entityDescription.managedObjectClassName = "\(NSStringFromClass(CoreStoreManagedObject.self)).\(NSStringFromClass(entity.type)).\(entity.entityName)"
|
||||||
|
|
||||||
var keyPathsByAffectedKeyPaths: [KeyPath: Set<KeyPath>] = [:]
|
var keyPathsByAffectedKeyPaths: [RawKeyPath: Set<RawKeyPath>] = [:]
|
||||||
func createProperties(for type: CoreStoreObject.Type) -> [NSPropertyDescription] {
|
func createProperties(for type: CoreStoreObject.Type) -> [NSPropertyDescription] {
|
||||||
|
|
||||||
var propertyDescriptions: [NSPropertyDescription] = []
|
var propertyDescriptions: [NSPropertyDescription] = []
|
||||||
|
|||||||
@@ -210,7 +210,7 @@ public class CustomSchemaMappingProvider: Hashable, SchemaMappingProvider {
|
|||||||
/**
|
/**
|
||||||
Accesses the property value via its keyPath.
|
Accesses the property value via its keyPath.
|
||||||
*/
|
*/
|
||||||
public subscript(attribute: KeyPath) -> Any? {
|
public subscript(attribute: RawKeyPath) -> Any? {
|
||||||
|
|
||||||
return self.rawObject.cs_accessValueForKVCKey(attribute)
|
return self.rawObject.cs_accessValueForKVCKey(attribute)
|
||||||
}
|
}
|
||||||
@@ -267,7 +267,7 @@ public class CustomSchemaMappingProvider: Hashable, SchemaMappingProvider {
|
|||||||
/**
|
/**
|
||||||
Accesses or mutates the property value via its keyPath.
|
Accesses or mutates the property value via its keyPath.
|
||||||
*/
|
*/
|
||||||
public subscript(attribute: KeyPath) -> Any? {
|
public subscript(attribute: RawKeyPath) -> Any? {
|
||||||
|
|
||||||
get { return self.rawObject.cs_accessValueForKVCKey(attribute) }
|
get { return self.rawObject.cs_accessValueForKVCKey(attribute) }
|
||||||
set { self.rawObject.cs_setValue(newValue, forKVCKey: attribute) }
|
set { self.rawObject.cs_setValue(newValue, forKVCKey: attribute) }
|
||||||
@@ -304,7 +304,7 @@ public class CustomSchemaMappingProvider: Hashable, SchemaMappingProvider {
|
|||||||
|
|
||||||
// MARK: Internal
|
// MARK: Internal
|
||||||
|
|
||||||
internal init(_ rawObject: NSManagedObject, _ sourceAttributesByDestinationKey: [KeyPath: NSAttributeDescription]) {
|
internal init(_ rawObject: NSManagedObject, _ sourceAttributesByDestinationKey: [RawKeyPath: NSAttributeDescription]) {
|
||||||
|
|
||||||
self.rawObject = rawObject
|
self.rawObject = rawObject
|
||||||
self.sourceAttributesByDestinationKey = sourceAttributesByDestinationKey
|
self.sourceAttributesByDestinationKey = sourceAttributesByDestinationKey
|
||||||
@@ -314,7 +314,7 @@ public class CustomSchemaMappingProvider: Hashable, SchemaMappingProvider {
|
|||||||
// MARK: FilePrivate
|
// MARK: FilePrivate
|
||||||
|
|
||||||
fileprivate let rawObject: NSManagedObject
|
fileprivate let rawObject: NSManagedObject
|
||||||
fileprivate let sourceAttributesByDestinationKey: [KeyPath: NSAttributeDescription]
|
fileprivate let sourceAttributesByDestinationKey: [RawKeyPath: NSAttributeDescription]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -477,7 +477,7 @@ public class CustomSchemaMappingProvider: Hashable, SchemaMappingProvider {
|
|||||||
let transformedRenamingIdentifiers = Set(destinationAttributes.keys)
|
let transformedRenamingIdentifiers = Set(destinationAttributes.keys)
|
||||||
.intersection(sourceAttributes.keys)
|
.intersection(sourceAttributes.keys)
|
||||||
|
|
||||||
var sourceAttributesByDestinationKey: [KeyPath: NSAttributeDescription] = [:]
|
var sourceAttributesByDestinationKey: [RawKeyPath: NSAttributeDescription] = [:]
|
||||||
for renamingIdentifier in transformedRenamingIdentifiers {
|
for renamingIdentifier in transformedRenamingIdentifiers {
|
||||||
|
|
||||||
let sourceAttribute = sourceAttributes[renamingIdentifier]!.attribute
|
let sourceAttribute = sourceAttributes[renamingIdentifier]!.attribute
|
||||||
@@ -535,7 +535,7 @@ public class CustomSchemaMappingProvider: Hashable, SchemaMappingProvider {
|
|||||||
|
|
||||||
let userInfo = mapping.userInfo!
|
let userInfo = mapping.userInfo!
|
||||||
let transformer = userInfo[CustomEntityMigrationPolicy.UserInfoKey.transformer]! as! CustomMapping.Transformer
|
let transformer = userInfo[CustomEntityMigrationPolicy.UserInfoKey.transformer]! as! CustomMapping.Transformer
|
||||||
let sourceAttributesByDestinationKey = userInfo[CustomEntityMigrationPolicy.UserInfoKey.sourceAttributesByDestinationKey] as! [KeyPath: NSAttributeDescription]
|
let sourceAttributesByDestinationKey = userInfo[CustomEntityMigrationPolicy.UserInfoKey.sourceAttributesByDestinationKey] as! [RawKeyPath: NSAttributeDescription]
|
||||||
|
|
||||||
var destinationObject: UnsafeDestinationObject?
|
var destinationObject: UnsafeDestinationObject?
|
||||||
try transformer(
|
try transformer(
|
||||||
@@ -585,8 +585,8 @@ public class CustomSchemaMappingProvider: Hashable, SchemaMappingProvider {
|
|||||||
var insertMappings: Set<CustomMapping> = []
|
var insertMappings: Set<CustomMapping> = []
|
||||||
var copyMappings: Set<CustomMapping> = []
|
var copyMappings: Set<CustomMapping> = []
|
||||||
var transformMappings: Set<CustomMapping> = []
|
var transformMappings: Set<CustomMapping> = []
|
||||||
var allMappedSourceKeys: [KeyPath: KeyPath] = [:]
|
var allMappedSourceKeys: [RawKeyPath: RawKeyPath] = [:]
|
||||||
var allMappedDestinationKeys: [KeyPath: KeyPath] = [:]
|
var allMappedDestinationKeys: [RawKeyPath: RawKeyPath] = [:]
|
||||||
|
|
||||||
let sourceRenamingIdentifiers = sourceModel.cs_resolvedRenamingIdentities()
|
let sourceRenamingIdentifiers = sourceModel.cs_resolvedRenamingIdentities()
|
||||||
let sourceEntityNames = sourceModel.entitiesByName
|
let sourceEntityNames = sourceModel.entitiesByName
|
||||||
|
|||||||
@@ -61,10 +61,6 @@ public extension DataStack {
|
|||||||
)
|
)
|
||||||
transaction.transactionQueue.cs_async {
|
transaction.transactionQueue.cs_async {
|
||||||
|
|
||||||
defer {
|
|
||||||
|
|
||||||
withExtendedLifetime((self, transaction), {})
|
|
||||||
}
|
|
||||||
let userInfo: T
|
let userInfo: T
|
||||||
do {
|
do {
|
||||||
|
|
||||||
@@ -82,6 +78,10 @@ public extension DataStack {
|
|||||||
}
|
}
|
||||||
transaction.autoCommit { (_, error) in
|
transaction.autoCommit { (_, error) in
|
||||||
|
|
||||||
|
defer {
|
||||||
|
|
||||||
|
withExtendedLifetime((self, transaction), {})
|
||||||
|
}
|
||||||
if let error = error {
|
if let error = error {
|
||||||
|
|
||||||
failure(error)
|
failure(error)
|
||||||
|
|||||||
@@ -96,49 +96,49 @@ public extension DynamicSchema {
|
|||||||
|
|
||||||
case .integer16AttributeType:
|
case .integer16AttributeType:
|
||||||
valueType = Int16.self
|
valueType = Int16.self
|
||||||
if let defaultValue = (attribute.defaultValue as! Int16.ImportableNativeType?).flatMap(Int16.cs_fromImportableNativeType),
|
if let defaultValue = (attribute.defaultValue as! Int16.QueryableNativeType?).flatMap(Int16.cs_fromQueryableNativeType),
|
||||||
defaultValue != Int16.cs_emptyValue() {
|
defaultValue != Int16.cs_emptyValue() {
|
||||||
|
|
||||||
defaultString = ", default: \(defaultValue)"
|
defaultString = ", default: \(defaultValue)"
|
||||||
}
|
}
|
||||||
case .integer32AttributeType:
|
case .integer32AttributeType:
|
||||||
valueType = Int32.self
|
valueType = Int32.self
|
||||||
if let defaultValue = (attribute.defaultValue as! Int32.ImportableNativeType?).flatMap(Int32.cs_fromImportableNativeType),
|
if let defaultValue = (attribute.defaultValue as! Int32.QueryableNativeType?).flatMap(Int32.cs_fromQueryableNativeType),
|
||||||
defaultValue != Int32.cs_emptyValue() {
|
defaultValue != Int32.cs_emptyValue() {
|
||||||
|
|
||||||
defaultString = ", default: \(defaultValue)"
|
defaultString = ", default: \(defaultValue)"
|
||||||
}
|
}
|
||||||
case .integer64AttributeType:
|
case .integer64AttributeType:
|
||||||
valueType = Int64.self
|
valueType = Int64.self
|
||||||
if let defaultValue = (attribute.defaultValue as! Int64.ImportableNativeType?).flatMap(Int64.cs_fromImportableNativeType),
|
if let defaultValue = (attribute.defaultValue as! Int64.QueryableNativeType?).flatMap(Int64.cs_fromQueryableNativeType),
|
||||||
defaultValue != Int64.cs_emptyValue() {
|
defaultValue != Int64.cs_emptyValue() {
|
||||||
|
|
||||||
defaultString = ", default: \(defaultValue)"
|
defaultString = ", default: \(defaultValue)"
|
||||||
}
|
}
|
||||||
case .decimalAttributeType:
|
case .decimalAttributeType:
|
||||||
valueType = NSDecimalNumber.self
|
valueType = NSDecimalNumber.self
|
||||||
if let defaultValue = (attribute.defaultValue as! NSDecimalNumber.ImportableNativeType?).flatMap(NSDecimalNumber.cs_fromImportableNativeType),
|
if let defaultValue = (attribute.defaultValue as! NSDecimalNumber.QueryableNativeType?).flatMap(NSDecimalNumber.cs_fromQueryableNativeType),
|
||||||
defaultValue != NSDecimalNumber.cs_emptyValue() {
|
defaultValue != NSDecimalNumber.cs_emptyValue() {
|
||||||
|
|
||||||
defaultString = ", default: NSDecimalNumber(string: \"\(defaultValue.description(withLocale: nil))\")"
|
defaultString = ", default: NSDecimalNumber(string: \"\(defaultValue.description(withLocale: nil))\")"
|
||||||
}
|
}
|
||||||
case .doubleAttributeType:
|
case .doubleAttributeType:
|
||||||
valueType = Double.self
|
valueType = Double.self
|
||||||
if let defaultValue = (attribute.defaultValue as! Double.ImportableNativeType?).flatMap(Double.cs_fromImportableNativeType),
|
if let defaultValue = (attribute.defaultValue as! Double.QueryableNativeType?).flatMap(Double.cs_fromQueryableNativeType),
|
||||||
defaultValue != Double.cs_emptyValue() {
|
defaultValue != Double.cs_emptyValue() {
|
||||||
|
|
||||||
defaultString = ", default: \(defaultValue)"
|
defaultString = ", default: \(defaultValue)"
|
||||||
}
|
}
|
||||||
case .floatAttributeType:
|
case .floatAttributeType:
|
||||||
valueType = Float.self
|
valueType = Float.self
|
||||||
if let defaultValue = (attribute.defaultValue as! Float.ImportableNativeType?).flatMap(Float.cs_fromImportableNativeType),
|
if let defaultValue = (attribute.defaultValue as! Float.QueryableNativeType?).flatMap(Float.cs_fromQueryableNativeType),
|
||||||
defaultValue != Float.cs_emptyValue() {
|
defaultValue != Float.cs_emptyValue() {
|
||||||
|
|
||||||
defaultString = ", default: \(defaultValue)"
|
defaultString = ", default: \(defaultValue)"
|
||||||
}
|
}
|
||||||
case .stringAttributeType:
|
case .stringAttributeType:
|
||||||
valueType = String.self
|
valueType = String.self
|
||||||
if let defaultValue = (attribute.defaultValue as! String.ImportableNativeType?).flatMap(String.cs_fromImportableNativeType),
|
if let defaultValue = (attribute.defaultValue as! String.QueryableNativeType?).flatMap(String.cs_fromQueryableNativeType),
|
||||||
defaultValue != String.cs_emptyValue() {
|
defaultValue != String.cs_emptyValue() {
|
||||||
|
|
||||||
// TODO: escape strings
|
// TODO: escape strings
|
||||||
@@ -146,20 +146,20 @@ public extension DynamicSchema {
|
|||||||
}
|
}
|
||||||
case .booleanAttributeType:
|
case .booleanAttributeType:
|
||||||
valueType = Bool.self
|
valueType = Bool.self
|
||||||
if let defaultValue = (attribute.defaultValue as! Bool.ImportableNativeType?).flatMap(Bool.cs_fromImportableNativeType),
|
if let defaultValue = (attribute.defaultValue as! Bool.QueryableNativeType?).flatMap(Bool.cs_fromQueryableNativeType),
|
||||||
defaultValue != Bool.cs_emptyValue() {
|
defaultValue != Bool.cs_emptyValue() {
|
||||||
|
|
||||||
defaultString = ", default: \(defaultValue ? "true" : "false")"
|
defaultString = ", default: \(defaultValue ? "true" : "false")"
|
||||||
}
|
}
|
||||||
case .dateAttributeType:
|
case .dateAttributeType:
|
||||||
valueType = Date.self
|
valueType = Date.self
|
||||||
if let defaultValue = (attribute.defaultValue as! Date.ImportableNativeType?).flatMap(Date.cs_fromImportableNativeType) {
|
if let defaultValue = (attribute.defaultValue as! Date.QueryableNativeType?).flatMap(Date.cs_fromQueryableNativeType) {
|
||||||
|
|
||||||
defaultString = ", default: Date(timeIntervalSinceReferenceDate: \(defaultValue.timeIntervalSinceReferenceDate))"
|
defaultString = ", default: Date(timeIntervalSinceReferenceDate: \(defaultValue.timeIntervalSinceReferenceDate))"
|
||||||
}
|
}
|
||||||
case .binaryDataAttributeType:
|
case .binaryDataAttributeType:
|
||||||
valueType = Data.self
|
valueType = Data.self
|
||||||
if let defaultValue = (attribute.defaultValue as! Data.ImportableNativeType?).flatMap(Data.cs_fromImportableNativeType),
|
if let defaultValue = (attribute.defaultValue as! Data.QueryableNativeType?).flatMap(Data.cs_fromQueryableNativeType),
|
||||||
defaultValue != Data.cs_emptyValue() {
|
defaultValue != Data.cs_emptyValue() {
|
||||||
|
|
||||||
let count = defaultValue.count
|
let count = defaultValue.count
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ public struct GroupBy: QueryClause, Hashable {
|
|||||||
/**
|
/**
|
||||||
The list of key path strings to group results with
|
The list of key path strings to group results with
|
||||||
*/
|
*/
|
||||||
public let keyPaths: [KeyPath]
|
public let keyPaths: [RawKeyPath]
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Initializes a `GroupBy` clause with an empty list of key path strings
|
Initializes a `GroupBy` clause with an empty list of key path strings
|
||||||
@@ -53,7 +53,7 @@ public struct GroupBy: QueryClause, Hashable {
|
|||||||
- parameter keyPath: a key path string to group results with
|
- parameter keyPath: a key path string to group results with
|
||||||
- parameter keyPaths: a series of key path strings to group results with
|
- parameter keyPaths: a series of key path strings to group results with
|
||||||
*/
|
*/
|
||||||
public init(_ keyPath: KeyPath, _ keyPaths: KeyPath...) {
|
public init(_ keyPath: RawKeyPath, _ keyPaths: RawKeyPath...) {
|
||||||
|
|
||||||
self.init([keyPath] + keyPaths)
|
self.init([keyPath] + keyPaths)
|
||||||
}
|
}
|
||||||
@@ -63,7 +63,7 @@ public struct GroupBy: QueryClause, Hashable {
|
|||||||
|
|
||||||
- parameter keyPaths: a list of key path strings to group results with
|
- parameter keyPaths: a list of key path strings to group results with
|
||||||
*/
|
*/
|
||||||
public init(_ keyPaths: [KeyPath]) {
|
public init(_ keyPaths: [RawKeyPath]) {
|
||||||
|
|
||||||
self.keyPaths = keyPaths
|
self.keyPaths = keyPaths
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -57,25 +57,7 @@ import CoreGraphics
|
|||||||
|
|
||||||
In addition, `RawRepresentable` types whose `RawValue` already implements `ImportableAttributeType` only need to declare conformance to `ImportableAttributeType`.
|
In addition, `RawRepresentable` types whose `RawValue` already implements `ImportableAttributeType` only need to declare conformance to `ImportableAttributeType`.
|
||||||
*/
|
*/
|
||||||
public protocol ImportableAttributeType: QueryableAttributeType {
|
public protocol ImportableAttributeType: QueryableAttributeType {}
|
||||||
|
|
||||||
/**
|
|
||||||
The `CoreDataNativeType` for this type.
|
|
||||||
*/
|
|
||||||
associatedtype ImportableNativeType: QueryableNativeType
|
|
||||||
|
|
||||||
/**
|
|
||||||
Creates an instance of this type from its `ImportableNativeType` value.
|
|
||||||
*/
|
|
||||||
@inline(__always)
|
|
||||||
static func cs_fromImportableNativeType(_ value: ImportableNativeType) -> Self?
|
|
||||||
|
|
||||||
/**
|
|
||||||
Creates `ImportableNativeType` value from this instance.
|
|
||||||
*/
|
|
||||||
@inline(__always)
|
|
||||||
func cs_toImportableNativeType() -> ImportableNativeType
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// MARK: - EmptyableAttributeType
|
// MARK: - EmptyableAttributeType
|
||||||
@@ -99,22 +81,6 @@ public protocol EmptyableAttributeType: ImportableAttributeType {
|
|||||||
|
|
||||||
extension Bool: ImportableAttributeType, EmptyableAttributeType {
|
extension Bool: ImportableAttributeType, EmptyableAttributeType {
|
||||||
|
|
||||||
// MARK: ImportableAttributeType
|
|
||||||
|
|
||||||
public typealias ImportableNativeType = NSNumber
|
|
||||||
|
|
||||||
@inline(__always)
|
|
||||||
public static func cs_fromImportableNativeType(_ value: ImportableNativeType) -> Bool? {
|
|
||||||
|
|
||||||
return self.cs_fromQueryableNativeType(value)
|
|
||||||
}
|
|
||||||
|
|
||||||
@inline(__always)
|
|
||||||
public func cs_toImportableNativeType() -> ImportableNativeType {
|
|
||||||
|
|
||||||
return self.cs_toQueryableNativeType()
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// MARK: EmptyableAttributeType
|
// MARK: EmptyableAttributeType
|
||||||
|
|
||||||
@@ -130,23 +96,6 @@ extension Bool: ImportableAttributeType, EmptyableAttributeType {
|
|||||||
|
|
||||||
extension CGFloat: ImportableAttributeType, EmptyableAttributeType {
|
extension CGFloat: ImportableAttributeType, EmptyableAttributeType {
|
||||||
|
|
||||||
// MARK: ImportableAttributeType
|
|
||||||
|
|
||||||
public typealias ImportableNativeType = NSNumber
|
|
||||||
|
|
||||||
@inline(__always)
|
|
||||||
public static func cs_fromImportableNativeType(_ value: ImportableNativeType) -> CGFloat? {
|
|
||||||
|
|
||||||
return self.cs_fromQueryableNativeType(value)
|
|
||||||
}
|
|
||||||
|
|
||||||
@inline(__always)
|
|
||||||
public func cs_toImportableNativeType() -> ImportableNativeType {
|
|
||||||
|
|
||||||
return self.cs_toQueryableNativeType()
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// MARK: EmptyableAttributeType
|
// MARK: EmptyableAttributeType
|
||||||
|
|
||||||
@inline(__always)
|
@inline(__always)
|
||||||
@@ -161,23 +110,6 @@ extension CGFloat: ImportableAttributeType, EmptyableAttributeType {
|
|||||||
|
|
||||||
extension Data: ImportableAttributeType, EmptyableAttributeType {
|
extension Data: ImportableAttributeType, EmptyableAttributeType {
|
||||||
|
|
||||||
// MARK: ImportableAttributeType
|
|
||||||
|
|
||||||
public typealias ImportableNativeType = NSData
|
|
||||||
|
|
||||||
@inline(__always)
|
|
||||||
public static func cs_fromImportableNativeType(_ value: ImportableNativeType) -> Data? {
|
|
||||||
|
|
||||||
return self.cs_fromQueryableNativeType(value)
|
|
||||||
}
|
|
||||||
|
|
||||||
@inline(__always)
|
|
||||||
public func cs_toImportableNativeType() -> ImportableNativeType {
|
|
||||||
|
|
||||||
return self.cs_toQueryableNativeType()
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// MARK: EmptyableAttributeType
|
// MARK: EmptyableAttributeType
|
||||||
|
|
||||||
@inline(__always)
|
@inline(__always)
|
||||||
@@ -190,47 +122,13 @@ extension Data: ImportableAttributeType, EmptyableAttributeType {
|
|||||||
|
|
||||||
// MARK: - Date
|
// MARK: - Date
|
||||||
|
|
||||||
extension Date: ImportableAttributeType {
|
extension Date: ImportableAttributeType {}
|
||||||
|
|
||||||
// MARK: ImportableAttributeType
|
|
||||||
|
|
||||||
public typealias ImportableNativeType = NSDate
|
|
||||||
|
|
||||||
@inline(__always)
|
|
||||||
public static func cs_fromImportableNativeType(_ value: ImportableNativeType) -> Date? {
|
|
||||||
|
|
||||||
return self.cs_fromQueryableNativeType(value)
|
|
||||||
}
|
|
||||||
|
|
||||||
@inline(__always)
|
|
||||||
public func cs_toImportableNativeType() -> ImportableNativeType {
|
|
||||||
|
|
||||||
return self.cs_toQueryableNativeType()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// MARK: - Double
|
// MARK: - Double
|
||||||
|
|
||||||
extension Double: ImportableAttributeType, EmptyableAttributeType {
|
extension Double: ImportableAttributeType, EmptyableAttributeType {
|
||||||
|
|
||||||
// MARK: ImportableAttributeType
|
|
||||||
|
|
||||||
public typealias ImportableNativeType = NSNumber
|
|
||||||
|
|
||||||
@inline(__always)
|
|
||||||
public static func cs_fromImportableNativeType(_ value: ImportableNativeType) -> Double? {
|
|
||||||
|
|
||||||
return self.cs_fromQueryableNativeType(value)
|
|
||||||
}
|
|
||||||
|
|
||||||
@inline(__always)
|
|
||||||
public func cs_toImportableNativeType() -> ImportableNativeType {
|
|
||||||
|
|
||||||
return self.cs_toQueryableNativeType()
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// MARK: EmptyableAttributeType
|
// MARK: EmptyableAttributeType
|
||||||
|
|
||||||
@inline(__always)
|
@inline(__always)
|
||||||
@@ -245,23 +143,6 @@ extension Double: ImportableAttributeType, EmptyableAttributeType {
|
|||||||
|
|
||||||
extension Float: ImportableAttributeType, EmptyableAttributeType {
|
extension Float: ImportableAttributeType, EmptyableAttributeType {
|
||||||
|
|
||||||
// MARK: ImportableAttributeType
|
|
||||||
|
|
||||||
public typealias ImportableNativeType = NSNumber
|
|
||||||
|
|
||||||
@inline(__always)
|
|
||||||
public static func cs_fromImportableNativeType(_ value: ImportableNativeType) -> Float? {
|
|
||||||
|
|
||||||
return self.cs_fromQueryableNativeType(value)
|
|
||||||
}
|
|
||||||
|
|
||||||
@inline(__always)
|
|
||||||
public func cs_toImportableNativeType() -> ImportableNativeType {
|
|
||||||
|
|
||||||
return self.cs_toQueryableNativeType()
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// MARK: EmptyableAttributeType
|
// MARK: EmptyableAttributeType
|
||||||
|
|
||||||
@inline(__always)
|
@inline(__always)
|
||||||
@@ -276,23 +157,6 @@ extension Float: ImportableAttributeType, EmptyableAttributeType {
|
|||||||
|
|
||||||
extension Int: ImportableAttributeType, EmptyableAttributeType {
|
extension Int: ImportableAttributeType, EmptyableAttributeType {
|
||||||
|
|
||||||
// MARK: ImportableAttributeType
|
|
||||||
|
|
||||||
public typealias ImportableNativeType = NSNumber
|
|
||||||
|
|
||||||
@inline(__always)
|
|
||||||
public static func cs_fromImportableNativeType(_ value: ImportableNativeType) -> Int? {
|
|
||||||
|
|
||||||
return self.cs_fromQueryableNativeType(value)
|
|
||||||
}
|
|
||||||
|
|
||||||
@inline(__always)
|
|
||||||
public func cs_toImportableNativeType() -> ImportableNativeType {
|
|
||||||
|
|
||||||
return self.cs_toQueryableNativeType()
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// MARK: EmptyableAttributeType
|
// MARK: EmptyableAttributeType
|
||||||
|
|
||||||
@inline(__always)
|
@inline(__always)
|
||||||
@@ -307,23 +171,6 @@ extension Int: ImportableAttributeType, EmptyableAttributeType {
|
|||||||
|
|
||||||
extension Int8: ImportableAttributeType, EmptyableAttributeType {
|
extension Int8: ImportableAttributeType, EmptyableAttributeType {
|
||||||
|
|
||||||
// MARK: ImportableAttributeType
|
|
||||||
|
|
||||||
public typealias ImportableNativeType = NSNumber
|
|
||||||
|
|
||||||
@inline(__always)
|
|
||||||
public static func cs_fromImportableNativeType(_ value: ImportableNativeType) -> Int8? {
|
|
||||||
|
|
||||||
return self.cs_fromQueryableNativeType(value)
|
|
||||||
}
|
|
||||||
|
|
||||||
@inline(__always)
|
|
||||||
public func cs_toImportableNativeType() -> ImportableNativeType {
|
|
||||||
|
|
||||||
return self.cs_toQueryableNativeType()
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// MARK: EmptyableAttributeType
|
// MARK: EmptyableAttributeType
|
||||||
|
|
||||||
@inline(__always)
|
@inline(__always)
|
||||||
@@ -338,23 +185,6 @@ extension Int8: ImportableAttributeType, EmptyableAttributeType {
|
|||||||
|
|
||||||
extension Int16: ImportableAttributeType, EmptyableAttributeType {
|
extension Int16: ImportableAttributeType, EmptyableAttributeType {
|
||||||
|
|
||||||
// MARK: ImportableAttributeType
|
|
||||||
|
|
||||||
public typealias ImportableNativeType = NSNumber
|
|
||||||
|
|
||||||
@inline(__always)
|
|
||||||
public static func cs_fromImportableNativeType(_ value: ImportableNativeType) -> Int16? {
|
|
||||||
|
|
||||||
return self.cs_fromQueryableNativeType(value)
|
|
||||||
}
|
|
||||||
|
|
||||||
@inline(__always)
|
|
||||||
public func cs_toImportableNativeType() -> ImportableNativeType {
|
|
||||||
|
|
||||||
return self.cs_toQueryableNativeType()
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// MARK: EmptyableAttributeType
|
// MARK: EmptyableAttributeType
|
||||||
|
|
||||||
@inline(__always)
|
@inline(__always)
|
||||||
@@ -369,23 +199,6 @@ extension Int16: ImportableAttributeType, EmptyableAttributeType {
|
|||||||
|
|
||||||
extension Int32: ImportableAttributeType, EmptyableAttributeType {
|
extension Int32: ImportableAttributeType, EmptyableAttributeType {
|
||||||
|
|
||||||
// MARK: ImportableAttributeType
|
|
||||||
|
|
||||||
public typealias ImportableNativeType = NSNumber
|
|
||||||
|
|
||||||
@inline(__always)
|
|
||||||
public static func cs_fromImportableNativeType(_ value: ImportableNativeType) -> Int32? {
|
|
||||||
|
|
||||||
return self.cs_fromQueryableNativeType(value)
|
|
||||||
}
|
|
||||||
|
|
||||||
@inline(__always)
|
|
||||||
public func cs_toImportableNativeType() -> ImportableNativeType {
|
|
||||||
|
|
||||||
return self.cs_toQueryableNativeType()
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// MARK: EmptyableAttributeType
|
// MARK: EmptyableAttributeType
|
||||||
|
|
||||||
@inline(__always)
|
@inline(__always)
|
||||||
@@ -400,23 +213,6 @@ extension Int32: ImportableAttributeType, EmptyableAttributeType {
|
|||||||
|
|
||||||
extension Int64: ImportableAttributeType, EmptyableAttributeType {
|
extension Int64: ImportableAttributeType, EmptyableAttributeType {
|
||||||
|
|
||||||
// MARK: ImportableAttributeType
|
|
||||||
|
|
||||||
public typealias ImportableNativeType = NSNumber
|
|
||||||
|
|
||||||
@inline(__always)
|
|
||||||
public static func cs_fromImportableNativeType(_ value: ImportableNativeType) -> Int64? {
|
|
||||||
|
|
||||||
return self.cs_fromQueryableNativeType(value)
|
|
||||||
}
|
|
||||||
|
|
||||||
@inline(__always)
|
|
||||||
public func cs_toImportableNativeType() -> ImportableNativeType {
|
|
||||||
|
|
||||||
return self.cs_toQueryableNativeType()
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// MARK: EmptyableAttributeType
|
// MARK: EmptyableAttributeType
|
||||||
|
|
||||||
@inline(__always)
|
@inline(__always)
|
||||||
@@ -431,23 +227,6 @@ extension Int64: ImportableAttributeType, EmptyableAttributeType {
|
|||||||
|
|
||||||
extension NSData: ImportableAttributeType, EmptyableAttributeType {
|
extension NSData: ImportableAttributeType, EmptyableAttributeType {
|
||||||
|
|
||||||
// MARK: ImportableAttributeType
|
|
||||||
|
|
||||||
public typealias ImportableNativeType = NSData
|
|
||||||
|
|
||||||
@nonobjc @inline(__always)
|
|
||||||
public class func cs_fromImportableNativeType(_ value: ImportableNativeType) -> Self? {
|
|
||||||
|
|
||||||
return self.cs_fromQueryableNativeType(value)
|
|
||||||
}
|
|
||||||
|
|
||||||
@nonobjc @inline(__always)
|
|
||||||
public func cs_toImportableNativeType() -> ImportableNativeType {
|
|
||||||
|
|
||||||
return self.cs_toQueryableNativeType()
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// MARK: EmptyableAttributeType
|
// MARK: EmptyableAttributeType
|
||||||
|
|
||||||
@nonobjc @inline(__always)
|
@nonobjc @inline(__always)
|
||||||
@@ -460,47 +239,13 @@ extension NSData: ImportableAttributeType, EmptyableAttributeType {
|
|||||||
|
|
||||||
// MARK: - NSDate
|
// MARK: - NSDate
|
||||||
|
|
||||||
extension NSDate: ImportableAttributeType {
|
extension NSDate: ImportableAttributeType {}
|
||||||
|
|
||||||
// MARK: ImportableAttributeType
|
|
||||||
|
|
||||||
public typealias ImportableNativeType = NSDate
|
|
||||||
|
|
||||||
@nonobjc @inline(__always)
|
|
||||||
public class func cs_fromImportableNativeType(_ value: ImportableNativeType) -> Self? {
|
|
||||||
|
|
||||||
return self.cs_fromQueryableNativeType(value)
|
|
||||||
}
|
|
||||||
|
|
||||||
@nonobjc @inline(__always)
|
|
||||||
public func cs_toImportableNativeType() -> ImportableNativeType {
|
|
||||||
|
|
||||||
return self.cs_toQueryableNativeType()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// MARK: - NSNumber
|
// MARK: - NSNumber
|
||||||
|
|
||||||
extension NSNumber: ImportableAttributeType, EmptyableAttributeType {
|
extension NSNumber: ImportableAttributeType, EmptyableAttributeType {
|
||||||
|
|
||||||
// MARK: ImportableAttributeType
|
|
||||||
|
|
||||||
public typealias ImportableNativeType = NSNumber
|
|
||||||
|
|
||||||
@nonobjc @inline(__always)
|
|
||||||
public class func cs_fromImportableNativeType(_ value: ImportableNativeType) -> Self? {
|
|
||||||
|
|
||||||
return self.cs_fromQueryableNativeType(value)
|
|
||||||
}
|
|
||||||
|
|
||||||
@nonobjc @inline(__always)
|
|
||||||
public func cs_toImportableNativeType() -> ImportableNativeType {
|
|
||||||
|
|
||||||
return self.cs_toQueryableNativeType()
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// MARK: EmptyableAttributeType
|
// MARK: EmptyableAttributeType
|
||||||
|
|
||||||
@nonobjc @inline(__always)
|
@nonobjc @inline(__always)
|
||||||
@@ -515,23 +260,6 @@ extension NSNumber: ImportableAttributeType, EmptyableAttributeType {
|
|||||||
|
|
||||||
extension NSString: ImportableAttributeType, EmptyableAttributeType {
|
extension NSString: ImportableAttributeType, EmptyableAttributeType {
|
||||||
|
|
||||||
// MARK: ImportableAttributeType
|
|
||||||
|
|
||||||
public typealias ImportableNativeType = NSString
|
|
||||||
|
|
||||||
@nonobjc @inline(__always)
|
|
||||||
public class func cs_fromImportableNativeType(_ value: ImportableNativeType) -> Self? {
|
|
||||||
|
|
||||||
return self.cs_fromQueryableNativeType(value)
|
|
||||||
}
|
|
||||||
|
|
||||||
@nonobjc @inline(__always)
|
|
||||||
public func cs_toImportableNativeType() -> ImportableNativeType {
|
|
||||||
|
|
||||||
return self.cs_toQueryableNativeType()
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// MARK: EmptyableAttributeType
|
// MARK: EmptyableAttributeType
|
||||||
|
|
||||||
@nonobjc @inline(__always)
|
@nonobjc @inline(__always)
|
||||||
@@ -544,69 +272,18 @@ extension NSString: ImportableAttributeType, EmptyableAttributeType {
|
|||||||
|
|
||||||
// MARK: - NSURL
|
// MARK: - NSURL
|
||||||
|
|
||||||
extension NSURL: ImportableAttributeType {
|
extension NSURL: ImportableAttributeType {}
|
||||||
|
|
||||||
// MARK: ImportableAttributeType
|
|
||||||
|
|
||||||
public typealias ImportableNativeType = NSString
|
|
||||||
|
|
||||||
@nonobjc @inline(__always)
|
|
||||||
public class func cs_fromImportableNativeType(_ value: ImportableNativeType) -> Self? {
|
|
||||||
|
|
||||||
return self.cs_fromQueryableNativeType(value)
|
|
||||||
}
|
|
||||||
|
|
||||||
@nonobjc @inline(__always)
|
|
||||||
public func cs_toImportableNativeType() -> ImportableNativeType {
|
|
||||||
|
|
||||||
return self.cs_toQueryableNativeType()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// MARK: - NSUUID
|
// MARK: - NSUUID
|
||||||
|
|
||||||
extension NSUUID: ImportableAttributeType {
|
extension NSUUID: ImportableAttributeType {}
|
||||||
|
|
||||||
// MARK: ImportableAttributeType
|
|
||||||
|
|
||||||
public typealias ImportableNativeType = NSString
|
|
||||||
|
|
||||||
@nonobjc @inline(__always)
|
|
||||||
public class func cs_fromImportableNativeType(_ value: ImportableNativeType) -> Self? {
|
|
||||||
|
|
||||||
return self.cs_fromQueryableNativeType(value)
|
|
||||||
}
|
|
||||||
|
|
||||||
@nonobjc @inline(__always)
|
|
||||||
public func cs_toImportableNativeType() -> ImportableNativeType {
|
|
||||||
|
|
||||||
return self.cs_toQueryableNativeType()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// MARK: - String
|
// MARK: - String
|
||||||
|
|
||||||
extension String: ImportableAttributeType, EmptyableAttributeType {
|
extension String: ImportableAttributeType, EmptyableAttributeType {
|
||||||
|
|
||||||
// MARK: ImportableAttributeType
|
|
||||||
|
|
||||||
public typealias ImportableNativeType = NSString
|
|
||||||
|
|
||||||
@inline(__always)
|
|
||||||
public static func cs_fromImportableNativeType(_ value: ImportableNativeType) -> String? {
|
|
||||||
|
|
||||||
return self.cs_fromQueryableNativeType(value)
|
|
||||||
}
|
|
||||||
|
|
||||||
@inline(__always)
|
|
||||||
public func cs_toImportableNativeType() -> ImportableNativeType {
|
|
||||||
|
|
||||||
return self.cs_toQueryableNativeType()
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// MARK: EmptyableAttributeType
|
// MARK: EmptyableAttributeType
|
||||||
|
|
||||||
@inline(__always)
|
@inline(__always)
|
||||||
@@ -619,63 +296,27 @@ extension String: ImportableAttributeType, EmptyableAttributeType {
|
|||||||
|
|
||||||
// MARK: - URL
|
// MARK: - URL
|
||||||
|
|
||||||
extension URL: ImportableAttributeType {
|
extension URL: ImportableAttributeType {}
|
||||||
|
|
||||||
// MARK: ImportableAttributeType
|
|
||||||
|
|
||||||
public typealias ImportableNativeType = NSString
|
|
||||||
|
|
||||||
@inline(__always)
|
|
||||||
public static func cs_fromImportableNativeType(_ value: ImportableNativeType) -> URL? {
|
|
||||||
|
|
||||||
return self.cs_fromQueryableNativeType(value)
|
|
||||||
}
|
|
||||||
|
|
||||||
@inline(__always)
|
|
||||||
public func cs_toImportableNativeType() -> ImportableNativeType {
|
|
||||||
|
|
||||||
return self.cs_toQueryableNativeType()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// MARK: - UUID
|
// MARK: - UUID
|
||||||
|
|
||||||
extension UUID: ImportableAttributeType {
|
extension UUID: ImportableAttributeType {}
|
||||||
|
|
||||||
// MARK: ImportableAttributeType
|
|
||||||
|
|
||||||
public typealias ImportableNativeType = NSString
|
|
||||||
|
|
||||||
@inline(__always)
|
|
||||||
public static func cs_fromImportableNativeType(_ value: ImportableNativeType) -> UUID? {
|
|
||||||
|
|
||||||
return self.cs_fromQueryableNativeType(value)
|
|
||||||
}
|
|
||||||
|
|
||||||
@inline(__always)
|
|
||||||
public func cs_toImportableNativeType() -> ImportableNativeType {
|
|
||||||
|
|
||||||
return self.cs_toQueryableNativeType()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// MARK: - RawRepresentable
|
// MARK: - RawRepresentable
|
||||||
|
|
||||||
extension RawRepresentable where RawValue: ImportableAttributeType {
|
extension RawRepresentable where RawValue: ImportableAttributeType {
|
||||||
|
|
||||||
public typealias ImportableNativeType = RawValue.ImportableNativeType
|
|
||||||
|
|
||||||
@inline(__always)
|
@inline(__always)
|
||||||
public static func cs_fromImportableNativeType(_ value: ImportableNativeType) -> Self? {
|
public static func cs_fromQueryableNativeType(_ value: QueryableNativeType) -> Self? {
|
||||||
|
|
||||||
return RawValue.cs_fromImportableNativeType(value).flatMap({ self.init(rawValue: $0) })
|
return RawValue.cs_fromQueryableNativeType(value).flatMap({ self.init(rawValue: $0) })
|
||||||
}
|
}
|
||||||
|
|
||||||
@inline(__always)
|
@inline(__always)
|
||||||
public func cs_toImportableNativeType() -> ImportableNativeType {
|
public func cs_toQueryableNativeType() -> QueryableNativeType {
|
||||||
|
|
||||||
return self.rawValue.cs_toImportableNativeType()
|
return self.rawValue.cs_toQueryableNativeType()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -118,7 +118,7 @@ public protocol ImportableUniqueObject: ImportableObject {
|
|||||||
|
|
||||||
// MARK: - ImportableUniqueObject (Default Implementations)
|
// MARK: - ImportableUniqueObject (Default Implementations)
|
||||||
|
|
||||||
public extension ImportableUniqueObject {
|
public extension ImportableUniqueObject where UniqueIDType.QueryableNativeType: CoreDataNativeType {
|
||||||
|
|
||||||
var uniqueIDValue: UniqueIDType {
|
var uniqueIDValue: UniqueIDType {
|
||||||
|
|
||||||
@@ -126,7 +126,7 @@ public extension ImportableUniqueObject {
|
|||||||
|
|
||||||
return self.cs_toRaw().getValue(
|
return self.cs_toRaw().getValue(
|
||||||
forKvcKey: type(of: self).uniqueIDKeyPath,
|
forKvcKey: type(of: self).uniqueIDKeyPath,
|
||||||
didGetValue: { UniqueIDType.cs_fromImportableNativeType($0 as! UniqueIDType.ImportableNativeType)! }
|
didGetValue: { UniqueIDType.cs_fromQueryableNativeType($0 as! UniqueIDType.QueryableNativeType)! }
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
set {
|
set {
|
||||||
@@ -135,10 +135,13 @@ public extension ImportableUniqueObject {
|
|||||||
.setValue(
|
.setValue(
|
||||||
newValue,
|
newValue,
|
||||||
forKvcKey: type(of: self).uniqueIDKeyPath,
|
forKvcKey: type(of: self).uniqueIDKeyPath,
|
||||||
willSetValue: { ($0.cs_toImportableNativeType() as! CoreDataNativeType) }
|
willSetValue: { ($0.cs_toQueryableNativeType() as CoreDataNativeType) }
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public extension ImportableUniqueObject {
|
||||||
|
|
||||||
static func shouldInsert(from source: ImportSource, in transaction: BaseDataTransaction) -> Bool {
|
static func shouldInsert(from source: ImportSource, in transaction: BaseDataTransaction) -> Bool {
|
||||||
|
|
||||||
|
|||||||
@@ -997,7 +997,7 @@ public final class ListMonitor<D: DynamicObject>: Hashable {
|
|||||||
|
|
||||||
fileprivate var fetchedResultsController: CoreStoreFetchedResultsController
|
fileprivate var fetchedResultsController: CoreStoreFetchedResultsController
|
||||||
fileprivate let taskGroup = DispatchGroup()
|
fileprivate let taskGroup = DispatchGroup()
|
||||||
fileprivate let sectionIndexTransformer: (_ sectionName: KeyPath?) -> String?
|
fileprivate let sectionIndexTransformer: (_ sectionName: RawKeyPath?) -> String?
|
||||||
|
|
||||||
private let isSectioned: Bool
|
private let isSectioned: Bool
|
||||||
|
|
||||||
|
|||||||
@@ -75,12 +75,12 @@ internal extension NSEntityDescription {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
internal var keyPathsByAffectedKeyPaths: [KeyPath: Set<KeyPath>] {
|
internal var keyPathsByAffectedKeyPaths: [RawKeyPath: Set<RawKeyPath>] {
|
||||||
|
|
||||||
get {
|
get {
|
||||||
|
|
||||||
if let userInfo = self.userInfo,
|
if let userInfo = self.userInfo,
|
||||||
let function = userInfo[UserInfoKey.CoreStoreManagedObjectKeyPathsByAffectedKeyPaths] as! [KeyPath: Set<KeyPath>]? {
|
let function = userInfo[UserInfoKey.CoreStoreManagedObjectKeyPathsByAffectedKeyPaths] as! [RawKeyPath: Set<RawKeyPath>]? {
|
||||||
|
|
||||||
return function
|
return function
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -84,7 +84,7 @@ public extension NSManagedObject {
|
|||||||
- returns: the primitive value for the KVC key
|
- returns: the primitive value for the KVC key
|
||||||
*/
|
*/
|
||||||
@nonobjc @inline(__always)
|
@nonobjc @inline(__always)
|
||||||
public func getValue(forKvcKey kvcKey: KeyPath) -> Any? {
|
public func getValue(forKvcKey kvcKey: RawKeyPath) -> Any? {
|
||||||
|
|
||||||
self.willAccessValue(forKey: kvcKey)
|
self.willAccessValue(forKey: kvcKey)
|
||||||
defer {
|
defer {
|
||||||
@@ -102,7 +102,7 @@ public extension NSManagedObject {
|
|||||||
- returns: the primitive value transformed by the `didGetValue` closure
|
- returns: the primitive value transformed by the `didGetValue` closure
|
||||||
*/
|
*/
|
||||||
@nonobjc @inline(__always)
|
@nonobjc @inline(__always)
|
||||||
public func getValue<T>(forKvcKey kvcKey: KeyPath, didGetValue: (Any?) throws -> T) rethrows -> T {
|
public func getValue<T>(forKvcKey kvcKey: RawKeyPath, didGetValue: (Any?) throws -> T) rethrows -> T {
|
||||||
|
|
||||||
self.willAccessValue(forKey: kvcKey)
|
self.willAccessValue(forKey: kvcKey)
|
||||||
defer {
|
defer {
|
||||||
@@ -121,7 +121,7 @@ public extension NSManagedObject {
|
|||||||
- returns: the primitive value transformed by the `didGetValue` closure
|
- returns: the primitive value transformed by the `didGetValue` closure
|
||||||
*/
|
*/
|
||||||
@nonobjc @inline(__always)
|
@nonobjc @inline(__always)
|
||||||
public func getValue<T>(forKvcKey kvcKey: KeyPath, willGetValue: () throws -> Void, didGetValue: (Any?) throws -> T) rethrows -> T {
|
public func getValue<T>(forKvcKey kvcKey: RawKeyPath, willGetValue: () throws -> Void, didGetValue: (Any?) throws -> T) rethrows -> T {
|
||||||
|
|
||||||
self.willAccessValue(forKey: kvcKey)
|
self.willAccessValue(forKey: kvcKey)
|
||||||
defer {
|
defer {
|
||||||
@@ -139,7 +139,7 @@ public extension NSManagedObject {
|
|||||||
- parameter KVCKey: the KVC key
|
- parameter KVCKey: the KVC key
|
||||||
*/
|
*/
|
||||||
@nonobjc @inline(__always)
|
@nonobjc @inline(__always)
|
||||||
public func setValue(_ value: Any?, forKvcKey KVCKey: KeyPath) {
|
public func setValue(_ value: Any?, forKvcKey KVCKey: RawKeyPath) {
|
||||||
|
|
||||||
self.willChangeValue(forKey: KVCKey)
|
self.willChangeValue(forKey: KVCKey)
|
||||||
defer {
|
defer {
|
||||||
@@ -157,7 +157,7 @@ public extension NSManagedObject {
|
|||||||
- parameter didSetValue: called after executing `setPrimitiveValue(forKey:)`.
|
- parameter didSetValue: called after executing `setPrimitiveValue(forKey:)`.
|
||||||
*/
|
*/
|
||||||
@nonobjc @inline(__always)
|
@nonobjc @inline(__always)
|
||||||
public func setValue(_ value: Any?, forKvcKey KVCKey: KeyPath, didSetValue: () -> Void) {
|
public func setValue(_ value: Any?, forKvcKey KVCKey: RawKeyPath, didSetValue: () -> Void) {
|
||||||
|
|
||||||
self.willChangeValue(forKey: KVCKey)
|
self.willChangeValue(forKey: KVCKey)
|
||||||
defer {
|
defer {
|
||||||
@@ -177,7 +177,7 @@ public extension NSManagedObject {
|
|||||||
- parameter didSetValue: called after executing `setPrimitiveValue(forKey:)`.
|
- parameter didSetValue: called after executing `setPrimitiveValue(forKey:)`.
|
||||||
*/
|
*/
|
||||||
@nonobjc @inline(__always)
|
@nonobjc @inline(__always)
|
||||||
public func setValue<T>(_ value: T, forKvcKey KVCKey: KeyPath, willSetValue: (T) throws -> Any?, didSetValue: (Any?) -> Void = { _ in }) rethrows {
|
public func setValue<T>(_ value: T, forKvcKey KVCKey: RawKeyPath, willSetValue: (T) throws -> Any?, didSetValue: (Any?) -> Void = { _ in }) rethrows {
|
||||||
|
|
||||||
self.willChangeValue(forKey: KVCKey)
|
self.willChangeValue(forKey: KVCKey)
|
||||||
defer {
|
defer {
|
||||||
@@ -212,7 +212,7 @@ public extension NSManagedObject {
|
|||||||
|
|
||||||
@available(*, deprecated, renamed: "getValue(forKvcKey:)")
|
@available(*, deprecated, renamed: "getValue(forKvcKey:)")
|
||||||
@nonobjc
|
@nonobjc
|
||||||
public func accessValueForKVCKey(_ KVCKey: KeyPath) -> Any? {
|
public func accessValueForKVCKey(_ KVCKey: RawKeyPath) -> Any? {
|
||||||
|
|
||||||
self.willAccessValue(forKey: KVCKey)
|
self.willAccessValue(forKey: KVCKey)
|
||||||
defer {
|
defer {
|
||||||
@@ -225,7 +225,7 @@ public extension NSManagedObject {
|
|||||||
@available(*, deprecated, renamed: "getValue(forKvcKey:didGetValue:)")
|
@available(*, deprecated, renamed: "getValue(forKvcKey:didGetValue:)")
|
||||||
@discardableResult
|
@discardableResult
|
||||||
@nonobjc
|
@nonobjc
|
||||||
public func accessValueForKVCKey<T>(_ KVCKey: KeyPath, _ didAccessPrimitiveValue: (Any?) throws -> T) rethrows -> T {
|
public func accessValueForKVCKey<T>(_ KVCKey: RawKeyPath, _ didAccessPrimitiveValue: (Any?) throws -> T) rethrows -> T {
|
||||||
|
|
||||||
self.willAccessValue(forKey: KVCKey)
|
self.willAccessValue(forKey: KVCKey)
|
||||||
defer {
|
defer {
|
||||||
@@ -237,7 +237,7 @@ public extension NSManagedObject {
|
|||||||
|
|
||||||
@available(*, deprecated, renamed: "setValue(_:forKvcKey:)")
|
@available(*, deprecated, renamed: "setValue(_:forKvcKey:)")
|
||||||
@nonobjc
|
@nonobjc
|
||||||
public func setValue(_ value: Any?, forKVCKey KVCKey: KeyPath) {
|
public func setValue(_ value: Any?, forKVCKey KVCKey: RawKeyPath) {
|
||||||
|
|
||||||
self.willChangeValue(forKey: KVCKey)
|
self.willChangeValue(forKey: KVCKey)
|
||||||
defer {
|
defer {
|
||||||
@@ -250,7 +250,7 @@ public extension NSManagedObject {
|
|||||||
@available(*, deprecated, renamed: "setValue(_:forKvcKey:didSetValue:)")
|
@available(*, deprecated, renamed: "setValue(_:forKvcKey:didSetValue:)")
|
||||||
@discardableResult
|
@discardableResult
|
||||||
@nonobjc
|
@nonobjc
|
||||||
public func setValue<T>(_ value: Any?, forKVCKey KVCKey: KeyPath, _ didSetPrimitiveValue: (Any?) throws -> T) rethrows -> T {
|
public func setValue<T>(_ value: Any?, forKVCKey KVCKey: RawKeyPath, _ didSetPrimitiveValue: (Any?) throws -> T) rethrows -> T {
|
||||||
|
|
||||||
self.willChangeValue(forKey: KVCKey)
|
self.willChangeValue(forKey: KVCKey)
|
||||||
defer {
|
defer {
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ public extension NSManagedObject {
|
|||||||
- returns: the primitive value for the KVC key
|
- returns: the primitive value for the KVC key
|
||||||
*/
|
*/
|
||||||
@objc
|
@objc
|
||||||
public func cs_accessValueForKVCKey(_ KVCKey: KeyPath) -> Any? {
|
public func cs_accessValueForKVCKey(_ KVCKey: RawKeyPath) -> Any? {
|
||||||
|
|
||||||
return self.getValue(forKvcKey: KVCKey)
|
return self.getValue(forKvcKey: KVCKey)
|
||||||
}
|
}
|
||||||
@@ -50,7 +50,7 @@ public extension NSManagedObject {
|
|||||||
- parameter KVCKey: the KVC key
|
- parameter KVCKey: the KVC key
|
||||||
*/
|
*/
|
||||||
@objc
|
@objc
|
||||||
public func cs_setValue(_ value: Any?, forKVCKey KVCKey: KeyPath) {
|
public func cs_setValue(_ value: Any?, forKVCKey KVCKey: RawKeyPath) {
|
||||||
|
|
||||||
self.setValue(value, forKvcKey: KVCKey)
|
self.setValue(value, forKvcKey: KVCKey)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -61,7 +61,7 @@ public protocol ObjectObserver: class {
|
|||||||
- parameter object: the `DynamicObject` instance being observed
|
- parameter object: the `DynamicObject` instance being observed
|
||||||
- parameter changedPersistentKeys: a `Set` of key paths for the attributes that were changed. Note that `changedPersistentKeys` only contains keys for attributes/relationships present in the persistent store, thus transient properties will not be reported.
|
- parameter changedPersistentKeys: a `Set` of key paths for the attributes that were changed. Note that `changedPersistentKeys` only contains keys for attributes/relationships present in the persistent store, thus transient properties will not be reported.
|
||||||
*/
|
*/
|
||||||
func objectMonitor(_ monitor: ObjectMonitor<ObjectEntityType>, didUpdateObject object: ObjectEntityType, changedPersistentKeys: Set<KeyPath>)
|
func objectMonitor(_ monitor: ObjectMonitor<ObjectEntityType>, didUpdateObject object: ObjectEntityType, changedPersistentKeys: Set<RawKeyPath>)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Handles processing right after `object` is deleted. (Optional)
|
Handles processing right after `object` is deleted. (Optional)
|
||||||
@@ -81,7 +81,7 @@ public extension ObjectObserver {
|
|||||||
|
|
||||||
public func objectMonitor(_ monitor: ObjectMonitor<ObjectEntityType>, willUpdateObject object: ObjectEntityType) { }
|
public func objectMonitor(_ monitor: ObjectMonitor<ObjectEntityType>, willUpdateObject object: ObjectEntityType) { }
|
||||||
|
|
||||||
public func objectMonitor(_ monitor: ObjectMonitor<ObjectEntityType>, didUpdateObject object: ObjectEntityType, changedPersistentKeys: Set<KeyPath>) { }
|
public func objectMonitor(_ monitor: ObjectMonitor<ObjectEntityType>, didUpdateObject object: ObjectEntityType, changedPersistentKeys: Set<RawKeyPath>) { }
|
||||||
|
|
||||||
public func objectMonitor(_ monitor: ObjectMonitor<ObjectEntityType>, didDeleteObject object: ObjectEntityType) { }
|
public func objectMonitor(_ monitor: ObjectMonitor<ObjectEntityType>, didDeleteObject object: ObjectEntityType) { }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,9 +27,9 @@ import Foundation
|
|||||||
import CoreData
|
import CoreData
|
||||||
|
|
||||||
|
|
||||||
// MARK: - KeyPath
|
// MARK: - RawKeyPath
|
||||||
|
|
||||||
public typealias KeyPath = String
|
public typealias RawKeyPath = String
|
||||||
|
|
||||||
|
|
||||||
// MARK: - SortKey
|
// MARK: - SortKey
|
||||||
@@ -40,14 +40,14 @@ public typealias KeyPath = String
|
|||||||
public enum SortKey {
|
public enum SortKey {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Indicates that the `KeyPath` should be sorted in ascending order
|
Indicates that the `RawKeyPath` should be sorted in ascending order
|
||||||
*/
|
*/
|
||||||
case ascending(KeyPath)
|
case ascending(RawKeyPath)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Indicates that the `KeyPath` should be sorted in descending order
|
Indicates that the `RawKeyPath` should be sorted in descending order
|
||||||
*/
|
*/
|
||||||
case descending(KeyPath)
|
case descending(RawKeyPath)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -64,7 +64,7 @@ public protocol QueryableAttributeType: Hashable, SelectResultType {
|
|||||||
/**
|
/**
|
||||||
The `CoreDataNativeType` for this type when used in `Select` clauses.
|
The `CoreDataNativeType` for this type when used in `Select` clauses.
|
||||||
*/
|
*/
|
||||||
associatedtype QueryableNativeType: CoreDataNativeType
|
associatedtype QueryableNativeType
|
||||||
|
|
||||||
/**
|
/**
|
||||||
The `NSAttributeType` for this type when used in `Select` clauses.
|
The `NSAttributeType` for this type when used in `Select` clauses.
|
||||||
@@ -111,7 +111,7 @@ extension Bool: QueryableAttributeType {
|
|||||||
@inline(__always)
|
@inline(__always)
|
||||||
public func cs_toQueryableNativeType() -> QueryableNativeType {
|
public func cs_toQueryableNativeType() -> QueryableNativeType {
|
||||||
|
|
||||||
return self as NSNumber
|
return self as QueryableNativeType
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -133,7 +133,7 @@ extension CGFloat: QueryableAttributeType {
|
|||||||
@inline(__always)
|
@inline(__always)
|
||||||
public func cs_toQueryableNativeType() -> QueryableNativeType {
|
public func cs_toQueryableNativeType() -> QueryableNativeType {
|
||||||
|
|
||||||
return self as NSNumber
|
return self as QueryableNativeType
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -155,7 +155,7 @@ extension Data: QueryableAttributeType {
|
|||||||
@inline(__always)
|
@inline(__always)
|
||||||
public func cs_toQueryableNativeType() -> QueryableNativeType {
|
public func cs_toQueryableNativeType() -> QueryableNativeType {
|
||||||
|
|
||||||
return self as NSData
|
return self as QueryableNativeType
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -342,7 +342,10 @@ extension NSData: QueryableAttributeType {
|
|||||||
|
|
||||||
public typealias QueryableNativeType = NSData
|
public typealias QueryableNativeType = NSData
|
||||||
|
|
||||||
public static let cs_rawAttributeType: NSAttributeType = .binaryDataAttributeType
|
public class var cs_rawAttributeType: NSAttributeType {
|
||||||
|
|
||||||
|
return .binaryDataAttributeType
|
||||||
|
}
|
||||||
|
|
||||||
@nonobjc @inline(__always)
|
@nonobjc @inline(__always)
|
||||||
public class func cs_fromQueryableNativeType(_ value: QueryableNativeType) -> Self? {
|
public class func cs_fromQueryableNativeType(_ value: QueryableNativeType) -> Self? {
|
||||||
@@ -369,7 +372,10 @@ extension NSDate: QueryableAttributeType {
|
|||||||
|
|
||||||
public typealias QueryableNativeType = NSDate
|
public typealias QueryableNativeType = NSDate
|
||||||
|
|
||||||
public static let cs_rawAttributeType: NSAttributeType = .dateAttributeType
|
public class var cs_rawAttributeType: NSAttributeType {
|
||||||
|
|
||||||
|
return .dateAttributeType
|
||||||
|
}
|
||||||
|
|
||||||
@nonobjc @inline(__always)
|
@nonobjc @inline(__always)
|
||||||
public class func cs_fromQueryableNativeType(_ value: QueryableNativeType) -> Self? {
|
public class func cs_fromQueryableNativeType(_ value: QueryableNativeType) -> Self? {
|
||||||
@@ -407,7 +413,10 @@ extension NSManagedObjectID: QueryableAttributeType {
|
|||||||
|
|
||||||
public typealias QueryableNativeType = NSManagedObjectID
|
public typealias QueryableNativeType = NSManagedObjectID
|
||||||
|
|
||||||
public static let cs_rawAttributeType: NSAttributeType = .objectIDAttributeType
|
public class var cs_rawAttributeType: NSAttributeType {
|
||||||
|
|
||||||
|
return .objectIDAttributeType
|
||||||
|
}
|
||||||
|
|
||||||
@nonobjc @inline(__always)
|
@nonobjc @inline(__always)
|
||||||
public class func cs_fromQueryableNativeType(_ value: QueryableNativeType) -> Self? {
|
public class func cs_fromQueryableNativeType(_ value: QueryableNativeType) -> Self? {
|
||||||
@@ -440,7 +449,7 @@ extension NSNull: QueryableAttributeType {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@nonobjc @inline(__always)
|
@nonobjc @inline(__always)
|
||||||
public static func cs_fromQueryableNativeType(_ value: QueryableNativeType) -> Self? {
|
public class func cs_fromQueryableNativeType(_ value: QueryableNativeType) -> Self? {
|
||||||
|
|
||||||
@inline(__always)
|
@inline(__always)
|
||||||
func forceCast<T: NSNull>(_ value: Any) -> T? {
|
func forceCast<T: NSNull>(_ value: Any) -> T? {
|
||||||
@@ -494,7 +503,10 @@ extension NSString: QueryableAttributeType {
|
|||||||
|
|
||||||
public typealias QueryableNativeType = NSString
|
public typealias QueryableNativeType = NSString
|
||||||
|
|
||||||
public static let cs_rawAttributeType: NSAttributeType = .stringAttributeType
|
public class var cs_rawAttributeType: NSAttributeType {
|
||||||
|
|
||||||
|
return .stringAttributeType
|
||||||
|
}
|
||||||
|
|
||||||
@nonobjc @inline(__always)
|
@nonobjc @inline(__always)
|
||||||
public class func cs_fromQueryableNativeType(_ value: QueryableNativeType) -> Self? {
|
public class func cs_fromQueryableNativeType(_ value: QueryableNativeType) -> Self? {
|
||||||
@@ -521,10 +533,13 @@ extension NSURL: QueryableAttributeType {
|
|||||||
|
|
||||||
public typealias QueryableNativeType = NSString
|
public typealias QueryableNativeType = NSString
|
||||||
|
|
||||||
public static let cs_rawAttributeType: NSAttributeType = .stringAttributeType
|
public class var cs_rawAttributeType: NSAttributeType {
|
||||||
|
|
||||||
|
return .stringAttributeType
|
||||||
|
}
|
||||||
|
|
||||||
@nonobjc @inline(__always)
|
@nonobjc @inline(__always)
|
||||||
public static func cs_fromQueryableNativeType(_ value: QueryableNativeType) -> Self? {
|
public class func cs_fromQueryableNativeType(_ value: QueryableNativeType) -> Self? {
|
||||||
|
|
||||||
return self.init(string: value as String)
|
return self.init(string: value as String)
|
||||||
}
|
}
|
||||||
@@ -543,10 +558,13 @@ extension NSUUID: QueryableAttributeType {
|
|||||||
|
|
||||||
public typealias QueryableNativeType = NSString
|
public typealias QueryableNativeType = NSString
|
||||||
|
|
||||||
public static let cs_rawAttributeType: NSAttributeType = .stringAttributeType
|
public class var cs_rawAttributeType: NSAttributeType {
|
||||||
|
|
||||||
|
return .stringAttributeType
|
||||||
|
}
|
||||||
|
|
||||||
@nonobjc @inline(__always)
|
@nonobjc @inline(__always)
|
||||||
public static func cs_fromQueryableNativeType(_ value: QueryableNativeType) -> Self? {
|
public class func cs_fromQueryableNativeType(_ value: QueryableNativeType) -> Self? {
|
||||||
|
|
||||||
return self.init(uuidString: value.lowercased)
|
return self.init(uuidString: value.lowercased)
|
||||||
}
|
}
|
||||||
@@ -576,7 +594,7 @@ extension String: QueryableAttributeType {
|
|||||||
@inline(__always)
|
@inline(__always)
|
||||||
public func cs_toQueryableNativeType() -> QueryableNativeType {
|
public func cs_toQueryableNativeType() -> QueryableNativeType {
|
||||||
|
|
||||||
return self as NSString
|
return self as QueryableNativeType
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -95,7 +95,7 @@ public enum RelationshipContainer<O: CoreStoreObject> {
|
|||||||
- parameter affectedByKeyPaths: a set of key paths for properties whose values affect the value of the receiver. This is similar to `NSManagedObject.keyPathsForValuesAffectingValue(forKey:)`.
|
- 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(
|
public convenience init(
|
||||||
_ keyPath: KeyPath,
|
_ keyPath: RawKeyPath,
|
||||||
deleteRule: DeleteRule = .nullify,
|
deleteRule: DeleteRule = .nullify,
|
||||||
versionHashModifier: String? = nil,
|
versionHashModifier: String? = nil,
|
||||||
renamingIdentifier: String? = nil,
|
renamingIdentifier: String? = nil,
|
||||||
@@ -129,7 +129,7 @@ public enum RelationshipContainer<O: CoreStoreObject> {
|
|||||||
- parameter affectedByKeyPaths: a set of key paths for properties whose values affect the value of the receiver. This is similar to `NSManagedObject.keyPathsForValuesAffectingValue(forKey:)`.
|
- 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(
|
public convenience init(
|
||||||
_ keyPath: KeyPath,
|
_ keyPath: RawKeyPath,
|
||||||
inverse: @escaping (D) -> RelationshipContainer<D>.ToOne<O>,
|
inverse: @escaping (D) -> RelationshipContainer<D>.ToOne<O>,
|
||||||
deleteRule: DeleteRule = .nullify,
|
deleteRule: DeleteRule = .nullify,
|
||||||
versionHashModifier: String? = nil,
|
versionHashModifier: String? = nil,
|
||||||
@@ -164,7 +164,7 @@ public enum RelationshipContainer<O: CoreStoreObject> {
|
|||||||
- parameter affectedByKeyPaths: a set of key paths for properties whose values affect the value of the receiver. This is similar to `NSManagedObject.keyPathsForValuesAffectingValue(forKey:)`.
|
- 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(
|
public convenience init(
|
||||||
_ keyPath: KeyPath,
|
_ keyPath: RawKeyPath,
|
||||||
inverse: @escaping (D) -> RelationshipContainer<D>.ToManyOrdered<O>,
|
inverse: @escaping (D) -> RelationshipContainer<D>.ToManyOrdered<O>,
|
||||||
deleteRule: DeleteRule = .nullify,
|
deleteRule: DeleteRule = .nullify,
|
||||||
versionHashModifier: String? = nil,
|
versionHashModifier: String? = nil,
|
||||||
@@ -199,7 +199,7 @@ public enum RelationshipContainer<O: CoreStoreObject> {
|
|||||||
- parameter affectedByKeyPaths: a set of key paths for properties whose values affect the value of the receiver. This is similar to `NSManagedObject.keyPathsForValuesAffectingValue(forKey:)`.
|
- 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(
|
public convenience init(
|
||||||
_ keyPath: KeyPath,
|
_ keyPath: RawKeyPath,
|
||||||
inverse: @escaping (D) -> RelationshipContainer<D>.ToManyUnordered<O>,
|
inverse: @escaping (D) -> RelationshipContainer<D>.ToManyUnordered<O>,
|
||||||
deleteRule: DeleteRule = .nullify,
|
deleteRule: DeleteRule = .nullify,
|
||||||
versionHashModifier: String? = nil,
|
versionHashModifier: String? = nil,
|
||||||
@@ -234,14 +234,14 @@ public enum RelationshipContainer<O: CoreStoreObject> {
|
|||||||
|
|
||||||
// MARK: RelationshipProtocol
|
// MARK: RelationshipProtocol
|
||||||
|
|
||||||
public let keyPath: KeyPath
|
public let keyPath: RawKeyPath
|
||||||
|
|
||||||
internal let isToMany = false
|
internal let isToMany = false
|
||||||
internal let isOrdered = false
|
internal let isOrdered = false
|
||||||
internal let deleteRule: NSDeleteRule
|
internal let deleteRule: NSDeleteRule
|
||||||
internal let minCount: Int = 0
|
internal let minCount: Int = 0
|
||||||
internal let maxCount: Int = 1
|
internal let maxCount: Int = 1
|
||||||
internal let inverse: (type: CoreStoreObject.Type, keyPath: () -> KeyPath?)
|
internal let inverse: (type: CoreStoreObject.Type, keyPath: () -> RawKeyPath?)
|
||||||
internal let versionHashModifier: String?
|
internal let versionHashModifier: String?
|
||||||
internal let renamingIdentifier: String?
|
internal let renamingIdentifier: String?
|
||||||
internal let affectedByKeyPaths: () -> Set<String>
|
internal let affectedByKeyPaths: () -> Set<String>
|
||||||
@@ -286,7 +286,7 @@ public enum RelationshipContainer<O: CoreStoreObject> {
|
|||||||
|
|
||||||
// MARK: Private
|
// MARK: Private
|
||||||
|
|
||||||
private init(keyPath: KeyPath, inverseKeyPath: @escaping () -> KeyPath?, deleteRule: DeleteRule, versionHashModifier: String?, renamingIdentifier: String?, affectedByKeyPaths: @autoclosure @escaping () -> Set<String>) {
|
private init(keyPath: RawKeyPath, inverseKeyPath: @escaping () -> RawKeyPath?, deleteRule: DeleteRule, versionHashModifier: String?, renamingIdentifier: String?, affectedByKeyPaths: @autoclosure @escaping () -> Set<String>) {
|
||||||
|
|
||||||
self.keyPath = keyPath
|
self.keyPath = keyPath
|
||||||
self.deleteRule = deleteRule.nativeValue
|
self.deleteRule = deleteRule.nativeValue
|
||||||
@@ -333,7 +333,7 @@ public enum RelationshipContainer<O: CoreStoreObject> {
|
|||||||
- parameter affectedByKeyPaths: a set of key paths for properties whose values affect the value of the receiver. This is similar to `NSManagedObject.keyPathsForValuesAffectingValue(forKey:)`.
|
- 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(
|
public convenience init(
|
||||||
_ keyPath: KeyPath,
|
_ keyPath: RawKeyPath,
|
||||||
minCount: Int = 0,
|
minCount: Int = 0,
|
||||||
maxCount: Int = 0,
|
maxCount: Int = 0,
|
||||||
deleteRule: DeleteRule = .nullify,
|
deleteRule: DeleteRule = .nullify,
|
||||||
@@ -373,7 +373,7 @@ public enum RelationshipContainer<O: CoreStoreObject> {
|
|||||||
- parameter affectedByKeyPaths: a set of key paths for properties whose values affect the value of the receiver. This is similar to `NSManagedObject.keyPathsForValuesAffectingValue(forKey:)`.
|
- 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(
|
public convenience init(
|
||||||
_ keyPath: KeyPath,
|
_ keyPath: RawKeyPath,
|
||||||
minCount: Int = 0,
|
minCount: Int = 0,
|
||||||
maxCount: Int = 0,
|
maxCount: Int = 0,
|
||||||
inverse: @escaping (D) -> RelationshipContainer<D>.ToOne<O>,
|
inverse: @escaping (D) -> RelationshipContainer<D>.ToOne<O>,
|
||||||
@@ -414,7 +414,7 @@ public enum RelationshipContainer<O: CoreStoreObject> {
|
|||||||
- parameter affectedByKeyPaths: a set of key paths for properties whose values affect the value of the receiver. This is similar to `NSManagedObject.keyPathsForValuesAffectingValue(forKey:)`.
|
- 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(
|
public convenience init(
|
||||||
_ keyPath: KeyPath,
|
_ keyPath: RawKeyPath,
|
||||||
minCount: Int = 0,
|
minCount: Int = 0,
|
||||||
maxCount: Int = 0,
|
maxCount: Int = 0,
|
||||||
inverse: @escaping (D) -> RelationshipContainer<D>.ToManyOrdered<O>,
|
inverse: @escaping (D) -> RelationshipContainer<D>.ToManyOrdered<O>,
|
||||||
@@ -455,7 +455,7 @@ public enum RelationshipContainer<O: CoreStoreObject> {
|
|||||||
- parameter affectedByKeyPaths: a set of key paths for properties whose values affect the value of the receiver. This is similar to `NSManagedObject.keyPathsForValuesAffectingValue(forKey:)`.
|
- 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(
|
public convenience init(
|
||||||
_ keyPath: KeyPath,
|
_ keyPath: RawKeyPath,
|
||||||
minCount: Int = 0,
|
minCount: Int = 0,
|
||||||
maxCount: Int = 0,
|
maxCount: Int = 0,
|
||||||
inverse: @escaping (D) -> RelationshipContainer<D>.ToManyUnordered<O>,
|
inverse: @escaping (D) -> RelationshipContainer<D>.ToManyUnordered<O>,
|
||||||
@@ -494,7 +494,7 @@ public enum RelationshipContainer<O: CoreStoreObject> {
|
|||||||
|
|
||||||
// MARK: RelationshipProtocol
|
// MARK: RelationshipProtocol
|
||||||
|
|
||||||
public let keyPath: KeyPath
|
public let keyPath: RawKeyPath
|
||||||
|
|
||||||
internal let isToMany = true
|
internal let isToMany = true
|
||||||
internal let isOptional = true
|
internal let isOptional = true
|
||||||
@@ -502,7 +502,7 @@ public enum RelationshipContainer<O: CoreStoreObject> {
|
|||||||
internal let deleteRule: NSDeleteRule
|
internal let deleteRule: NSDeleteRule
|
||||||
internal let minCount: Int
|
internal let minCount: Int
|
||||||
internal let maxCount: Int
|
internal let maxCount: Int
|
||||||
internal let inverse: (type: CoreStoreObject.Type, keyPath: () -> KeyPath?)
|
internal let inverse: (type: CoreStoreObject.Type, keyPath: () -> RawKeyPath?)
|
||||||
internal let versionHashModifier: String?
|
internal let versionHashModifier: String?
|
||||||
internal let renamingIdentifier: String?
|
internal let renamingIdentifier: String?
|
||||||
internal let affectedByKeyPaths: () -> Set<String>
|
internal let affectedByKeyPaths: () -> Set<String>
|
||||||
@@ -599,7 +599,7 @@ public enum RelationshipContainer<O: CoreStoreObject> {
|
|||||||
- parameter affectedByKeyPaths: a set of key paths for properties whose values affect the value of the receiver. This is similar to `NSManagedObject.keyPathsForValuesAffectingValue(forKey:)`.
|
- 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(
|
public convenience init(
|
||||||
_ keyPath: KeyPath,
|
_ keyPath: RawKeyPath,
|
||||||
deleteRule: DeleteRule = .nullify,
|
deleteRule: DeleteRule = .nullify,
|
||||||
minCount: Int = 0,
|
minCount: Int = 0,
|
||||||
maxCount: Int = 0,
|
maxCount: Int = 0,
|
||||||
@@ -639,7 +639,7 @@ public enum RelationshipContainer<O: CoreStoreObject> {
|
|||||||
- parameter affectedByKeyPaths: a set of key paths for properties whose values affect the value of the receiver. This is similar to `NSManagedObject.keyPathsForValuesAffectingValue(forKey:)`.
|
- 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(
|
public convenience init(
|
||||||
_ keyPath: KeyPath,
|
_ keyPath: RawKeyPath,
|
||||||
inverse: @escaping (D) -> RelationshipContainer<D>.ToOne<O>,
|
inverse: @escaping (D) -> RelationshipContainer<D>.ToOne<O>,
|
||||||
deleteRule: DeleteRule = .nullify,
|
deleteRule: DeleteRule = .nullify,
|
||||||
minCount: Int = 0,
|
minCount: Int = 0,
|
||||||
@@ -680,7 +680,7 @@ public enum RelationshipContainer<O: CoreStoreObject> {
|
|||||||
- parameter affectedByKeyPaths: a set of key paths for properties whose values affect the value of the receiver. This is similar to `NSManagedObject.keyPathsForValuesAffectingValue(forKey:)`.
|
- 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(
|
public convenience init(
|
||||||
_ keyPath: KeyPath,
|
_ keyPath: RawKeyPath,
|
||||||
inverse: @escaping (D) -> RelationshipContainer<D>.ToManyOrdered<O>,
|
inverse: @escaping (D) -> RelationshipContainer<D>.ToManyOrdered<O>,
|
||||||
deleteRule: DeleteRule = .nullify,
|
deleteRule: DeleteRule = .nullify,
|
||||||
minCount: Int = 0,
|
minCount: Int = 0,
|
||||||
@@ -721,7 +721,7 @@ public enum RelationshipContainer<O: CoreStoreObject> {
|
|||||||
- parameter affectedByKeyPaths: a set of key paths for properties whose values affect the value of the receiver. This is similar to `NSManagedObject.keyPathsForValuesAffectingValue(forKey:)`.
|
- 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(
|
public convenience init(
|
||||||
_ keyPath: KeyPath,
|
_ keyPath: RawKeyPath,
|
||||||
inverse: @escaping (D) -> RelationshipContainer<D>.ToManyUnordered<O>,
|
inverse: @escaping (D) -> RelationshipContainer<D>.ToManyUnordered<O>,
|
||||||
deleteRule: DeleteRule = .nullify,
|
deleteRule: DeleteRule = .nullify,
|
||||||
minCount: Int = 0,
|
minCount: Int = 0,
|
||||||
@@ -760,7 +760,7 @@ public enum RelationshipContainer<O: CoreStoreObject> {
|
|||||||
|
|
||||||
// MARK: RelationshipProtocol
|
// MARK: RelationshipProtocol
|
||||||
|
|
||||||
public let keyPath: KeyPath
|
public let keyPath: RawKeyPath
|
||||||
|
|
||||||
internal let isToMany = true
|
internal let isToMany = true
|
||||||
internal let isOptional = true
|
internal let isOptional = true
|
||||||
@@ -768,7 +768,7 @@ public enum RelationshipContainer<O: CoreStoreObject> {
|
|||||||
internal let deleteRule: NSDeleteRule
|
internal let deleteRule: NSDeleteRule
|
||||||
internal let minCount: Int
|
internal let minCount: Int
|
||||||
internal let maxCount: Int
|
internal let maxCount: Int
|
||||||
internal let inverse: (type: CoreStoreObject.Type, keyPath: () -> KeyPath?)
|
internal let inverse: (type: CoreStoreObject.Type, keyPath: () -> RawKeyPath?)
|
||||||
internal let versionHashModifier: String?
|
internal let versionHashModifier: String?
|
||||||
internal let renamingIdentifier: String?
|
internal let renamingIdentifier: String?
|
||||||
internal let affectedByKeyPaths: () -> Set<String>
|
internal let affectedByKeyPaths: () -> Set<String>
|
||||||
@@ -813,7 +813,7 @@ public enum RelationshipContainer<O: CoreStoreObject> {
|
|||||||
|
|
||||||
// MARK: Private
|
// MARK: Private
|
||||||
|
|
||||||
private init(keyPath: KeyPath, inverseKeyPath: @escaping () -> KeyPath?, deleteRule: DeleteRule, minCount: Int, maxCount: Int, versionHashModifier: String?, renamingIdentifier: String?, affectedByKeyPaths: @autoclosure @escaping () -> Set<String>) {
|
private init(keyPath: RawKeyPath, inverseKeyPath: @escaping () -> RawKeyPath?, deleteRule: DeleteRule, minCount: Int, maxCount: Int, versionHashModifier: String?, renamingIdentifier: String?, affectedByKeyPaths: @autoclosure @escaping () -> Set<String>) {
|
||||||
|
|
||||||
self.keyPath = keyPath
|
self.keyPath = keyPath
|
||||||
self.deleteRule = deleteRule.nativeValue
|
self.deleteRule = deleteRule.nativeValue
|
||||||
@@ -1186,11 +1186,11 @@ extension RelationshipContainer.ToManyUnordered {
|
|||||||
|
|
||||||
internal protocol RelationshipProtocol: class {
|
internal protocol RelationshipProtocol: class {
|
||||||
|
|
||||||
var keyPath: KeyPath { get }
|
var keyPath: RawKeyPath { get }
|
||||||
var isToMany: Bool { get }
|
var isToMany: Bool { get }
|
||||||
var isOrdered: Bool { get }
|
var isOrdered: Bool { get }
|
||||||
var deleteRule: NSDeleteRule { get }
|
var deleteRule: NSDeleteRule { get }
|
||||||
var inverse: (type: CoreStoreObject.Type, keyPath: () -> KeyPath?) { get }
|
var inverse: (type: CoreStoreObject.Type, keyPath: () -> RawKeyPath?) { get }
|
||||||
var affectedByKeyPaths: () -> Set<String> { get }
|
var affectedByKeyPaths: () -> Set<String> { get }
|
||||||
var parentObject: () -> CoreStoreObject { get set }
|
var parentObject: () -> CoreStoreObject { get set }
|
||||||
var versionHashModifier: String? { get }
|
var versionHashModifier: String? { get }
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ public struct SectionBy {
|
|||||||
|
|
||||||
- parameter sectionKeyPath: the key path to use to group the objects into sections
|
- parameter sectionKeyPath: the key path to use to group the objects into sections
|
||||||
*/
|
*/
|
||||||
public init(_ sectionKeyPath: KeyPath) {
|
public init(_ sectionKeyPath: RawKeyPath) {
|
||||||
|
|
||||||
self.init(sectionKeyPath, { $0 })
|
self.init(sectionKeyPath, { $0 })
|
||||||
}
|
}
|
||||||
@@ -59,7 +59,7 @@ public struct SectionBy {
|
|||||||
- parameter sectionKeyPath: the key path to use to group the objects into sections
|
- parameter sectionKeyPath: the key path to use to group the objects into sections
|
||||||
- parameter sectionIndexTransformer: a closure to transform the value for the key path to an appropriate section name
|
- parameter sectionIndexTransformer: a closure to transform the value for the key path to an appropriate section name
|
||||||
*/
|
*/
|
||||||
public init(_ sectionKeyPath: KeyPath, _ sectionIndexTransformer: @escaping (_ sectionName: String?) -> String?) {
|
public init(_ sectionKeyPath: RawKeyPath, _ sectionIndexTransformer: @escaping (_ sectionName: String?) -> String?) {
|
||||||
|
|
||||||
self.sectionKeyPath = sectionKeyPath
|
self.sectionKeyPath = sectionKeyPath
|
||||||
self.sectionIndexTransformer = sectionIndexTransformer
|
self.sectionIndexTransformer = sectionIndexTransformer
|
||||||
@@ -68,6 +68,6 @@ public struct SectionBy {
|
|||||||
|
|
||||||
// MARK: Internal
|
// MARK: Internal
|
||||||
|
|
||||||
internal let sectionKeyPath: KeyPath
|
internal let sectionKeyPath: RawKeyPath
|
||||||
internal let sectionIndexTransformer: (_ sectionName: String?) -> String?
|
internal let sectionIndexTransformer: (_ sectionName: String?) -> String?
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -74,7 +74,7 @@ public enum SelectTerm: ExpressibleByStringLiteral, Hashable {
|
|||||||
- parameter keyPath: the attribute name
|
- parameter keyPath: the attribute name
|
||||||
- returns: a `SelectTerm` to a `Select` clause for querying an entity attribute
|
- returns: a `SelectTerm` to a `Select` clause for querying an entity attribute
|
||||||
*/
|
*/
|
||||||
public static func attribute(_ keyPath: KeyPath) -> SelectTerm {
|
public static func attribute(_ keyPath: RawKeyPath) -> SelectTerm {
|
||||||
|
|
||||||
return ._attribute(keyPath)
|
return ._attribute(keyPath)
|
||||||
}
|
}
|
||||||
@@ -91,7 +91,7 @@ public enum SelectTerm: ExpressibleByStringLiteral, Hashable {
|
|||||||
- parameter alias: the dictionary key to use to access the result. Ignored when the query return value is not an `NSDictionary`. If `nil`, the default key "average(<attributeName>)" is used
|
- parameter alias: the dictionary key to use to access the result. Ignored when the query return value is not an `NSDictionary`. If `nil`, the default key "average(<attributeName>)" is used
|
||||||
- returns: a `SelectTerm` to a `Select` clause for querying the average value of an attribute
|
- returns: a `SelectTerm` to a `Select` clause for querying the average value of an attribute
|
||||||
*/
|
*/
|
||||||
public static func average(_ keyPath: KeyPath, as alias: KeyPath? = nil) -> SelectTerm {
|
public static func average(_ keyPath: RawKeyPath, as alias: RawKeyPath? = nil) -> SelectTerm {
|
||||||
|
|
||||||
return ._aggregate(
|
return ._aggregate(
|
||||||
function: "average:",
|
function: "average:",
|
||||||
@@ -113,7 +113,7 @@ public enum SelectTerm: ExpressibleByStringLiteral, Hashable {
|
|||||||
- parameter alias: the dictionary key to use to access the result. Ignored when the query return value is not an `NSDictionary`. If `nil`, the default key "count(<attributeName>)" is used
|
- parameter alias: the dictionary key to use to access the result. Ignored when the query return value is not an `NSDictionary`. If `nil`, the default key "count(<attributeName>)" is used
|
||||||
- returns: a `SelectTerm` to a `Select` clause for a count query
|
- returns: a `SelectTerm` to a `Select` clause for a count query
|
||||||
*/
|
*/
|
||||||
public static func count(_ keyPath: KeyPath, as alias: KeyPath? = nil) -> SelectTerm {
|
public static func count(_ keyPath: RawKeyPath, as alias: RawKeyPath? = nil) -> SelectTerm {
|
||||||
|
|
||||||
return ._aggregate(
|
return ._aggregate(
|
||||||
function: "count:",
|
function: "count:",
|
||||||
@@ -135,7 +135,7 @@ public enum SelectTerm: ExpressibleByStringLiteral, Hashable {
|
|||||||
- parameter alias: the dictionary key to use to access the result. Ignored when the query return value is not an `NSDictionary`. If `nil`, the default key "max(<attributeName>)" is used
|
- parameter alias: the dictionary key to use to access the result. Ignored when the query return value is not an `NSDictionary`. If `nil`, the default key "max(<attributeName>)" is used
|
||||||
- returns: a `SelectTerm` to a `Select` clause for querying the maximum value for an attribute
|
- returns: a `SelectTerm` to a `Select` clause for querying the maximum value for an attribute
|
||||||
*/
|
*/
|
||||||
public static func maximum(_ keyPath: KeyPath, as alias: KeyPath? = nil) -> SelectTerm {
|
public static func maximum(_ keyPath: RawKeyPath, as alias: RawKeyPath? = nil) -> SelectTerm {
|
||||||
|
|
||||||
return ._aggregate(
|
return ._aggregate(
|
||||||
function: "max:",
|
function: "max:",
|
||||||
@@ -157,7 +157,7 @@ public enum SelectTerm: ExpressibleByStringLiteral, Hashable {
|
|||||||
- parameter alias: the dictionary key to use to access the result. Ignored when the query return value is not an `NSDictionary`. If `nil`, the default key "min(<attributeName>)" is used
|
- parameter alias: the dictionary key to use to access the result. Ignored when the query return value is not an `NSDictionary`. If `nil`, the default key "min(<attributeName>)" is used
|
||||||
- returns: a `SelectTerm` to a `Select` clause for querying the minimum value for an attribute
|
- returns: a `SelectTerm` to a `Select` clause for querying the minimum value for an attribute
|
||||||
*/
|
*/
|
||||||
public static func minimum(_ keyPath: KeyPath, as alias: KeyPath? = nil) -> SelectTerm {
|
public static func minimum(_ keyPath: RawKeyPath, as alias: RawKeyPath? = nil) -> SelectTerm {
|
||||||
|
|
||||||
return ._aggregate(
|
return ._aggregate(
|
||||||
function: "min:",
|
function: "min:",
|
||||||
@@ -179,7 +179,7 @@ public enum SelectTerm: ExpressibleByStringLiteral, Hashable {
|
|||||||
- parameter alias: the dictionary key to use to access the result. Ignored when the query return value is not an `NSDictionary`. If `nil`, the default key "sum(<attributeName>)" is used
|
- parameter alias: the dictionary key to use to access the result. Ignored when the query return value is not an `NSDictionary`. If `nil`, the default key "sum(<attributeName>)" is used
|
||||||
- returns: a `SelectTerm` to a `Select` clause for querying the sum value for an attribute
|
- returns: a `SelectTerm` to a `Select` clause for querying the sum value for an attribute
|
||||||
*/
|
*/
|
||||||
public static func sum(_ keyPath: KeyPath, as alias: KeyPath? = nil) -> SelectTerm {
|
public static func sum(_ keyPath: RawKeyPath, as alias: RawKeyPath? = nil) -> SelectTerm {
|
||||||
|
|
||||||
return ._aggregate(
|
return ._aggregate(
|
||||||
function: "sum:",
|
function: "sum:",
|
||||||
@@ -202,7 +202,7 @@ public enum SelectTerm: ExpressibleByStringLiteral, Hashable {
|
|||||||
- parameter alias: the dictionary key to use to access the result. Ignored when the query return value is not an `NSDictionary`. If `nil`, the default key "objecID" is used
|
- parameter alias: the dictionary key to use to access the result. Ignored when the query return value is not an `NSDictionary`. If `nil`, the default key "objecID" is used
|
||||||
- returns: a `SelectTerm` to a `Select` clause for querying the sum value for an attribute
|
- returns: a `SelectTerm` to a `Select` clause for querying the sum value for an attribute
|
||||||
*/
|
*/
|
||||||
public static func objectID(as alias: KeyPath? = nil) -> SelectTerm {
|
public static func objectID(as alias: RawKeyPath? = nil) -> SelectTerm {
|
||||||
|
|
||||||
return ._identity(
|
return ._identity(
|
||||||
alias: alias ?? "objectID",
|
alias: alias ?? "objectID",
|
||||||
@@ -213,17 +213,17 @@ public enum SelectTerm: ExpressibleByStringLiteral, Hashable {
|
|||||||
|
|
||||||
// MARK: ExpressibleByStringLiteral
|
// MARK: ExpressibleByStringLiteral
|
||||||
|
|
||||||
public init(stringLiteral value: KeyPath) {
|
public init(stringLiteral value: RawKeyPath) {
|
||||||
|
|
||||||
self = ._attribute(value)
|
self = ._attribute(value)
|
||||||
}
|
}
|
||||||
|
|
||||||
public init(unicodeScalarLiteral value: KeyPath) {
|
public init(unicodeScalarLiteral value: RawKeyPath) {
|
||||||
|
|
||||||
self = ._attribute(value)
|
self = ._attribute(value)
|
||||||
}
|
}
|
||||||
|
|
||||||
public init(extendedGraphemeClusterLiteral value: KeyPath) {
|
public init(extendedGraphemeClusterLiteral value: RawKeyPath) {
|
||||||
|
|
||||||
self = ._attribute(value)
|
self = ._attribute(value)
|
||||||
}
|
}
|
||||||
@@ -274,8 +274,8 @@ public enum SelectTerm: ExpressibleByStringLiteral, Hashable {
|
|||||||
|
|
||||||
// MARK: Internal
|
// MARK: Internal
|
||||||
|
|
||||||
case _attribute(KeyPath)
|
case _attribute(RawKeyPath)
|
||||||
case _aggregate(function: String, keyPath: KeyPath, alias: String, nativeType: NSAttributeType)
|
case _aggregate(function: String, keyPath: RawKeyPath, alias: String, nativeType: NSAttributeType)
|
||||||
case _identity(alias: String, nativeType: NSAttributeType)
|
case _identity(alias: String, nativeType: NSAttributeType)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -479,7 +479,7 @@ internal extension Collection where Iterator.Element == SelectTerm {
|
|||||||
fetchRequest.propertiesToFetch = propertiesToFetch
|
fetchRequest.propertiesToFetch = propertiesToFetch
|
||||||
}
|
}
|
||||||
|
|
||||||
internal func keyPathForFirstSelectTerm() -> KeyPath {
|
internal func keyPathForFirstSelectTerm() -> RawKeyPath {
|
||||||
|
|
||||||
switch self.first! {
|
switch self.first! {
|
||||||
|
|
||||||
|
|||||||
@@ -117,7 +117,7 @@ public enum ValueContainer<O: CoreStoreObject> {
|
|||||||
- parameter affectedByKeyPaths: a set of key paths for properties whose values affect the value of the receiver. This is similar to `NSManagedObject.keyPathsForValuesAffectingValue(forKey:)`.
|
- 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 init(
|
public init(
|
||||||
_ keyPath: KeyPath,
|
_ keyPath: RawKeyPath,
|
||||||
`default`: V,
|
`default`: V,
|
||||||
isIndexed: Bool = false,
|
isIndexed: Bool = false,
|
||||||
isTransient: Bool = false,
|
isTransient: Bool = false,
|
||||||
@@ -130,7 +130,7 @@ public enum ValueContainer<O: CoreStoreObject> {
|
|||||||
self.keyPath = keyPath
|
self.keyPath = keyPath
|
||||||
self.isIndexed = isIndexed
|
self.isIndexed = isIndexed
|
||||||
self.isTransient = isTransient
|
self.isTransient = isTransient
|
||||||
self.defaultValue = `default`.cs_toImportableNativeType()
|
self.defaultValue = `default`.cs_toQueryableNativeType()
|
||||||
self.versionHashModifier = versionHashModifier
|
self.versionHashModifier = versionHashModifier
|
||||||
self.renamingIdentifier = renamingIdentifier
|
self.renamingIdentifier = renamingIdentifier
|
||||||
self.customGetter = customGetter
|
self.customGetter = customGetter
|
||||||
@@ -156,7 +156,7 @@ public enum ValueContainer<O: CoreStoreObject> {
|
|||||||
|
|
||||||
return object.rawObject!.getValue(
|
return object.rawObject!.getValue(
|
||||||
forKvcKey: self.keyPath,
|
forKvcKey: self.keyPath,
|
||||||
didGetValue: { V.cs_fromImportableNativeType($0 as! V.ImportableNativeType)! }
|
didGetValue: { V.cs_fromQueryableNativeType($0 as! V.QueryableNativeType)! }
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
@@ -179,7 +179,7 @@ public enum ValueContainer<O: CoreStoreObject> {
|
|||||||
object.rawObject!.setValue(
|
object.rawObject!.setValue(
|
||||||
newValue,
|
newValue,
|
||||||
forKvcKey: self.keyPath,
|
forKvcKey: self.keyPath,
|
||||||
willSetValue: { $0.cs_toImportableNativeType() }
|
willSetValue: { $0.cs_toQueryableNativeType() }
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
newValue
|
newValue
|
||||||
@@ -195,7 +195,7 @@ public enum ValueContainer<O: CoreStoreObject> {
|
|||||||
return V.cs_rawAttributeType
|
return V.cs_rawAttributeType
|
||||||
}
|
}
|
||||||
|
|
||||||
public let keyPath: KeyPath
|
public let keyPath: RawKeyPath
|
||||||
|
|
||||||
internal let isOptional = false
|
internal let isOptional = false
|
||||||
internal let isIndexed: Bool
|
internal let isIndexed: Bool
|
||||||
@@ -262,7 +262,7 @@ public enum ValueContainer<O: CoreStoreObject> {
|
|||||||
- parameter affectedByKeyPaths: a set of key paths for properties whose values affect the value of the receiver. This is similar to `NSManagedObject.keyPathsForValuesAffectingValue(forKey:)`.
|
- 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 init(
|
public init(
|
||||||
_ keyPath: KeyPath,
|
_ keyPath: RawKeyPath,
|
||||||
`default`: V? = nil,
|
`default`: V? = nil,
|
||||||
isIndexed: Bool = false,
|
isIndexed: Bool = false,
|
||||||
isTransient: Bool = false,
|
isTransient: Bool = false,
|
||||||
@@ -275,7 +275,7 @@ public enum ValueContainer<O: CoreStoreObject> {
|
|||||||
self.keyPath = keyPath
|
self.keyPath = keyPath
|
||||||
self.isIndexed = isIndexed
|
self.isIndexed = isIndexed
|
||||||
self.isTransient = isTransient
|
self.isTransient = isTransient
|
||||||
self.defaultValue = `default`?.cs_toImportableNativeType()
|
self.defaultValue = `default`?.cs_toQueryableNativeType()
|
||||||
self.versionHashModifier = versionHashModifier
|
self.versionHashModifier = versionHashModifier
|
||||||
self.renamingIdentifier = renamingIdentifier
|
self.renamingIdentifier = renamingIdentifier
|
||||||
self.customGetter = customGetter
|
self.customGetter = customGetter
|
||||||
@@ -301,7 +301,7 @@ public enum ValueContainer<O: CoreStoreObject> {
|
|||||||
|
|
||||||
return object.rawObject!.getValue(
|
return object.rawObject!.getValue(
|
||||||
forKvcKey: self.keyPath,
|
forKvcKey: self.keyPath,
|
||||||
didGetValue: { ($0 as! V.ImportableNativeType?).flatMap(V.cs_fromImportableNativeType) }
|
didGetValue: { ($0 as! V.QueryableNativeType?).flatMap(V.cs_fromQueryableNativeType) }
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
@@ -324,7 +324,7 @@ public enum ValueContainer<O: CoreStoreObject> {
|
|||||||
object.rawObject!.setValue(
|
object.rawObject!.setValue(
|
||||||
newValue,
|
newValue,
|
||||||
forKvcKey: self.keyPath,
|
forKvcKey: self.keyPath,
|
||||||
willSetValue: { $0?.cs_toImportableNativeType() }
|
willSetValue: { $0?.cs_toQueryableNativeType() }
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
newValue
|
newValue
|
||||||
@@ -340,7 +340,7 @@ public enum ValueContainer<O: CoreStoreObject> {
|
|||||||
return V.cs_rawAttributeType
|
return V.cs_rawAttributeType
|
||||||
}
|
}
|
||||||
|
|
||||||
public let keyPath: KeyPath
|
public let keyPath: RawKeyPath
|
||||||
internal let isOptional = true
|
internal let isOptional = true
|
||||||
internal let isIndexed: Bool
|
internal let isIndexed: Bool
|
||||||
internal let isTransient: Bool
|
internal let isTransient: Bool
|
||||||
@@ -386,7 +386,7 @@ public extension ValueContainer.Required where V: EmptyableAttributeType {
|
|||||||
- parameter affectedByKeyPaths: a set of key paths for properties whose values affect the value of the receiver. This is similar to `NSManagedObject.keyPathsForValuesAffectingValue(forKey:)`.
|
- 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(
|
public convenience init(
|
||||||
_ keyPath: KeyPath,
|
_ keyPath: RawKeyPath,
|
||||||
isIndexed: Bool = false,
|
isIndexed: Bool = false,
|
||||||
isTransient: Bool = false,
|
isTransient: Bool = false,
|
||||||
versionHashModifier: String? = nil,
|
versionHashModifier: String? = nil,
|
||||||
@@ -462,7 +462,7 @@ public enum TransformableContainer<O: CoreStoreObject> {
|
|||||||
- parameter affectedByKeyPaths: a set of key paths for properties whose values affect the value of the receiver. This is similar to `NSManagedObject.keyPathsForValuesAffectingValue(forKey:)`.
|
- 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 init(
|
public init(
|
||||||
_ keyPath: KeyPath,
|
_ keyPath: RawKeyPath,
|
||||||
`default`: V,
|
`default`: V,
|
||||||
isIndexed: Bool = false,
|
isIndexed: Bool = false,
|
||||||
isTransient: Bool = false,
|
isTransient: Bool = false,
|
||||||
@@ -539,7 +539,7 @@ public enum TransformableContainer<O: CoreStoreObject> {
|
|||||||
return .transformableAttributeType
|
return .transformableAttributeType
|
||||||
}
|
}
|
||||||
|
|
||||||
public let keyPath: KeyPath
|
public let keyPath: RawKeyPath
|
||||||
|
|
||||||
internal let isOptional = false
|
internal let isOptional = false
|
||||||
internal let isIndexed: Bool
|
internal let isIndexed: Bool
|
||||||
@@ -600,7 +600,7 @@ public enum TransformableContainer<O: CoreStoreObject> {
|
|||||||
- parameter affectedByKeyPaths: a set of key paths for properties whose values affect the value of the receiver. This is similar to `NSManagedObject.keyPathsForValuesAffectingValue(forKey:)`.
|
- 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 init(
|
public init(
|
||||||
_ keyPath: KeyPath,
|
_ keyPath: RawKeyPath,
|
||||||
`default`: V? = nil,
|
`default`: V? = nil,
|
||||||
isIndexed: Bool = false,
|
isIndexed: Bool = false,
|
||||||
isTransient: Bool = false,
|
isTransient: Bool = false,
|
||||||
@@ -677,7 +677,7 @@ public enum TransformableContainer<O: CoreStoreObject> {
|
|||||||
return .transformableAttributeType
|
return .transformableAttributeType
|
||||||
}
|
}
|
||||||
|
|
||||||
public let keyPath: KeyPath
|
public let keyPath: RawKeyPath
|
||||||
|
|
||||||
internal let isOptional = true
|
internal let isOptional = true
|
||||||
internal let isIndexed: Bool
|
internal let isIndexed: Bool
|
||||||
@@ -995,7 +995,7 @@ internal protocol AttributeProtocol: class {
|
|||||||
|
|
||||||
static var attributeType: NSAttributeType { get }
|
static var attributeType: NSAttributeType { get }
|
||||||
|
|
||||||
var keyPath: KeyPath { get }
|
var keyPath: RawKeyPath { get }
|
||||||
var isOptional: Bool { get }
|
var isOptional: Bool { get }
|
||||||
var isIndexed: Bool { get }
|
var isIndexed: Bool { get }
|
||||||
var isTransient: Bool { get }
|
var isTransient: Bool { get }
|
||||||
|
|||||||
@@ -109,7 +109,7 @@ public struct Where: FetchClause, QueryClause, DeleteClause, Hashable {
|
|||||||
- parameter keyPath: the keyPath to compare with
|
- parameter keyPath: the keyPath to compare with
|
||||||
- parameter value: the arguments for the `==` operator
|
- parameter value: the arguments for the `==` operator
|
||||||
*/
|
*/
|
||||||
public init(_ keyPath: KeyPath, isEqualTo value: Void?) {
|
public init(_ keyPath: RawKeyPath, isEqualTo value: Void?) {
|
||||||
|
|
||||||
self.init(NSPredicate(format: "\(keyPath) == nil"))
|
self.init(NSPredicate(format: "\(keyPath) == nil"))
|
||||||
}
|
}
|
||||||
@@ -120,7 +120,7 @@ public struct Where: FetchClause, QueryClause, DeleteClause, Hashable {
|
|||||||
- parameter keyPath: the keyPath to compare with
|
- parameter keyPath: the keyPath to compare with
|
||||||
- parameter value: the arguments for the `==` operator
|
- parameter value: the arguments for the `==` operator
|
||||||
*/
|
*/
|
||||||
public init<T: QueryableAttributeType>(_ keyPath: KeyPath, isEqualTo value: T?) {
|
public init<T: QueryableAttributeType>(_ keyPath: RawKeyPath, isEqualTo value: T?) {
|
||||||
|
|
||||||
switch value {
|
switch value {
|
||||||
|
|
||||||
@@ -139,7 +139,7 @@ public struct Where: FetchClause, QueryClause, DeleteClause, Hashable {
|
|||||||
- parameter keyPath: the keyPath to compare with
|
- parameter keyPath: the keyPath to compare with
|
||||||
- parameter object: the arguments for the `==` operator
|
- parameter object: the arguments for the `==` operator
|
||||||
*/
|
*/
|
||||||
public init<T: DynamicObject>(_ keyPath: KeyPath, isEqualTo object: T?) {
|
public init<T: DynamicObject>(_ keyPath: RawKeyPath, isEqualTo object: T?) {
|
||||||
|
|
||||||
switch object {
|
switch object {
|
||||||
|
|
||||||
@@ -158,7 +158,7 @@ public struct Where: FetchClause, QueryClause, DeleteClause, Hashable {
|
|||||||
- parameter keyPath: the keyPath to compare with
|
- parameter keyPath: the keyPath to compare with
|
||||||
- parameter list: the sequence to check membership of
|
- parameter list: the sequence to check membership of
|
||||||
*/
|
*/
|
||||||
public init<S: Sequence>(_ keyPath: KeyPath, isMemberOf list: S) where S.Iterator.Element: QueryableAttributeType {
|
public init<S: Sequence>(_ keyPath: RawKeyPath, isMemberOf list: S) where S.Iterator.Element: QueryableAttributeType {
|
||||||
|
|
||||||
self.init(NSPredicate(format: "\(keyPath) IN %@", list.map({ $0.cs_toQueryableNativeType() }) as NSArray))
|
self.init(NSPredicate(format: "\(keyPath) IN %@", list.map({ $0.cs_toQueryableNativeType() }) as NSArray))
|
||||||
}
|
}
|
||||||
@@ -169,7 +169,7 @@ public struct Where: FetchClause, QueryClause, DeleteClause, Hashable {
|
|||||||
- parameter keyPath: the keyPath to compare with
|
- parameter keyPath: the keyPath to compare with
|
||||||
- parameter list: the sequence to check membership of
|
- parameter list: the sequence to check membership of
|
||||||
*/
|
*/
|
||||||
public init<S: Sequence>(_ keyPath: KeyPath, isMemberOf list: S) where S.Iterator.Element: DynamicObject {
|
public init<S: Sequence>(_ keyPath: RawKeyPath, isMemberOf list: S) where S.Iterator.Element: DynamicObject {
|
||||||
|
|
||||||
self.init(NSPredicate(format: "\(keyPath) IN %@", list.map({ $0.cs_id() }) as NSArray))
|
self.init(NSPredicate(format: "\(keyPath) IN %@", list.map({ $0.cs_id() }) as NSArray))
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user