Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add ParseBytes and ParsePolygon #190

Merged
merged 2 commits into from Jul 10, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Expand Up @@ -50,6 +50,25 @@ struct GameScore: ParseObject {
}
}

struct GameData: ParseObject {
//: Those are required for Object
var objectId: String?
var createdAt: Date?
var updatedAt: Date?
var ACL: ParseACL?

//: Your own properties.
var polygon: ParsePolygon?
//: `ParseBytes` needs to be a part of the original schema
//: or else you will need your masterKey to force an upgrade.
var bytes: ParseBytes?

init (bytes: ParseBytes?, polygon: ParsePolygon) {
self.bytes = bytes
self.polygon = polygon
}
}

//: Define initial GameScores.
let score = GameScore(score: 10)
let score2 = GameScore(score: 3)
Expand Down Expand Up @@ -308,6 +327,24 @@ do {
assertionFailure("Error deleting: \(error)")
}*/

//: How to add `ParseBytes` and `ParsePolygon` to objects.
let points = [
try ParseGeoPoint(latitude: 0, longitude: 0),
try ParseGeoPoint(latitude: 0, longitude: 1),
try ParseGeoPoint(latitude: 1, longitude: 1),
try ParseGeoPoint(latitude: 1, longitude: 0),
try ParseGeoPoint(latitude: 0, longitude: 0)
]
do {
let polygon = try ParsePolygon(points)
let bytes = ParseBytes(data: "hello world".data(using: .utf8)!)
var gameData = GameData(bytes: bytes, polygon: polygon)
gameData = try gameData.save()
print("Successfully saved: \(gameData)")
} catch {
print("Error saving: \(error.localizedDescription)")
}

PlaygroundPage.current.finishExecution()

//: [Next](@next)
Expand Up @@ -32,7 +32,9 @@ struct GameScore: ParseObject {

//: Define initial GameScore.
var score = GameScore(score: 10)
score.location = ParseGeoPoint(latitude: 40.0, longitude: -30.0)
do {
try score.location = ParseGeoPoint(latitude: 40.0, longitude: -30.0)
}

/*: Save asynchronously (preferred way) - performs work on background
queue and returns to specified callbackQueue.
Expand Down Expand Up @@ -61,22 +63,26 @@ score.save { result in
}

//: Now we will show how to query based on the `ParseGeoPoint`.
let pointToFind = ParseGeoPoint(latitude: 40.0, longitude: -30.0)
var query: Query<GameScore> //: Store query for later user
var constraints = [QueryConstraint]()
constraints.append(near(key: "location", geoPoint: pointToFind))

let query = GameScore.query(constraints)
query.find { results in
switch results {
case .success(let scores):
do {
let pointToFind = try ParseGeoPoint(latitude: 40.0, longitude: -30.0)
constraints.append(near(key: "location", geoPoint: pointToFind))

assert(scores.count >= 1)
scores.forEach { (score) in
print("Someone with objectId \"\(score.objectId!)\" has a score of \"\(score.score)\" near me")
}
query = GameScore.query(constraints)
query.find { results in
switch results {
case .success(let scores):

case .failure(let error):
assertionFailure("Error querying: \(error)")
assert(scores.count >= 1)
scores.forEach { (score) in
print("Someone with objectId \"\(score.objectId!)\" has a score of \"\(score.score)\" near me")
}

case .failure(let error):
assertionFailure("Error querying: \(error)")
}
}
}

Expand Down
36 changes: 36 additions & 0 deletions ParseSwift.xcodeproj/project.pbxproj
Expand Up @@ -369,6 +369,20 @@
911DB12E24C4837E0027F3C7 /* APICommandTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 911DB12D24C4837E0027F3C7 /* APICommandTests.swift */; };
911DB13324C494390027F3C7 /* MockURLProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 911DB13224C494390027F3C7 /* MockURLProtocol.swift */; };
911DB13624C4FC100027F3C7 /* ParseObjectTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 911DB13524C4FC100027F3C7 /* ParseObjectTests.swift */; };
91285B132698DBF20051B544 /* ParseBytes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91285B122698DBF20051B544 /* ParseBytes.swift */; };
91285B142698DBF20051B544 /* ParseBytes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91285B122698DBF20051B544 /* ParseBytes.swift */; };
91285B152698DBF20051B544 /* ParseBytes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91285B122698DBF20051B544 /* ParseBytes.swift */; };
91285B162698DBF20051B544 /* ParseBytes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91285B122698DBF20051B544 /* ParseBytes.swift */; };
91285B182698E66D0051B544 /* ParseBytesTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91285B172698E66D0051B544 /* ParseBytesTests.swift */; };
91285B192698E66D0051B544 /* ParseBytesTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91285B172698E66D0051B544 /* ParseBytesTests.swift */; };
91285B1A2698E66D0051B544 /* ParseBytesTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91285B172698E66D0051B544 /* ParseBytesTests.swift */; };
91285B1C26990D7F0051B544 /* ParsePolygon.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91285B1B26990D7F0051B544 /* ParsePolygon.swift */; };
91285B1D26990D7F0051B544 /* ParsePolygon.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91285B1B26990D7F0051B544 /* ParsePolygon.swift */; };
91285B1E26990D7F0051B544 /* ParsePolygon.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91285B1B26990D7F0051B544 /* ParsePolygon.swift */; };
91285B1F26990D7F0051B544 /* ParsePolygon.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91285B1B26990D7F0051B544 /* ParsePolygon.swift */; };
91285B2126991EE80051B544 /* ParsePolygonTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91285B2026991EE80051B544 /* ParsePolygonTests.swift */; };
91285B2226991EE80051B544 /* ParsePolygonTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91285B2026991EE80051B544 /* ParsePolygonTests.swift */; };
91285B2326991EE80051B544 /* ParsePolygonTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91285B2026991EE80051B544 /* ParsePolygonTests.swift */; };
912C9BCF24D3005D009947C3 /* ParseSwift_watchOS.h in Headers */ = {isa = PBXBuildFile; fileRef = 912C9BCD24D3005D009947C3 /* ParseSwift_watchOS.h */; settings = {ATTRIBUTES = (Public, ); }; };
912C9BDC24D3011F009947C3 /* ParseSwift_tvOS.h in Headers */ = {isa = PBXBuildFile; fileRef = 912C9BDA24D3011F009947C3 /* ParseSwift_tvOS.h */; settings = {ATTRIBUTES = (Public, ); }; };
912C9BE024D302B0009947C3 /* Parse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A82B7EE1F254B820063D731 /* Parse.swift */; };
Expand Down Expand Up @@ -707,6 +721,10 @@
911DB12D24C4837E0027F3C7 /* APICommandTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = APICommandTests.swift; sourceTree = "<group>"; };
911DB13224C494390027F3C7 /* MockURLProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockURLProtocol.swift; sourceTree = "<group>"; };
911DB13524C4FC100027F3C7 /* ParseObjectTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ParseObjectTests.swift; sourceTree = "<group>"; };
91285B122698DBF20051B544 /* ParseBytes.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ParseBytes.swift; sourceTree = "<group>"; };
91285B172698E66D0051B544 /* ParseBytesTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ParseBytesTests.swift; sourceTree = "<group>"; };
91285B1B26990D7F0051B544 /* ParsePolygon.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ParsePolygon.swift; sourceTree = "<group>"; };
91285B2026991EE80051B544 /* ParsePolygonTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ParsePolygonTests.swift; sourceTree = "<group>"; };
912C9BCB24D3005D009947C3 /* ParseSwift.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ParseSwift.framework; sourceTree = BUILT_PRODUCTS_DIR; };
912C9BCD24D3005D009947C3 /* ParseSwift_watchOS.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ParseSwift_watchOS.h; sourceTree = "<group>"; };
912C9BCE24D3005D009947C3 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
Expand Down Expand Up @@ -884,6 +902,7 @@
7044C24225C5EA360011F6E7 /* ParseAppleCombineTests.swift */,
70C5502125B3D8F700B5DBC2 /* ParseAppleTests.swift */,
70A2D81E25B36A7D001BEB7D /* ParseAuthenticationTests.swift */,
91285B172698E66D0051B544 /* ParseBytesTests.swift */,
7044C21225C5DE490011F6E7 /* ParseCloudCombineTests.swift */,
916786EF259BC59600BB5B4E /* ParseCloudTests.swift */,
7044C21F25C5E0160011F6E7 /* ParseConfigCombineTests.swift */,
Expand Down Expand Up @@ -911,6 +930,7 @@
70C5508425B4A68700B5DBC2 /* ParseOperationTests.swift */,
70E09E1B262F0634002DD451 /* ParsePointerCombineTests.swift */,
70CE1D882545BF730018D572 /* ParsePointerTests.swift */,
91285B2026991EE80051B544 /* ParsePolygonTests.swift */,
7044C20525C5D6780011F6E7 /* ParseQueryCombineTests.swift */,
70C7DC1F24D20F180050419B /* ParseQueryTests.swift */,
70D1BD8625B8C37200A42E7C /* ParseRelationTests.swift */,
Expand Down Expand Up @@ -1188,6 +1208,8 @@
F97B45C024D9C6F200F4A88B /* ParseACL.swift */,
70170A432656B02C0070C905 /* ParseAnalytics.swift */,
70170A482656E2FE0070C905 /* ParseAnalytics+combine.swift */,
91285B122698DBF20051B544 /* ParseBytes.swift */,
91285B1B26990D7F0051B544 /* ParsePolygon.swift */,
916786E1259B7DDA00BB5B4E /* ParseCloud.swift */,
7044C17425C4ECFF0011F6E7 /* ParseCloud+combine.swift */,
70D1BDB925BB17A600A42E7C /* ParseConfig.swift */,
Expand Down Expand Up @@ -1711,6 +1733,7 @@
70D1BDBA25BB17A600A42E7C /* ParseConfig.swift in Sources */,
F97B465224D9C78C00F4A88B /* AddUnique.swift in Sources */,
91679D64268E596300F71809 /* ParseVersion.swift in Sources */,
91285B1C26990D7F0051B544 /* ParsePolygon.swift in Sources */,
F97B45D624D9C6F200F4A88B /* ParseEncoder.swift in Sources */,
70F79A272639D84600731C46 /* ParseHealth+combine.swift in Sources */,
700395A325A119430052CB31 /* Operations.swift in Sources */,
Expand Down Expand Up @@ -1755,6 +1778,7 @@
F97B45EA24D9C6F200F4A88B /* ParseGeoPoint.swift in Sources */,
F97B460224D9C6F200F4A88B /* NoBody.swift in Sources */,
700395BA25A1470F0052CB31 /* Subscription.swift in Sources */,
91285B132698DBF20051B544 /* ParseBytes.swift in Sources */,
7016ED5625C4C32B00038648 /* ParseInstallation+combine.swift in Sources */,
7003972A25A3B0140052CB31 /* ParseURLSessionDelegate.swift in Sources */,
700395D125A147BE0052CB31 /* ParseSubscription.swift in Sources */,
Expand Down Expand Up @@ -1797,11 +1821,13 @@
89899D772603CF66002E2043 /* ParseFacebookTests.swift in Sources */,
70386A4625D99C8B0048EC1B /* ParseLDAPTests.swift in Sources */,
709B40C1268F999000ED2EAC /* IOS13Tests.swift in Sources */,
91285B182698E66D0051B544 /* ParseBytesTests.swift in Sources */,
911DB12E24C4837E0027F3C7 /* APICommandTests.swift in Sources */,
70732C5A2606CCAD000CAB81 /* ParseObjectCustomObjectIdTests.swift in Sources */,
911DB12C24C3F7720027F3C7 /* MockURLResponse.swift in Sources */,
7044C24325C5EA360011F6E7 /* ParseAppleCombineTests.swift in Sources */,
70DFEA8A2618E77800F8EB4B /* InitializeSDKTests.swift in Sources */,
91285B2126991EE80051B544 /* ParsePolygonTests.swift in Sources */,
70170A4E2656EBA50070C905 /* ParseAnalyticsTests.swift in Sources */,
7044C1DF25C5C70D0011F6E7 /* ParseObjectCombine.swift in Sources */,
89899D9F26045998002E2043 /* ParseTwitterCombineTests.swift in Sources */,
Expand Down Expand Up @@ -1868,6 +1894,7 @@
70D1BDBB25BB17A600A42E7C /* ParseConfig.swift in Sources */,
F97B465324D9C78C00F4A88B /* AddUnique.swift in Sources */,
91679D65268E596300F71809 /* ParseVersion.swift in Sources */,
91285B1D26990D7F0051B544 /* ParsePolygon.swift in Sources */,
F97B45D724D9C6F200F4A88B /* ParseEncoder.swift in Sources */,
70F79A282639D84600731C46 /* ParseHealth+combine.swift in Sources */,
700395A425A119430052CB31 /* Operations.swift in Sources */,
Expand Down Expand Up @@ -1912,6 +1939,7 @@
F97B45EB24D9C6F200F4A88B /* ParseGeoPoint.swift in Sources */,
F97B460324D9C6F200F4A88B /* NoBody.swift in Sources */,
700395BB25A1470F0052CB31 /* Subscription.swift in Sources */,
91285B142698DBF20051B544 /* ParseBytes.swift in Sources */,
7016ED5725C4C32B00038648 /* ParseInstallation+combine.swift in Sources */,
7003972B25A3B0140052CB31 /* ParseURLSessionDelegate.swift in Sources */,
700395D225A147BE0052CB31 /* ParseSubscription.swift in Sources */,
Expand Down Expand Up @@ -1963,11 +1991,13 @@
89899D822603CF67002E2043 /* ParseFacebookTests.swift in Sources */,
70386A4825D99C8B0048EC1B /* ParseLDAPTests.swift in Sources */,
709B40C3268F999000ED2EAC /* IOS13Tests.swift in Sources */,
91285B1A2698E66D0051B544 /* ParseBytesTests.swift in Sources */,
709B984C2556ECAA00507778 /* APICommandTests.swift in Sources */,
70732C5C2606CCAD000CAB81 /* ParseObjectCustomObjectIdTests.swift in Sources */,
709B984D2556ECAA00507778 /* AnyDecodableTests.swift in Sources */,
7044C24525C5EA360011F6E7 /* ParseAppleCombineTests.swift in Sources */,
70DFEA8C2618E77800F8EB4B /* InitializeSDKTests.swift in Sources */,
91285B2326991EE80051B544 /* ParsePolygonTests.swift in Sources */,
70170A502656EBA50070C905 /* ParseAnalyticsTests.swift in Sources */,
7044C1E125C5C70D0011F6E7 /* ParseObjectCombine.swift in Sources */,
89899DA126045998002E2043 /* ParseTwitterCombineTests.swift in Sources */,
Expand Down Expand Up @@ -2027,11 +2057,13 @@
89899D812603CF67002E2043 /* ParseFacebookTests.swift in Sources */,
70386A4725D99C8B0048EC1B /* ParseLDAPTests.swift in Sources */,
709B40C2268F999000ED2EAC /* IOS13Tests.swift in Sources */,
91285B192698E66D0051B544 /* ParseBytesTests.swift in Sources */,
70F2E2B5254F283000B2EA5C /* ParseEncoderExtraTests.swift in Sources */,
70732C5B2606CCAD000CAB81 /* ParseObjectCustomObjectIdTests.swift in Sources */,
70F2E2C2254F283000B2EA5C /* APICommandTests.swift in Sources */,
7044C24425C5EA360011F6E7 /* ParseAppleCombineTests.swift in Sources */,
70DFEA8B2618E77800F8EB4B /* InitializeSDKTests.swift in Sources */,
91285B2226991EE80051B544 /* ParsePolygonTests.swift in Sources */,
70170A4F2656EBA50070C905 /* ParseAnalyticsTests.swift in Sources */,
7044C1E025C5C70D0011F6E7 /* ParseObjectCombine.swift in Sources */,
89899DA026045998002E2043 /* ParseTwitterCombineTests.swift in Sources */,
Expand Down Expand Up @@ -2098,6 +2130,7 @@
70D1BDBD25BB17A600A42E7C /* ParseConfig.swift in Sources */,
F97B45E524D9C6F200F4A88B /* AnyEncodable.swift in Sources */,
91679D67268E596300F71809 /* ParseVersion.swift in Sources */,
91285B1F26990D7F0051B544 /* ParsePolygon.swift in Sources */,
F97B465D24D9C78C00F4A88B /* Increment.swift in Sources */,
70F79A2A2639D84600731C46 /* ParseHealth+combine.swift in Sources */,
700395A625A119430052CB31 /* Operations.swift in Sources */,
Expand Down Expand Up @@ -2142,6 +2175,7 @@
70110D5A2506CE890091CC1D /* BaseParseInstallation.swift in Sources */,
F97B45F924D9C6F200F4A88B /* ParseError.swift in Sources */,
700395BD25A1470F0052CB31 /* Subscription.swift in Sources */,
91285B162698DBF20051B544 /* ParseBytes.swift in Sources */,
7016ED5925C4C32B00038648 /* ParseInstallation+combine.swift in Sources */,
7003972D25A3B0140052CB31 /* ParseURLSessionDelegate.swift in Sources */,
700395D425A147BE0052CB31 /* ParseSubscription.swift in Sources */,
Expand Down Expand Up @@ -2191,6 +2225,7 @@
70D1BDBC25BB17A600A42E7C /* ParseConfig.swift in Sources */,
F97B45E424D9C6F200F4A88B /* AnyEncodable.swift in Sources */,
91679D66268E596300F71809 /* ParseVersion.swift in Sources */,
91285B1E26990D7F0051B544 /* ParsePolygon.swift in Sources */,
F97B465C24D9C78C00F4A88B /* Increment.swift in Sources */,
70F79A292639D84600731C46 /* ParseHealth+combine.swift in Sources */,
700395A525A119430052CB31 /* Operations.swift in Sources */,
Expand Down Expand Up @@ -2235,6 +2270,7 @@
70110D592506CE890091CC1D /* BaseParseInstallation.swift in Sources */,
F97B45F824D9C6F200F4A88B /* ParseError.swift in Sources */,
700395BC25A1470F0052CB31 /* Subscription.swift in Sources */,
91285B152698DBF20051B544 /* ParseBytes.swift in Sources */,
7016ED5825C4C32B00038648 /* ParseInstallation+combine.swift in Sources */,
7003972C25A3B0140052CB31 /* ParseURLSessionDelegate.swift in Sources */,
700395D325A147BE0052CB31 /* ParseSubscription.swift in Sources */,
Expand Down
70 changes: 70 additions & 0 deletions Sources/ParseSwift/Types/ParseBytes.swift
@@ -0,0 +1,70 @@
//
// ParseBytes.swift
// ParseSwift
//
// Created by Corey Baker on 7/9/21.
// Copyright © 2021 Parse Community. All rights reserved.
//

import Foundation

/**
`ParseBytes` is used to stote bytes.
It could be used to perform queries.
*/
public struct ParseBytes: Codable, Hashable {
private let __type: String = "Bytes" // swiftlint:disable:this identifier_name
public let base64: String

enum CodingKeys: String, CodingKey {
case __type // swiftlint:disable:this identifier_name
case base64
}

/**
Create new `ParseBytes` instance with the specified base64 string.
- parameter base64: A base64 string.
*/
public init(base64: String) {
self.base64 = base64
}

/**
Create new `ParseBytes` instance with the specified data.
- parameter data: The data to encode to a base64 string.
*/
public init(data: Data) {
self.base64 = data.base64EncodedString()
}
}

extension ParseBytes {
public init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
base64 = try values.decode(String.self, forKey: .base64)
}

public func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(__type, forKey: .__type)
try container.encode(base64, forKey: .base64)
}
}

// MARK: CustomDebugStringConvertible
extension ParseBytes: CustomDebugStringConvertible {
public var debugDescription: String {
guard let descriptionData = try? ParseCoding.jsonEncoder().encode(self),
let descriptionString = String(data: descriptionData, encoding: .utf8) else {
return "ParseBytes ()"
}
return "ParseBytes (\(descriptionString))"
}
}

// MARK: CustomStringConvertible
extension ParseBytes: CustomStringConvertible {
public var description: String {
debugDescription
}
}