diff --git a/License.md b/License.md new file mode 100644 index 00000000..849ba27c --- /dev/null +++ b/License.md @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright YI GU + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/Project 01 - GoodAsOldPhones/GoodAsOldPhones.xcodeproj/project.pbxproj b/Project 01 - GoodAsOldPhones/GoodAsOldPhones.xcodeproj/project.pbxproj index 73bcd2b2..a57eca6a 100644 --- a/Project 01 - GoodAsOldPhones/GoodAsOldPhones.xcodeproj/project.pbxproj +++ b/Project 01 - GoodAsOldPhones/GoodAsOldPhones.xcodeproj/project.pbxproj @@ -100,18 +100,18 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0720; - LastUpgradeCheck = 0820; + LastUpgradeCheck = 1020; ORGANIZATIONNAME = "Code School"; TargetAttributes = { 197C21091C6686EE00BCCAE8 = { CreatedOnToolsVersion = 7.2.1; - LastSwiftMigration = 0800; + LastSwiftMigration = 1020; }; }; }; buildConfigurationList = 197C21051C6686EE00BCCAE8 /* Build configuration list for PBXProject "GoodAsOldPhones" */; compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; + developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, @@ -179,18 +179,27 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -213,7 +222,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.2; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -226,18 +235,27 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -254,7 +272,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.2; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; @@ -271,7 +289,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.codeschool.GoodAsOldPhones; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; }; name = Debug; }; @@ -283,7 +301,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.codeschool.GoodAsOldPhones; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; }; name = Release; }; diff --git a/Project 29 - Grocr/Grocr/Grocr.entitlements b/Project 01 - GoodAsOldPhones/GoodAsOldPhones.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 60% rename from Project 29 - Grocr/Grocr/Grocr.entitlements rename to Project 01 - GoodAsOldPhones/GoodAsOldPhones.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist index 1b2730ed..18d98100 100644 --- a/Project 29 - Grocr/Grocr/Grocr.entitlements +++ b/Project 01 - GoodAsOldPhones/GoodAsOldPhones.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -2,9 +2,7 @@ - keychain-access-groups - - $(AppIdentifierPrefix)rw.firebase.gettingstarted - + IDEDidComputeMac32BitWarning + diff --git a/Project 01 - GoodAsOldPhones/GoodAsOldPhones.xcodeproj/project.xcworkspace/xcuserdata/Yi.xcuserdatad/UserInterfaceState.xcuserstate b/Project 01 - GoodAsOldPhones/GoodAsOldPhones.xcodeproj/project.xcworkspace/xcuserdata/Yi.xcuserdatad/UserInterfaceState.xcuserstate index 4a67ac85..e923dabb 100644 Binary files a/Project 01 - GoodAsOldPhones/GoodAsOldPhones.xcodeproj/project.xcworkspace/xcuserdata/Yi.xcuserdatad/UserInterfaceState.xcuserstate and b/Project 01 - GoodAsOldPhones/GoodAsOldPhones.xcodeproj/project.xcworkspace/xcuserdata/Yi.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/Project 01 - GoodAsOldPhones/GoodAsOldPhones.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/GoodAsOldPhones.xcscheme b/Project 01 - GoodAsOldPhones/GoodAsOldPhones.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/GoodAsOldPhones.xcscheme index bafe8ee3..3f04ac32 100644 --- a/Project 01 - GoodAsOldPhones/GoodAsOldPhones.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/GoodAsOldPhones.xcscheme +++ b/Project 01 - GoodAsOldPhones/GoodAsOldPhones.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/GoodAsOldPhones.xcscheme @@ -1,6 +1,6 @@ Bool { + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch. return true } diff --git a/Project 01 - GoodAsOldPhones/GoodAsOldPhones/Assets.xcassets/AppIcon.appiconset/Contents.json b/Project 01 - GoodAsOldPhones/GoodAsOldPhones/Assets.xcassets/AppIcon.appiconset/Contents.json index 1d060ed2..d8db8d65 100644 --- a/Project 01 - GoodAsOldPhones/GoodAsOldPhones/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/Project 01 - GoodAsOldPhones/GoodAsOldPhones/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -84,6 +84,11 @@ "idiom" : "ipad", "size" : "83.5x83.5", "scale" : "2x" + }, + { + "idiom" : "ios-marketing", + "size" : "1024x1024", + "scale" : "1x" } ], "info" : { diff --git a/Project 01 - GoodAsOldPhones/GoodAsOldPhones/Base.lproj/Main.storyboard b/Project 01 - GoodAsOldPhones/GoodAsOldPhones/Base.lproj/Main.storyboard index 4f73b641..434d68be 100644 --- a/Project 01 - GoodAsOldPhones/GoodAsOldPhones/Base.lproj/Main.storyboard +++ b/Project 01 - GoodAsOldPhones/GoodAsOldPhones/Base.lproj/Main.storyboard @@ -1,9 +1,18 @@ - - + + + + + - + + + + + DamascusBold + + @@ -17,26 +26,33 @@ - + - + + + + + + + - @@ -57,79 +73,90 @@ - + - - + + + + + @@ -144,10 +171,10 @@ - + - + @@ -164,7 +191,6 @@ - @@ -177,7 +203,7 @@ - + @@ -195,8 +221,9 @@ + - + diff --git a/Project 01 - GoodAsOldPhones/GoodAsOldPhones/ContactViewController.swift b/Project 01 - GoodAsOldPhones/GoodAsOldPhones/ContactViewController.swift index 8ce6e372..365a20e6 100644 --- a/Project 01 - GoodAsOldPhones/GoodAsOldPhones/ContactViewController.swift +++ b/Project 01 - GoodAsOldPhones/GoodAsOldPhones/ContactViewController.swift @@ -13,13 +13,19 @@ class ContactViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() - + view.addSubview(scrollView) } - override func viewWillLayoutSubviews() { - super.viewWillLayoutSubviews() + override func viewDidLayoutSubviews() { + super.viewDidLayoutSubviews() + + if #available(iOS 11.0, *) { + scrollView.frame = CGRect(x: 0, y: view.safeAreaInsets.top, width: view.frame.width, height: view.frame.height - view.safeAreaInsets.bottom - view.safeAreaInsets.top) + } else { + scrollView.frame = CGRect(x: 0, y: topLayoutGuide.length, width: view.frame.width, height: view.frame.height - topLayoutGuide.length - bottomLayoutGuide.length) + } - scrollView.contentSize = CGSize(width: 375, height: 800) + scrollView.contentSize = CGSize(width: self.view.frame.width, height: 800) } } diff --git a/Project 01 - GoodAsOldPhones/GoodAsOldPhones/ProductViewController.swift b/Project 01 - GoodAsOldPhones/GoodAsOldPhones/ProductViewController.swift index f8afd490..7376b326 100644 --- a/Project 01 - GoodAsOldPhones/GoodAsOldPhones/ProductViewController.swift +++ b/Project 01 - GoodAsOldPhones/GoodAsOldPhones/ProductViewController.swift @@ -24,7 +24,7 @@ class ProductViewController: UIViewController { } } - @IBAction func addToCartPressed(_ sender: AnyObject) { - print("Hello World") + @IBAction func addToCartButtonDidTap(_ sender: AnyObject) { + print("Add to cart successfully") } } diff --git a/Project 01 - GoodAsOldPhones/GoodAsOldPhones/ProductsTableViewController.swift b/Project 01 - GoodAsOldPhones/GoodAsOldPhones/ProductsTableViewController.swift index f41b15de..3f90906b 100644 --- a/Project 01 - GoodAsOldPhones/GoodAsOldPhones/ProductsTableViewController.swift +++ b/Project 01 - GoodAsOldPhones/GoodAsOldPhones/ProductsTableViewController.swift @@ -8,48 +8,54 @@ import UIKit class ProductsTableViewController: UITableViewController { - var products: [Product]? + private var products: [Product]? + private let identifer = "productCell" override func viewDidLoad() { super.viewDidLoad() - products = [Product(name: "1907 Wall Set", cellImageName: "image-cell1", fullscreenImageName: "phone-fullscreen1"), - Product(name: "1921 Dial Phone", cellImageName: "image-cell2", fullscreenImageName: "phone-fullscreen2"), - Product(name: "1937 Desk Set", cellImageName: "image-cell3", fullscreenImageName: "phone-fullscreen3"), - Product(name: "1984 Moto Portable", cellImageName: "image-cell4", fullscreenImageName: "phone-fullscreen4")] + products = [ + Product(name: "1907 Wall Set", cellImageName: "image-cell1", fullscreenImageName: "phone-fullscreen1"), + Product(name: "1921 Dial Phone", cellImageName: "image-cell2", fullscreenImageName: "phone-fullscreen2"), + Product(name: "1937 Desk Set", cellImageName: "image-cell3", fullscreenImageName: "phone-fullscreen3"), + Product(name: "1984 Moto Portable", cellImageName: "image-cell4", fullscreenImageName: "phone-fullscreen4") + ] } - // MARK: - tableView set - override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - if let products = products { - return products.count - } - return 0 - } - - override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { - let identifer = "productCell" - - let cell = tableView.dequeueReusableCell(withIdentifier: identifer, for: indexPath) - - cell.textLabel?.text = products?[(indexPath as NSIndexPath).row].name - - if let imageName = products?[(indexPath as NSIndexPath).row].cellImageName { - cell.imageView?.image = UIImage(named: imageName) - } - - return cell; - } - + + // MARK: - View Transfer override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if segue.identifier == "showProduct" { - let productVC = segue.destination as? ProductViewController - - if let cell = sender as? UITableViewCell { - if let indexPath = tableView.indexPath(for: cell) { - productVC?.product = products?[(indexPath as NSIndexPath).row] - } + if let cell = sender as? UITableViewCell, + let indexPath = tableView.indexPath(for: cell), + let productVC = segue.destination as? ProductViewController { + productVC.product = products?[indexPath.row] } } } } + + +// MARK: - UITableViewDataSource +extension ProductsTableViewController { + override func tableView(_ tableView: UITableView, + numberOfRowsInSection section: Int) -> Int + { + return products?.count ?? 0 + } + + override func tableView(_ tableView: UITableView, + cellForRowAt indexPath: IndexPath) -> UITableViewCell + { + let cell = tableView.dequeueReusableCell(withIdentifier: identifer, for: indexPath) + guard let products = products else { return cell } + + cell.textLabel?.text = products[indexPath.row].name + + if let imageName = products[indexPath.row].cellImageName { + cell.imageView?.image = UIImage(named: imageName) + } + + return cell; + } +} diff --git a/Project 01 - GoodAsOldPhones/README.md b/Project 01 - GoodAsOldPhones/README.md index 20295615..205ee37d 100644 --- a/Project 01 - GoodAsOldPhones/README.md +++ b/Project 01 - GoodAsOldPhones/README.md @@ -1,7 +1,7 @@ GoodAsOldPhones ========== -GoodAsOldPhones is a simple iOS app coded by Swift. Also, it is a demo sample app of Swift tutorial in codeschool.com. This app demonstates basic use and implementation of tab bar controller, navigation controller, scoll view, table view and storyboard. +GoodAsOldPhones is the demo app of [Swift tutorial](https://www.codeschool.com/courses/app-evolution-with-swift) on code school. This app demonstates basic use and implementation of tab bar controller, navigation controller, scoll view, table view and storyboard. ## Screenshots ![GoodAsOldPhones](./GoodAsOldPhones.gif) diff --git a/Project 02 - LoveTweet/LoveTweet.xcodeproj/project.xcworkspace/xcuserdata/Yi.xcuserdatad/UserInterfaceState.xcuserstate b/Project 02 - LoveTweet/LoveTweet.xcodeproj/project.xcworkspace/xcuserdata/Yi.xcuserdatad/UserInterfaceState.xcuserstate deleted file mode 100644 index a94ba7df..00000000 Binary files a/Project 02 - LoveTweet/LoveTweet.xcodeproj/project.xcworkspace/xcuserdata/Yi.xcuserdatad/UserInterfaceState.xcuserstate and /dev/null differ diff --git a/Project 02 - LoveTweet/LoveTweet.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/LoveTweet.xcscheme b/Project 02 - LoveTweet/LoveTweet.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/LoveTweet.xcscheme deleted file mode 100644 index 9180ae1f..00000000 --- a/Project 02 - LoveTweet/LoveTweet.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/LoveTweet.xcscheme +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Project 02 - LoveTweet/LoveTweet.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/xcschememanagement.plist b/Project 02 - LoveTweet/LoveTweet.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/xcschememanagement.plist deleted file mode 100644 index 2f01a67c..00000000 --- a/Project 02 - LoveTweet/LoveTweet.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/xcschememanagement.plist +++ /dev/null @@ -1,22 +0,0 @@ - - - - - SchemeUserState - - LoveTweet.xcscheme - - orderHint - 0 - - - SuppressBuildableAutocreation - - 194C54921C72852900749A4F - - primary - - - - - diff --git a/Project 02 - LoveTweet/LoveTweet/AppDelegate.swift b/Project 02 - LoveTweet/LoveTweet/AppDelegate.swift deleted file mode 100644 index 1df644b6..00000000 --- a/Project 02 - LoveTweet/LoveTweet/AppDelegate.swift +++ /dev/null @@ -1,19 +0,0 @@ -// -// AppDelegate.swift -// LoveTweet -// -// Copyright © 2016 YiGu. All rights reserved. -// - -import UIKit - -@UIApplicationMain -class AppDelegate: UIResponder, UIApplicationDelegate { - - var window: UIWindow? - - func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { - // Override point for customization after application launch. - return true - } -} diff --git a/Project 02 - LoveTweet/LoveTweet/Base.lproj/Main.storyboard b/Project 02 - LoveTweet/LoveTweet/Base.lproj/Main.storyboard deleted file mode 100644 index a02e6837..00000000 --- a/Project 02 - LoveTweet/LoveTweet/Base.lproj/Main.storyboard +++ /dev/null @@ -1,184 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Project 02 - LoveTweet/LoveTweet/ViewController.swift b/Project 02 - LoveTweet/LoveTweet/ViewController.swift deleted file mode 100644 index 984a64c4..00000000 --- a/Project 02 - LoveTweet/LoveTweet/ViewController.swift +++ /dev/null @@ -1,86 +0,0 @@ -// -// ViewController.swift -// LoveTweet -// -// Copyright © 2016 YiGu. All rights reserved. -// - -import UIKit -import Social - -var tweet:String = "" - -class ViewController: UIViewController { - - // MARK: Outlets - @IBOutlet weak var nameTextField: UITextField! - @IBOutlet weak var genderSeg: UISegmentedControl! - @IBOutlet weak var birthdayPicker: UIDatePicker! - @IBOutlet weak var workTextField: UITextField! - @IBOutlet weak var salaryLabel: UILabel! - @IBOutlet weak var straightSwitch: UISwitch! - - override func viewDidLoad() { - super.viewDidLoad() - } - - @IBAction func salaryHandler(_ sender: AnyObject) { - let slider = sender as! UISlider - let i = Int(slider.value) - salaryLabel.text = "$\(i)k" - } - - @IBAction func tweetTapped(_ sender: AnyObject) { - if (nameTextField.text == "" || workTextField.text == "" || salaryLabel.text == "") { - showAlert("Info Miss", message: "Please fill out the form", buttonTitle: "Ok") - return - } - - let name:String! = nameTextField.text - - let work:String! = workTextField.text - let salary:String! = salaryLabel.text - - // get age - let gregorian = Calendar(identifier: Calendar.Identifier.gregorian) - let now = Date() - let components = (gregorian as NSCalendar?)?.components(NSCalendar.Unit.year, from: birthdayPicker.date, to: now, options: []) - let age:Int! = components?.year - - var interestedIn:String! = "Women" - if (genderSeg.selectedSegmentIndex == 0 && !straightSwitch.isOn) { - interestedIn = "Men" - } - if (genderSeg.selectedSegmentIndex == 1 && straightSwitch.isOn ) { - interestedIn = "Women" - } - - let tweet = "Hi, I am \(name!). As a \(age!)-year-old \(work!) earning \(salary!)/year, I am interested in \(interestedIn!). Feel free to contact me!" - - tweetSLCVC(tweet) - } - - fileprivate func tweetSLCVC(_ tweet: String) { - if SLComposeViewController.isAvailable(forServiceType: SLServiceTypeTwitter){ - let twitterController:SLComposeViewController = SLComposeViewController(forServiceType: SLServiceTypeTwitter) - twitterController.setInitialText(tweet) - self.present(twitterController, animated: true, completion: nil) - } else { - showAlert("Twitter Unavailable", message: "Please configure your twitter account on device", buttonTitle: "Ok") - } - } - - fileprivate func showAlert(_ title:String, message:String, buttonTitle:String) { - let alert = UIAlertController(title: title, message: message, preferredStyle: UIAlertControllerStyle.alert) - alert.addAction(UIAlertAction(title: buttonTitle, style: UIAlertActionStyle.default, handler: nil)) - self.present(alert, animated: true, completion: nil) - } - - override func touchesBegan(_ touches: Set, with event: UIEvent?) { - super.touchesBegan(touches, with: event) - - // dismiss keyboard - view.endEditing(true) - } -} - diff --git a/Project 02 - LoveTweet/README.md b/Project 02 - LoveTweet/README.md deleted file mode 100644 index fbc1652c..00000000 --- a/Project 02 - LoveTweet/README.md +++ /dev/null @@ -1,9 +0,0 @@ -LoveTweet -========== - -Love Tweet is a Swift iOS App. It demonstrates how to use common UIKit controls such as UILabel, UITextField, UISegmentedControl, UIDatePicker, UISlider, UISwitch, UIButton and UITextView. Also, twitter API is integrated into this app. - -## Screenshots -![LoveTweet](https://github.com/soapyigu/30SwiftProjects/blob/master/Project%2002%20-%20LoveTweet/Screenshots/shot1.png) - -![LoveTweet](https://github.com/soapyigu/30SwiftProjects/blob/master/Project%2002%20-%20LoveTweet/Screenshots/shot2.png) diff --git a/Project 02 - LoveTweet/Screenshots/shot1.png b/Project 02 - LoveTweet/Screenshots/shot1.png deleted file mode 100644 index 5d5f4870..00000000 Binary files a/Project 02 - LoveTweet/Screenshots/shot1.png and /dev/null differ diff --git a/Project 02 - LoveTweet/Screenshots/shot2.png b/Project 02 - LoveTweet/Screenshots/shot2.png deleted file mode 100644 index dca1f763..00000000 Binary files a/Project 02 - LoveTweet/Screenshots/shot2.png and /dev/null differ diff --git a/Project 03 - Stopwatch/README.md b/Project 02 - Stopwatch/README.md similarity index 100% rename from Project 03 - Stopwatch/README.md rename to Project 02 - Stopwatch/README.md diff --git a/Project 03 - Stopwatch/Stopwatch.gif b/Project 02 - Stopwatch/Stopwatch.gif similarity index 100% rename from Project 03 - Stopwatch/Stopwatch.gif rename to Project 02 - Stopwatch/Stopwatch.gif diff --git a/Project 03 - Stopwatch/Stopwatch.xcodeproj/project.pbxproj b/Project 02 - Stopwatch/Stopwatch.xcodeproj/project.pbxproj similarity index 61% rename from Project 03 - Stopwatch/Stopwatch.xcodeproj/project.pbxproj rename to Project 02 - Stopwatch/Stopwatch.xcodeproj/project.pbxproj index b32e9a62..cf5bedd0 100644 --- a/Project 03 - Stopwatch/Stopwatch.xcodeproj/project.pbxproj +++ b/Project 02 - Stopwatch/Stopwatch.xcodeproj/project.pbxproj @@ -7,6 +7,7 @@ objects = { /* Begin PBXBuildFile section */ + 1931198D20D35E380079AC04 /* StopwatchTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1931198C20D35E380079AC04 /* StopwatchTests.swift */; }; 197BEE191C76E410005AD5E2 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 197BEE181C76E410005AD5E2 /* AppDelegate.swift */; }; 197BEE1B1C76E410005AD5E2 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 197BEE1A1C76E410005AD5E2 /* ViewController.swift */; }; 197BEE1E1C76E410005AD5E2 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 197BEE1C1C76E410005AD5E2 /* Main.storyboard */; }; @@ -15,7 +16,20 @@ 197BEE2D1C798B47005AD5E2 /* Stopwatch.swift in Sources */ = {isa = PBXBuildFile; fileRef = 197BEE2C1C798B47005AD5E2 /* Stopwatch.swift */; }; /* End PBXBuildFile section */ +/* Begin PBXContainerItemProxy section */ + 1931198F20D35E380079AC04 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 197BEE0D1C76E410005AD5E2 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 197BEE141C76E410005AD5E2; + remoteInfo = Stopwatch; + }; +/* End PBXContainerItemProxy section */ + /* Begin PBXFileReference section */ + 1931198A20D35E380079AC04 /* StopwatchTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = StopwatchTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 1931198C20D35E380079AC04 /* StopwatchTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StopwatchTests.swift; sourceTree = ""; }; + 1931198E20D35E380079AC04 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 197BEE151C76E410005AD5E2 /* Stopwatch.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Stopwatch.app; sourceTree = BUILT_PRODUCTS_DIR; }; 197BEE181C76E410005AD5E2 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 197BEE1A1C76E410005AD5E2 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; @@ -27,6 +41,13 @@ /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ + 1931198720D35E380079AC04 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; 197BEE121C76E410005AD5E2 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -37,10 +58,20 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 1931198B20D35E380079AC04 /* StopwatchTests */ = { + isa = PBXGroup; + children = ( + 1931198C20D35E380079AC04 /* StopwatchTests.swift */, + 1931198E20D35E380079AC04 /* Info.plist */, + ); + path = StopwatchTests; + sourceTree = ""; + }; 197BEE0C1C76E410005AD5E2 = { isa = PBXGroup; children = ( 197BEE171C76E410005AD5E2 /* Stopwatch */, + 1931198B20D35E380079AC04 /* StopwatchTests */, 197BEE161C76E410005AD5E2 /* Products */, ); sourceTree = ""; @@ -49,6 +80,7 @@ isa = PBXGroup; children = ( 197BEE151C76E410005AD5E2 /* Stopwatch.app */, + 1931198A20D35E380079AC04 /* StopwatchTests.xctest */, ); name = Products; sourceTree = ""; @@ -70,6 +102,24 @@ /* End PBXGroup section */ /* Begin PBXNativeTarget section */ + 1931198920D35E380079AC04 /* StopwatchTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 1931199120D35E380079AC04 /* Build configuration list for PBXNativeTarget "StopwatchTests" */; + buildPhases = ( + 1931198620D35E380079AC04 /* Sources */, + 1931198720D35E380079AC04 /* Frameworks */, + 1931198820D35E380079AC04 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 1931199020D35E380079AC04 /* PBXTargetDependency */, + ); + name = StopwatchTests; + productName = StopwatchTests; + productReference = 1931198A20D35E380079AC04 /* StopwatchTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; 197BEE141C76E410005AD5E2 /* Stopwatch */ = { isa = PBXNativeTarget; buildConfigurationList = 197BEE271C76E410005AD5E2 /* Build configuration list for PBXNativeTarget "Stopwatch" */; @@ -93,19 +143,26 @@ 197BEE0D1C76E410005AD5E2 /* Project object */ = { isa = PBXProject; attributes = { - LastSwiftUpdateCheck = 0720; - LastUpgradeCheck = 0820; + LastSwiftUpdateCheck = 0940; + LastUpgradeCheck = 1020; ORGANIZATIONNAME = YiGu; TargetAttributes = { + 1931198920D35E380079AC04 = { + CreatedOnToolsVersion = 9.4; + DevelopmentTeam = 44JDRP3T56; + LastSwiftMigration = 1020; + ProvisioningStyle = Automatic; + TestTargetID = 197BEE141C76E410005AD5E2; + }; 197BEE141C76E410005AD5E2 = { CreatedOnToolsVersion = 7.2.1; - LastSwiftMigration = 0800; + LastSwiftMigration = 1020; }; }; }; buildConfigurationList = 197BEE101C76E410005AD5E2 /* Build configuration list for PBXProject "Stopwatch" */; compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; + developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, @@ -117,11 +174,19 @@ projectRoot = ""; targets = ( 197BEE141C76E410005AD5E2 /* Stopwatch */, + 1931198920D35E380079AC04 /* StopwatchTests */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ + 1931198820D35E380079AC04 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; 197BEE131C76E410005AD5E2 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -135,6 +200,14 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ + 1931198620D35E380079AC04 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 1931198D20D35E380079AC04 /* StopwatchTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 197BEE111C76E410005AD5E2 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -147,6 +220,14 @@ }; /* End PBXSourcesBuildPhase section */ +/* Begin PBXTargetDependency section */ + 1931199020D35E380079AC04 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 197BEE141C76E410005AD5E2 /* Stopwatch */; + targetProxy = 1931198F20D35E380079AC04 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + /* Begin PBXVariantGroup section */ 197BEE1C1C76E410005AD5E2 /* Main.storyboard */ = { isa = PBXVariantGroup; @@ -167,22 +248,86 @@ /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ + 1931199220D35E380079AC04 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_IDENTITY = "iPhone Developer"; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = 44JDRP3T56; + GCC_C_LANGUAGE_STANDARD = gnu11; + INFOPLIST_FILE = StopwatchTests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 11.4; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = yigu.StopwatchTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Stopwatch.app/Stopwatch"; + }; + name = Debug; + }; + 1931199320D35E380079AC04 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_IDENTITY = "iPhone Developer"; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = 44JDRP3T56; + GCC_C_LANGUAGE_STANDARD = gnu11; + INFOPLIST_FILE = StopwatchTests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 11.4; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = yigu.StopwatchTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Stopwatch.app/Stopwatch"; + }; + name = Release; + }; 197BEE251C76E410005AD5E2 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -205,7 +350,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.2; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -218,18 +363,27 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -246,7 +400,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.2; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; @@ -263,7 +417,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.yigu.Stopwatch; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; }; name = Debug; }; @@ -275,13 +429,22 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.yigu.Stopwatch; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ + 1931199120D35E380079AC04 /* Build configuration list for PBXNativeTarget "StopwatchTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1931199220D35E380079AC04 /* Debug */, + 1931199320D35E380079AC04 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; 197BEE101C76E410005AD5E2 /* Build configuration list for PBXProject "Stopwatch" */ = { isa = XCConfigurationList; buildConfigurations = ( diff --git a/Project 03 - Stopwatch/Stopwatch.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Project 02 - Stopwatch/Stopwatch.xcodeproj/project.xcworkspace/contents.xcworkspacedata similarity index 100% rename from Project 03 - Stopwatch/Stopwatch.xcodeproj/project.xcworkspace/contents.xcworkspacedata rename to Project 02 - Stopwatch/Stopwatch.xcodeproj/project.xcworkspace/contents.xcworkspacedata diff --git a/Project 02 - Stopwatch/Stopwatch.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Project 02 - Stopwatch/Stopwatch.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/Project 02 - Stopwatch/Stopwatch.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Project 03 - Stopwatch/Stopwatch/AppDelegate.swift b/Project 02 - Stopwatch/Stopwatch/AppDelegate.swift similarity index 81% rename from Project 03 - Stopwatch/Stopwatch/AppDelegate.swift rename to Project 02 - Stopwatch/Stopwatch/AppDelegate.swift index 708ad41f..66eda8eb 100644 --- a/Project 03 - Stopwatch/Stopwatch/AppDelegate.swift +++ b/Project 02 - Stopwatch/Stopwatch/AppDelegate.swift @@ -12,7 +12,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? - func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch. return true } diff --git a/Project 03 - Stopwatch/Stopwatch/Assets.xcassets/AppIcon.appiconset/Contents.json b/Project 02 - Stopwatch/Stopwatch/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from Project 03 - Stopwatch/Stopwatch/Assets.xcassets/AppIcon.appiconset/Contents.json rename to Project 02 - Stopwatch/Stopwatch/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/Project 02 - LoveTweet/LoveTweet/Base.lproj/LaunchScreen.storyboard b/Project 02 - Stopwatch/Stopwatch/Base.lproj/LaunchScreen.storyboard similarity index 100% rename from Project 02 - LoveTweet/LoveTweet/Base.lproj/LaunchScreen.storyboard rename to Project 02 - Stopwatch/Stopwatch/Base.lproj/LaunchScreen.storyboard diff --git a/Project 03 - Stopwatch/Stopwatch/Base.lproj/Main.storyboard b/Project 02 - Stopwatch/Stopwatch/Base.lproj/Main.storyboard similarity index 100% rename from Project 03 - Stopwatch/Stopwatch/Base.lproj/Main.storyboard rename to Project 02 - Stopwatch/Stopwatch/Base.lproj/Main.storyboard diff --git a/Project 02 - LoveTweet/LoveTweet/Info.plist b/Project 02 - Stopwatch/Stopwatch/Info.plist similarity index 100% rename from Project 02 - LoveTweet/LoveTweet/Info.plist rename to Project 02 - Stopwatch/Stopwatch/Info.plist diff --git a/Project 03 - Stopwatch/Stopwatch/Stopwatch.swift b/Project 02 - Stopwatch/Stopwatch/Stopwatch.swift similarity index 100% rename from Project 03 - Stopwatch/Stopwatch/Stopwatch.swift rename to Project 02 - Stopwatch/Stopwatch/Stopwatch.swift diff --git a/Project 03 - Stopwatch/Stopwatch/ViewController.swift b/Project 02 - Stopwatch/Stopwatch/ViewController.swift similarity index 79% rename from Project 03 - Stopwatch/Stopwatch/ViewController.swift rename to Project 02 - Stopwatch/Stopwatch/ViewController.swift index 1c650d16..c5b1c165 100644 --- a/Project 03 - Stopwatch/Stopwatch/ViewController.swift +++ b/Project 02 - Stopwatch/Stopwatch/ViewController.swift @@ -8,28 +8,28 @@ import UIKit class ViewController: UIViewController, UITableViewDelegate { + // MARK: - Variables fileprivate let mainStopwatch: Stopwatch = Stopwatch() fileprivate let lapStopwatch: Stopwatch = Stopwatch() fileprivate var isPlay: Bool = false fileprivate var laps: [String] = [] - - // MARK: disable landscape mode - override var shouldAutorotate : Bool { - return false - } - - override var supportedInterfaceOrientations : UIInterfaceOrientationMask { - return UIInterfaceOrientationMask.portrait - } + // MARK: - UI components @IBOutlet weak var timerLabel: UILabel! @IBOutlet weak var lapTimerLabel: UILabel! @IBOutlet weak var playPauseButton: UIButton! @IBOutlet weak var lapRestButton: UIButton! @IBOutlet weak var lapsTableView: UITableView! + // MARK: - Life Cycle override func viewDidLoad() { super.viewDidLoad() + + let initCircleButton: (UIButton) -> Void = { button in + button.layer.cornerRadius = 0.5 * button.bounds.size.width + button.backgroundColor = UIColor.white + } + initCircleButton(playPauseButton) initCircleButton(lapRestButton) @@ -39,36 +39,43 @@ class ViewController: UIViewController, UITableViewDelegate { lapsTableView.dataSource = self; } - fileprivate func initCircleButton(_ button: UIButton) { - button.layer.cornerRadius = 0.5 * button.bounds.size.width - button.backgroundColor = UIColor.white + // MARK: - UI Settings + override var shouldAutorotate : Bool { + return false } - // MARK: hide status bar override var preferredStatusBarStyle : UIStatusBarStyle { return UIStatusBarStyle.lightContent } - // MARK: play, pause, lap, and reset + override var supportedInterfaceOrientations : UIInterfaceOrientationMask { + return UIInterfaceOrientationMask.portrait + } + + // MARK: - Actions @IBAction func playPauseTimer(_ sender: AnyObject) { lapRestButton.isEnabled = true + changeButton(lapRestButton, title: "Lap", titleColor: UIColor.black) + if !isPlay { - mainStopwatch.timer = Timer.scheduledTimer(timeInterval: 0.035, target: self, selector: Selector.updateMainTimer, userInfo: nil, repeats: true) - lapStopwatch.timer = Timer.scheduledTimer(timeInterval: 0.035, target: self, selector: Selector.updateLapTimer, userInfo: nil, repeats: true) + unowned let weakSelf = self - RunLoop.current.add(mainStopwatch.timer, forMode: .commonModes) - RunLoop.current.add(lapStopwatch.timer, forMode: .commonModes) + mainStopwatch.timer = Timer.scheduledTimer(timeInterval: 0.035, target: weakSelf, selector: Selector.updateMainTimer, userInfo: nil, repeats: true) + lapStopwatch.timer = Timer.scheduledTimer(timeInterval: 0.035, target: weakSelf, selector: Selector.updateLapTimer, userInfo: nil, repeats: true) + + RunLoop.current.add(mainStopwatch.timer, forMode: RunLoop.Mode.common) + RunLoop.current.add(lapStopwatch.timer, forMode: RunLoop.Mode.common) isPlay = true changeButton(playPauseButton, title: "Stop", titleColor: UIColor.red) } else { + mainStopwatch.timer.invalidate() lapStopwatch.timer.invalidate() isPlay = false changeButton(playPauseButton, title: "Start", titleColor: UIColor.green) changeButton(lapRestButton, title: "Reset", titleColor: UIColor.black) - } } @@ -84,17 +91,18 @@ class ViewController: UIViewController, UITableViewDelegate { } lapsTableView.reloadData() resetLapTimer() - lapStopwatch.timer = Timer.scheduledTimer(timeInterval: 0.035, target: self, selector: Selector.updateLapTimer, userInfo: nil, repeats: true) - RunLoop.current.add(lapStopwatch.timer, forMode: .commonModes) + unowned let weakSelf = self + lapStopwatch.timer = Timer.scheduledTimer(timeInterval: 0.035, target: weakSelf, selector: Selector.updateLapTimer, userInfo: nil, repeats: true) + RunLoop.current.add(lapStopwatch.timer, forMode: RunLoop.Mode.common) } } + // MARK: - Private Helpers fileprivate func changeButton(_ button: UIButton, title: String, titleColor: UIColor) { - button.setTitle(title, for: UIControlState()) - button.setTitleColor(titleColor, for: UIControlState()) + button.setTitle(title, for: UIControl.State()) + button.setTitleColor(titleColor, for: UIControl.State()) } - // MARK: reset timer seperately fileprivate func resetMainTimer() { resetTimer(mainStopwatch, label: timerLabel) laps.removeAll() @@ -110,13 +118,12 @@ class ViewController: UIViewController, UITableViewDelegate { stopwatch.counter = 0.0 label.text = "00:00:00" } - - // MARK: update two timer labels seperately - func updateMainTimer() { + + @objc func updateMainTimer() { updateTimer(mainStopwatch, label: timerLabel) } - func updateLapTimer() { + @objc func updateLapTimer() { updateTimer(lapStopwatch, label: lapTimerLabel) } @@ -137,7 +144,7 @@ class ViewController: UIViewController, UITableViewDelegate { } } -// MARK: tableView dataSource +// MARK: - UITableViewDataSource extension ViewController: UITableViewDataSource { func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return laps.count @@ -158,8 +165,8 @@ extension ViewController: UITableViewDataSource { } } +// MARK: - Extension fileprivate extension Selector { static let updateMainTimer = #selector(ViewController.updateMainTimer) static let updateLapTimer = #selector(ViewController.updateLapTimer) } - diff --git a/Project 02 - Stopwatch/StopwatchTests/Info.plist b/Project 02 - Stopwatch/StopwatchTests/Info.plist new file mode 100644 index 00000000..6c40a6cd --- /dev/null +++ b/Project 02 - Stopwatch/StopwatchTests/Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + + diff --git a/Project 17 - BlueLibrarySwift/BlueLibrarySwiftTests/BlueLibrarySwiftTests.swift b/Project 02 - Stopwatch/StopwatchTests/StopwatchTests.swift similarity index 70% rename from Project 17 - BlueLibrarySwift/BlueLibrarySwiftTests/BlueLibrarySwiftTests.swift rename to Project 02 - Stopwatch/StopwatchTests/StopwatchTests.swift index 5d26e007..515fc7de 100644 --- a/Project 17 - BlueLibrarySwift/BlueLibrarySwiftTests/BlueLibrarySwiftTests.swift +++ b/Project 02 - Stopwatch/StopwatchTests/StopwatchTests.swift @@ -1,15 +1,14 @@ // -// BlueLibrarySwiftTests.swift -// BlueLibrarySwiftTests +// StopwatchTests.swift +// StopwatchTests // -// Created by Vincent Ngo on 11/1/14. -// Copyright (c) 2014 Raywenderlich. All rights reserved. +// Created by Yi Gu on 6/14/18. +// Copyright © 2018 YiGu. All rights reserved. // -import UIKit import XCTest -class BlueLibrarySwiftTests: XCTestCase { +class StopwatchTests: XCTestCase { override func setUp() { super.setUp() @@ -23,12 +22,12 @@ class BlueLibrarySwiftTests: XCTestCase { func testExample() { // This is an example of a functional test case. - XCTAssert(true, "Pass") + // Use XCTAssert and related functions to verify your tests produce the correct results. } func testPerformanceExample() { // This is an example of a performance test case. - self.measure() { + self.measure { // Put the code you want to measure the time of here. } } diff --git a/Project 03 - FacebookMe/FacebookMe.gif b/Project 03 - FacebookMe/FacebookMe.gif new file mode 100644 index 00000000..755d1cd3 Binary files /dev/null and b/Project 03 - FacebookMe/FacebookMe.gif differ diff --git a/Project 03 - FacebookMe/FacebookMe.xcodeproj/project.pbxproj b/Project 03 - FacebookMe/FacebookMe.xcodeproj/project.pbxproj new file mode 100644 index 00000000..62a8ab8c --- /dev/null +++ b/Project 03 - FacebookMe/FacebookMe.xcodeproj/project.pbxproj @@ -0,0 +1,377 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 191804011EB67FC9007753C4 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 191804001EB67FC9007753C4 /* AppDelegate.swift */; }; + 191804081EB67FC9007753C4 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 191804071EB67FC9007753C4 /* Assets.xcassets */; }; + 1918040B1EB67FC9007753C4 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 191804091EB67FC9007753C4 /* LaunchScreen.storyboard */; }; + 191804131EB68093007753C4 /* FBMeBaseViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 191804121EB68093007753C4 /* FBMeBaseViewController.swift */; }; + 191804161EB6819F007753C4 /* Specs.swift in Sources */ = {isa = PBXBuildFile; fileRef = 191804151EB6819F007753C4 /* Specs.swift */; }; + 191804191EB68395007753C4 /* UIColor+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 191804181EB68395007753C4 /* UIColor+Extension.swift */; }; + 1918041B1EB684F6007753C4 /* FBMeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1918041A1EB684F6007753C4 /* FBMeViewController.swift */; }; + 1918041D1EB686AA007753C4 /* FBMeBaseCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1918041C1EB686AA007753C4 /* FBMeBaseCell.swift */; }; + 191804201EB693D3007753C4 /* FBMeUser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1918041F1EB693D3007753C4 /* FBMeUser.swift */; }; + 191804231EB69AF5007753C4 /* TableKeys.swift in Sources */ = {isa = PBXBuildFile; fileRef = 191804221EB69AF5007753C4 /* TableKeys.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 191803FD1EB67FC9007753C4 /* FacebookMe.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = FacebookMe.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 191804001EB67FC9007753C4 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 191804071EB67FC9007753C4 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 1918040A1EB67FC9007753C4 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 1918040C1EB67FC9007753C4 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 191804121EB68093007753C4 /* FBMeBaseViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FBMeBaseViewController.swift; sourceTree = ""; }; + 191804151EB6819F007753C4 /* Specs.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Specs.swift; sourceTree = ""; }; + 191804181EB68395007753C4 /* UIColor+Extension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIColor+Extension.swift"; sourceTree = ""; }; + 1918041A1EB684F6007753C4 /* FBMeViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FBMeViewController.swift; sourceTree = ""; }; + 1918041C1EB686AA007753C4 /* FBMeBaseCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FBMeBaseCell.swift; sourceTree = ""; }; + 1918041F1EB693D3007753C4 /* FBMeUser.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FBMeUser.swift; sourceTree = ""; }; + 191804221EB69AF5007753C4 /* TableKeys.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TableKeys.swift; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 191803FA1EB67FC9007753C4 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 191803F41EB67FC9007753C4 = { + isa = PBXGroup; + children = ( + 191803FF1EB67FC9007753C4 /* FacebookMe */, + 191803FE1EB67FC9007753C4 /* Products */, + ); + sourceTree = ""; + }; + 191803FE1EB67FC9007753C4 /* Products */ = { + isa = PBXGroup; + children = ( + 191803FD1EB67FC9007753C4 /* FacebookMe.app */, + ); + name = Products; + sourceTree = ""; + }; + 191803FF1EB67FC9007753C4 /* FacebookMe */ = { + isa = PBXGroup; + children = ( + 191804001EB67FC9007753C4 /* AppDelegate.swift */, + 191804171EB681B2007753C4 /* Helper */, + 191804141EB68099007753C4 /* ViewController */, + 1918041E1EB686B1007753C4 /* View */, + 191804211EB69401007753C4 /* Model */, + 191804091EB67FC9007753C4 /* LaunchScreen.storyboard */, + 1918040C1EB67FC9007753C4 /* Info.plist */, + 191804071EB67FC9007753C4 /* Assets.xcassets */, + ); + path = FacebookMe; + sourceTree = ""; + }; + 191804141EB68099007753C4 /* ViewController */ = { + isa = PBXGroup; + children = ( + 191804121EB68093007753C4 /* FBMeBaseViewController.swift */, + 1918041A1EB684F6007753C4 /* FBMeViewController.swift */, + ); + name = ViewController; + sourceTree = ""; + }; + 191804171EB681B2007753C4 /* Helper */ = { + isa = PBXGroup; + children = ( + 191804151EB6819F007753C4 /* Specs.swift */, + 191804181EB68395007753C4 /* UIColor+Extension.swift */, + 191804221EB69AF5007753C4 /* TableKeys.swift */, + ); + name = Helper; + sourceTree = ""; + }; + 1918041E1EB686B1007753C4 /* View */ = { + isa = PBXGroup; + children = ( + 1918041C1EB686AA007753C4 /* FBMeBaseCell.swift */, + ); + name = View; + sourceTree = ""; + }; + 191804211EB69401007753C4 /* Model */ = { + isa = PBXGroup; + children = ( + 1918041F1EB693D3007753C4 /* FBMeUser.swift */, + ); + name = Model; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 191803FC1EB67FC9007753C4 /* FacebookMe */ = { + isa = PBXNativeTarget; + buildConfigurationList = 1918040F1EB67FC9007753C4 /* Build configuration list for PBXNativeTarget "FacebookMe" */; + buildPhases = ( + 191803F91EB67FC9007753C4 /* Sources */, + 191803FA1EB67FC9007753C4 /* Frameworks */, + 191803FB1EB67FC9007753C4 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = FacebookMe; + productName = FacebookMe; + productReference = 191803FD1EB67FC9007753C4 /* FacebookMe.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 191803F51EB67FC9007753C4 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0830; + LastUpgradeCheck = 1020; + ORGANIZATIONNAME = "Yi Gu"; + TargetAttributes = { + 191803FC1EB67FC9007753C4 = { + CreatedOnToolsVersion = 8.3.2; + DevelopmentTeam = 44JDRP3T56; + LastSwiftMigration = 1020; + ProvisioningStyle = Automatic; + }; + }; + }; + buildConfigurationList = 191803F81EB67FC9007753C4 /* Build configuration list for PBXProject "FacebookMe" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 191803F41EB67FC9007753C4; + productRefGroup = 191803FE1EB67FC9007753C4 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 191803FC1EB67FC9007753C4 /* FacebookMe */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 191803FB1EB67FC9007753C4 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 1918040B1EB67FC9007753C4 /* LaunchScreen.storyboard in Resources */, + 191804081EB67FC9007753C4 /* Assets.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 191803F91EB67FC9007753C4 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 1918041B1EB684F6007753C4 /* FBMeViewController.swift in Sources */, + 191804161EB6819F007753C4 /* Specs.swift in Sources */, + 1918041D1EB686AA007753C4 /* FBMeBaseCell.swift in Sources */, + 191804011EB67FC9007753C4 /* AppDelegate.swift in Sources */, + 191804131EB68093007753C4 /* FBMeBaseViewController.swift in Sources */, + 191804191EB68395007753C4 /* UIColor+Extension.swift in Sources */, + 191804231EB69AF5007753C4 /* TableKeys.swift in Sources */, + 191804201EB693D3007753C4 /* FBMeUser.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 191804091EB67FC9007753C4 /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 1918040A1EB67FC9007753C4 /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 1918040D1EB67FC9007753C4 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 1918040E1EB67FC9007753C4 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 191804101EB67FC9007753C4 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + DEVELOPMENT_TEAM = 44JDRP3T56; + GCC_TREAT_WARNINGS_AS_ERRORS = YES; + INFOPLIST_FILE = FacebookMe/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = yigu.FacebookMe; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + }; + name = Debug; + }; + 191804111EB67FC9007753C4 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + DEVELOPMENT_TEAM = 44JDRP3T56; + GCC_TREAT_WARNINGS_AS_ERRORS = YES; + INFOPLIST_FILE = FacebookMe/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = yigu.FacebookMe; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 191803F81EB67FC9007753C4 /* Build configuration list for PBXProject "FacebookMe" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1918040D1EB67FC9007753C4 /* Debug */, + 1918040E1EB67FC9007753C4 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 1918040F1EB67FC9007753C4 /* Build configuration list for PBXNativeTarget "FacebookMe" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 191804101EB67FC9007753C4 /* Debug */, + 191804111EB67FC9007753C4 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 191803F51EB67FC9007753C4 /* Project object */; +} diff --git a/Project 02 - LoveTweet/LoveTweet.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Project 03 - FacebookMe/FacebookMe.xcodeproj/project.xcworkspace/contents.xcworkspacedata similarity index 70% rename from Project 02 - LoveTweet/LoveTweet.xcodeproj/project.xcworkspace/contents.xcworkspacedata rename to Project 03 - FacebookMe/FacebookMe.xcodeproj/project.xcworkspace/contents.xcworkspacedata index 81b6b941..425a07f6 100644 --- a/Project 02 - LoveTweet/LoveTweet.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ b/Project 03 - FacebookMe/FacebookMe.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -2,6 +2,6 @@ + location = "self:FacebookMe.xcodeproj"> diff --git a/Project 03 - FacebookMe/FacebookMe.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Project 03 - FacebookMe/FacebookMe.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/Project 03 - FacebookMe/FacebookMe.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Project 03 - FacebookMe/FacebookMe/AppDelegate.swift b/Project 03 - FacebookMe/FacebookMe/AppDelegate.swift new file mode 100644 index 00000000..c556e345 --- /dev/null +++ b/Project 03 - FacebookMe/FacebookMe/AppDelegate.swift @@ -0,0 +1,24 @@ +// +// AppDelegate.swift +// FacebookMe +// +// Copyright © 2017 Yi Gu. All rights reserved. +// + +import UIKit + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + + var window: UIWindow? + + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { + + window = UIWindow(frame: UIScreen.main.bounds) + window?.rootViewController = UINavigationController(rootViewController: FBMeViewController()) + window?.makeKeyAndVisible() + + return true + } +} + diff --git a/Project 18 - ClassicPhotos/ClassicPhotos/Images.xcassets/AppIcon.appiconset/Contents.json b/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from Project 18 - ClassicPhotos/ClassicPhotos/Images.xcassets/AppIcon.appiconset/Contents.json rename to Project 03 - FacebookMe/FacebookMe/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/Project 04 - Todo/Todo/Assets.xcassets/Contents.json b/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/Contents.json similarity index 100% rename from Project 04 - Todo/Todo/Assets.xcassets/Contents.json rename to Project 03 - FacebookMe/FacebookMe/Assets.xcassets/Contents.json diff --git a/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/map.imageset/Contents.json b/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/bayMax.imageset/Contents.json similarity index 88% rename from Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/map.imageset/Contents.json rename to Project 03 - FacebookMe/FacebookMe/Assets.xcassets/bayMax.imageset/Contents.json index 7150a8c9..fb82202d 100644 --- a/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/map.imageset/Contents.json +++ b/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/bayMax.imageset/Contents.json @@ -2,7 +2,6 @@ "images" : [ { "idiom" : "universal", - "filename" : "map.png", "scale" : "1x" }, { @@ -11,6 +10,7 @@ }, { "idiom" : "universal", + "filename" : "images.jpeg", "scale" : "3x" } ], diff --git a/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/bayMax.imageset/images.jpeg b/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/bayMax.imageset/images.jpeg new file mode 100644 index 00000000..c3f9a464 Binary files /dev/null and b/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/bayMax.imageset/images.jpeg differ diff --git a/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_education.imageset/Contents.json b/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_education.imageset/Contents.json new file mode 100644 index 00000000..cb23eab2 --- /dev/null +++ b/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_education.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "fb_glyphs_education_20_20x20_@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "fb_glyphs_education_20_20x20_@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_education.imageset/fb_glyphs_education_20_20x20_@2x.png b/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_education.imageset/fb_glyphs_education_20_20x20_@2x.png new file mode 100644 index 00000000..8f794cda Binary files /dev/null and b/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_education.imageset/fb_glyphs_education_20_20x20_@2x.png differ diff --git a/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_education.imageset/fb_glyphs_education_20_20x20_@3x.png b/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_education.imageset/fb_glyphs_education_20_20x20_@3x.png new file mode 100644 index 00000000..88e70d32 Binary files /dev/null and b/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_education.imageset/fb_glyphs_education_20_20x20_@3x.png differ diff --git a/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_events.imageset/Contents.json b/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_events.imageset/Contents.json new file mode 100644 index 00000000..6d36d37d --- /dev/null +++ b/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_events.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "fb_glyphs_calendar_20_20x20_@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "fb_glyphs_calendar_20_20x20_@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_events.imageset/fb_glyphs_calendar_20_20x20_@2x.png b/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_events.imageset/fb_glyphs_calendar_20_20x20_@2x.png new file mode 100644 index 00000000..cf558c64 Binary files /dev/null and b/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_events.imageset/fb_glyphs_calendar_20_20x20_@2x.png differ diff --git a/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_events.imageset/fb_glyphs_calendar_20_20x20_@3x.png b/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_events.imageset/fb_glyphs_calendar_20_20x20_@3x.png new file mode 100644 index 00000000..8bdba013 Binary files /dev/null and b/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_events.imageset/fb_glyphs_calendar_20_20x20_@3x.png differ diff --git a/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_friends.imageset/Contents.json b/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_friends.imageset/Contents.json new file mode 100644 index 00000000..478399b9 --- /dev/null +++ b/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_friends.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "fb_glyphs_friend-friends_20_20x20_@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "fb_glyphs_friend-friends_20_20x20_@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_friends.imageset/fb_glyphs_friend-friends_20_20x20_@2x.png b/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_friends.imageset/fb_glyphs_friend-friends_20_20x20_@2x.png new file mode 100644 index 00000000..11984937 Binary files /dev/null and b/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_friends.imageset/fb_glyphs_friend-friends_20_20x20_@2x.png differ diff --git a/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_friends.imageset/fb_glyphs_friend-friends_20_20x20_@3x.png b/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_friends.imageset/fb_glyphs_friend-friends_20_20x20_@3x.png new file mode 100644 index 00000000..6c8e1832 Binary files /dev/null and b/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_friends.imageset/fb_glyphs_friend-friends_20_20x20_@3x.png differ diff --git a/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_games.imageset/Contents.json b/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_games.imageset/Contents.json new file mode 100644 index 00000000..e4486088 --- /dev/null +++ b/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_games.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "fb_glyphs_games_20_20x20_@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "fb_glyphs_games_20_20x20_@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_games.imageset/fb_glyphs_games_20_20x20_@2x.png b/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_games.imageset/fb_glyphs_games_20_20x20_@2x.png new file mode 100644 index 00000000..53031427 Binary files /dev/null and b/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_games.imageset/fb_glyphs_games_20_20x20_@2x.png differ diff --git a/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_games.imageset/fb_glyphs_games_20_20x20_@3x.png b/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_games.imageset/fb_glyphs_games_20_20x20_@3x.png new file mode 100644 index 00000000..0c4a43c5 Binary files /dev/null and b/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_games.imageset/fb_glyphs_games_20_20x20_@3x.png differ diff --git a/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_groups.imageset/Contents.json b/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_groups.imageset/Contents.json new file mode 100644 index 00000000..3494b7c4 --- /dev/null +++ b/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_groups.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "fb_glyphs_app-groups_20_20x20_@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "fb_glyphs_app-groups_20_20x20_@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_groups.imageset/fb_glyphs_app-groups_20_20x20_@2x.png b/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_groups.imageset/fb_glyphs_app-groups_20_20x20_@2x.png new file mode 100644 index 00000000..11f88df4 Binary files /dev/null and b/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_groups.imageset/fb_glyphs_app-groups_20_20x20_@2x.png differ diff --git a/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_groups.imageset/fb_glyphs_app-groups_20_20x20_@3x.png b/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_groups.imageset/fb_glyphs_app-groups_20_20x20_@3x.png new file mode 100644 index 00000000..3a61c813 Binary files /dev/null and b/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_groups.imageset/fb_glyphs_app-groups_20_20x20_@3x.png differ diff --git a/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_help_and_support.imageset/Contents.json b/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_help_and_support.imageset/Contents.json new file mode 100644 index 00000000..515eb486 --- /dev/null +++ b/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_help_and_support.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "fb_glyphs_question_20_20x20_@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "fb_glyphs_question_20_20x20_@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_help_and_support.imageset/fb_glyphs_question_20_20x20_@2x.png b/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_help_and_support.imageset/fb_glyphs_question_20_20x20_@2x.png new file mode 100644 index 00000000..1d26f150 Binary files /dev/null and b/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_help_and_support.imageset/fb_glyphs_question_20_20x20_@2x.png differ diff --git a/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_help_and_support.imageset/fb_glyphs_question_20_20x20_@3x.png b/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_help_and_support.imageset/fb_glyphs_question_20_20x20_@3x.png new file mode 100644 index 00000000..4b255daf Binary files /dev/null and b/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_help_and_support.imageset/fb_glyphs_question_20_20x20_@3x.png differ diff --git a/Project 04 - Todo/Todo/Assets.xcassets/selected/shopping-cart-selected.imageset/Contents.json b/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_placeholder.imageset/Contents.json similarity index 75% rename from Project 04 - Todo/Todo/Assets.xcassets/selected/shopping-cart-selected.imageset/Contents.json rename to Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_placeholder.imageset/Contents.json index 9c5ca47f..55433427 100644 --- a/Project 04 - Todo/Todo/Assets.xcassets/selected/shopping-cart-selected.imageset/Contents.json +++ b/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_placeholder.imageset/Contents.json @@ -6,11 +6,12 @@ }, { "idiom" : "universal", - "filename" : "shopping-cart-selected@2x.png", + "filename" : "fb_placeholder@2x.png", "scale" : "2x" }, { "idiom" : "universal", + "filename" : "fb_placeholder@3x.png", "scale" : "3x" } ], diff --git a/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_placeholder.imageset/fb_placeholder@2x.png b/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_placeholder.imageset/fb_placeholder@2x.png new file mode 100644 index 00000000..26e0f446 Binary files /dev/null and b/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_placeholder.imageset/fb_placeholder@2x.png differ diff --git a/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_placeholder.imageset/fb_placeholder@3x.png b/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_placeholder.imageset/fb_placeholder@3x.png new file mode 100644 index 00000000..24753256 Binary files /dev/null and b/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_placeholder.imageset/fb_placeholder@3x.png differ diff --git a/Project 04 - Todo/Todo/Assets.xcassets/selected/phone-selected.imageset/Contents.json b/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_privacy_shortcuts.imageset/Contents.json similarity index 71% rename from Project 04 - Todo/Todo/Assets.xcassets/selected/phone-selected.imageset/Contents.json rename to Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_privacy_shortcuts.imageset/Contents.json index 5981edc5..c4b0f437 100644 --- a/Project 04 - Todo/Todo/Assets.xcassets/selected/phone-selected.imageset/Contents.json +++ b/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_privacy_shortcuts.imageset/Contents.json @@ -6,11 +6,12 @@ }, { "idiom" : "universal", - "filename" : "phone-selected@2x.png", + "filename" : "fb_glyphs_lock_20_20x20_@2x.png", "scale" : "2x" }, { "idiom" : "universal", + "filename" : "fb_glyphs_lock_20_20x20_@3x.png", "scale" : "3x" } ], diff --git a/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_privacy_shortcuts.imageset/fb_glyphs_lock_20_20x20_@2x.png b/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_privacy_shortcuts.imageset/fb_glyphs_lock_20_20x20_@2x.png new file mode 100644 index 00000000..a4a4adc8 Binary files /dev/null and b/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_privacy_shortcuts.imageset/fb_glyphs_lock_20_20x20_@2x.png differ diff --git a/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_privacy_shortcuts.imageset/fb_glyphs_lock_20_20x20_@3x.png b/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_privacy_shortcuts.imageset/fb_glyphs_lock_20_20x20_@3x.png new file mode 100644 index 00000000..0df56424 Binary files /dev/null and b/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_privacy_shortcuts.imageset/fb_glyphs_lock_20_20x20_@3x.png differ diff --git a/Project 04 - Todo/Todo/Assets.xcassets/selected/travel-selected.imageset/Contents.json b/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_settings.imageset/Contents.json similarity index 71% rename from Project 04 - Todo/Todo/Assets.xcassets/selected/travel-selected.imageset/Contents.json rename to Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_settings.imageset/Contents.json index 5c9158b2..8c333624 100644 --- a/Project 04 - Todo/Todo/Assets.xcassets/selected/travel-selected.imageset/Contents.json +++ b/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_settings.imageset/Contents.json @@ -6,11 +6,12 @@ }, { "idiom" : "universal", - "filename" : "travel-selected@2x.png", + "filename" : "fb_glyphs_gear_20_20x20_@2x.png", "scale" : "2x" }, { "idiom" : "universal", + "filename" : "fb_glyphs_gear_20_20x20_@3x.png", "scale" : "3x" } ], diff --git a/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_settings.imageset/fb_glyphs_gear_20_20x20_@2x.png b/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_settings.imageset/fb_glyphs_gear_20_20x20_@2x.png new file mode 100644 index 00000000..9bd6c8b6 Binary files /dev/null and b/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_settings.imageset/fb_glyphs_gear_20_20x20_@2x.png differ diff --git a/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_settings.imageset/fb_glyphs_gear_20_20x20_@3x.png b/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_settings.imageset/fb_glyphs_gear_20_20x20_@3x.png new file mode 100644 index 00000000..f306fe49 Binary files /dev/null and b/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_settings.imageset/fb_glyphs_gear_20_20x20_@3x.png differ diff --git a/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_town_hall.imageset/Contents.json b/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_town_hall.imageset/Contents.json new file mode 100644 index 00000000..f54b6fee --- /dev/null +++ b/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_town_hall.imageset/Contents.json @@ -0,0 +1,22 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "fb_glyphs_house_20_20x20_@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "fb_glyphs_house_20_20x20_@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_town_hall.imageset/fb_glyphs_house_20_20x20_@2x.png b/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_town_hall.imageset/fb_glyphs_house_20_20x20_@2x.png new file mode 100644 index 00000000..3ab1b17f Binary files /dev/null and b/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_town_hall.imageset/fb_glyphs_house_20_20x20_@2x.png differ diff --git a/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_town_hall.imageset/fb_glyphs_house_20_20x20_@3x.png b/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_town_hall.imageset/fb_glyphs_house_20_20x20_@3x.png new file mode 100644 index 00000000..b2504648 Binary files /dev/null and b/Project 03 - FacebookMe/FacebookMe/Assets.xcassets/fb_town_hall.imageset/fb_glyphs_house_20_20x20_@3x.png differ diff --git a/Project 04 - Todo/Todo/Base.lproj/LaunchScreen.storyboard b/Project 03 - FacebookMe/FacebookMe/Base.lproj/LaunchScreen.storyboard similarity index 65% rename from Project 04 - Todo/Todo/Base.lproj/LaunchScreen.storyboard rename to Project 03 - FacebookMe/FacebookMe/Base.lproj/LaunchScreen.storyboard index 2e721e18..62ccb99b 100644 --- a/Project 04 - Todo/Todo/Base.lproj/LaunchScreen.storyboard +++ b/Project 03 - FacebookMe/FacebookMe/Base.lproj/LaunchScreen.storyboard @@ -1,7 +1,12 @@ - - + + + + + - + + + @@ -13,10 +18,9 @@ - + - - + diff --git a/Project 03 - FacebookMe/FacebookMe/FBMeBaseCell.swift b/Project 03 - FacebookMe/FacebookMe/FBMeBaseCell.swift new file mode 100644 index 00000000..2239f9d3 --- /dev/null +++ b/Project 03 - FacebookMe/FacebookMe/FBMeBaseCell.swift @@ -0,0 +1,27 @@ +// +// FBMeBaseCell.swift +// FacebookMe +// +// Copyright © 2017 Yi Gu. All rights reserved. +// + +import UIKit + +class FBMeBaseCell: UITableViewCell { + static let identifier = "FBMeBaseCell" + + override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { + super.init(style: .default, reuseIdentifier: reuseIdentifier) + + backgroundColor = Specs.color.white + textLabel?.textColor = Specs.color.black + textLabel?.font = Specs.font.large + + detailTextLabel?.font = Specs.font.small + detailTextLabel?.textColor = Specs.color.gray + } + + required init?(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} diff --git a/Project 03 - FacebookMe/FacebookMe/FBMeBaseViewController.swift b/Project 03 - FacebookMe/FacebookMe/FBMeBaseViewController.swift new file mode 100644 index 00000000..f8c9c6e1 --- /dev/null +++ b/Project 03 - FacebookMe/FacebookMe/FBMeBaseViewController.swift @@ -0,0 +1,15 @@ +// +// FBMeBaseViewController.swift +// FacebookMe +// +// Copyright © 2017 Yi Gu. All rights reserved. +// + +import UIKit + +class FBMeBaseViewController: UIViewController { + override func viewDidLoad() { + super.viewDidLoad() + view.backgroundColor = Specs.color.gray + } +} diff --git a/Project 03 - FacebookMe/FacebookMe/FBMeUser.swift b/Project 03 - FacebookMe/FacebookMe/FBMeUser.swift new file mode 100644 index 00000000..5f064dd4 --- /dev/null +++ b/Project 03 - FacebookMe/FacebookMe/FBMeUser.swift @@ -0,0 +1,20 @@ +// +// FBMeUser.swift +// FacebookMe +// +// Copyright © 2017 Yi Gu. All rights reserved. +// + +import UIKit + +class FBMeUser { + var name: String + var avatarName: String + var education: String + + init(name: String, avatarName: String = "bayMax", education: String) { + self.name = name + self.avatarName = avatarName + self.education = education + } +} diff --git a/Project 03 - FacebookMe/FacebookMe/FBMeViewController.swift b/Project 03 - FacebookMe/FacebookMe/FBMeViewController.swift new file mode 100644 index 00000000..d74c52dd --- /dev/null +++ b/Project 03 - FacebookMe/FacebookMe/FBMeViewController.swift @@ -0,0 +1,138 @@ +// +// FBMeViewController.swift +// FacebookMe +// +// Copyright © 2017 Yi Gu. All rights reserved. +// + +import UIKit + +class FBMeViewController: FBMeBaseViewController { + + typealias RowModel = [String: String] + + fileprivate var user: FBMeUser { + get { + return FBMeUser(name: "BayMax", education: "CMU") + } + } + + fileprivate var tableViewDataSource: [[String: Any]] { + get { + return TableKeys.populate(withUser: user) + } + } + + private let tableView: UITableView = { + let view = UITableView(frame: .zero, style: .grouped) + view.register(FBMeBaseCell.self, forCellReuseIdentifier: FBMeBaseCell.identifier) + return view + }() + + override func viewDidLoad() { + super.viewDidLoad() + + title = "Facebook" + navigationController?.navigationBar.barTintColor = Specs.color.tint + + tableView.delegate = self + tableView.dataSource = self + view.addSubview(tableView) + + // Set layout for tableView. + tableView.translatesAutoresizingMaskIntoConstraints = false + view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|-0-[tableView]-0-|", options: .directionLeadingToTrailing, metrics: nil, views: ["tableView": tableView])) + view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|-0-[tableView]-0-|", options: .directionLeadingToTrailing, metrics: nil, views: ["tableView": tableView])) + } + + fileprivate func rows(at section: Int) -> [Any] { + return tableViewDataSource[section][TableKeys.Rows] as! [Any] + } + + fileprivate func title(at section: Int) -> String? { + return tableViewDataSource[section][TableKeys.Section] as? String + } + + fileprivate func rowModel(at indexPath: IndexPath) -> RowModel { + return rows(at: indexPath.section)[indexPath.row] as! RowModel + } +} + +extension FBMeViewController: UITableViewDataSource { + func numberOfSections(in tableView: UITableView) -> Int { + return tableViewDataSource.count + } + + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return rows(at: section).count + } + + func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { + return title(at: section) + } + + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let modelForRow = rowModel(at: indexPath) + var cell = UITableViewCell() + + guard let title = modelForRow[TableKeys.Title] else { + return cell + } + + if title == user.name { + cell = UITableViewCell.init(style: .subtitle, reuseIdentifier: nil) + } else { + cell = tableView.dequeueReusableCell(withIdentifier: FBMeBaseCell.identifier, for: indexPath) + } + + cell.textLabel?.text = title + + if let imageName = modelForRow[TableKeys.ImageName] { + cell.imageView?.image = UIImage(named: imageName) + } else if title != TableKeys.logout { + cell.imageView?.image = UIImage(named: Specs.imageName.placeholder) + } + + if title == user.name { + cell.detailTextLabel?.text = modelForRow[TableKeys.SubTitle] + } + + return cell + } +} + +extension FBMeViewController: UITableViewDelegate { + func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { + let modelForRow = rowModel(at: indexPath) + + guard let title = modelForRow[TableKeys.Title] else { + return 0.0 + } + + if title == user.name { + return 64.0 + } else { + return 44.0 + } + } + + func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) { + let modelForRow = rowModel(at: indexPath) + + guard let title = modelForRow[TableKeys.Title] else { + return + } + + if title == TableKeys.seeMore || title == TableKeys.addFavorites { + cell.textLabel?.textColor = Specs.color.tint + cell.accessoryType = .none + } else if title == TableKeys.logout { + cell.textLabel?.centerXAnchor.constraint(equalTo: cell.centerXAnchor).isActive = true + cell.textLabel?.textColor = Specs.color.red + cell.textLabel?.textAlignment = .center + cell.accessoryType = .none + } else { + cell.accessoryType = .disclosureIndicator + } + } +} diff --git a/Project 04 - Todo/Todo/Info.plist b/Project 03 - FacebookMe/FacebookMe/Info.plist similarity index 92% rename from Project 04 - Todo/Todo/Info.plist rename to Project 03 - FacebookMe/FacebookMe/Info.plist index 40c6215d..c12df3b8 100644 --- a/Project 04 - Todo/Todo/Info.plist +++ b/Project 03 - FacebookMe/FacebookMe/Info.plist @@ -16,16 +16,12 @@ APPL CFBundleShortVersionString 1.0 - CFBundleSignature - ???? CFBundleVersion 1 LSRequiresIPhoneOS UILaunchStoryboardName LaunchScreen - UIMainStoryboardFile - Main UIRequiredDeviceCapabilities armv7 diff --git a/Project 03 - FacebookMe/FacebookMe/Specs.swift b/Project 03 - FacebookMe/FacebookMe/Specs.swift new file mode 100644 index 00000000..d68757a9 --- /dev/null +++ b/Project 03 - FacebookMe/FacebookMe/Specs.swift @@ -0,0 +1,66 @@ +// +// Specs.swift +// FacebookMe +// +// Copyright © 2017 Yi Gu. All rights reserved. +// + +import UIKit + +public struct Specs { + public struct Color { + public let tint = UIColor(hex: 0x3b5998) + public let red = UIColor.red + public let white = UIColor.white + public let black = UIColor.black + public let gray = UIColor.lightGray + } + + public struct FontSize { + public let tiny: CGFloat = 10 + public let small: CGFloat = 12 + public let regular: CGFloat = 14 + public let large: CGFloat = 16 + } + + public struct Font { + private static let regularName = "Helvetica Neue" + private static let boldName = "Helvetica Neue Bold" + public let tiny = UIFont(name: regularName, size: Specs.fontSize.tiny) + public let small = UIFont(name: regularName, size: Specs.fontSize.small) + public let regular = UIFont(name: regularName, size: Specs.fontSize.regular) + public let large = UIFont(name: regularName, size: Specs.fontSize.large) + public let smallBold = UIFont(name: boldName, size: Specs.fontSize.small) + public let regularBold = UIFont(name: boldName, size: Specs.fontSize.regular) + public let largeBold = UIFont(name: boldName, size: Specs.fontSize.large) + } + + public struct ImageName { + public let friends = "fb_friends" + public let events = "fb_events" + public let groups = "fb_groups" + public let education = "fb_education" + public let townHall = "fb_town_hall" + public let instantGames = "fb_games" + public let settings = "fb_settings" + public let privacyShortcuts = "fb_privacy_shortcuts" + public let helpSupport = "fb_help_and_support" + public let placeholder = "fb_placeholder" + } + + public static var color: Color { + return Color() + } + + public static var fontSize: FontSize { + return FontSize() + } + + public static var font: Font { + return Font() + } + + public static var imageName: ImageName { + return ImageName() + } +} diff --git a/Project 03 - FacebookMe/FacebookMe/TableKeys.swift b/Project 03 - FacebookMe/FacebookMe/TableKeys.swift new file mode 100644 index 00000000..6f657e10 --- /dev/null +++ b/Project 03 - FacebookMe/FacebookMe/TableKeys.swift @@ -0,0 +1,60 @@ +// +// TableKeys.swift +// FacebookMe +// +// Copyright © 2017 Yi Gu. All rights reserved. +// + +import Foundation + +public struct TableKeys { + static let Section = "section" + static let Rows = "rows" + static let ImageName = "imageName" + static let Title = "title" + static let SubTitle = "subTitle" + static let seeMore = "See More..." + static let addFavorites = "Add Favorites..." + static let logout = "Log Out" + + static func populate(withUser user: FBMeUser) -> [[String: Any]] { + return [ + [ + TableKeys.Rows: [ + [TableKeys.ImageName: user.avatarName, TableKeys.Title: user.name, TableKeys.SubTitle: "View your profile"] + ] + ], + [ + TableKeys.Rows: [ + [TableKeys.ImageName: Specs.imageName.friends, TableKeys.Title: "Friends"], + [TableKeys.ImageName: Specs.imageName.events, TableKeys.Title: "Events"], + [TableKeys.ImageName: Specs.imageName.groups, TableKeys.Title: "Groups"], + [TableKeys.ImageName: Specs.imageName.education, TableKeys.Title: user.education], + [TableKeys.ImageName: Specs.imageName.townHall, TableKeys.Title: "Town Hall"], + [TableKeys.ImageName: Specs.imageName.instantGames, TableKeys.Title: "Instant Games"], + [TableKeys.Title: TableKeys.seeMore] + ] + ], + [ + TableKeys.Section: "FAVORITES", + TableKeys.Rows: [ + [TableKeys.Title: TableKeys.addFavorites] + ] + ], + [ + TableKeys.Rows: [ + [TableKeys.ImageName: Specs.imageName.settings, TableKeys.Title: "Settings"], + [TableKeys.ImageName: Specs.imageName.privacyShortcuts, TableKeys.Title: "Privacy Shortcuts"], + [TableKeys.ImageName: Specs.imageName.helpSupport, TableKeys.Title: "Help and Support"] + ] + ], + [ + TableKeys.Rows: [ + [TableKeys.Title: TableKeys.logout] + ] + ] + ] + } +} + + diff --git a/Project 03 - FacebookMe/FacebookMe/UIColor+Extension.swift b/Project 03 - FacebookMe/FacebookMe/UIColor+Extension.swift new file mode 100644 index 00000000..9262a12f --- /dev/null +++ b/Project 03 - FacebookMe/FacebookMe/UIColor+Extension.swift @@ -0,0 +1,18 @@ +// +// UIColor+Extension.swift +// FacebookMe +// +// Copyright © 2017 Yi Gu. All rights reserved. +// + +import UIKit + +public extension UIColor { + convenience init(r: Int, g: Int, b: Int, a: CGFloat) { + self.init(red: CGFloat(r) / 255, green: CGFloat(g) / 255, blue: CGFloat(b) / 255, alpha: a) + } + + convenience init(hex: Int) { + self.init(r: (hex & 0xff0000) >> 16, g: (hex & 0xff00) >> 8, b: (hex & 0xff), a: 1) + } +} diff --git a/Project 03 - FacebookMe/README.md b/Project 03 - FacebookMe/README.md new file mode 100644 index 00000000..d966db16 --- /dev/null +++ b/Project 03 - FacebookMe/README.md @@ -0,0 +1,6 @@ +FacebookMe +========== +FacebookMe is a Swift App Mimics the personal profile tab of Facebook. It demos one simple way to implement a UITableView with mutiple sections and different types of cells. + +## Screenshots +![FacebookMe](./FacebookMe.gif) diff --git a/Project 03 - Stopwatch/Stopwatch.xcodeproj/project.xcworkspace/xcuserdata/Yi.xcuserdatad/UserInterfaceState.xcuserstate b/Project 03 - Stopwatch/Stopwatch.xcodeproj/project.xcworkspace/xcuserdata/Yi.xcuserdatad/UserInterfaceState.xcuserstate deleted file mode 100644 index 2ae97376..00000000 Binary files a/Project 03 - Stopwatch/Stopwatch.xcodeproj/project.xcworkspace/xcuserdata/Yi.xcuserdatad/UserInterfaceState.xcuserstate and /dev/null differ diff --git a/Project 03 - Stopwatch/Stopwatch.xcodeproj/xcuserdata/Yi.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/Project 03 - Stopwatch/Stopwatch.xcodeproj/xcuserdata/Yi.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist deleted file mode 100644 index fe2b4541..00000000 --- a/Project 03 - Stopwatch/Stopwatch.xcodeproj/xcuserdata/Yi.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/Project 03 - Stopwatch/Stopwatch.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/Stopwatch.xcscheme b/Project 03 - Stopwatch/Stopwatch.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/Stopwatch.xcscheme deleted file mode 100644 index 35235328..00000000 --- a/Project 03 - Stopwatch/Stopwatch.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/Stopwatch.xcscheme +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Project 03 - Stopwatch/Stopwatch.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/xcschememanagement.plist b/Project 03 - Stopwatch/Stopwatch.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/xcschememanagement.plist deleted file mode 100644 index 17e1bb60..00000000 --- a/Project 03 - Stopwatch/Stopwatch.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/xcschememanagement.plist +++ /dev/null @@ -1,22 +0,0 @@ - - - - - SchemeUserState - - Stopwatch.xcscheme - - orderHint - 0 - - - SuppressBuildableAutocreation - - 197BEE141C76E410005AD5E2 - - primary - - - - - diff --git a/Project 04 - Todo/README.md b/Project 04 - Todo/README.md deleted file mode 100644 index 7c972ca0..00000000 --- a/Project 04 - Todo/README.md +++ /dev/null @@ -1,6 +0,0 @@ -Todo -========== -Todo is iOS App written by Swift. It is inspired by Jakelin's course in imooc.com and demonstrates how to manipulate tableview. This app shows a way to implement tableview add, edit and delete functions. - -## Screenshots -![Todo](./Todo.gif) diff --git a/Project 04 - Todo/Todo.gif b/Project 04 - Todo/Todo.gif deleted file mode 100644 index 4bc1c49d..00000000 Binary files a/Project 04 - Todo/Todo.gif and /dev/null differ diff --git a/Project 04 - Todo/Todo.xcodeproj/project.xcworkspace/xcuserdata/Yi.xcuserdatad/UserInterfaceState.xcuserstate b/Project 04 - Todo/Todo.xcodeproj/project.xcworkspace/xcuserdata/Yi.xcuserdatad/UserInterfaceState.xcuserstate deleted file mode 100644 index b38d3fca..00000000 Binary files a/Project 04 - Todo/Todo.xcodeproj/project.xcworkspace/xcuserdata/Yi.xcuserdatad/UserInterfaceState.xcuserstate and /dev/null differ diff --git a/Project 04 - Todo/Todo.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/Todo.xcscheme b/Project 04 - Todo/Todo.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/Todo.xcscheme deleted file mode 100644 index 275da6ef..00000000 --- a/Project 04 - Todo/Todo.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/Todo.xcscheme +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Project 04 - Todo/Todo.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/xcschememanagement.plist b/Project 04 - Todo/Todo.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/xcschememanagement.plist deleted file mode 100644 index 11cd46f0..00000000 --- a/Project 04 - Todo/Todo.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/xcschememanagement.plist +++ /dev/null @@ -1,22 +0,0 @@ - - - - - SchemeUserState - - Todo.xcscheme - - orderHint - 0 - - - SuppressBuildableAutocreation - - 19515F891C8558F800DC2284 - - primary - - - - - diff --git a/Project 04 - Todo/Todo/AppDelegate.swift b/Project 04 - Todo/Todo/AppDelegate.swift deleted file mode 100644 index 1f315b4a..00000000 --- a/Project 04 - Todo/Todo/AppDelegate.swift +++ /dev/null @@ -1,20 +0,0 @@ -// -// AppDelegate.swift -// Todo -// -// Copyright © 2016 YiGu. All rights reserved. -// - -import UIKit - -@UIApplicationMain -class AppDelegate: UIResponder, UIApplicationDelegate { - - var window: UIWindow? - - func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { - // Override point for customization after application launch. - return true - } -} - diff --git a/Project 04 - Todo/Todo/Assets.xcassets/selected/child-selected.imageset/child-selected@2x.png b/Project 04 - Todo/Todo/Assets.xcassets/selected/child-selected.imageset/child-selected@2x.png deleted file mode 100644 index f4286d1e..00000000 Binary files a/Project 04 - Todo/Todo/Assets.xcassets/selected/child-selected.imageset/child-selected@2x.png and /dev/null differ diff --git a/Project 04 - Todo/Todo/Assets.xcassets/selected/phone-selected.imageset/phone-selected@2x.png b/Project 04 - Todo/Todo/Assets.xcassets/selected/phone-selected.imageset/phone-selected@2x.png deleted file mode 100644 index 58456fd3..00000000 Binary files a/Project 04 - Todo/Todo/Assets.xcassets/selected/phone-selected.imageset/phone-selected@2x.png and /dev/null differ diff --git a/Project 04 - Todo/Todo/Assets.xcassets/selected/shopping-cart-selected.imageset/shopping-cart-selected@2x.png b/Project 04 - Todo/Todo/Assets.xcassets/selected/shopping-cart-selected.imageset/shopping-cart-selected@2x.png deleted file mode 100644 index 34813b71..00000000 Binary files a/Project 04 - Todo/Todo/Assets.xcassets/selected/shopping-cart-selected.imageset/shopping-cart-selected@2x.png and /dev/null differ diff --git a/Project 04 - Todo/Todo/Assets.xcassets/selected/travel-selected.imageset/travel-selected@2x.png b/Project 04 - Todo/Todo/Assets.xcassets/selected/travel-selected.imageset/travel-selected@2x.png deleted file mode 100644 index 8b2f1669..00000000 Binary files a/Project 04 - Todo/Todo/Assets.xcassets/selected/travel-selected.imageset/travel-selected@2x.png and /dev/null differ diff --git a/Project 04 - Todo/Todo/Assets.xcassets/unselected/child.imageset/child@2x.png b/Project 04 - Todo/Todo/Assets.xcassets/unselected/child.imageset/child@2x.png deleted file mode 100644 index d7027a4f..00000000 Binary files a/Project 04 - Todo/Todo/Assets.xcassets/unselected/child.imageset/child@2x.png and /dev/null differ diff --git a/Project 04 - Todo/Todo/Assets.xcassets/unselected/phone.imageset/Contents.json b/Project 04 - Todo/Todo/Assets.xcassets/unselected/phone.imageset/Contents.json deleted file mode 100644 index 5274fd54..00000000 --- a/Project 04 - Todo/Todo/Assets.xcassets/unselected/phone.imageset/Contents.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "filename" : "phone@2x.png", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/Project 04 - Todo/Todo/Assets.xcassets/unselected/phone.imageset/phone@2x.png b/Project 04 - Todo/Todo/Assets.xcassets/unselected/phone.imageset/phone@2x.png deleted file mode 100644 index 55d29179..00000000 Binary files a/Project 04 - Todo/Todo/Assets.xcassets/unselected/phone.imageset/phone@2x.png and /dev/null differ diff --git a/Project 04 - Todo/Todo/Assets.xcassets/unselected/shopping-cart.imageset/Contents.json b/Project 04 - Todo/Todo/Assets.xcassets/unselected/shopping-cart.imageset/Contents.json deleted file mode 100644 index 43c62af1..00000000 --- a/Project 04 - Todo/Todo/Assets.xcassets/unselected/shopping-cart.imageset/Contents.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "filename" : "shopping-cart@2x.png", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/Project 04 - Todo/Todo/Assets.xcassets/unselected/shopping-cart.imageset/shopping-cart@2x.png b/Project 04 - Todo/Todo/Assets.xcassets/unselected/shopping-cart.imageset/shopping-cart@2x.png deleted file mode 100644 index 2e194702..00000000 Binary files a/Project 04 - Todo/Todo/Assets.xcassets/unselected/shopping-cart.imageset/shopping-cart@2x.png and /dev/null differ diff --git a/Project 04 - Todo/Todo/Assets.xcassets/unselected/travel.imageset/travel@2x.png b/Project 04 - Todo/Todo/Assets.xcassets/unselected/travel.imageset/travel@2x.png deleted file mode 100644 index cc573e90..00000000 Binary files a/Project 04 - Todo/Todo/Assets.xcassets/unselected/travel.imageset/travel@2x.png and /dev/null differ diff --git a/Project 04 - Todo/Todo/Base.lproj/Main.storyboard b/Project 04 - Todo/Todo/Base.lproj/Main.storyboard deleted file mode 100644 index 32134e17..00000000 --- a/Project 04 - Todo/Todo/Base.lproj/Main.storyboard +++ /dev/null @@ -1,245 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Project 04 - Todo/Todo/DetailViewController.swift b/Project 04 - Todo/Todo/DetailViewController.swift deleted file mode 100644 index 49b99c98..00000000 --- a/Project 04 - Todo/Todo/DetailViewController.swift +++ /dev/null @@ -1,108 +0,0 @@ -// -// DetailViewController.swift -// Todo -// -// Copyright © 2016 YiGu. All rights reserved. -// - -import UIKit - -class DetailViewController: UIViewController { - - @IBOutlet weak var childButton: UIButton! - @IBOutlet weak var phoneButton: UIButton! - @IBOutlet weak var shoppingCartButton: UIButton! - @IBOutlet weak var travelButton: UIButton! - @IBOutlet weak var todoTitleLabel: UITextField! - @IBOutlet weak var todoDatePicker: UIDatePicker! - - var todo: ToDoItem? - - override func viewDidLoad() { - super.viewDidLoad() - - if let todo = todo { - self.title = "Edit Todo" - if todo.image == "child-selected"{ - childButton.isSelected = true - } - else if todo.image == "phone-selected"{ - phoneButton.isSelected = true - } - else if todo.image == "shopping-cart-selected"{ - shoppingCartButton.isSelected = true - } - else if todo.image == "travel-selected"{ - travelButton.isSelected = true - } - - todoTitleLabel.text = todo.title - todoDatePicker.setDate(todo.date, animated: false) - } else { - title = "New Todo" - childButton.isSelected = true - } - } - - // MARK: type select - @IBAction func selectChild(_ sender: AnyObject) { - resetButtons() - childButton.isSelected = true - } - - @IBAction func selectPhone(_ sender: AnyObject) { - resetButtons() - phoneButton.isSelected = true - } - - @IBAction func selectShoppingCart(_ sender: AnyObject) { - resetButtons() - shoppingCartButton.isSelected = true - } - - @IBAction func selectTravel(_ sender: AnyObject) { - resetButtons() - travelButton.isSelected = true - } - - func resetButtons() { - childButton.isSelected = false - phoneButton.isSelected = false - shoppingCartButton.isSelected = false - travelButton.isSelected = false - } - - // MARK: create or edit a new todo - @IBAction func tapDone(_ sender: AnyObject) { - var image = "" - if childButton.isSelected { - image = "child-selected" - } - else if phoneButton.isSelected { - image = "phone-selected" - } - else if shoppingCartButton.isSelected { - image = "shopping-cart-selected" - } - else if travelButton.isSelected { - image = "travel-selected" - } - - if let todo = todo { - todo.image = image - todo.title = todoTitleLabel.text! - todo.date = todoDatePicker.date - } else { - let uuid = UUID().uuidString - todo = ToDoItem(id: uuid, image: image, title: todoTitleLabel.text!, date: todoDatePicker.date) - todos.append(todo!) - } - - let _ = navigationController?.popToRootViewController(animated: true) - } - - override func touchesBegan(_ touches: Set, with event: UIEvent?) { - super.touchesBegan(touches, with: event) - view.endEditing(true) - } -} diff --git a/Project 04 - Todo/Todo/ToDoItem.swift b/Project 04 - Todo/Todo/ToDoItem.swift deleted file mode 100644 index ae9a2127..00000000 --- a/Project 04 - Todo/Todo/ToDoItem.swift +++ /dev/null @@ -1,22 +0,0 @@ -// -// ToDoItem.swift -// Todo -// -// Copyright © 2016 YiGu. All rights reserved. -// - -import Foundation - -class ToDoItem: NSObject { - var id: String - var image: String - var title: String - var date: Date - - init(id: String, image: String, title: String, date: Date) { - self.id = id - self.image = image - self.title = title - self.date = date - } -} diff --git a/Project 04 - Todo/Todo/Utils.swift b/Project 04 - Todo/Todo/Utils.swift deleted file mode 100644 index 23c13cb1..00000000 --- a/Project 04 - Todo/Todo/Utils.swift +++ /dev/null @@ -1,20 +0,0 @@ -// -// Utils.swift -// Todo -// -// Copyright © 2016 YiGu. All rights reserved. -// - -import Foundation - -func dateFromString(_ date: String) -> Date? { - let dateFormatter = DateFormatter() - dateFormatter.dateFormat = "yyyy-MM-dd" - return dateFormatter.date(from: date) -} - -func stringFromDate(_ date: Date) -> String { - let dateFormatter = DateFormatter() - dateFormatter.dateFormat = "yyyy-MM-dd" - return dateFormatter.string(from: date) -} diff --git a/Project 04 - Todo/Todo/ViewController.swift b/Project 04 - Todo/Todo/ViewController.swift deleted file mode 100644 index a7153305..00000000 --- a/Project 04 - Todo/Todo/ViewController.swift +++ /dev/null @@ -1,115 +0,0 @@ -// -// ViewController.swift -// Todo -// -// Copyright © 2016 YiGu. All rights reserved. -// - -import UIKit - -var todos: [ToDoItem] = [] - -class ViewController: UIViewController { - - @IBOutlet weak var todoTableView: UITableView! - - override func viewDidLoad() { - super.viewDidLoad() - - navigationItem.leftBarButtonItem = editButtonItem - - todos = [ToDoItem(id: "1", image: "child-selected", title: "Go to Disney", date: dateFromString("2014-10-20")!), - ToDoItem(id: "2", image: "shopping-cart-selected", title: "Cicso Shopping", date: dateFromString("2014-10-28")!), - ToDoItem(id: "3", image: "phone-selected", title: "Phone to Jobs", date: dateFromString("2014-10-30")!), - ToDoItem(id: "4", image: "travel-selected", title: "Plan to Europe", date: dateFromString("2014-10-31")!)] - } - - override func viewWillAppear(_ animated: Bool) { - super.viewWillAppear(animated) - todoTableView.reloadData() - } - - // MARK - helper func - func setMessageLabel(_ messageLabel: UILabel, frame: CGRect, text: String, textColor: UIColor, numberOfLines: Int, textAlignment: NSTextAlignment, font: UIFont) { - messageLabel.frame = frame - messageLabel.text = text - messageLabel.textColor = textColor - messageLabel.numberOfLines = numberOfLines - messageLabel.textAlignment = textAlignment - messageLabel.font = font - messageLabel.sizeToFit() - } - - func setCellWithTodoItem(_ cell: UITableViewCell, todo: ToDoItem) { - let imageView: UIImageView = cell.viewWithTag(11) as! UIImageView - let titleLabel: UILabel = cell.viewWithTag(12) as! UILabel - let dateLabel: UILabel = cell.viewWithTag(13) as! UILabel - - imageView.image = UIImage(named: todo.image) - titleLabel.text = todo.title - dateLabel.text = stringFromDate(todo.date) - } - - override func prepare(for segue: UIStoryboardSegue, sender: Any?) { - if segue.identifier == "editTodo" { - let vc = segue.destination as! DetailViewController - let indexPath = todoTableView.indexPathForSelectedRow - if let indexPath = indexPath { - vc.todo = todos[(indexPath as NSIndexPath).row] - } - } - } -} - -extension ViewController: UITableViewDataSource { - func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - - if todos.count != 0 { - return todos.count - } else { - let messageLabel: UILabel = UILabel() - - setMessageLabel(messageLabel, frame: CGRect(x: 0, y: 0, width: self.view.bounds.size.width, height: self.view.bounds.size.height), text: "No data is currently available.", textColor: UIColor.black, numberOfLines: 0, textAlignment: NSTextAlignment.center, font: UIFont(name:"Palatino-Italic", size: 20)!) - - self.todoTableView.backgroundView = messageLabel - self.todoTableView.separatorStyle = UITableViewCellSeparatorStyle.none - - return 0 - } - } - - func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { - let cellIdentifier: String = "todoCell" - let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) - - setCellWithTodoItem(cell, todo: todos[(indexPath as NSIndexPath).row]) - - return cell - } -} - -extension ViewController: UITableViewDelegate { - // Edit mode - override func setEditing(_ editing: Bool, animated: Bool) { - super.setEditing(editing, animated: animated) - todoTableView.setEditing(editing, animated: true) - } - - // Delete the cell - func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) { - if editingStyle == UITableViewCellEditingStyle.delete { - todos.remove(at: (indexPath as NSIndexPath).row) - todoTableView.deleteRows(at: [indexPath], with: UITableViewRowAnimation.automatic) - } - } - - // Move the cell - func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool { - return self.isEditing - } - - func tableView(_ tableView: UITableView, moveRowAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) { - let todo = todos.remove(at: (sourceIndexPath as NSIndexPath).row) - todos.insert(todo, at: (destinationIndexPath as NSIndexPath).row) - } -} diff --git a/Project 04 - TodoTDD/README.md b/Project 04 - TodoTDD/README.md new file mode 100644 index 00000000..60ac2e0b --- /dev/null +++ b/Project 04 - TodoTDD/README.md @@ -0,0 +1,7 @@ +ToDoTDD +========== +TodoTDD is a simple to do list iOS App. It is inspired by Dr. Dominik Hauser's book *Test-Driven iOS Developement with Swift 4* and demonstrates how to write unit / UI tests for UI components, network layer, data serizalization, and etc. by following the test driven development process. The code test coverage is 91.9%. + +## Screenshots + +![ToDOTDD](./ToDoTDD.gif) diff --git a/Project 04 - TodoTDD/ToDo.xcodeproj/project.pbxproj b/Project 04 - TodoTDD/ToDo.xcodeproj/project.pbxproj new file mode 100644 index 00000000..ce115a71 --- /dev/null +++ b/Project 04 - TodoTDD/ToDo.xcodeproj/project.pbxproj @@ -0,0 +1,738 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 48; + objects = { + +/* Begin PBXBuildFile section */ + 1962BCA4228768A9000130AD /* APIClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1962BCA3228768A9000130AD /* APIClient.swift */; }; + 1962BCA6228768CB000130AD /* APIClientTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1962BCA5228768CB000130AD /* APIClientTests.swift */; }; + 1962BCAB22876BC6000130AD /* Token.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1962BCAA22876BC6000130AD /* Token.swift */; }; + 1962BCAD2290C8C9000130AD /* StoryboardTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1962BCAC2290C8C9000130AD /* StoryboardTests.swift */; }; + 19946964227E3B5C00138341 /* InputViewControllerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19946963227E3B5C00138341 /* InputViewControllerTests.swift */; }; + 19946966227E3B9200138341 /* InputViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19946965227E3B9200138341 /* InputViewController.swift */; }; + 19E866A822D180DE001FFAB1 /* ToDoUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19E866A722D180DE001FFAB1 /* ToDoUITests.swift */; }; + EE47EF1E2141DA5D00C76F03 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE47EF1D2141DA5D00C76F03 /* AppDelegate.swift */; }; + EE47EF232141DA5D00C76F03 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = EE47EF212141DA5D00C76F03 /* Main.storyboard */; }; + EE47EF252141DA5D00C76F03 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = EE47EF242141DA5D00C76F03 /* Assets.xcassets */; }; + EE47EF282141DA5D00C76F03 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = EE47EF262141DA5D00C76F03 /* LaunchScreen.storyboard */; }; + EE47EF412141DAA700C76F03 /* ToDoItemTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE47EF402141DAA700C76F03 /* ToDoItemTests.swift */; }; + EE47EF432141DAE500C76F03 /* ToDoItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE47EF422141DAE500C76F03 /* ToDoItem.swift */; }; + EE47EF462141DFDE00C76F03 /* LocationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE47EF452141DFDE00C76F03 /* LocationTests.swift */; }; + EE47EF482141DFF300C76F03 /* Location.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE47EF472141DFF300C76F03 /* Location.swift */; }; + EE47EF4A2141E48700C76F03 /* ToDoItemManagerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE47EF492141E48700C76F03 /* ToDoItemManagerTests.swift */; }; + EE47EF4C2141E49F00C76F03 /* ToDoItemManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE47EF4B2141E49F00C76F03 /* ToDoItemManager.swift */; }; + EE665594215C174500D42DB6 /* ItemCellTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE665593215C174500D42DB6 /* ItemCellTests.swift */; }; + EE6655E32164492200D42DB6 /* DetailViewControllerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE6655E22164492200D42DB6 /* DetailViewControllerTests.swift */; }; + EE6655E52164498C00D42DB6 /* DetailViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE6655E42164498C00D42DB6 /* DetailViewController.swift */; }; + EE9333822151C8E8006939C4 /* ItemListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE9333812151C8E8006939C4 /* ItemListViewController.swift */; }; + EE9333852151C935006939C4 /* ItemListViewControllerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE9333842151C935006939C4 /* ItemListViewControllerTests.swift */; }; + EE9333882151F66F006939C4 /* ItemListDataProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE9333872151F66F006939C4 /* ItemListDataProvider.swift */; }; + EE9333A021546ED7006939C4 /* ItemListDataProviderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE93339F21546ED7006939C4 /* ItemListDataProviderTests.swift */; }; + EE9333A521547C7F006939C4 /* ItemCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE9333A421547C7F006939C4 /* ItemCell.swift */; }; + EE9333A82155BC25006939C4 /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE9333A72155BC25006939C4 /* Constants.swift */; }; + EE9333A92155BCCB006939C4 /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE9333A121547348006939C4 /* Constants.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 19E866AA22D180DE001FFAB1 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = EE47EF122141DA5D00C76F03 /* Project object */; + proxyType = 1; + remoteGlobalIDString = EE47EF192141DA5D00C76F03; + remoteInfo = ToDo; + }; + EE47EF2F2141DA5D00C76F03 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = EE47EF122141DA5D00C76F03 /* Project object */; + proxyType = 1; + remoteGlobalIDString = EE47EF192141DA5D00C76F03; + remoteInfo = ToDo; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 1962BCA3228768A9000130AD /* APIClient.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = APIClient.swift; sourceTree = ""; }; + 1962BCA5228768CB000130AD /* APIClientTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = APIClientTests.swift; sourceTree = ""; }; + 1962BCAA22876BC6000130AD /* Token.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Token.swift; sourceTree = ""; }; + 1962BCAC2290C8C9000130AD /* StoryboardTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StoryboardTests.swift; sourceTree = ""; }; + 19946963227E3B5C00138341 /* InputViewControllerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InputViewControllerTests.swift; sourceTree = ""; }; + 19946965227E3B9200138341 /* InputViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InputViewController.swift; sourceTree = ""; }; + 19E866A522D180DE001FFAB1 /* ToDoUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ToDoUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 19E866A722D180DE001FFAB1 /* ToDoUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ToDoUITests.swift; sourceTree = ""; }; + 19E866A922D180DE001FFAB1 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + EE47EF1A2141DA5D00C76F03 /* ToDo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ToDo.app; sourceTree = BUILT_PRODUCTS_DIR; }; + EE47EF1D2141DA5D00C76F03 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + EE47EF222141DA5D00C76F03 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + EE47EF242141DA5D00C76F03 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + EE47EF272141DA5D00C76F03 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + EE47EF292141DA5D00C76F03 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + EE47EF2E2141DA5D00C76F03 /* ToDoTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ToDoTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + EE47EF342141DA5D00C76F03 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + EE47EF402141DAA700C76F03 /* ToDoItemTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ToDoItemTests.swift; sourceTree = ""; }; + EE47EF422141DAE500C76F03 /* ToDoItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ToDoItem.swift; sourceTree = ""; }; + EE47EF452141DFDE00C76F03 /* LocationTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationTests.swift; sourceTree = ""; }; + EE47EF472141DFF300C76F03 /* Location.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Location.swift; sourceTree = ""; }; + EE47EF492141E48700C76F03 /* ToDoItemManagerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ToDoItemManagerTests.swift; sourceTree = ""; }; + EE47EF4B2141E49F00C76F03 /* ToDoItemManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ToDoItemManager.swift; sourceTree = ""; }; + EE665593215C174500D42DB6 /* ItemCellTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ItemCellTests.swift; sourceTree = ""; }; + EE6655E22164492200D42DB6 /* DetailViewControllerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetailViewControllerTests.swift; sourceTree = ""; }; + EE6655E42164498C00D42DB6 /* DetailViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetailViewController.swift; sourceTree = ""; }; + EE9333812151C8E8006939C4 /* ItemListViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ItemListViewController.swift; sourceTree = ""; }; + EE9333842151C935006939C4 /* ItemListViewControllerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ItemListViewControllerTests.swift; sourceTree = ""; }; + EE9333872151F66F006939C4 /* ItemListDataProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ItemListDataProvider.swift; sourceTree = ""; }; + EE93339F21546ED7006939C4 /* ItemListDataProviderTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ItemListDataProviderTests.swift; sourceTree = ""; }; + EE9333A121547348006939C4 /* Constants.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Constants.swift; sourceTree = ""; }; + EE9333A421547C7F006939C4 /* ItemCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ItemCell.swift; sourceTree = ""; }; + EE9333A72155BC25006939C4 /* Constants.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Constants.swift; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 19E866A222D180DE001FFAB1 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + EE47EF172141DA5D00C76F03 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + EE47EF2B2141DA5D00C76F03 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 1962BCA8228768E8000130AD /* Network */ = { + isa = PBXGroup; + children = ( + 1962BCA3228768A9000130AD /* APIClient.swift */, + 1962BCAA22876BC6000130AD /* Token.swift */, + ); + path = Network; + sourceTree = ""; + }; + 1962BCA9228768F4000130AD /* Network */ = { + isa = PBXGroup; + children = ( + 1962BCA5228768CB000130AD /* APIClientTests.swift */, + ); + path = Network; + sourceTree = ""; + }; + 19E866A622D180DE001FFAB1 /* ToDoUITests */ = { + isa = PBXGroup; + children = ( + 19E866A722D180DE001FFAB1 /* ToDoUITests.swift */, + 19E866A922D180DE001FFAB1 /* Info.plist */, + ); + path = ToDoUITests; + sourceTree = ""; + }; + EE47EF112141DA5D00C76F03 = { + isa = PBXGroup; + children = ( + EE47EF1C2141DA5D00C76F03 /* ToDo */, + EE47EF312141DA5D00C76F03 /* ToDoTests */, + 19E866A622D180DE001FFAB1 /* ToDoUITests */, + EE47EF1B2141DA5D00C76F03 /* Products */, + ); + sourceTree = ""; + }; + EE47EF1B2141DA5D00C76F03 /* Products */ = { + isa = PBXGroup; + children = ( + EE47EF1A2141DA5D00C76F03 /* ToDo.app */, + EE47EF2E2141DA5D00C76F03 /* ToDoTests.xctest */, + 19E866A522D180DE001FFAB1 /* ToDoUITests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + EE47EF1C2141DA5D00C76F03 /* ToDo */ = { + isa = PBXGroup; + children = ( + 1962BCA8228768E8000130AD /* Network */, + EE9333A621547C86006939C4 /* Views */, + EE47EF3E2141DA7800C76F03 /* ViewControllers */, + EE47EF442141DAF000C76F03 /* Models */, + EE47EF3F2141DA8700C76F03 /* Storyboards */, + EE47EF3D2141DA7000C76F03 /* Others */, + ); + path = ToDo; + sourceTree = ""; + }; + EE47EF312141DA5D00C76F03 /* ToDoTests */ = { + isa = PBXGroup; + children = ( + 1962BCA9228768F4000130AD /* Network */, + EE665595215C174F00D42DB6 /* Views */, + EE9333832151C915006939C4 /* Models */, + EE9333862151C940006939C4 /* ViewControllers */, + EE9333A3215473B3006939C4 /* Others */, + ); + path = ToDoTests; + sourceTree = ""; + }; + EE47EF3D2141DA7000C76F03 /* Others */ = { + isa = PBXGroup; + children = ( + EE9333A72155BC25006939C4 /* Constants.swift */, + EE47EF1D2141DA5D00C76F03 /* AppDelegate.swift */, + EE47EF242141DA5D00C76F03 /* Assets.xcassets */, + EE47EF292141DA5D00C76F03 /* Info.plist */, + ); + path = Others; + sourceTree = ""; + }; + EE47EF3E2141DA7800C76F03 /* ViewControllers */ = { + isa = PBXGroup; + children = ( + EE9333812151C8E8006939C4 /* ItemListViewController.swift */, + EE9333872151F66F006939C4 /* ItemListDataProvider.swift */, + EE6655E42164498C00D42DB6 /* DetailViewController.swift */, + 19946965227E3B9200138341 /* InputViewController.swift */, + ); + path = ViewControllers; + sourceTree = ""; + }; + EE47EF3F2141DA8700C76F03 /* Storyboards */ = { + isa = PBXGroup; + children = ( + EE47EF212141DA5D00C76F03 /* Main.storyboard */, + EE47EF262141DA5D00C76F03 /* LaunchScreen.storyboard */, + ); + path = Storyboards; + sourceTree = ""; + }; + EE47EF442141DAF000C76F03 /* Models */ = { + isa = PBXGroup; + children = ( + EE47EF422141DAE500C76F03 /* ToDoItem.swift */, + EE47EF472141DFF300C76F03 /* Location.swift */, + EE47EF4B2141E49F00C76F03 /* ToDoItemManager.swift */, + ); + path = Models; + sourceTree = ""; + }; + EE665595215C174F00D42DB6 /* Views */ = { + isa = PBXGroup; + children = ( + EE665593215C174500D42DB6 /* ItemCellTests.swift */, + 1962BCAC2290C8C9000130AD /* StoryboardTests.swift */, + ); + path = Views; + sourceTree = ""; + }; + EE9333832151C915006939C4 /* Models */ = { + isa = PBXGroup; + children = ( + EE47EF402141DAA700C76F03 /* ToDoItemTests.swift */, + EE47EF452141DFDE00C76F03 /* LocationTests.swift */, + EE47EF492141E48700C76F03 /* ToDoItemManagerTests.swift */, + ); + path = Models; + sourceTree = ""; + }; + EE9333862151C940006939C4 /* ViewControllers */ = { + isa = PBXGroup; + children = ( + EE9333842151C935006939C4 /* ItemListViewControllerTests.swift */, + EE93339F21546ED7006939C4 /* ItemListDataProviderTests.swift */, + EE6655E22164492200D42DB6 /* DetailViewControllerTests.swift */, + 19946963227E3B5C00138341 /* InputViewControllerTests.swift */, + ); + path = ViewControllers; + sourceTree = ""; + }; + EE9333A3215473B3006939C4 /* Others */ = { + isa = PBXGroup; + children = ( + EE9333A121547348006939C4 /* Constants.swift */, + EE47EF342141DA5D00C76F03 /* Info.plist */, + ); + path = Others; + sourceTree = ""; + }; + EE9333A621547C86006939C4 /* Views */ = { + isa = PBXGroup; + children = ( + EE9333A421547C7F006939C4 /* ItemCell.swift */, + ); + path = Views; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 19E866A422D180DE001FFAB1 /* ToDoUITests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 19E866AE22D180DE001FFAB1 /* Build configuration list for PBXNativeTarget "ToDoUITests" */; + buildPhases = ( + 19E866A122D180DE001FFAB1 /* Sources */, + 19E866A222D180DE001FFAB1 /* Frameworks */, + 19E866A322D180DE001FFAB1 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 19E866AB22D180DE001FFAB1 /* PBXTargetDependency */, + ); + name = ToDoUITests; + productName = ToDoUITests; + productReference = 19E866A522D180DE001FFAB1 /* ToDoUITests.xctest */; + productType = "com.apple.product-type.bundle.ui-testing"; + }; + EE47EF192141DA5D00C76F03 /* ToDo */ = { + isa = PBXNativeTarget; + buildConfigurationList = EE47EF372141DA5D00C76F03 /* Build configuration list for PBXNativeTarget "ToDo" */; + buildPhases = ( + EE47EF162141DA5D00C76F03 /* Sources */, + EE47EF172141DA5D00C76F03 /* Frameworks */, + EE47EF182141DA5D00C76F03 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = ToDo; + productName = ToDo; + productReference = EE47EF1A2141DA5D00C76F03 /* ToDo.app */; + productType = "com.apple.product-type.application"; + }; + EE47EF2D2141DA5D00C76F03 /* ToDoTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = EE47EF3A2141DA5D00C76F03 /* Build configuration list for PBXNativeTarget "ToDoTests" */; + buildPhases = ( + EE47EF2A2141DA5D00C76F03 /* Sources */, + EE47EF2B2141DA5D00C76F03 /* Frameworks */, + EE47EF2C2141DA5D00C76F03 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + EE47EF302141DA5D00C76F03 /* PBXTargetDependency */, + ); + name = ToDoTests; + productName = ToDoTests; + productReference = EE47EF2E2141DA5D00C76F03 /* ToDoTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + EE47EF122141DA5D00C76F03 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 1020; + LastUpgradeCheck = 1020; + ORGANIZATIONNAME = "gu, yi"; + TargetAttributes = { + 19E866A422D180DE001FFAB1 = { + CreatedOnToolsVersion = 10.2.1; + ProvisioningStyle = Automatic; + TestTargetID = EE47EF192141DA5D00C76F03; + }; + EE47EF192141DA5D00C76F03 = { + CreatedOnToolsVersion = 9.2; + LastSwiftMigration = 1020; + ProvisioningStyle = Automatic; + }; + EE47EF2D2141DA5D00C76F03 = { + CreatedOnToolsVersion = 9.2; + LastSwiftMigration = 1020; + ProvisioningStyle = Automatic; + TestTargetID = EE47EF192141DA5D00C76F03; + }; + }; + }; + buildConfigurationList = EE47EF152141DA5D00C76F03 /* Build configuration list for PBXProject "ToDo" */; + compatibilityVersion = "Xcode 8.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = EE47EF112141DA5D00C76F03; + productRefGroup = EE47EF1B2141DA5D00C76F03 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + EE47EF192141DA5D00C76F03 /* ToDo */, + EE47EF2D2141DA5D00C76F03 /* ToDoTests */, + 19E866A422D180DE001FFAB1 /* ToDoUITests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 19E866A322D180DE001FFAB1 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + EE47EF182141DA5D00C76F03 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + EE47EF282141DA5D00C76F03 /* LaunchScreen.storyboard in Resources */, + EE47EF252141DA5D00C76F03 /* Assets.xcassets in Resources */, + EE47EF232141DA5D00C76F03 /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + EE47EF2C2141DA5D00C76F03 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 19E866A122D180DE001FFAB1 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 19E866A822D180DE001FFAB1 /* ToDoUITests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + EE47EF162141DA5D00C76F03 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + EE6655E52164498C00D42DB6 /* DetailViewController.swift in Sources */, + 19946966227E3B9200138341 /* InputViewController.swift in Sources */, + EE9333A521547C7F006939C4 /* ItemCell.swift in Sources */, + 1962BCAB22876BC6000130AD /* Token.swift in Sources */, + EE47EF432141DAE500C76F03 /* ToDoItem.swift in Sources */, + EE9333882151F66F006939C4 /* ItemListDataProvider.swift in Sources */, + 1962BCA4228768A9000130AD /* APIClient.swift in Sources */, + EE9333822151C8E8006939C4 /* ItemListViewController.swift in Sources */, + EE47EF482141DFF300C76F03 /* Location.swift in Sources */, + EE47EF1E2141DA5D00C76F03 /* AppDelegate.swift in Sources */, + EE9333A82155BC25006939C4 /* Constants.swift in Sources */, + EE47EF4C2141E49F00C76F03 /* ToDoItemManager.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + EE47EF2A2141DA5D00C76F03 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + EE9333A021546ED7006939C4 /* ItemListDataProviderTests.swift in Sources */, + EE9333A92155BCCB006939C4 /* Constants.swift in Sources */, + 1962BCAD2290C8C9000130AD /* StoryboardTests.swift in Sources */, + EE47EF462141DFDE00C76F03 /* LocationTests.swift in Sources */, + 1962BCA6228768CB000130AD /* APIClientTests.swift in Sources */, + EE47EF4A2141E48700C76F03 /* ToDoItemManagerTests.swift in Sources */, + EE665594215C174500D42DB6 /* ItemCellTests.swift in Sources */, + EE47EF412141DAA700C76F03 /* ToDoItemTests.swift in Sources */, + 19946964227E3B5C00138341 /* InputViewControllerTests.swift in Sources */, + EE9333852151C935006939C4 /* ItemListViewControllerTests.swift in Sources */, + EE6655E32164492200D42DB6 /* DetailViewControllerTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 19E866AB22D180DE001FFAB1 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = EE47EF192141DA5D00C76F03 /* ToDo */; + targetProxy = 19E866AA22D180DE001FFAB1 /* PBXContainerItemProxy */; + }; + EE47EF302141DA5D00C76F03 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = EE47EF192141DA5D00C76F03 /* ToDo */; + targetProxy = EE47EF2F2141DA5D00C76F03 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + EE47EF212141DA5D00C76F03 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + EE47EF222141DA5D00C76F03 /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + EE47EF262141DA5D00C76F03 /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + EE47EF272141DA5D00C76F03 /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 19E866AC22D180DE001FFAB1 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_OBJC_WEAK = YES; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = 44JDRP3T56; + INFOPLIST_FILE = ToDoUITests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 12.2; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = yigu.ToDoUITests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_TARGET_NAME = ToDo; + }; + name = Debug; + }; + 19E866AD22D180DE001FFAB1 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_OBJC_WEAK = YES; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = 44JDRP3T56; + INFOPLIST_FILE = ToDoUITests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 12.2; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = yigu.ToDoUITests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_TARGET_NAME = ToDo; + }; + name = Release; + }; + EE47EF352141DA5D00C76F03 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 11.2; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + EE47EF362141DA5D00C76F03 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 11.2; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + EE47EF382141DA5D00C76F03 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + INFOPLIST_FILE = ToDo/Others/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = yigu.com.ToDo; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + EE47EF392141DA5D00C76F03 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + INFOPLIST_FILE = ToDo/Others/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = yigu.com.ToDo; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; + EE47EF3B2141DA5D00C76F03 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + INFOPLIST_FILE = ToDoTests/Others/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = yigu.com.ToDoTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/ToDo.app/ToDo"; + }; + name = Debug; + }; + EE47EF3C2141DA5D00C76F03 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + INFOPLIST_FILE = ToDoTests/Others/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = yigu.com.ToDoTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/ToDo.app/ToDo"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 19E866AE22D180DE001FFAB1 /* Build configuration list for PBXNativeTarget "ToDoUITests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 19E866AC22D180DE001FFAB1 /* Debug */, + 19E866AD22D180DE001FFAB1 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + EE47EF152141DA5D00C76F03 /* Build configuration list for PBXProject "ToDo" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + EE47EF352141DA5D00C76F03 /* Debug */, + EE47EF362141DA5D00C76F03 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + EE47EF372141DA5D00C76F03 /* Build configuration list for PBXNativeTarget "ToDo" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + EE47EF382141DA5D00C76F03 /* Debug */, + EE47EF392141DA5D00C76F03 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + EE47EF3A2141DA5D00C76F03 /* Build configuration list for PBXNativeTarget "ToDoTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + EE47EF3B2141DA5D00C76F03 /* Debug */, + EE47EF3C2141DA5D00C76F03 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = EE47EF122141DA5D00C76F03 /* Project object */; +} diff --git a/Project 04 - Todo/Todo.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Project 04 - TodoTDD/ToDo.xcodeproj/project.xcworkspace/contents.xcworkspacedata similarity index 73% rename from Project 04 - Todo/Todo.xcodeproj/project.xcworkspace/contents.xcworkspacedata rename to Project 04 - TodoTDD/ToDo.xcodeproj/project.xcworkspace/contents.xcworkspacedata index 19476363..cec21847 100644 --- a/Project 04 - Todo/Todo.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ b/Project 04 - TodoTDD/ToDo.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -2,6 +2,6 @@ + location = "self:ToDo.xcodeproj"> diff --git a/Project 04 - TodoTDD/ToDo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Project 04 - TodoTDD/ToDo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/Project 04 - TodoTDD/ToDo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Project 11 - Animations/Animations.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/Animations.xcscheme b/Project 04 - TodoTDD/ToDo.xcodeproj/xcshareddata/xcschemes/ToDo.xcscheme similarity index 67% rename from Project 11 - Animations/Animations.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/Animations.xcscheme rename to Project 04 - TodoTDD/ToDo.xcodeproj/xcshareddata/xcschemes/ToDo.xcscheme index 44f9fbed..2b5cfb43 100644 --- a/Project 11 - Animations/Animations.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/Animations.xcscheme +++ b/Project 04 - TodoTDD/ToDo.xcodeproj/xcshareddata/xcschemes/ToDo.xcscheme @@ -1,6 +1,6 @@ + BlueprintIdentifier = "EE47EF192141DA5D00C76F03" + BuildableName = "ToDo.app" + BlueprintName = "ToDo" + ReferencedContainer = "container:ToDo.xcodeproj"> @@ -26,36 +26,37 @@ buildConfiguration = "Debug" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" + codeCoverageEnabled = "YES" shouldUseLaunchSchemeArgsEnv = "YES"> + BlueprintIdentifier = "EE47EF2D2141DA5D00C76F03" + BuildableName = "ToDoTests.xctest" + BlueprintName = "ToDoTests" + ReferencedContainer = "container:ToDo.xcodeproj"> + BlueprintIdentifier = "19E866A422D180DE001FFAB1" + BuildableName = "ToDoUITests.xctest" + BlueprintName = "ToDoUITests" + ReferencedContainer = "container:ToDo.xcodeproj"> + BlueprintIdentifier = "EE47EF192141DA5D00C76F03" + BuildableName = "ToDo.app" + BlueprintName = "ToDo" + ReferencedContainer = "container:ToDo.xcodeproj"> @@ -75,10 +76,10 @@ runnableDebuggingMode = "0"> + BlueprintIdentifier = "EE47EF192141DA5D00C76F03" + BuildableName = "ToDo.app" + BlueprintName = "ToDo" + ReferencedContainer = "container:ToDo.xcodeproj"> @@ -94,10 +95,10 @@ runnableDebuggingMode = "0"> + BlueprintIdentifier = "EE47EF192141DA5D00C76F03" + BuildableName = "ToDo.app" + BlueprintName = "ToDo" + ReferencedContainer = "container:ToDo.xcodeproj"> diff --git a/Project 04 - TodoTDD/ToDo/Models/Location.swift b/Project 04 - TodoTDD/ToDo/Models/Location.swift new file mode 100644 index 00000000..74662fce --- /dev/null +++ b/Project 04 - TodoTDD/ToDo/Models/Location.swift @@ -0,0 +1,60 @@ +// +// Location.swift +// ToDo +// +// Created by gu, yi on 9/6/18. +// Copyright © 2018 gu, yi. All rights reserved. +// + +import Foundation +import CoreLocation + +struct Location { + let name: String + let coordinate: CLLocationCoordinate2D? + + // plist + private let nameKey = "nameKey" + private let latitudeKey = "latitudeKey" + private let longitudeKey = "longitudeKey" + + var plistDict: [String:Any] { + var dict = [String:Any]() + + dict[nameKey] = name + if let coordinate = coordinate { + dict[latitudeKey] = coordinate.latitude + dict[longitudeKey] = coordinate.longitude + } + + return dict + } + + init(name: String, coordinate: CLLocationCoordinate2D? = nil) { + self.name = name + self.coordinate = coordinate + } + + init?(dict: [String: Any]) { + guard let name = dict[nameKey] as? String else { + return nil + } + + let coordinate: CLLocationCoordinate2D? + if let latitude = dict[latitudeKey] as? Double, + let longitude = dict[longitudeKey] as? Double { + coordinate = CLLocationCoordinate2DMake(latitude, longitude) + } else { + coordinate = nil + } + + self.name = name + self.coordinate = coordinate + } +} + +extension Location: Equatable { + static func ==(lhs: Location, rhs: Location) -> Bool { + return lhs.name == rhs.name && lhs.coordinate?.latitude == rhs.coordinate?.latitude && lhs.coordinate?.longitude == rhs.coordinate?.longitude + } +} diff --git a/Project 04 - TodoTDD/ToDo/Models/ToDoItem.swift b/Project 04 - TodoTDD/ToDo/Models/ToDoItem.swift new file mode 100644 index 00000000..0e077a21 --- /dev/null +++ b/Project 04 - TodoTDD/ToDo/Models/ToDoItem.swift @@ -0,0 +1,67 @@ +// +// ToDOItem.swift +// ToDo +// +// Created by gu, yi on 9/6/18. +// Copyright © 2018 gu, yi. All rights reserved. +// + +import Foundation + +struct ToDoItem { + let title: String + let itemDescription: String? + let timestamp: Double? + let location: Location? + + // plist related + private let titleKey = "titleKey" + private let itemDescriptionKey = "itemDescriptionKey" + private let timestampKey = "timestampKey" + private let locationKey = "locationKey" + + var plistDict: [String:Any] { + var dict = [String:Any]() + + dict[titleKey] = title + if let itemDescription = itemDescription { + dict[itemDescriptionKey] = itemDescription + } + if let timestamp = timestamp { + dict[timestampKey] = timestamp + } + if let location = location { + let locationDict = location.plistDict + dict[locationKey] = locationDict + } + return dict + } + + init(title: String, itemDescription: String? = nil, timeStamp: Double? = nil, location: Location? = nil) { + self.title = title + self.itemDescription = itemDescription + self.timestamp = timeStamp + self.location = location + } + + init?(dict: [String: Any]) { + guard let title = dict[titleKey] as? String else { + return nil + } + + self.title = title + self.itemDescription = dict[itemDescriptionKey] as? String + self.timestamp = dict[timestampKey] as? Double + if let locationDict = dict[locationKey] as? [String: Any] { + self.location = Location(dict: locationDict) + } else { + self.location = nil + } + } +} + +extension ToDoItem: Equatable { + static func ==(lhs: ToDoItem, rhs: ToDoItem) -> Bool { + return lhs.title == rhs.title && lhs.location?.name == rhs.location?.name + } +} diff --git a/Project 04 - TodoTDD/ToDo/Models/ToDoItemManager.swift b/Project 04 - TodoTDD/ToDo/Models/ToDoItemManager.swift new file mode 100644 index 00000000..03b83884 --- /dev/null +++ b/Project 04 - TodoTDD/ToDo/Models/ToDoItemManager.swift @@ -0,0 +1,94 @@ +// +// ToDoItemManager.swift +// ToDo +// +// Created by gu, yi on 9/6/18. +// Copyright © 2018 gu, yi. All rights reserved. +// + +import UIKit + +class ToDoItemManager { + var toDoCount: Int { return toDoItems.count } + var doneCount: Int { return doneItems.count } + + private var toDoItems = [ToDoItem]() + private var doneItems = [ToDoItem]() + + // plist related + var toDoPathURL: URL { + let fileURLs = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask) + + guard let documentURL = fileURLs.first else { + fatalError("Something went wrong. Documents url could not be found") + } + + return documentURL.appendingPathComponent("toDoItems.plist") + } + + init() { + NotificationCenter.default.addObserver(self, selector: #selector(save), name: UIApplication.willResignActiveNotification, object: nil) + + if let nsToDoItems = NSArray(contentsOf: toDoPathURL) { + for dict in nsToDoItems { + if let toDoItem = ToDoItem(dict: dict as! [String:Any]) { + toDoItems.append(toDoItem) + } + } + } + } + + deinit { + NotificationCenter.default.removeObserver(self) + save() + } + + @objc func save() { + let nsToDoItems = toDoItems.map { $0.plistDict } + + guard nsToDoItems.count > 0 else { + try? FileManager.default.removeItem(at: toDoPathURL) + return + } + + do { + let plistData = try PropertyListSerialization.data( + fromPropertyList: nsToDoItems, + format: PropertyListSerialization.PropertyListFormat.xml, + options: PropertyListSerialization.WriteOptions(0) + ) + try plistData.write(to: toDoPathURL, + options: Data.WritingOptions.atomic) + } catch { + print(error) + } + } + + + func add(_ item: ToDoItem) { + toDoItems.append(item) + } + + func item(at index: Int) -> ToDoItem { + return toDoItems[index] + } + + func doneItem(at index: Int) -> ToDoItem { + return doneItems[index] + } + + func checkItem(at index: Int) { + let checkedItem = toDoItems.remove(at: index) + doneItems.append(checkedItem) + } + + func uncheckItem(at index: Int) { + let uncheckedItem = doneItems.remove(at: index) + toDoItems.append(uncheckedItem) + } + + func removeAll() { + toDoItems.removeAll() + doneItems.removeAll() + } +} diff --git a/Project 04 - TodoTDD/ToDo/Network/APIClient.swift b/Project 04 - TodoTDD/ToDo/Network/APIClient.swift new file mode 100644 index 00000000..f7a8dce5 --- /dev/null +++ b/Project 04 - TodoTDD/ToDo/Network/APIClient.swift @@ -0,0 +1,57 @@ +// +// APIClient.swift +// ToDo +// +// Created by Yi Gu on 5/11/19. +// Copyright © 2019 gu, yi. All rights reserved. +// + +import Foundation + +enum NetworkError : Error { + case DataEmptyError +} + +class APIClient { + + lazy var session: Sessionable = URLSession.shared + + func loginUser(with name:String , password: String, completion: @escaping (Token?, Error?) -> Void) { + + let query = "username=\(Constants.userName)&password=\(Constants.password)" + guard let url = URL(string: "https://awesometodos.com/login?\(query)") else { + fatalError() + } + + session.dataTask(with: url) { (data, response, error) in + if let error = error { + completion(nil, error) + return + } + + guard let data = data else { + completion(nil, NetworkError.DataEmptyError) + return + } + + do { + let dict = try JSONSerialization.jsonObject(with: data, options: []) as? [String:String] + + var token: Token? = nil + + if let tokenString = dict?["token"] { + token = Token(id: tokenString) + } + completion(token, nil) + } catch { + completion(nil, error) + } + }.resume() + } +} + +extension URLSession: Sessionable { } + +protocol Sessionable { + func dataTask(with url: URL, completionHandler: @escaping (Data?, URLResponse?, Error?) -> Void) -> URLSessionDataTask +} diff --git a/Project 04 - TodoTDD/ToDo/Network/Token.swift b/Project 04 - TodoTDD/ToDo/Network/Token.swift new file mode 100644 index 00000000..25794a81 --- /dev/null +++ b/Project 04 - TodoTDD/ToDo/Network/Token.swift @@ -0,0 +1,14 @@ +// +// Token.swift +// ToDo +// +// Created by Yi Gu on 5/11/19. +// Copyright © 2019 gu, yi. All rights reserved. +// + +import Foundation + +struct Token { + + var id: String +} diff --git a/Project 04 - TodoTDD/ToDo/Others/AppDelegate.swift b/Project 04 - TodoTDD/ToDo/Others/AppDelegate.swift new file mode 100644 index 00000000..896a1d48 --- /dev/null +++ b/Project 04 - TodoTDD/ToDo/Others/AppDelegate.swift @@ -0,0 +1,23 @@ +// +// AppDelegate.swift +// ToDo +// +// Created by gu, yi on 9/6/18. +// Copyright © 2018 gu, yi. All rights reserved. +// + +import UIKit + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + + var window: UIWindow? + + + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { + // Override point for customization after application launch. + return true + } + +} + diff --git a/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/AppIcon.appiconset/Contents.json b/Project 04 - TodoTDD/ToDo/Others/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/AppIcon.appiconset/Contents.json rename to Project 04 - TodoTDD/ToDo/Others/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/Project 04 - TodoTDD/ToDo/Others/Constants.swift b/Project 04 - TodoTDD/ToDo/Others/Constants.swift new file mode 100644 index 00000000..477121f1 --- /dev/null +++ b/Project 04 - TodoTDD/ToDo/Others/Constants.swift @@ -0,0 +1,25 @@ +// +// File.swift +// ToDo +// +// Created by gu, yi on 9/21/18. +// Copyright © 2018 gu, yi. All rights reserved. +// + +import Foundation + +struct Constants { + static let MainBundleIdentifer = "Main" + static let ItemListViewControllerIdentifier = "ItemListViewController" + static let DetailViewControllerIdentifier = "DetailViewController" + static let InputViewControllerIndentifier = "InputViewController" + + static let ItemCellIdentifier = "ItemCell" + + static let userName = "Crystal" + static let password = "1234" +} + +extension Notification { + static let ItemSelectedNotification = Notification.Name("ItemSelectedNotification") +} diff --git a/Project 28 - SlidebarMenu/SlidebarMenu/Info.plist b/Project 04 - TodoTDD/ToDo/Others/Info.plist similarity index 97% rename from Project 28 - SlidebarMenu/SlidebarMenu/Info.plist rename to Project 04 - TodoTDD/ToDo/Others/Info.plist index d0524738..16be3b68 100644 --- a/Project 28 - SlidebarMenu/SlidebarMenu/Info.plist +++ b/Project 04 - TodoTDD/ToDo/Others/Info.plist @@ -3,7 +3,7 @@ CFBundleDevelopmentRegion - en + $(DEVELOPMENT_LANGUAGE) CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier diff --git a/Project 04 - TodoTDD/ToDo/Storyboards/Base.lproj/LaunchScreen.storyboard b/Project 04 - TodoTDD/ToDo/Storyboards/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 00000000..f83f6fd5 --- /dev/null +++ b/Project 04 - TodoTDD/ToDo/Storyboards/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Project 04 - TodoTDD/ToDo/Storyboards/Base.lproj/Main.storyboard b/Project 04 - TodoTDD/ToDo/Storyboards/Base.lproj/Main.storyboard new file mode 100644 index 00000000..d5426957 --- /dev/null +++ b/Project 04 - TodoTDD/ToDo/Storyboards/Base.lproj/Main.storyboard @@ -0,0 +1,265 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Project 04 - TodoTDD/ToDo/ViewControllers/DetailViewController.swift b/Project 04 - TodoTDD/ToDo/ViewControllers/DetailViewController.swift new file mode 100644 index 00000000..e5333888 --- /dev/null +++ b/Project 04 - TodoTDD/ToDo/ViewControllers/DetailViewController.swift @@ -0,0 +1,43 @@ +// +// DetailViewController.swift +// ToDo +// +// Created by gu, yi on 10/2/18. +// Copyright © 2018 gu, yi. All rights reserved. +// + +import UIKit +import MapKit + +class DetailViewController: UIViewController { + + @IBOutlet var titleLabel: UILabel! + @IBOutlet var mapView: MKMapView! + @IBOutlet var locationLabel: UILabel! + + var item: ToDoItem? + + override func viewDidLoad() { + super.viewDidLoad() + + guard let item = item else { + return + } + + titleLabel.text = item.title + + if let location = item.location { + locationLabel.text = location.name + if let cooridnate = location.coordinate { + centerMapOnLocation(with: cooridnate) + } + } + } + + private func centerMapOnLocation(with coordinate: CLLocationCoordinate2D) { + let regionRadius: CLLocationDistance = 1000 + + let coordinateRegion = MKCoordinateRegion(center: coordinate, latitudinalMeters: regionRadius, longitudinalMeters: regionRadius) + mapView.setRegion(coordinateRegion, animated: true) + } +} diff --git a/Project 04 - TodoTDD/ToDo/ViewControllers/InputViewController.swift b/Project 04 - TodoTDD/ToDo/ViewControllers/InputViewController.swift new file mode 100644 index 00000000..9496c2a0 --- /dev/null +++ b/Project 04 - TodoTDD/ToDo/ViewControllers/InputViewController.swift @@ -0,0 +1,105 @@ +// +// InputViewController.swift +// ToDo +// +// Created by Yi Gu on 5/4/19. +// Copyright © 2019 gu, yi. All rights reserved. +// + +import UIKit +import CoreLocation + +class InputViewController: UIViewController { + + @IBOutlet var titleTextField: UITextField! + @IBOutlet var locationTextField: UITextField! + @IBOutlet var descriptionTextField: UITextField! + @IBOutlet var datePicker: UIDatePicker! + @IBOutlet var cancelButton: UIButton! + @IBOutlet var saveButton: UIButton! + + lazy var geocoder = CLGeocoder() + var itemManager: ToDoItemManager? + + override func viewDidLoad() { + super.viewDidLoad() + + titleTextField.delegate = self + locationTextField.delegate = self + descriptionTextField.delegate = self + } + + override func touchesBegan(_ touches: Set, with event: UIEvent?) { + view.endEditing(true) + } + + @IBAction func save() { + guard let titleString = titleTextField.text, + titleString.count > 0 else { + return + } + + // datePicker could be nil if the view controller is init via code + var date: Date? + if datePicker != nil { + date = datePicker.date + } + + // descriptionTextField could be nil if the view controller is init via code + var descriptionString: String? + if descriptionTextField != nil { + descriptionString = descriptionTextField.text + } + + // locationTextField could be nil if the view controller is init via code + var placeMark: CLPlacemark? + var locationName: String? + + if locationTextField != nil { + locationName = locationTextField.text + if let locationName = locationName, locationName.count > 0 { + geocoder.geocodeAddressString(locationName) { [weak self] placeMarks, _ in + placeMark = placeMarks?.first + + let item = ToDoItem(title: titleString, + itemDescription: descriptionString, + timeStamp: date?.timeIntervalSince1970, + location: Location(name: locationName, coordinate: placeMark?.location?.coordinate)) + + DispatchQueue.main.async { + self?.itemManager?.add(item) + self?.dismiss(animated: true) + } + } + } else { + let item = ToDoItem(title: titleString, + itemDescription: descriptionString, + timeStamp: date?.timeIntervalSince1970, + location: nil) + self.itemManager?.add(item) + dismiss(animated: true) + } + } else { + let item = ToDoItem( + title: titleString, + itemDescription: descriptionString, + timeStamp: date?.timeIntervalSince1970) + + self.itemManager?.add(item) + dismiss(animated: true) + } + } + + @IBAction func cancel() { + dismiss(animated: true, completion: nil) + } +} + +extension InputViewController: UITextFieldDelegate { + func textFieldShouldReturn(_ textField: UITextField) -> Bool { + resignFirstResponder() + view.endEditing(true) + return false + } +} + diff --git a/Project 04 - TodoTDD/ToDo/ViewControllers/ItemListDataProvider.swift b/Project 04 - TodoTDD/ToDo/ViewControllers/ItemListDataProvider.swift new file mode 100644 index 00000000..922cc185 --- /dev/null +++ b/Project 04 - TodoTDD/ToDo/ViewControllers/ItemListDataProvider.swift @@ -0,0 +1,120 @@ +// +// ItemListDataProvider.swift +// ToDo +// +// Created by gu, yi on 9/18/18. +// Copyright © 2018 gu, yi. All rights reserved. +// + +import UIKit + +enum Section: Int { + case toDo + case done +} + +class ItemListDataProvider: NSObject { + var itemManager: ToDoItemManager? +} + +extension ItemListDataProvider: UITableViewDataSource { + func numberOfSections(in tableView: UITableView) -> Int { + return 2 + } + + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + guard let itemManager = itemManager else { + return 0 + } + guard let itemSection = Section(rawValue: section) else { + fatalError() + } + + let numberOfRows: Int + + switch itemSection { + case .toDo: + numberOfRows = itemManager.toDoCount + case .done: + numberOfRows = itemManager.doneCount + } + + return numberOfRows + } + + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let cell = tableView.dequeueReusableCell(withIdentifier: Constants.ItemCellIdentifier, for: indexPath) as! ItemCell + + guard let itemManager = itemManager else { + fatalError() + } + guard let itemSection = Section(rawValue: indexPath.section) else { + fatalError() + } + + let item: ToDoItem + + switch itemSection { + case .toDo: + item = itemManager.item(at: indexPath.row) + case .done: + item = itemManager.doneItem(at: indexPath.row) + } + + cell.configCell(with: item) + + return cell + } +} + +extension ItemListDataProvider: UITableViewDelegate { + func tableView(_ tableView: UITableView, titleForDeleteConfirmationButtonForRowAt indexPath: IndexPath) -> String? { + + guard let itemSection = Section(rawValue: indexPath.section) else { + fatalError() + } + + let deleteTitle: String + + switch itemSection { + case .toDo: + deleteTitle = "Check" + case .done: + deleteTitle = "Uncheck" + } + + return deleteTitle + } + + func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) { + + guard let itemSection = Section(rawValue: indexPath.section) else { + fatalError() + } + + switch itemSection { + case .toDo: + itemManager?.checkItem(at: indexPath.row) + case .done: + itemManager?.uncheckItem(at: indexPath.row) + } + + tableView.reloadData() + } + + func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + guard let itemSection = Section(rawValue: indexPath.section) else { + fatalError() + } + + switch itemSection { + case .toDo: + NotificationCenter.default.post( + name: Notification.ItemSelectedNotification, + object: self, + userInfo: ["index": indexPath.row]) + case .done: + break + } + } +} diff --git a/Project 04 - TodoTDD/ToDo/ViewControllers/ItemListViewController.swift b/Project 04 - TodoTDD/ToDo/ViewControllers/ItemListViewController.swift new file mode 100644 index 00000000..bf640b4b --- /dev/null +++ b/Project 04 - TodoTDD/ToDo/ViewControllers/ItemListViewController.swift @@ -0,0 +1,60 @@ +// +// ItemListViewController.swift +// ToDo +// +// Created by gu, yi on 9/18/18. +// Copyright © 2018 gu, yi. All rights reserved. +// + +import UIKit + +class ItemListViewController: UIViewController { + + @IBOutlet var tableView: UITableView! + @IBOutlet var dataProvider: ItemListDataProvider! + + override func viewDidLoad() { + super.viewDidLoad() + + tableView.dataSource = dataProvider + tableView.delegate = dataProvider + + dataProvider.itemManager = ToDoItemManager() + + NotificationCenter.default.addObserver(self, selector: #selector(showDetails(_:)), name: Notification.ItemSelectedNotification, + object: nil) + } + + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + + tableView.reloadData() + } + + @objc func showDetails(_ sender: Notification) { + guard let index = sender.userInfo?["index"] as? Int else { + fatalError() + } + + if let nextViewController = storyboard?.instantiateViewController(withIdentifier: Constants.DetailViewControllerIdentifier) as? DetailViewController, + let itemManager = dataProvider.itemManager { + + guard index < itemManager.toDoCount else { + return + } + + nextViewController.item = itemManager.item(at: index) + + navigationController?.pushViewController(nextViewController, animated: true) + } + } + + @IBAction func addItem(_ sender: UIBarButtonItem) { + guard let inputViewController = storyboard?.instantiateViewController(withIdentifier: "InputViewController") as? InputViewController else { + return + } + inputViewController.itemManager = dataProvider.itemManager + + present(inputViewController, animated: true, completion: nil) + } +} diff --git a/Project 04 - TodoTDD/ToDo/Views/ItemCell.swift b/Project 04 - TodoTDD/ToDo/Views/ItemCell.swift new file mode 100644 index 00000000..b8d32674 --- /dev/null +++ b/Project 04 - TodoTDD/ToDo/Views/ItemCell.swift @@ -0,0 +1,53 @@ +// +// ItemCell.swift +// ToDo +// +// Created by gu, yi on 9/20/18. +// Copyright © 2018 gu, yi. All rights reserved. +// + +import UIKit + +class ItemCell: UITableViewCell { + + @IBOutlet weak var titleLabel: UILabel! + @IBOutlet weak var locationLabel: UILabel! + @IBOutlet weak var dateLabel: UILabel! + + lazy var dateFormatter: DateFormatter = { + let dateFormatter = DateFormatter() + dateFormatter.dateFormat = "MM/dd/yyyy" + return dateFormatter + }() + + override func awakeFromNib() { + super.awakeFromNib() + // Initialization code + } + + override func setSelected(_ selected: Bool, animated: Bool) { + super.setSelected(selected, animated: animated) + } + + func configCell(with item: ToDoItem, isChecked: Bool = false) { + if isChecked { + let attributedString = NSAttributedString(string: item.title, attributes: [NSAttributedString.Key.strikethroughStyle: NSUnderlineStyle.single.rawValue]) + + titleLabel.attributedText = attributedString + dateLabel.text = nil + locationLabel.text = nil + } else { + titleLabel.text = item.title + + if let timestamp = item.timestamp { + let date = Date(timeIntervalSince1970: timestamp) + dateLabel.text = dateFormatter.string(from: date) + } + + if let location = item.location { + locationLabel.text = location.name + } + } + } + +} diff --git a/Project 04 - TodoTDD/ToDoTDD.gif b/Project 04 - TodoTDD/ToDoTDD.gif new file mode 100644 index 00000000..475531c4 Binary files /dev/null and b/Project 04 - TodoTDD/ToDoTDD.gif differ diff --git a/Project 04 - TodoTDD/ToDoTests/Models/LocationTests.swift b/Project 04 - TodoTDD/ToDoTests/Models/LocationTests.swift new file mode 100644 index 00000000..19b6d291 --- /dev/null +++ b/Project 04 - TodoTDD/ToDoTests/Models/LocationTests.swift @@ -0,0 +1,59 @@ +// +// LocationTests.swift +// ToDoTests +// +// Created by gu, yi on 9/6/18. +// Copyright © 2018 gu, yi. All rights reserved. +// + +import XCTest +import CoreLocation +@testable import ToDo + +class LocationTests: XCTestCase { + + let locationName = "LocationName" + let latitude = 1.0 + let longitude = 2.0 + + override func setUp() { + super.setUp() + } + + override func tearDown() { + super.tearDown() + } + + func test_init_givenName_setsName() { + let location = Location(name: locationName) + + XCTAssertEqual(location.name, locationName, "should set name") + } + + func test_init_givenCoordinate_setsCoordinate() { + let coordinate = CLLocationCoordinate2D(latitude: latitude, longitude: longitude) + let location = Location(name: "", coordinate: coordinate) + + XCTAssertEqual(location.coordinate?.latitude, latitude, "should set latitude") + XCTAssertEqual(location.coordinate?.longitude, longitude, "should set longitude") + } + + func test_init_hasPlistDictionaryProperty() { + let location = Location(name: "Home") + let dictionary = location.plistDict + + XCTAssertNotNil(dictionary) + } + + func test_canBeSerializedAndDeserialized() { + let location = Location( + name: "Home", + coordinate: CLLocationCoordinate2DMake(50.0, 6.0)) + + let dict = location.plistDict + let recreatedLocation = Location(dict: dict) + + XCTAssertEqual(recreatedLocation, location) + + } +} diff --git a/Project 04 - TodoTDD/ToDoTests/Models/ToDoItemManagerTests.swift b/Project 04 - TodoTDD/ToDoTests/Models/ToDoItemManagerTests.swift new file mode 100644 index 00000000..7a07fb1c --- /dev/null +++ b/Project 04 - TodoTDD/ToDoTests/Models/ToDoItemManagerTests.swift @@ -0,0 +1,113 @@ +// +// ToDoItemManagerTests.swift +// ToDoTests +// +// Created by gu, yi on 9/6/18. +// Copyright © 2018 gu, yi. All rights reserved. +// + +import XCTest +@testable import ToDo + +class ToDoItemManagerTests: XCTestCase { + + var itemManager: ToDoItemManager! + let titleForFirstToAdd = "first" + let titleForSecondToAdd = "second" + + override func setUp() { + super.setUp() + + itemManager = ToDoItemManager() + } + + override func tearDown() { + itemManager.removeAll() + itemManager = nil + + super.tearDown() + } + + func test_init_toDoCountIsZero() { + XCTAssertEqual(itemManager.toDoCount, 0, "toDoCount should be 0") + } + + func test_init_doneCountIsZero() { + XCTAssertEqual(itemManager.doneCount, 0, "toDoCount should be 0") + } + + func test_addItem_increaseToDoCountByOne() { + let expectToDoCount = itemManager.toDoCount + 1 + itemManager.add(ToDoItem(title: "")) + + XCTAssertEqual(itemManager.toDoCount, expectToDoCount, "toDoCount should increase by 1") + } + + func test_itemAt_givenLastIndex_returnsAddedItem() { + let item = ToDoItem(title: titleForFirstToAdd) + itemManager.add(item) + + XCTAssertEqual(itemManager.item(at: itemManager.toDoCount - 1), item, "should return added item") + } + + func test_checkItemAt_givenFirstIndex_removesFromToDoItems() { + let firstItem = ToDoItem(title: titleForFirstToAdd) + let secondItem = ToDoItem(title: titleForSecondToAdd) + + itemManager.add(firstItem) + itemManager.add(secondItem) + + XCTAssertEqual(itemManager.item(at: 0), firstItem, "first item should be added") + + let expectToDoCount = itemManager.toDoCount - 1 + + itemManager.checkItem(at: 0) + + XCTAssertEqual(itemManager.item(at: 0), secondItem, "first item should be removed") + XCTAssertEqual(itemManager.toDoCount, expectToDoCount, "toDoCount should decrease by 1") + } + + func test_checkItemAt_givenFirstIndex_addsToDoneItems() { + let firstItem = ToDoItem(title: titleForFirstToAdd) + let secondItem = ToDoItem(title: titleForSecondToAdd) + + itemManager.add(firstItem) + itemManager.add(secondItem) + + XCTAssertEqual(itemManager.doneCount, 0, "done items should be empty") + + let expectDoneCount = itemManager.doneCount + 1 + + itemManager.checkItem(at: 0) + + XCTAssertEqual(itemManager.doneItem(at: 0), firstItem, "first item should be removed") + XCTAssertEqual(itemManager.doneCount, expectDoneCount, "doneCount should increase by 1") + } + + func test_removeAll_clearsItems() { + let firstItem = ToDoItem(title: titleForFirstToAdd) + let secondItem = ToDoItem(title: titleForSecondToAdd) + + itemManager.add(firstItem) + itemManager.add(secondItem) + + itemManager.removeAll() + + XCTAssertEqual(itemManager.toDoCount, 0, "toDoCount should be 0") + XCTAssertEqual(itemManager.doneCount, 0, "doneCount should be 0") + } + + func test_ToDoItemsGetSerialized() { + let firstItem = ToDoItem(title: "First") + itemManager.add(firstItem) + + let secondItem = ToDoItem(title: "Second") + itemManager.add(secondItem) + + NotificationCenter.default.post(name: UIApplication.willResignActiveNotification, object: nil) + + XCTAssertEqual(itemManager?.toDoCount, 2) + XCTAssertEqual(itemManager?.item(at: 0), firstItem) + XCTAssertEqual(itemManager?.item(at: 1), secondItem) + } +} diff --git a/Project 04 - TodoTDD/ToDoTests/Models/ToDoItemTests.swift b/Project 04 - TodoTDD/ToDoTests/Models/ToDoItemTests.swift new file mode 100644 index 00000000..b8c2e9a5 --- /dev/null +++ b/Project 04 - TodoTDD/ToDoTests/Models/ToDoItemTests.swift @@ -0,0 +1,71 @@ +// +// ToDoItemTests.swift +// ToDoTests +// +// Created by gu, yi on 9/6/18. +// Copyright © 2018 gu, yi. All rights reserved. +// + +import XCTest +@testable import ToDo + +class ToDoItemTests: XCTestCase { + + let timestamp = 0.0 + let locationName = "Location" + + override func setUp() { + super.setUp() + // Put setup code here. This method is called before the invocation of each test method in the class. + } + + override func tearDown() { + // Put teardown code here. This method is called after the invocation of each test method in the class. + super.tearDown() + } + + func test_init_givenTitle_setsTitle() { + let toDoItem = ToDoItem(title: Foo) + + XCTAssertEqual(toDoItem.title, Foo, "should set title") + } + + func test_init_givenItemDescription_setsItemDescription() { + let toDoItem = ToDoItem(title: Foo, itemDescription: Bar) + + XCTAssertEqual(toDoItem.title, Foo, "should set title") + XCTAssertEqual(toDoItem.itemDescription, Bar, "should set itemDescription") + } + + func test_init_givenTimeStamp_setsTimeStamp() { + let toDoItem = ToDoItem(title: Foo, timeStamp: timestamp) + + XCTAssertEqual(toDoItem.timestamp, timestamp, "should set timeStamp") + } + + func test_init_givenLocation_setsLocation() { + + let location = Location(name: locationName) + let toDoItem = ToDoItem(title: Foo, location: Location(name: locationName)) + + XCTAssertEqual(toDoItem.location, location, "should set location") + } + + func test_init_hasPlistDictionaryProperty() { + let toDoItem = ToDoItem(title: "First") + let dictionary = toDoItem.plistDict + + XCTAssertNotNil(dictionary) + } + + func test_canBeCreatedFromPlistDictionary() { + let location = Location(name: "Bar") + let toDoItem = ToDoItem(title: "Foo", itemDescription: "Baz", timeStamp: 1.0, location: location) + + let dict = toDoItem.plistDict + let recreatedItem = ToDoItem(dict: dict) + + XCTAssertEqual(recreatedItem, toDoItem) + } + +} diff --git a/Project 04 - TodoTDD/ToDoTests/Network/APIClientTests.swift b/Project 04 - TodoTDD/ToDoTests/Network/APIClientTests.swift new file mode 100644 index 00000000..f45d8a30 --- /dev/null +++ b/Project 04 - TodoTDD/ToDoTests/Network/APIClientTests.swift @@ -0,0 +1,189 @@ +// +// APIClientTests.swift +// ToDoTests +// +// Created by Yi Gu on 5/11/19. +// Copyright © 2019 gu, yi. All rights reserved. +// + +import XCTest +@testable import ToDo + +class APIClientTests: XCTestCase { + + var apiClient: APIClient! + var urlSession: MockURLSession! + + override func setUp() { + apiClient = APIClient() + urlSession = MockURLSession() + + apiClient.session = urlSession + } + + override func tearDown() { + super.tearDown() + } + + func test_login_usesExpectedHost() { + + let completion = { (token: Token?, error: Error?) in } + apiClient.loginUser(with: Constants.userName, password: Constants.password, completion: completion) + + guard let _ = urlSession.url else { + XCTFail(); + return + } + + XCTAssertEqual(urlSession.urlComponents?.host, "awesometodos.com") + } + + func test_login_usesExpectedPath() { + let completion = { (token: Token?, error: Error?) in } + apiClient.loginUser(with: Constants.userName, password: Constants.password, completion: completion) + + guard let _ = urlSession.url else { + XCTFail(); + return + } + + XCTAssertEqual(urlSession.urlComponents?.path, "/login") + } + + func test_login_usesExpectedQuery() { + let completion = { (token: Token?, error: Error?) in } + apiClient.loginUser(with: Constants.userName, password: Constants.password, completion: completion) + + guard let _ = urlSession.url else { + XCTFail(); + return + } + + XCTAssertEqual(urlSession.urlComponents?.query, "username=\(Constants.userName)&password=\(Constants.password)") + } + + func test_login_givenSuccessResponse_createsToken() { + + let jsonData = "{\"token\": \"1234567890\"}".data(using: .utf8) + let mockURLSession = MockURLSession(data: jsonData) + apiClient.session = mockURLSession + + let tokenExpectation = expectation(description: "Token") + + var caughtToken: Token? + apiClient.loginUser(with: Constants.userName, password: Constants.password) { (token, _) in + caughtToken = token + tokenExpectation.fulfill() + } + + waitForExpectations(timeout: 1) { _ in + XCTAssertEqual(caughtToken?.id, "1234567890") + } + } + + func test_login_givenJSONIsInvalid_returnsError() { + + let mockURLSession = MockURLSession(data: Data()) + apiClient.session = mockURLSession + + let errorExpectation = expectation(description: "Error") + + var catchedError: Error? + apiClient.loginUser(with: Constants.userName, password: Constants.password) { (_, error) in + catchedError = error + errorExpectation.fulfill() + } + + waitForExpectations(timeout: 1) { _ in + XCTAssertNotNil(catchedError) + } + } + + func test_login_givenJSONIsNil_returnsError() { + + let mockURLSession = MockURLSession() + apiClient.session = mockURLSession + + let errorExpectation = expectation(description: "Error") + + var catchedError: Error? + apiClient.loginUser(with: Constants.userName, password: Constants.password) { (_, error) in + catchedError = error + errorExpectation.fulfill() + } + + waitForExpectations(timeout: 1) { _ in + XCTAssertNotNil(catchedError) + } + } + + func test_login_givenFailResponse_returnsError() { + + let jsonData = "{\"token\": \"1234567890\"}".data(using: .utf8) + let error = NSError(domain: "SomeError", code: 1234, userInfo: nil) + let mockURLSession = MockURLSession(data: jsonData, error: error) + apiClient.session = mockURLSession + + let errorExpectation = expectation(description: "Error") + + var catchedError: Error? + apiClient.loginUser(with: Constants.userName, password: Constants.password) { (_, error) in + catchedError = error + errorExpectation.fulfill() + } + + waitForExpectations(timeout: 1) { _ in + XCTAssertNotNil(catchedError) + } + } +} + +extension APIClientTests { + class MockURLSession: Sessionable { + + var url: URL? + var urlComponents: URLComponents? { + guard let url = url else { + return nil + } + return URLComponents(url: url, resolvingAgainstBaseURL: true) + } + + private let dataTask: MockTask + + init(data: Data? = nil, urlResponse: URLResponse? = nil, error: Error? = nil) { + dataTask = MockTask(data: data, urlResponse: urlResponse, error: error) + } + + func dataTask(with url: URL, completionHandler: @escaping (Data?, URLResponse?, Error?) -> Void) -> URLSessionDataTask { + + self.url = url + dataTask.completionHandler = completionHandler + + return dataTask + } + } + + class MockTask: URLSessionDataTask { + + private let data: Data? + private let urlResponse: URLResponse? + private let responseError: Error? + + var completionHandler: ((Data?, URLResponse?, Error?) -> Void)? + + init(data: Data?, urlResponse: URLResponse?, error: Error?) { + self.data = data + self.urlResponse = urlResponse + self.responseError = error + } + + override func resume() { + DispatchQueue.main.async() { + self.completionHandler?(self.data, + self.urlResponse, + self.responseError) + } + } + } +} diff --git a/Project 04 - TodoTDD/ToDoTests/Others/Constants.swift b/Project 04 - TodoTDD/ToDoTests/Others/Constants.swift new file mode 100644 index 00000000..730b4aca --- /dev/null +++ b/Project 04 - TodoTDD/ToDoTests/Others/Constants.swift @@ -0,0 +1,12 @@ +// +// Constants.swift +// ToDo +// +// Created by gu, yi on 9/20/18. +// Copyright © 2018 gu, yi. All rights reserved. +// + +let Foo = "Foo" +let Bar = "Bar" + +let testDate = "09/08/2018" diff --git a/Project 04 - TodoTDD/ToDoTests/Others/Info.plist b/Project 04 - TodoTDD/ToDoTests/Others/Info.plist new file mode 100644 index 00000000..6c40a6cd --- /dev/null +++ b/Project 04 - TodoTDD/ToDoTests/Others/Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + + diff --git a/Project 04 - TodoTDD/ToDoTests/ViewControllers/DetailViewControllerTests.swift b/Project 04 - TodoTDD/ToDoTests/ViewControllers/DetailViewControllerTests.swift new file mode 100644 index 00000000..a8a60afe --- /dev/null +++ b/Project 04 - TodoTDD/ToDoTests/ViewControllers/DetailViewControllerTests.swift @@ -0,0 +1,63 @@ +// +// DetailViewControllerTests.swift +// ToDoTests +// +// Created by gu, yi on 10/2/18. +// Copyright © 2018 gu, yi. All rights reserved. +// + +import XCTest +import CoreLocation +@testable import ToDo + +class DetailViewControllerTests: XCTestCase { + + var detailViewController: DetailViewController! + + override func setUp() { + super.setUp() + + let storyboard = UIStoryboard(name: Constants.MainBundleIdentifer, bundle: nil) + detailViewController = (storyboard.instantiateViewController(withIdentifier: Constants.DetailViewControllerIdentifier) as! DetailViewController) + + detailViewController.loadViewIfNeeded() + } + + override func tearDown() { + detailViewController.item = nil + + super.tearDown() + } + + func test_init_hasTitleLabel() { + XCTAssertTrue(detailViewController.titleLabel.isDescendant(of: detailViewController.view)) + } + + func test_init_hasLocationLabel() { + XCTAssertTrue(detailViewController.locationLabel.isDescendant(of: detailViewController.view)) + } + + func test_init_hasMapView() { + XCTAssertTrue(detailViewController.mapView.isDescendant(of: detailViewController.view)) + } + + func test_viewDidLoad_givenItem_hasItem() { + let coordinate = CLLocationCoordinate2DMake(1.0, + 2.0) + let timestamp = 1456095600.0 + let testItem = ToDoItem(title: "Foo", + itemDescription: "Bar", + timeStamp: timestamp, + location: Location(name: "Infinite Loop 1, Cupertino", + coordinate: coordinate)) + + detailViewController.item = testItem + + detailViewController.viewDidLoad() + + XCTAssertEqual(detailViewController.titleLabel.text, testItem.title) + XCTAssertEqual(detailViewController.locationLabel.text, testItem.location!.name) + XCTAssertEqual(ceil(detailViewController.mapView.centerCoordinate.latitude), testItem.location!.coordinate!.latitude) + XCTAssertEqual(ceil(detailViewController.mapView.centerCoordinate.longitude), testItem.location!.coordinate!.longitude) + } +} diff --git a/Project 04 - TodoTDD/ToDoTests/ViewControllers/InputViewControllerTests.swift b/Project 04 - TodoTDD/ToDoTests/ViewControllers/InputViewControllerTests.swift new file mode 100644 index 00000000..bf47bd09 --- /dev/null +++ b/Project 04 - TodoTDD/ToDoTests/ViewControllers/InputViewControllerTests.swift @@ -0,0 +1,210 @@ +// +// InputViewControllerTests.swift +// ToDoTests +// +// Created by Yi Gu on 5/4/19. +// Copyright © 2019 gu, yi. All rights reserved. +// + +import XCTest +import CoreLocation +@testable import ToDo + +class InputViewControllerTests: XCTestCase { + + var inputViewController: InputViewController! + var placemark: MockPlacemark! + + override func setUp() { + super.setUp() + + let storyboard = UIStoryboard(name: Constants.MainBundleIdentifer, bundle: nil) + inputViewController = (storyboard.instantiateViewController(withIdentifier: Constants.InputViewControllerIndentifier) as! InputViewController) + + inputViewController.loadViewIfNeeded() + } + + override func tearDown() { + inputViewController.itemManager?.removeAll() + + super.tearDown() + } + + func test_init_hasTitleTextField() { + XCTAssertTrue(inputViewController.titleTextField.isDescendant(of: inputViewController.view)) + } + + func test_init_hasLocationTextField() { + XCTAssertTrue(inputViewController.locationTextField.isDescendant(of: inputViewController.view)) + } + + func test_init_hasDescriptionTextField() { + XCTAssertTrue(inputViewController.descriptionTextField.isDescendant(of: inputViewController.view)) + } + + func test_init_hasDatePicker() { + XCTAssertTrue(inputViewController.datePicker.isDescendant(of: inputViewController.view)) + } + + func test_init_hasCanelButton() { + XCTAssertTrue(inputViewController.cancelButton.isDescendant(of: inputViewController.view)) + } + + func test_init_hasSaveButton() { + XCTAssertTrue(inputViewController.saveButton.isDescendant(of: inputViewController.view)) + } + + func test_init_hasSaveAction() { + let saveButton = inputViewController.saveButton + + guard let actions = saveButton?.actions(forTarget: inputViewController, forControlEvent: .touchUpInside) else { + XCTFail() + return + } + + XCTAssertTrue(actions.contains("save")) + } + + func test_save_usesGeocoderToGetCoordinateFromAddress() { + let mockInputViewController = MockInputViewController() + mockInputViewController.titleTextField = UITextField() + mockInputViewController.datePicker = UIDatePicker() + mockInputViewController.descriptionTextField = UITextField() + mockInputViewController.locationTextField = UITextField() + + mockInputViewController.titleTextField.text = "Foo" + + // input a new item and save + let dateFormatter = DateFormatter() + dateFormatter.dateFormat = "MM/dd/yyyy" + let timestamp = 1456095600.0 + let date = Date(timeIntervalSince1970: timestamp) + mockInputViewController.datePicker.date = date + + mockInputViewController.descriptionTextField.text = "Bar" + mockInputViewController.locationTextField.text = "Infinite Loop 1, Cupertino" + + let mockGeocoder = MockGeocoder() + mockInputViewController.geocoder = mockGeocoder + + mockInputViewController.itemManager = ToDoItemManager() + + let dismissExpectation = expectation(description: "Dismiss") + + mockInputViewController.completionHandler = { + dismissExpectation.fulfill() + } + + mockInputViewController.save() + + placemark = MockPlacemark() + let coordinate = CLLocationCoordinate2DMake(37.3316851, + -122.0300674) + placemark.mockCoordinate = coordinate + mockGeocoder.completionHandler?([placemark], nil) + + waitForExpectations(timeout: 3, handler: nil) + + // create the expected item + let testItem = ToDoItem(title: "Foo", + itemDescription: "Bar", + timeStamp: timestamp, + location: Location(name: "Infinite Loop 1, Cupertino", + coordinate: coordinate)) + + let item = mockInputViewController.itemManager?.item(at: 0) + XCTAssertEqual(item, testItem) + + mockInputViewController.itemManager?.removeAll() + } + + func test_save_dismissSelf() { + let mockInputViewController = MockInputViewController() + + mockInputViewController.titleTextField = UITextField() + mockInputViewController.titleTextField.text = "Foo" + + mockInputViewController.save() + + XCTAssertTrue(mockInputViewController.dismissGotCalled) + + mockInputViewController.itemManager?.removeAll() + } + + func test_cancel_dismissSelf() { + let mockInputViewController = MockInputViewController() + + mockInputViewController.cancel() + + XCTAssertTrue(mockInputViewController.dismissGotCalled) + + mockInputViewController.itemManager?.removeAll() + } + + func test_Geocoder_FetchesCoordinates() { + let geocoderAnswered = expectation(description: "Geocoder") + + let address = "Infinite Loop 1, Cupertino" + + CLGeocoder().geocodeAddressString(address) { placemarks, error -> Void in + let coordinate = placemarks?.first?.location?.coordinate + + guard let latitude = coordinate?.latitude else { + XCTFail() + return + } + guard let longitude = coordinate?.longitude else { + XCTFail() + return + } + + XCTAssertEqual(latitude, 37.3316, accuracy: 0.001) + XCTAssertEqual(longitude, -122.0301, accuracy: 0.001) + + geocoderAnswered.fulfill() + } + + waitForExpectations(timeout: 3, handler: nil) + } +} + +extension InputViewControllerTests { + class MockGeocoder: CLGeocoder { + + var completionHandler: CLGeocodeCompletionHandler? + + override func geocodeAddressString( + _ addressString: String, + completionHandler: @escaping CLGeocodeCompletionHandler) { + + self.completionHandler = completionHandler + } + } + + class MockPlacemark : CLPlacemark { + + var mockCoordinate: CLLocationCoordinate2D? + + override var location: CLLocation? { + guard let coordinate = mockCoordinate else { + return CLLocation() + } + + return CLLocation(latitude: coordinate.latitude, + longitude: coordinate.longitude) + } + } + + class MockInputViewController : InputViewController { + + var dismissGotCalled = false + var completionHandler: (() -> Void)? + + override func dismiss(animated flag: Bool, + completion: (() -> Void)? = nil) { + + dismissGotCalled = true + completionHandler?() + } + } +} diff --git a/Project 04 - TodoTDD/ToDoTests/ViewControllers/ItemListDataProviderTests.swift b/Project 04 - TodoTDD/ToDoTests/ViewControllers/ItemListDataProviderTests.swift new file mode 100644 index 00000000..8fc5e3ee --- /dev/null +++ b/Project 04 - TodoTDD/ToDoTests/ViewControllers/ItemListDataProviderTests.swift @@ -0,0 +1,235 @@ +// +// ItemListDataProviderTests.swift +// ToDoTests +// +// Created by gu, yi on 9/20/18. +// Copyright © 2018 gu, yi. All rights reserved. +// + +import XCTest +@testable import ToDo + +class ItemListDataProviderTests: XCTestCase { + + // MARK: - Variables + var tableView: UITableView! + var dataProvider: ItemListDataProvider! + var itemManager: ToDoItemManager! + + // MARK: - Life Cycle + override func setUp() { + super.setUp() + + let storyboard = UIStoryboard(name: Constants.MainBundleIdentifer, bundle: nil) + let controller = storyboard.instantiateViewController(withIdentifier: Constants.ItemListViewControllerIdentifier) as! ItemListViewController + controller.loadViewIfNeeded() + tableView = controller.tableView + + dataProvider = ItemListDataProvider() + itemManager = ToDoItemManager() + + dataProvider.itemManager = itemManager + tableView.dataSource = dataProvider + } + + override func tearDown() { + itemManager.removeAll() + + super.tearDown() + } + + // MARK: - NumberOfSections + func test_numberOfSections_init_isTwo() { + XCTAssertEqual(tableView.numberOfSections, 2, "number of sections should be 2") + } + + // MARK: - NumberOfRows + func test_numberOfRowsOfToDoSection_init_isToDoCount() { + XCTAssertEqual(tableView.numberOfRows(inSection: 0), 0, "number of rows in toDo section should be 0 at first") + XCTAssertEqual(tableView.numberOfRows(inSection: 0), itemManager.toDoCount, "number of rows in toDo section should be equal to toDoCount of itemManager") + } + + func test_numberOfRowsOfToDoSection_addToDoItem_isToDoCount() { + itemManager.add(ToDoItem(title: Foo)) + + tableView.reloadData() + + XCTAssertEqual(tableView.numberOfRows(inSection: 0), 1, "number of rows in toDo section increase to be 1 after adding a new item") + XCTAssertEqual(tableView.numberOfRows(inSection: 0), itemManager.toDoCount, "number of rows in toDo section should be equal to toDoCount of itemManager") + } + + func test_numberOfRowsOfToDoSection_checkToDoItem_isToDoCount() { + itemManager.add(ToDoItem(title: Foo)) + itemManager.checkItem(at: 0) + + tableView.reloadData() + + XCTAssertEqual(tableView.numberOfRows(inSection: 0), 0, "number of rows in toDo section should be 0 after all items checked") + XCTAssertEqual(tableView.numberOfRows(inSection: 0), itemManager.toDoCount, "number of rows in toDo section should be equal to toDoCount of itemManager") + } + + func test_numberOfRowsOfToDoSection_removeAllItems_isToDoCount() { + itemManager.add(ToDoItem(title: Foo)) + itemManager.removeAll() + + tableView.reloadData() + + XCTAssertEqual(tableView.numberOfRows(inSection: 0), 0, "number of rows in toDo section should be 0 after all items removed") + XCTAssertEqual(tableView.numberOfRows(inSection: 0), itemManager.toDoCount, "number of rows in toDo section should be equal to toDoCount of itemManager") + } + + func test_numberOfRowsOfDoneSection_init_isDoneCount() { + XCTAssertEqual(tableView.numberOfRows(inSection: 1), 0, "number of rows in done section should be 0 at first") + XCTAssertEqual(tableView.numberOfRows(inSection: 1), itemManager.doneCount, "number of rows in done section should be equal to doneCount of itemManager") + } + + func test_numberOfRowsOfDoneSection_addDoneItem_isDoneCount() { + itemManager.add(ToDoItem(title: Foo)) + + tableView.reloadData() + + XCTAssertEqual(tableView.numberOfRows(inSection: 1), 0, "number of rows in done section should keep to be 0 after adding a new item") + XCTAssertEqual(tableView.numberOfRows(inSection: 1), itemManager.doneCount, "number of rows in done section should be equal to doneCount of itemManager") + } + + func test_numberOfRowsOfDoneSection_checkToDoItem_isDoneCount() { + itemManager.add(ToDoItem(title: Foo)) + itemManager.checkItem(at: 0) + + tableView.reloadData() + + XCTAssertEqual(tableView.numberOfRows(inSection: 1), 1, "number of rows in done section should be 1 after one item checked") + XCTAssertEqual(tableView.numberOfRows(inSection: 1), itemManager.doneCount, "number of rows in done section should be equal to doneCount of itemManager") + } + + func test_numberOfRowsOfDoneSection_removeAllItems_isDoneCount() { + itemManager.add(ToDoItem(title: Foo)) + itemManager.removeAll() + + tableView.reloadData() + + XCTAssertEqual(tableView.numberOfRows(inSection: 1), 0, "number of rows in done section should be 0 after all items removed") + XCTAssertEqual(tableView.numberOfRows(inSection: 1), itemManager.doneCount, "number of rows in done section should be equal to doneCount of itemManager") + } + + // MARK: - CellForRow + func test_cellForRow_init_isItemCell() { + itemManager.add(ToDoItem(title: Foo)) + tableView.reloadData() + + // if tableView is not init from storyboard, it cannot configure cell to ItemCell as it cannot find the right identifier + let cell = tableView.cellForRow(at: IndexPath(row: 0, section: 0)) + + XCTAssertTrue(cell is ItemCell, "should be ItemCell") + } + + func test_cellForRow_givenToDoItem_callsCellDequeue() { + let mockTableView = MockTableView.mockTableView(withDataSource: dataProvider) + + itemManager.add(ToDoItem(title: Foo)) + mockTableView.reloadData() + + _ = mockTableView.cellForRow(at: IndexPath(row: 0, section: 0)) + XCTAssertTrue(mockTableView.dequeueCellGotCalled, "cell should be dequeued") + } + + func test_cellForRow_givenToDoItem_callsConfigCell() { + let mockTableView = MockTableView.mockTableView(withDataSource: dataProvider) + + let item = ToDoItem(title: Foo) + itemManager.add(item) + mockTableView.reloadData() + + let cell = mockTableView.cellForRow(at: IndexPath(row: 0, section: 0)) as! MockItemCell + XCTAssertTrue(cell.configCellGotCalled, "cell should be dequeued") + XCTAssertEqual(cell.cachedItem, item, "config item should be the one added") + } + + func test_cellForRow_givenDoneItem_callsConfigCell() { + let mockTableView = MockTableView.mockTableView(withDataSource: dataProvider) + + let item = ToDoItem(title: Foo) + itemManager.add(item) + itemManager.checkItem(at: 0) + mockTableView.reloadData() + + let cell = mockTableView.cellForRow(at: IndexPath(row: 0, section: 1)) as! MockItemCell + XCTAssertTrue(cell.configCellGotCalled, "cell should be dequeued") + XCTAssertEqual(cell.cachedItem, item, "config item should be the one added") + } + + // MARK: - UITableViewDelegate + func test_deleteButton_inToDoSection_showsTitleCheck() { + let deleteButtonTitle = tableView.delegate?.tableView?( + tableView, + titleForDeleteConfirmationButtonForRowAt: IndexPath(row: 0, + section: 0)) + + XCTAssertEqual(deleteButtonTitle, "Check") + } + + func test_deleteButton_inDoneSection_showsTitleCheck() { + let deleteButtonTitle = tableView.delegate?.tableView?(tableView, titleForDeleteConfirmationButtonForRowAt: IndexPath(row: 0, section: 1)) + + XCTAssertEqual(deleteButtonTitle, "Uncheck") + } + + func test_checkAnItem_inToDoSection_changesItemsNum() { + itemManager.add(ToDoItem(title: Foo)) + + tableView.dataSource?.tableView?(tableView, commit: .delete, forRowAt: IndexPath(row: 0, section: 0)) + + XCTAssertEqual(itemManager.toDoCount, 0, "should remove toDo item") + XCTAssertEqual(itemManager.doneCount, 1, "should add done item") + XCTAssertEqual(tableView.numberOfRows(inSection: 0), 0, "toDo item number should be 0") + XCTAssertEqual(tableView.numberOfRows(inSection: 1), 1, "done item number should be 1") + } + + func test_checkAnItem_inDoneSection_changesItemsNum() { + itemManager.add(ToDoItem(title: Foo)) + itemManager.checkItem(at: 0) + tableView.reloadData() + + tableView.dataSource?.tableView?(tableView, commit: .delete, forRowAt: IndexPath(row: 0, section: 1)) + + XCTAssertEqual(itemManager.toDoCount, 1, "should add toDo item") + XCTAssertEqual(itemManager.doneCount, 0, "should remove done item") + XCTAssertEqual(tableView.numberOfRows(inSection: 0), 1, "toDo item number should be 1") + XCTAssertEqual(tableView.numberOfRows(inSection: 1), 0, "done item number should be 0") + } + +} + +extension ItemListDataProviderTests { + // Mock a table view to ensure the dequeCell function is called. + class MockTableView: UITableView { + var dequeueCellGotCalled = false + + override func dequeueReusableCell(withIdentifier identifier: String, for indexPath: IndexPath) -> UITableViewCell { + + dequeueCellGotCalled = true + + return super.dequeueReusableCell(withIdentifier: identifier, for: indexPath) + } + + class func mockTableView(withDataSource dataSource: UITableViewDataSource) -> MockTableView { + let mockTableView = MockTableView() + + mockTableView.dataSource = dataSource + mockTableView.register(MockItemCell.self, forCellReuseIdentifier: Constants.ItemCellIdentifier) + + return mockTableView + } + } + + class MockItemCell: ItemCell { + var configCellGotCalled = false + var cachedItem: ToDoItem? + + override func configCell(with item: ToDoItem, isChecked: Bool = false) { + + configCellGotCalled = true + cachedItem = item + } + } +} diff --git a/Project 04 - TodoTDD/ToDoTests/ViewControllers/ItemListViewControllerTests.swift b/Project 04 - TodoTDD/ToDoTests/ViewControllers/ItemListViewControllerTests.swift new file mode 100644 index 00000000..e9d3fecd --- /dev/null +++ b/Project 04 - TodoTDD/ToDoTests/ViewControllers/ItemListViewControllerTests.swift @@ -0,0 +1,166 @@ +// +// ItemListViewControllerTests.swift +// ToDoTests +// +// Created by gu, yi on 9/18/18. +// Copyright © 2018 gu, yi. All rights reserved. +// + +import XCTest +@testable import ToDo + +class ItemListViewControllerTests: XCTestCase { + + var itemListViewController: ItemListViewController! + + override func setUp() { + super.setUp() + + let storyboard = UIStoryboard(name: "Main", bundle: nil) + + itemListViewController = (storyboard.instantiateViewController(withIdentifier: "ItemListViewController") as! ItemListViewController) + + itemListViewController.loadViewIfNeeded() + } + + override func tearDown() { + super.tearDown() + } + + func test_init_hasTableView() { + + XCTAssertTrue(itemListViewController.tableView.isDescendant(of: itemListViewController.view)) + } + + func test_init_givenDataProvider_setsTableViewDataSource() { + + XCTAssertTrue(itemListViewController.tableView.dataSource is ItemListDataProvider, "dataProvider should be the dataSource to tableView") + } + + func test_init_givenDataProvider_setsTableViewDelegate() { + + XCTAssertTrue(itemListViewController.tableView.delegate is ItemListDataProvider, "dataProvider should be the dataSource to tableView") + } + + func test_init_givenDataProvider_dataSourceEqualsDelegate() { + + XCTAssertEqual(itemListViewController.tableView.dataSource as? ItemListDataProvider, + itemListViewController.tableView.delegate as? ItemListDataProvider, "dataSource and delegate should be the same") + } + + func test_init_itemListViewController_hasAddBarButtonWithSelfAsTarget() { + + let target = itemListViewController.navigationItem.rightBarButtonItem?.target + XCTAssertEqual(target as? UIViewController, itemListViewController) + } + + func test_addItem_inputViewController_shouldPresent() { + + XCTAssertNil(itemListViewController.presentedViewController) + + _test_performAddItem() + + XCTAssertNotNil(itemListViewController.presentedViewController) + XCTAssertTrue(itemListViewController.presentedViewController is InputViewController) + } + + func test_addItem_inputViewController_sharesItemManagerWithItemListViewController() { + _test_performAddItem() + + guard let inputViewController = itemListViewController.presentedViewController as? InputViewController else { + XCTFail() + return + } + guard let inputItemManager = inputViewController.itemManager else { + XCTFail() + return + } + + guard let itemManager = itemListViewController.dataProvider.itemManager else { + XCTFail() + return + } + + XCTAssert(itemManager === inputItemManager) + } + + func test_addItem_givenSave_shouldHaveNewItem() { + _test_performAddItem() + + XCTAssertEqual(itemListViewController.tableView.numberOfRows(inSection: Section.toDo.rawValue), 0) + + guard let inputViewController = itemListViewController.presentedViewController as? InputViewController else { + XCTFail() + return + } + + inputViewController.titleTextField = UITextField() + inputViewController.titleTextField.text = "Foo" + inputViewController.save() + + // trigger view will appear + itemListViewController.viewWillAppear(true) + + XCTAssertEqual(itemListViewController.tableView.numberOfRows(inSection: Section.toDo.rawValue), 1) + } + + private func _test_performAddItem() { + guard let addItemButton = itemListViewController.navigationItem.rightBarButtonItem else { + return XCTFail() + } + guard let action = addItemButton.action else { + return XCTFail() + } + + // set item list view controller as root so that it is visible in view hierachy + UIApplication.shared.keyWindow?.rootViewController = itemListViewController + + itemListViewController.performSelector(onMainThread: action, + with: addItemButton, + waitUntilDone: true) + } + + func test_selectToDoItemCell_shouldPresentDetailViewController() { + let mockNavigationController = MockNavigationController(rootViewController: itemListViewController) + + UIApplication.shared.keyWindow?.rootViewController = mockNavigationController + + let testItem = ToDoItem(title: "foo") + itemListViewController.dataProvider.itemManager = ToDoItemManager() + itemListViewController.dataProvider.itemManager?.add(testItem) + + // reload data to make sure tableview gets updated + itemListViewController.tableView.reloadData() + + // select row 0 + NotificationCenter.default.post( + name: Notification.ItemSelectedNotification, + object: self, + userInfo: ["index": 0]) + + guard let detailViewController = mockNavigationController.lastPushedViewController as? DetailViewController else { + return XCTFail() + } + + guard let detailItem = detailViewController.item else { + return XCTFail() + } + + detailViewController.loadViewIfNeeded() + + XCTAssertEqual(detailItem, testItem) + } +} + +extension ItemListViewControllerTests { + class MockNavigationController : UINavigationController { + + var lastPushedViewController: UIViewController? + + override func pushViewController(_ viewController: UIViewController, animated: Bool) { + lastPushedViewController = viewController + super.pushViewController(viewController, animated: animated) + } + } +} + diff --git a/Project 04 - TodoTDD/ToDoTests/Views/ItemCellTests.swift b/Project 04 - TodoTDD/ToDoTests/Views/ItemCellTests.swift new file mode 100644 index 00000000..0a325412 --- /dev/null +++ b/Project 04 - TodoTDD/ToDoTests/Views/ItemCellTests.swift @@ -0,0 +1,107 @@ +// +// ItemCellTests.swift +// ToDoTests +// +// Created by gu, yi on 9/26/18. +// Copyright © 2018 gu, yi. All rights reserved. +// + +import XCTest +@testable import ToDo + +class ItemCellTests: XCTestCase { + + var cell: ItemCell! + + override func setUp() { + super.setUp() + + let storyboard = UIStoryboard(name: Constants.MainBundleIdentifer, bundle: nil) + let itemListViewController = storyboard.instantiateViewController(withIdentifier: Constants.ItemListViewControllerIdentifier) as! ItemListViewController + itemListViewController.loadViewIfNeeded() + + let tableView = itemListViewController.tableView + let fakeDataSource = FakeDataSource() + tableView?.dataSource = fakeDataSource + + cell = (tableView?.dequeueReusableCell(withIdentifier: Constants.ItemCellIdentifier, for: IndexPath(row: 0, section: 0)) as! ItemCell) + } + + override func tearDown() { + super.tearDown() + } + + // MARK: - init + func test_init_givenTableViewDataSource_hasNameLabel() { + // make sure it is not nil is not enough, we have to make sure it is in the content view + XCTAssertTrue(cell.titleLabel.isDescendant(of: cell.contentView)) + } + + func test_init_givenTableViewDataSource_hasLocationLabel() { + XCTAssertTrue(cell.locationLabel.isDescendant(of: cell.contentView)) + } + + func test_init_givenTableViewDataSource_hasDateLabel() { + XCTAssertTrue(cell.dateLabel.isDescendant(of: cell.contentView)) + } + + // MARK: - configCell + func test_configCell_givenTitle_setsTitle() { + let toDoItem = ToDoItem(title: Foo) + + cell.configCell(with: toDoItem) + + XCTAssertEqual(cell.titleLabel.text, toDoItem.title) + } + + func test_configCell_givenLocation_setsLocation() { + let location = Location(name: Bar) + let toDoItem = ToDoItem(title: Foo, location: location) + + cell.configCell(with: toDoItem) + + XCTAssertEqual(cell.locationLabel.text, Bar) + } + + func test_configCell_givenDate_setsDate() { + let dateFormatter = DateFormatter() + dateFormatter.dateFormat = "MM/dd/yyyy" + let date = dateFormatter.date(from: testDate) + let timeStamp = date?.timeIntervalSince1970 + + let toDoItem = ToDoItem(title: Foo, timeStamp: timeStamp) + + cell.configCell(with: toDoItem) + + XCTAssertEqual(cell.dateLabel.text, testDate) + } + + func test_configCell_itemIsChecked_titleIsStrokeThrough() { + let location = Location(name: Bar) + let toDoItem = ToDoItem(title: Foo, timeStamp: 1456150025, location: location) + + cell.configCell(with: toDoItem, isChecked: true) + + let attributedString = NSAttributedString( + string: Foo, + attributes: [NSAttributedString.Key.strikethroughStyle: + NSUnderlineStyle.single.rawValue]) + + XCTAssertEqual(cell.titleLabel.attributedText, attributedString) + XCTAssertNil(cell.locationLabel.text) + XCTAssertNil(cell.dateLabel.text) + } +} + +extension ItemCellTests { + class FakeDataSource: NSObject, UITableViewDataSource { + + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return 1 + } + + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + return UITableViewCell() + } + } +} diff --git a/Project 04 - TodoTDD/ToDoTests/Views/StoryboardTests.swift b/Project 04 - TodoTDD/ToDoTests/Views/StoryboardTests.swift new file mode 100644 index 00000000..8330a672 --- /dev/null +++ b/Project 04 - TodoTDD/ToDoTests/Views/StoryboardTests.swift @@ -0,0 +1,31 @@ +// +// StoryboardTests.swift +// ToDoTests +// +// Created by Yi Gu on 5/18/19. +// Copyright © 2019 gu, yi. All rights reserved. +// + +import XCTest +@testable import ToDo + +class StoryboardTests: XCTestCase { + + override func setUp() { + } + + override func tearDown() { + } + + func test_init_initialViewController_isItemListViewController() { + let storyboard = UIStoryboard(name: Constants.MainBundleIdentifer, bundle: nil) + + let navigationController = + storyboard.instantiateInitialViewController() + as! UINavigationController + + let rootViewController = navigationController.viewControllers[0] + + XCTAssertTrue(rootViewController is ItemListViewController) + } +} diff --git a/Project 04 - TodoTDD/ToDoUITests/Info.plist b/Project 04 - TodoTDD/ToDoUITests/Info.plist new file mode 100644 index 00000000..6c40a6cd --- /dev/null +++ b/Project 04 - TodoTDD/ToDoUITests/Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + + diff --git a/Project 04 - TodoTDD/ToDoUITests/ToDoUITests.swift b/Project 04 - TodoTDD/ToDoUITests/ToDoUITests.swift new file mode 100644 index 00000000..9bdc7226 --- /dev/null +++ b/Project 04 - TodoTDD/ToDoUITests/ToDoUITests.swift @@ -0,0 +1,63 @@ +// +// ToDoUITests.swift +// ToDoUITests +// +// Created by Yi Gu on 7/6/19. +// Copyright © 2019 gu, yi. All rights reserved. +// + +import XCTest + +class ToDoUITests: XCTestCase { + + override func setUp() { + // Put setup code here. This method is called before the invocation of each test method in the class. + + // In UI tests it is usually best to stop immediately when a failure occurs. + continueAfterFailure = false + + // UI tests must launch the application that they test. Doing this in setup will make sure it happens for each test method. + XCUIApplication().launch() + + // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this. + } + + override func tearDown() { + + } + + // make sure 'Hardware -> Keyboard -> Connect hardware keyboard' is off. + func testAddToDo() { + + let app = XCUIApplication() + app.navigationBars["ToDo.ItemListView"].buttons["Add"].tap() + + let titleTextField = app.textFields["Title"] + titleTextField.tap() + titleTextField.typeText("Meeting") + + let addressTextField = app.textFields["Address"] + addressTextField.tap() + addressTextField.typeText("650 Castro St, Mountain View") + + let descriptionTextField = app.textFields["Description"] + descriptionTextField.tap() + descriptionTextField.typeText("Quora") + + // Please change the value of pickerWheels to today to make the test work + let datePickersQuery = app.datePickers + datePickersQuery.pickerWheels["2019"].adjust(toPickerWheelValue: "2019") + datePickersQuery.pickerWheels["July"].adjust(toPickerWheelValue: "April") + datePickersQuery.pickerWheels["7"].adjust(toPickerWheelValue: "1") + + // tap anywhere to dismiss keyboard + app.keyboards.buttons["return"].tap() + + // go back to previous page + app.buttons["Save"].tap() + + XCTAssertTrue(app.tables.staticTexts["Meeting"].exists) + XCTAssertTrue(app.tables.staticTexts["04/01/2019"].exists) + XCTAssertTrue(app.tables.staticTexts["650 Castro St, Mountain View"].exists) + } +} diff --git a/Project 05 - Artistry/Artistry.xcodeproj/project.pbxproj b/Project 05 - Artistry/Artistry.xcodeproj/project.pbxproj index 19279828..ae44a809 100644 --- a/Project 05 - Artistry/Artistry.xcodeproj/project.pbxproj +++ b/Project 05 - Artistry/Artistry.xcodeproj/project.pbxproj @@ -143,18 +143,18 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0720; - LastUpgradeCheck = 0800; + LastUpgradeCheck = 1020; ORGANIZATIONNAME = RayWenderlich; TargetAttributes = { A2D7F3041C8CE3F60097399A = { CreatedOnToolsVersion = 7.2.1; - LastSwiftMigration = 0800; + LastSwiftMigration = 1020; }; }; }; buildConfigurationList = A2D7F3001C8CE3F60097399A /* Build configuration list for PBXProject "Artistry" */; compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; + developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, @@ -225,18 +225,27 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -259,7 +268,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.2; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -272,18 +281,27 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -300,7 +318,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.2; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; @@ -317,7 +335,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = RW.Artistry; PRODUCT_NAME = Artistry; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = 1; }; name = Debug; @@ -330,7 +348,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = RW.Artistry; PRODUCT_NAME = Artistry; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = 1; }; name = Release; diff --git a/Project 05 - Artistry/Artistry.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Project 05 - Artistry/Artistry.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/Project 05 - Artistry/Artistry.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Project 05 - Artistry/Artistry.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/Artistry.xcscheme b/Project 05 - Artistry/Artistry.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/Artistry.xcscheme index 80901b91..9b92e2bf 100644 --- a/Project 05 - Artistry/Artistry.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/Artistry.xcscheme +++ b/Project 05 - Artistry/Artistry.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/Artistry.xcscheme @@ -1,6 +1,6 @@ Bool { + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch. UINavigationBar.appearance().tintColor = UIColor.white return true diff --git a/Project 05 - Artistry/Artistry/ArtistDetailViewController.swift b/Project 05 - Artistry/Artistry/ArtistDetailViewController.swift index d771ef3e..66434fc5 100644 --- a/Project 05 - Artistry/Artistry/ArtistDetailViewController.swift +++ b/Project 05 - Artistry/Artistry/ArtistDetailViewController.swift @@ -34,10 +34,10 @@ class ArtistDetailViewController: UIViewController { super.viewDidLoad() title = selectedArtist.name - tableView.rowHeight = UITableViewAutomaticDimension + tableView.rowHeight = UITableView.automaticDimension tableView.estimatedRowHeight = 300 - NotificationCenter.default.addObserver(forName: .UIContentSizeCategoryDidChange, object: .none, queue: OperationQueue.main) { [weak self] _ in + NotificationCenter.default.addObserver(forName: UIContentSizeCategory.didChangeNotification, object: .none, queue: OperationQueue.main) { [weak self] _ in self?.tableView.reloadData() } } @@ -64,8 +64,8 @@ extension ArtistDetailViewController: UITableViewDataSource { cell.moreInfoTextView.text = work.isExpanded ? work.info : moreInfoText cell.moreInfoTextView.textAlignment = work.isExpanded ? .left : .center - cell.workTitleLabel.font = UIFont.preferredFont(forTextStyle: UIFontTextStyle.headline) - cell.moreInfoTextView.font = UIFont.preferredFont(forTextStyle: UIFontTextStyle.footnote) + cell.workTitleLabel.font = UIFont.preferredFont(forTextStyle: UIFont.TextStyle.headline) + cell.moreInfoTextView.font = UIFont.preferredFont(forTextStyle: UIFont.TextStyle.footnote) return cell } diff --git a/Project 05 - Artistry/Artistry/ArtistListViewController.swift b/Project 05 - Artistry/Artistry/ArtistListViewController.swift index f0a746fd..26affd5c 100644 --- a/Project 05 - Artistry/Artistry/ArtistListViewController.swift +++ b/Project 05 - Artistry/Artistry/ArtistListViewController.swift @@ -31,10 +31,10 @@ class ArtistListViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() - tableView.rowHeight = UITableViewAutomaticDimension + tableView.rowHeight = UITableView.automaticDimension tableView.estimatedRowHeight = 140 - NotificationCenter.default.addObserver(forName: .UIContentSizeCategoryDidChange, object: .none, queue: OperationQueue.main) { [weak self] _ in + NotificationCenter.default.addObserver(forName: UIContentSizeCategory.didChangeNotification, object: .none, queue: OperationQueue.main) { [weak self] _ in self?.tableView.reloadData() } } diff --git a/Project 06 - CandySearch/CandySearch.xcodeproj/project.pbxproj b/Project 06 - CandySearch/CandySearch.xcodeproj/project.pbxproj index 8b023a93..75341ccb 100644 --- a/Project 06 - CandySearch/CandySearch.xcodeproj/project.pbxproj +++ b/Project 06 - CandySearch/CandySearch.xcodeproj/project.pbxproj @@ -96,18 +96,18 @@ 171E0C721B8E5B84001E6242 /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0820; + LastUpgradeCheck = 1020; ORGANIZATIONNAME = "Peartree Developers"; TargetAttributes = { 171E0C791B8E5B84001E6242 = { CreatedOnToolsVersion = 7.0; - LastSwiftMigration = 0800; + LastSwiftMigration = 1020; }; }; }; buildConfigurationList = 171E0C751B8E5B84001E6242 /* Build configuration list for PBXProject "CandySearch" */; compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; + developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, @@ -174,18 +174,27 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -208,7 +217,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -221,18 +230,27 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -249,7 +267,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; @@ -266,7 +284,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.razeware.CandySearch; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; }; name = Debug; }; @@ -278,7 +296,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.razeware.CandySearch; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; }; name = Release; }; diff --git a/Project 06 - CandySearch/CandySearch.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Project 06 - CandySearch/CandySearch.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/Project 06 - CandySearch/CandySearch.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Project 06 - CandySearch/CandySearch.xcodeproj/project.xcworkspace/xcuserdata/Yi.xcuserdatad/UserInterfaceState.xcuserstate b/Project 06 - CandySearch/CandySearch.xcodeproj/project.xcworkspace/xcuserdata/Yi.xcuserdatad/UserInterfaceState.xcuserstate index 286c2c1a..1a5c5ec6 100644 Binary files a/Project 06 - CandySearch/CandySearch.xcodeproj/project.xcworkspace/xcuserdata/Yi.xcuserdatad/UserInterfaceState.xcuserstate and b/Project 06 - CandySearch/CandySearch.xcodeproj/project.xcworkspace/xcuserdata/Yi.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/Project 06 - CandySearch/CandySearch.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/CandySearch.xcscheme b/Project 06 - CandySearch/CandySearch.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/CandySearch.xcscheme index 2d87faee..1b08d2cf 100644 --- a/Project 06 - CandySearch/CandySearch.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/CandySearch.xcscheme +++ b/Project 06 - CandySearch/CandySearch.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/CandySearch.xcscheme @@ -1,6 +1,6 @@ Bool { + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch. let splitViewController = window!.rootViewController as! UISplitViewController let navigationController = splitViewController.viewControllers[splitViewController.viewControllers.count-1] as! UINavigationController diff --git a/Project 06 - CandySearch/CandySearch/MasterViewController.swift b/Project 06 - CandySearch/CandySearch/MasterViewController.swift index 9a9af816..79d5ea27 100644 --- a/Project 06 - CandySearch/CandySearch/MasterViewController.swift +++ b/Project 06 - CandySearch/CandySearch/MasterViewController.swift @@ -59,18 +59,27 @@ class MasterViewController: UITableViewController { searchController.searchResultsUpdater = self searchController.dimsBackgroundDuringPresentation = false definesPresentationContext = true - tableView.tableHeaderView = searchController.searchBar searchController.searchBar.scopeButtonTitles = ["All", "Chocolate", "Hard", "Other"] searchController.searchBar.delegate = self + if #available(iOS 11, *) { + self.navigationItem.searchController = searchController + self.navigationItem.searchController?.isActive = true + self.navigationItem.hidesSearchBarWhenScrolling = false + } else { + tableView.tableHeaderView = searchController.searchBar + } } func filterContentForSearchText(_ searchText: String, scope: String = "All") { - filteredCandies = candies.filter { candy in - let categoryMatch = (scope == "All") || (candy.category == scope) - return categoryMatch && candy.name.lowercased().contains(searchText.lowercased()) - } - - tableView.reloadData() + filteredCandies = candies.filter { candy in + if !(candy.category == scope) && scope != "All" { + return false + } + + return candy.name.lowercased().contains(searchText.lowercased()) || searchText == "" + } + + tableView.reloadData() } override func viewWillAppear(_ animated: Bool) { @@ -88,7 +97,7 @@ class MasterViewController: UITableViewController { } override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - if searchController.isActive && searchController.searchBar.text != "" { + if searchController.isActive { return filteredCandies.count } return candies.count @@ -98,7 +107,7 @@ class MasterViewController: UITableViewController { let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) let candy: Candy - if searchController.isActive && searchController.searchBar.text != "" { + if searchController.isActive { candy = filteredCandies[(indexPath as NSIndexPath).row] } else { candy = candies[(indexPath as NSIndexPath).row] @@ -113,7 +122,7 @@ class MasterViewController: UITableViewController { if segue.identifier == "showDetail" { if let indexPath = tableView.indexPathForSelectedRow { let candy: Candy - if searchController.isActive && searchController.searchBar.text != "" { + if searchController.isActive { candy = filteredCandies[(indexPath as NSIndexPath).row] } else { candy = candies[(indexPath as NSIndexPath).row] diff --git a/Project 07 - PokedexGo/Podfile b/Project 07 - PokedexGo/Podfile index 7dfce12e..0a95938e 100644 --- a/Project 07 - PokedexGo/Podfile +++ b/Project 07 - PokedexGo/Podfile @@ -4,7 +4,7 @@ target 'PokedexGo' do # Comment the next line if you're not using Swift and don't want to use dynamic frameworks use_frameworks! - pod 'RxSwift', '~> 3.0.0-beta.1' - pod 'RxCocoa', '~> 3.0.0-beta.1' + pod 'RxSwift', '~> 3.0.0' + pod 'RxCocoa', '~> 3.0.0' end diff --git a/Project 07 - PokedexGo/Podfile.lock b/Project 07 - PokedexGo/Podfile.lock index 472ea3ac..84b82015 100644 --- a/Project 07 - PokedexGo/Podfile.lock +++ b/Project 07 - PokedexGo/Podfile.lock @@ -1,16 +1,16 @@ PODS: - - RxCocoa (3.0.0-beta.1): - - RxSwift (~> 3.0.0-beta.1) - - RxSwift (3.0.0-beta.1) + - RxCocoa (3.0.1): + - RxSwift (~> 3.0) + - RxSwift (3.0.1) DEPENDENCIES: - - RxCocoa (~> 3.0.0-beta.1) - - RxSwift (~> 3.0.0-beta.1) + - RxCocoa (~> 3.0.0) + - RxSwift (~> 3.0.0) SPEC CHECKSUMS: - RxCocoa: 8cecf331302b8ae5381bbab1bccba4ede2eae6a8 - RxSwift: 0823e8d7969c23bfa9ddfb2afa4881e424a1a710 + RxCocoa: 15a52fc590dcc700cb4a690a633b5c5184ce3a78 + RxSwift: af5680055c4ad04480189c52d28385b1029493a6 -PODFILE CHECKSUM: 31520e96dfb6135d161b1a6bb218b7c0ec40fe04 +PODFILE CHECKSUM: a0a772563440e97813d5a19acc777d48b93573ca -COCOAPODS: 1.1.0.beta.2 +COCOAPODS: 1.2.0.beta.1 diff --git a/Project 07 - PokedexGo/Pods/Manifest.lock b/Project 07 - PokedexGo/Pods/Manifest.lock index 472ea3ac..84b82015 100644 --- a/Project 07 - PokedexGo/Pods/Manifest.lock +++ b/Project 07 - PokedexGo/Pods/Manifest.lock @@ -1,16 +1,16 @@ PODS: - - RxCocoa (3.0.0-beta.1): - - RxSwift (~> 3.0.0-beta.1) - - RxSwift (3.0.0-beta.1) + - RxCocoa (3.0.1): + - RxSwift (~> 3.0) + - RxSwift (3.0.1) DEPENDENCIES: - - RxCocoa (~> 3.0.0-beta.1) - - RxSwift (~> 3.0.0-beta.1) + - RxCocoa (~> 3.0.0) + - RxSwift (~> 3.0.0) SPEC CHECKSUMS: - RxCocoa: 8cecf331302b8ae5381bbab1bccba4ede2eae6a8 - RxSwift: 0823e8d7969c23bfa9ddfb2afa4881e424a1a710 + RxCocoa: 15a52fc590dcc700cb4a690a633b5c5184ce3a78 + RxSwift: af5680055c4ad04480189c52d28385b1029493a6 -PODFILE CHECKSUM: 31520e96dfb6135d161b1a6bb218b7c0ec40fe04 +PODFILE CHECKSUM: a0a772563440e97813d5a19acc777d48b93573ca -COCOAPODS: 1.1.0.beta.2 +COCOAPODS: 1.2.0.beta.1 diff --git a/Project 07 - PokedexGo/Pods/Pods.xcodeproj/project.pbxproj b/Project 07 - PokedexGo/Pods/Pods.xcodeproj/project.pbxproj index b22889e7..78276a94 100644 --- a/Project 07 - PokedexGo/Pods/Pods.xcodeproj/project.pbxproj +++ b/Project 07 - PokedexGo/Pods/Pods.xcodeproj/project.pbxproj @@ -7,575 +7,594 @@ objects = { /* Begin PBXBuildFile section */ - 000B063FD301679731F8FFF30B6E5733 /* Observable+Creation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E76C507568E7ADA82A3ED8A726F5358 /* Observable+Creation.swift */; }; - 0226A0AEE44C36AF973682CB4E1F7AA8 /* DelegateProxyType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4ECD634CA1C212F31539A5E94F027EEB /* DelegateProxyType.swift */; }; - 023ACADEFB83DF1D3C198C428DCF38AA /* _RXObjCRuntime.m in Sources */ = {isa = PBXBuildFile; fileRef = 67A7308A253850F00B05819855D27377 /* _RXObjCRuntime.m */; }; - 02ED9C39332CDA21BC1ABB82D3C0CBD0 /* String+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 875AD7325E306F32D856D41E705AFBE8 /* String+Rx.swift */; }; - 02EEDEC0A12BC1A14F24D1B4CC20313C /* NSObject+Rx+RawRepresentable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F73756FE68B6364B365C9083D70B121 /* NSObject+Rx+RawRepresentable.swift */; }; - 03349F7DB26471557DBA3BEC6AD66AA7 /* NopDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 923D369B7E87DEBE70A5D19C80932394 /* NopDisposable.swift */; }; - 038E7D217E8AF9B056F12B6022607BAC /* ObservableType+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEA91F7AF9BF7F6119E6D1CFBA138B64 /* ObservableType+Extensions.swift */; }; - 05375DD8BA8B0C62D6BD5CB8136C23F2 /* CombineLatest+CollectionType.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA042F18C4D096E30CA6636B17CEC3C4 /* CombineLatest+CollectionType.swift */; }; - 060BB7EDFED8C8F38EAB1C75419A6984 /* UILabel+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 601AE0DC6A3E86F516609C6D06CB60E2 /* UILabel+Rx.swift */; }; - 065CB7E7FCD725744876B59BBCDA7173 /* Using.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58AB0072B17C75AB1A21ECC38A91ACA1 /* Using.swift */; }; - 067820A308D5CCAAA9EF50952578CD61 /* HistoricalSchedulerTimeConverter.swift in Sources */ = {isa = PBXBuildFile; fileRef = F122B20E85DCC0A43C1773DA9A43FD01 /* HistoricalSchedulerTimeConverter.swift */; }; - 0738F0FAE4360B87C55BFCA3BCC1B30B /* Observable+Time.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5496796606D494C97794B6F90DF06136 /* Observable+Time.swift */; }; - 0923FCEEF2D4FCADE1727D61D99BDF05 /* ObservableType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 80671F727A9868EBE4018ED741F933D5 /* ObservableType.swift */; }; - 099DA1BDFD5892901146348B998D3D66 /* Lock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 974451D2E3E510B8E8A63654E04ACDD5 /* Lock.swift */; }; - 0BFAFB96C3AAACEDF809C2C85EEE7D9B /* LockOwnerType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 78D9CB1DCF4A368A286D9D843A1A4000 /* LockOwnerType.swift */; }; - 0C5587DCDD5C7DBB42B0B8A02882B368 /* UIAlertAction+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = B323F07EDFADF3FA093F86A088170A96 /* UIAlertAction+Rx.swift */; }; - 0EC4CEF1E3132FB1AEB0D781818D6D6D /* BinaryDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6E3FBE0F1D7C28F9585CE363E110E1E /* BinaryDisposable.swift */; }; - 0FD76A04CAC5537F85A14A05E41B7AF1 /* Sample.swift in Sources */ = {isa = PBXBuildFile; fileRef = C7771C5D99A775DA150DF545D573C1EF /* Sample.swift */; }; - 1032B74EC7A00AF022076C108643AD7E /* UIScrollView+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = E68FEF97896DC2C7B815D611FE2A2997 /* UIScrollView+Rx.swift */; }; - 10530B2996D799370BF1D002D3EA9286 /* RxCollectionViewDataSourceProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F48A7A2FF100CA7C630D332D34B7F3D /* RxCollectionViewDataSourceProxy.swift */; }; - 1083539F27F8C4A38F263A9655B3EB6B /* Skip.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E3556A091491F30496F2E31FD3DCCAF /* Skip.swift */; }; - 10E959E45D4D428635056928219C5475 /* MessageSentObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = C24EA368C4E55B5D1ADDAFB78767AB90 /* MessageSentObserver.swift */; }; - 114AF7633716B810F80CD33CC340B909 /* KVORepresentable+CoreGraphics.swift in Sources */ = {isa = PBXBuildFile; fileRef = 763DCEB0D5A66E991CC1B858DDC91E5F /* KVORepresentable+CoreGraphics.swift */; }; - 11C6D2B3912E2C8D012A347429216A97 /* TakeUntil.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3EA8D80D27873339FD839408A4206D3 /* TakeUntil.swift */; }; - 121D0412D6ED7B71C1AAC420CC31DE0A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 75BB3296A6C3E9773C545F0323C2659E /* Foundation.framework */; }; - 12CB5D267916999E0DCE991355A51F49 /* CompositeDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C919C040B85DF8BA3198306E66C6217 /* CompositeDisposable.swift */; }; - 139F2DDB3C00644885AC74E0DC7D69D8 /* CombineLatest+arity.swift in Sources */ = {isa = PBXBuildFile; fileRef = C012DED32C78F3BC4893FBB11ADB1866 /* CombineLatest+arity.swift */; }; - 13A3A6073FA3C3C35FB71D7F068CD495 /* ObserveOn.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02811E0858D470F34B739A6BFD2056F3 /* ObserveOn.swift */; }; - 14928CC74400DA81629E25E7E5AB08AF /* UISlider+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 438E2DC43570497DBE921AEB89518230 /* UISlider+Rx.swift */; }; - 1591B5BD6CA1678FD501EF69D85EDB22 /* UIPageControl+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF298074EB8EE70D6C90A0F816301B1B /* UIPageControl+Rx.swift */; }; - 159E21E449E35A0B0AD11826D1C2E911 /* TextInput.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14BF84797953369156C57EB5452EBF9E /* TextInput.swift */; }; - 1FA72CFE5EA8AD4AF5B50822AD02DE32 /* Logging.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63DA3DD4CA65031F9D6C2404057153C5 /* Logging.swift */; }; - 21E47814734174E5577E9B6E489DB2EB /* Throttle.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4E71A7E8F33A5D0D3B543950D968DCC /* Throttle.swift */; }; - 2469ABD273088B429C3D2D5F81F3F754 /* RefCount.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E41312BC41502D9EC683B790A5DEC59 /* RefCount.swift */; }; - 250B4E7CF26413EF2FB28815B1B62C3B /* WithLatestFrom.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00ED64DA988B533B84EB169AFCED363E /* WithLatestFrom.swift */; }; - 2546F9E0F230393F3116C65D708CD339 /* RxTextViewDelegateProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD2637FEE9AF1F14498DE84B56DAC41F /* RxTextViewDelegateProxy.swift */; }; - 258DDC4D40D56198DBAA5750B20167D5 /* Observable+Debug.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3777004EB16505CA6386B7D9FDBD7ED7 /* Observable+Debug.swift */; }; - 26381F45E3C7A769E893500A9185B214 /* ConcurrentMainScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0B365A38BCEEABC88B67EA39D80A861F /* ConcurrentMainScheduler.swift */; }; - 264DB6CCFB81FD481F9505279EDCCAAD /* ScheduledItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 383F17D9EBD7C4F32343FBA6C5743F68 /* ScheduledItem.swift */; }; - 26C95DD0018660F8458E31B0CB1A671E /* ControlProperty.swift in Sources */ = {isa = PBXBuildFile; fileRef = 360DB4FE725B14D1B4A919CAE6C07BD0 /* ControlProperty.swift */; }; - 27B825CB7B26AA4455DE2DB1EBAE68D4 /* UIRefreshControl+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = C04FFC0F79AC98E453AA5ECC691D397A /* UIRefreshControl+Rx.swift */; }; - 29EC70D2CA454BE2052C9EC3CB904FEA /* NSTextStorage+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E727D5CC6EEBE70CCC6502058E01F37 /* NSTextStorage+Rx.swift */; }; - 2A1C6A8E7B0DB05623F91821D3988FC8 /* _RXKVOObserver.h in Headers */ = {isa = PBXBuildFile; fileRef = A63EFF26965AFE7FFE18E68C039E6555 /* _RXKVOObserver.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 2DE2638032226CA289337A10058BA8CC /* ScheduledItemType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3193F1228BF29C5E2A301B4B72B7980E /* ScheduledItemType.swift */; }; - 2F1A3059466F0A841A3254B0DBD8BACD /* Observable+Bind.swift in Sources */ = {isa = PBXBuildFile; fileRef = C2FFC8DFE23B2D54E75C8888A95AA6C1 /* Observable+Bind.swift */; }; - 2FE6A5B69FF76C6573D8C9B8D8EB5789 /* RecursiveScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE6847941FEFEBAD130A00A342EB2462 /* RecursiveScheduler.swift */; }; - 31673C97F052AF47444F89EFEE80403F /* UISegmentedControl+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7D320004447B001CBF0382B778DA6BEB /* UISegmentedControl+Rx.swift */; }; - 32FA55C677F991160DE3F2658E843217 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 75BB3296A6C3E9773C545F0323C2659E /* Foundation.framework */; }; - 3484D496EC5F2E7A300319F44A5710CF /* AnonymousDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59CA3C0ABB91378BF6FE484D94481D88 /* AnonymousDisposable.swift */; }; - 39090DBB52FF620EAD0813499C55F238 /* VirtualTimeConverterType.swift in Sources */ = {isa = PBXBuildFile; fileRef = C642634FB859E1CBD5D098944AA629E7 /* VirtualTimeConverterType.swift */; }; - 3AEF12CACDD31E3E49F34D33372F4D1A /* SubjectType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52CCD0DF27D758124EE0BE12C033A336 /* SubjectType.swift */; }; - 3B34B15249AE1BD1BE4187FAC9873EA6 /* Just.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24EDBAF23688A76BA859735A2C8F3194 /* Just.swift */; }; - 3B8F5148F9F09D670822F3C34B58D871 /* Never.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B5D4368EAAEDBE617887F4EFB6EB0FB /* Never.swift */; }; - 3DA26A5A37F9D76BD7F425906B08A561 /* ReplaySubject.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58ECDE291B6C4966870B10DAAAC54753 /* ReplaySubject.swift */; }; - 3E0A23FB1C4EECC5DD016E55E4F8EC5C /* UITabBarItem+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1186161B975100A7DFC409B8C396D8B0 /* UITabBarItem+Rx.swift */; }; - 402E8D815B06D252DD6E6D527FB031A1 /* RxSwift-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = DE59B946AC888EB09684FEE661093D15 /* RxSwift-dummy.m */; }; - 410081D0FC3368E5FEEE568AC262BF63 /* SingleAsync.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD760FDEF3325452D1956E31DA16DF94 /* SingleAsync.swift */; }; - 4210F63FDD2369A54E4142B218F2D716 /* RxCocoa.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A47F6ED70808C18751C82FE05C97E84 /* RxCocoa.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 4270933FB3F4B96E628CE1FA13A10F2B /* DelegateProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9E7251AB28157263C195FC6E7D0D6A8 /* DelegateProxy.swift */; }; - 4354A4AB284D5CB7F60170EC9AA45C56 /* SynchronizedDisposeType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 815BE4D54328DCCC3EC688E99D515B84 /* SynchronizedDisposeType.swift */; }; - 43577F0B35EDE5C8CAD3985C85AED6BB /* ObserverType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 93307CD2F54897156D970EBDF97FA4F6 /* ObserverType.swift */; }; - 43D6ACABD794D862A6E86F6B52868B55 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 75BB3296A6C3E9773C545F0323C2659E /* Foundation.framework */; }; - 44FC239A0596D8DF873A3335E9CB9D54 /* UISwitch+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = D39FA6AC4938B92E4C0E1C3BFA0BBC38 /* UISwitch+Rx.swift */; }; - 478243AB17606EA714C45C1C745968D6 /* RxTabBarDelegateProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47C615A0C1C7CB0D93B1B59AAE7AE2FF /* RxTabBarDelegateProxy.swift */; }; - 49DEE03177E6DC81647C32BE0D3FAAEB /* SubscriptionDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = E42385DC3EDBFE2B12B9925A28D2F600 /* SubscriptionDisposable.swift */; }; - 4A6969C2FF43B8F29467829DA857ED58 /* ControlTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4742034066CBC30A03A7231BA909C2B8 /* ControlTarget.swift */; }; - 4BC7122279FAA452B5FFFF73BD3EAE9F /* RxCocoa-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = E14999237B0ADBAEE8885532CFF4C230 /* RxCocoa-dummy.m */; }; - 4EDE709A8D80B39DAFF8E8AAE8FDF7D2 /* Concat.swift in Sources */ = {isa = PBXBuildFile; fileRef = E7437F81B9A645215265A83BA900C24E /* Concat.swift */; }; - 526F658B2DFB22E2B897D95CAB61459A /* Delay.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC1D5F202F14E89C94DC8C8E9D3F2C35 /* Delay.swift */; }; - 5302D92F05F8E1F5DD28E2F733B89A3E /* _RX.h in Headers */ = {isa = PBXBuildFile; fileRef = 5912F2821234C2DC94784AB7BA0E7F3E /* _RX.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 54C485DCB6BA1622B49FC3089DEBFBC1 /* Producer.swift in Sources */ = {isa = PBXBuildFile; fileRef = EDE391691D8B5DF2142BD6D8E5BED61C /* Producer.swift */; }; - 562385BF0FC589222A183666DCDA5400 /* Error.swift in Sources */ = {isa = PBXBuildFile; fileRef = D402D1E02B23CC1DAFF711945E6C7C01 /* Error.swift */; }; - 568B2FF1D4BEF3605B4738BB5024D2E8 /* Driver+Operators.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B14971A9FD6B467BD6C09B2379A9395 /* Driver+Operators.swift */; }; - 585C95DBEFB469249E9EF27658647965 /* Platform.Darwin.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5BD593F3D0565668D7CC5990CE36818C /* Platform.Darwin.swift */; }; - 5ADA010E21F0DD0418EBF462DF0459EA /* Filter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 56D9D0405D1B795B6655805AC1CC4429 /* Filter.swift */; }; - 5BA6238EB2518E8DB7EA41BFB453F64C /* ShareReplay1.swift in Sources */ = {isa = PBXBuildFile; fileRef = EF811611BEC6E64AEDFA7326DDB269C6 /* ShareReplay1.swift */; }; - 5BEA1515F5BF10D217029C67551F19B3 /* RxTextStorageDelegateProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14C6018EB8ED3D2D4687001C575AFF19 /* RxTextStorageDelegateProxy.swift */; }; - 5BEAF300718433931253845E3ED3B29E /* UIBarButtonItem+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 322CA81233C08A654C0E044DCDC6F33D /* UIBarButtonItem+Rx.swift */; }; - 5D7EBAE24A93B4C36D704B7959A68D91 /* ObserveOnSerialDispatchQueue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9909A3B04F5BD9E0986A29DF4B5C9934 /* ObserveOnSerialDispatchQueue.swift */; }; - 5DA1DA267B7C6F0C6F0E740CA08B0ACF /* Disposables.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE7470DD24D55539FE38B33354609932 /* Disposables.swift */; }; - 5DF4F3950FC69C869DCD333388F9A2AC /* ConnectableObservableType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 614501176A095DC28303FD6091BAF437 /* ConnectableObservableType.swift */; }; - 5EE6A029304C5322AE71A0BAC6395DBB /* DistinctUntilChanged.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43FC3978A8C9F39C7800B21748B1C0EF /* DistinctUntilChanged.swift */; }; - 5F2D15A384B5E4A0FC6DE365D6D3574E /* Observable+StandardSequenceOperators.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3F95B7A11DFE661FB160F43DBA4B0B4 /* Observable+StandardSequenceOperators.swift */; }; - 5F65FAFF82D57FEE3D17D9D97006D914 /* Observable+Single.swift in Sources */ = {isa = PBXBuildFile; fileRef = F435E99579B5D417F9A5FFC0F7965B24 /* Observable+Single.swift */; }; - 5F847F03D5F09995DB0784844F330A21 /* Pods-PokedexGo-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 48AF5E6DB322F1C2C0209B854CE73993 /* Pods-PokedexGo-dummy.m */; }; - 61BEF0E4F3056C2AE5244886D9E8CD6A /* RxCollectionViewReactiveArrayDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = C7715463243BDD5175442CD871B06B2C /* RxCollectionViewReactiveArrayDataSource.swift */; }; - 62CC7CCAB23419773EA8F05FD1BF8F46 /* DispatchQueueSchedulerQOS.swift in Sources */ = {isa = PBXBuildFile; fileRef = 16BBBD04181474EAD0A97986ADBDE173 /* DispatchQueueSchedulerQOS.swift */; }; - 6416015FB86AEEED018CB78AAA46790E /* Driver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 69A4F803D759819D60EA7B093FEBBE3E /* Driver.swift */; }; - 64241BCF6445B010E2A1EB0670AA3D42 /* InvocableType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 86FF2384DCA4A4841ADF1FC2C0A9B331 /* InvocableType.swift */; }; - 654B482A8926A6C774C98664388658C5 /* UIApplication+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7CADEFCECC0EB186A12C0B291342D1CC /* UIApplication+Rx.swift */; }; - 65743D917885947A81777BAEE977C456 /* InfiniteSequence.swift in Sources */ = {isa = PBXBuildFile; fileRef = EBA62AF7E35D7F2AA1960DCF36A8A854 /* InfiniteSequence.swift */; }; - 66C957B4D0415A249E3EE833E4371994 /* Variable+Driver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5AF7610675E023203BE8EEE19C0F3F40 /* Variable+Driver.swift */; }; - 6942EB131AD4F0CCD6E5B60F88B8EDAB /* BehaviorSubject.swift in Sources */ = {isa = PBXBuildFile; fileRef = D4B00B3C6C7431F4D4550AD43C84F160 /* BehaviorSubject.swift */; }; - 6E6C0314350BCDE34E2BDC540FD6FFF2 /* Zip+arity.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7120F33703B8BB8862848546B1FD3393 /* Zip+arity.swift */; }; - 6ED51F4BFCEFBAD3C2AA38CB9293FEB2 /* DispatchQueueConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = C09A7A805374E513BC23516FE2414379 /* DispatchQueueConfiguration.swift */; }; - 6F07E168515898D6C8878BB88C50D72C /* RxSwift-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = EBA4D3419DA92747E9480E3892A0C2A1 /* RxSwift-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 6F4D85A44A7CA416C9F280D4B00D2597 /* Debunce.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B207B09ACA2B7C1A5955D4A670DF155 /* Debunce.swift */; }; - 6F95234234C5A7E07EB683381130F423 /* UITabBar+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9175FC6544DCDA825575330E821C7D3F /* UITabBar+Rx.swift */; }; - 7169C08262F574788CB29875468617EB /* SynchronizedOnType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 257340FD101A7D19D51F5261F0468333 /* SynchronizedOnType.swift */; }; - 718D7B7FB427D42DFDEA6FE094F36DCA /* UIViewController+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03A4D1610491EEC726F17C86B0EEADB0 /* UIViewController+Rx.swift */; }; - 71B42A3E2FB3C7F7CE0EAD2710F59C0A /* UITextView+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = E15CFC2139EC375288323D99AF8ED04F /* UITextView+Rx.swift */; }; - 7363ACC8A29B4B8D4F6804BC5929B3E8 /* RxCollectionViewDelegateProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73D332413223B3E4D33CDBF39A1C0F62 /* RxCollectionViewDelegateProxy.swift */; }; - 75E8D0BA3AE5FBDE9A73C4F68B61F9BF /* _RXDelegateProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = 0DE82875BF092ABF63F0129F1D66C342 /* _RXDelegateProxy.m */; }; - 76F654CD972132327C048291F268C8B0 /* KVORepresentable+Swift.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5D4B079C6BF22EB60FB4059831740F9A /* KVORepresentable+Swift.swift */; }; - 798D24B759179C918B3C181E9C7A99CB /* _RXKVOObserver.m in Sources */ = {isa = PBXBuildFile; fileRef = A070DEC2D90F2C3579F76D9FE69599F5 /* _RXKVOObserver.m */; }; - 79978C870BB6B31A0CF9B4B3DCC4FC0A /* Zip+CollectionType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F1518F3631A490DAC3F9FCF8B227E1D /* Zip+CollectionType.swift */; }; - 799A9FC2149DF784CABC966AE38308B0 /* Queue.swift in Sources */ = {isa = PBXBuildFile; fileRef = B58B58F4778B78D196858693A192BFEC /* Queue.swift */; }; - 7A0E20A7C149A126249CE2764497FF13 /* RxSearchBarDelegateProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0FAFF56A663DBECFB5CCB4D170959B3 /* RxSearchBarDelegateProxy.swift */; }; - 7A7CFAEEC2DCD04B97FDD4C24DAE8146 /* ControlEvent+Driver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C948102FFA85AF99FA4BDC4B31CEF66 /* ControlEvent+Driver.swift */; }; - 7B711100E8EC1981415FBC7F63D0B7FD /* Reduce.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27AC0F00E0539EE6BB3CA625F08F2A21 /* Reduce.swift */; }; - 7BE874E302F827B41F0DA43B1DDE68DE /* RxTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = A6CAB229EDDF2297965B52C92A2B5A76 /* RxTarget.swift */; }; - 7BF138F0EA1C2F1B831531B5A6C0A64F /* SynchronizedSubscribeType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A1611E18D67AF94FDC0B20D1CAF3A5F /* SynchronizedSubscribeType.swift */; }; - 7C5493B6455831A091803F51972CDA8E /* Observable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 77092120A3A3512BD4BC7DD2BF7F07B5 /* Observable.swift */; }; - 7E748810A566B9CD0BD8AB40A667F929 /* Range.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAF80653BBA27BB38CCC9ADB1B8989F7 /* Range.swift */; }; - 7F0E8DBC543D0E81FE073E2E3F39FA09 /* Pods-PokedexGo-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = CD0C2708ACBC7809074D8DBFBAE2CF6F /* Pods-PokedexGo-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7F49FDF50F834786A24A1595D5C50718 /* MainScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 357DF1CCC5063151569BCAC8BF4E9C6D /* MainScheduler.swift */; }; - 7F8D3FAEA342967C3B01FA6564D516E8 /* RxImagePickerDelegateProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = F27D858F62ECFB1BA73D63121A6A8EF0 /* RxImagePickerDelegateProxy.swift */; }; - 7FAE419D4D86D5809B677DF91CD043E7 /* RxTableViewDataSourceProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 68902A22C3070C8404E89BEF8A6F5FE5 /* RxTableViewDataSourceProxy.swift */; }; - 80D411ABB47575CEC00B164415356439 /* InvocableScheduledItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = B19D13BC17648E846D58611097F395F6 /* InvocableScheduledItem.swift */; }; - 822B9B2D31DBEB3BC1470891BB9E346F /* ImmediateScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = DABE43FFA22A5DC6DB547C6A26CA3F12 /* ImmediateScheduler.swift */; }; - 827F5BFFA3091EB4E72B617586A8F1A5 /* Map.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45B87E1492D431B8BA1E5AEB616A1AB4 /* Map.swift */; }; - 82B80B81D224402623C4DB4E358D32E6 /* BooleanDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF7C0B8064B13EF1B178438E7E83C24F /* BooleanDisposable.swift */; }; - 842DAA3E11FE3F9528597D860F6DA6D6 /* DisposeBag.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F597BF92F8C72C9FD96C8DAE1655E9B /* DisposeBag.swift */; }; - 84814A43FA9B7B3B881073E583427380 /* Empty.swift in Sources */ = {isa = PBXBuildFile; fileRef = 67E42E4C26C38702416C0FA860FE4966 /* Empty.swift */; }; - 84E8EAFEAB5002513564F99F9C14C3C4 /* SingleAssignmentDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3ADEF916724C3CD33414826B3075629D /* SingleAssignmentDisposable.swift */; }; - 853B999E3BCE9F97DE3A615190A0C8A1 /* Observable+Aggregate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FE90752083D12290474BC5BAA176969 /* Observable+Aggregate.swift */; }; - 8692E98F7E2FB3C77B77CBA3FBA511FC /* DisposeBase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D2E6375EF514E682DD5E099DEEA3C10 /* DisposeBase.swift */; }; - 8963FB3DD4ED2AE1D2747CD27AB29F79 /* _RXObjCRuntime.h in Headers */ = {isa = PBXBuildFile; fileRef = 622E80E3BE45B199242F59CB43CB499B /* _RXObjCRuntime.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 898D45A6CB05AC31969F4ECBF4CB05AE /* RxScrollViewDelegateProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 67C395039E40CCBAAF192350C12B9B6A /* RxScrollViewDelegateProxy.swift */; }; - 8A7B6E452DF412F5A64E9ECD424D2F22 /* RxCollectionViewDataSourceType.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDDBDF06D1B6E91266A572AA103E794F /* RxCollectionViewDataSourceType.swift */; }; - 8B45821DCADB3F6BC24F3E2711C42E3B /* AsyncLock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 804BC3384434439D1B1A243BE02DAD4A /* AsyncLock.swift */; }; - 8B65BFC93E68DEB7F12D1B27FD57BC13 /* UINavigationItem+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58F525F5B278210733C9EFC92FFEE06C /* UINavigationItem+Rx.swift */; }; - 8C00CB51D3C776341791C661ACA57C2B /* UISearchBar+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4706890E176FBF3A8D3F02AC3051B9CC /* UISearchBar+Rx.swift */; }; - 8CE91102D2CE432063BA65003DCB7475 /* Zip.swift in Sources */ = {isa = PBXBuildFile; fileRef = F91980105679FB515A28F75DC6473584 /* Zip.swift */; }; - 8D18BFDA8A1C379934E7C76A0DBBAD79 /* AnonymousInvocable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4D0141EACF4F5D67D5961B4AA466A47 /* AnonymousInvocable.swift */; }; - 902D49F6915B5AA29CACDBDA87321FD3 /* Observable+Multiple.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A111DDC4C1EB87CD4BE69AB57654306 /* Observable+Multiple.swift */; }; - 9043847379ECC7C512BDC6B89C0030AE /* Bag.swift in Sources */ = {isa = PBXBuildFile; fileRef = EB11497F37FF7943862F286A1651D042 /* Bag.swift */; }; - 9095FFEE4A59CDC37E05F226E25C665A /* AnonymousObservable.swift in Sources */ = {isa = PBXBuildFile; fileRef = FDDC303D9A217476756CF5B9D1EBA5B7 /* AnonymousObservable.swift */; }; - 9244FC69DDCCA91D041F5EEAB590C29B /* TakeLast.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1EC5D0239E634C375CA320C1CA5F9FDF /* TakeLast.swift */; }; - 9325E91F0D5BCABEA1A221652D95AE53 /* Driver+Operators+arity.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0291CC41E092EBFDF54D42B02E6424D3 /* Driver+Operators+arity.swift */; }; - 936D423DA529913F7A96CD1EDE161446 /* SynchronizedUnsubscribeType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6FA875C719138BA80C24ECFC28FDBF53 /* SynchronizedUnsubscribeType.swift */; }; - 93987D0C6E16433D86D9DD338F07795A /* UIBindingObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D0291CEF66C870D5E9E719C0EA72C1B /* UIBindingObserver.swift */; }; - 9534FB6966E51DFA0116C5AD6422C026 /* UIGestureRecognizer+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C939E6C52D2B5B921536AB609A6DF9A /* UIGestureRecognizer+Rx.swift */; }; - 9B0C23910EF280F64DC2EC303FF903D0 /* DelaySubscription.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6709E98277C4B1371C21EEF7734944C /* DelaySubscription.swift */; }; - 9CBF604FF8CF14BD6DAD363F4BFE1AD5 /* ShareReplay1WhileConnected.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5FAF129F0D5E633DA019E3F6BD799E0B /* ShareReplay1WhileConnected.swift */; }; - 9D9AA21DCD5F437F30AF75A4DBC6C32D /* Do.swift in Sources */ = {isa = PBXBuildFile; fileRef = D6E65FFF0964AFA4A351C3DC3DCB3049 /* Do.swift */; }; - 9EEE7265F1B76348C5ED599076DCFFCD /* VirtualTimeScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = A45E326290449ED1728E999DE8CD3CE2 /* VirtualTimeScheduler.swift */; }; - 9F165611E7FC0E29356C3BC02956BEAF /* Timer.swift in Sources */ = {isa = PBXBuildFile; fileRef = A056920DC5F216195680972D62F4E985 /* Timer.swift */; }; - A057AE65C3CCA3CE2A6AA15A253D2450 /* Generate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8CD370C39CCD9BFAD67AB8BD32F90797 /* Generate.swift */; }; - A0B69A7A4559D8C3A628299126D263BD /* Switch.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E09E844F9BC7D5598D6EF366D27BCA9 /* Switch.swift */; }; - A10C76937225217C6056E552E03B230A /* RxSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 397ED6A120A7323FEFFD443352B8A3B8 /* RxSwift.framework */; }; - A2A95C5735862A712D566BEA75D200CE /* RefCountDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD661F853C0E03E91523D62109EFAE7E /* RefCountDisposable.swift */; }; - A2BC4F1279CFA1C735ECCA7125A70B2E /* NSNotificationCenter+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52AA199050F22DB9F9654B0E79A1B72D /* NSNotificationCenter+Rx.swift */; }; - A459DB9C44891DD97058C0C2499C96FB /* Platform.Linux.swift in Sources */ = {isa = PBXBuildFile; fileRef = 692544D6FE00282284D2344E91536B0F /* Platform.Linux.swift */; }; - A56C60396A7689818FA6D5D12B41FABB /* Sequence.swift in Sources */ = {isa = PBXBuildFile; fileRef = F231F1E47F983ACDA69EFC946613F57A /* Sequence.swift */; }; - A5FF9B1CEDB7FD51B137660A49B48565 /* NSObject+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 945831043EEFA936E358129A58ED1C11 /* NSObject+Rx.swift */; }; - A6AC25617FC2ED12F0A27CFD039AA3F1 /* NSObject+Rx+KVORepresentable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 363274368317697F561BB2ED8F6AB66A /* NSObject+Rx+KVORepresentable.swift */; }; - A6CE70378DC461284BC023DC93FCEEFA /* Window.swift in Sources */ = {isa = PBXBuildFile; fileRef = 40AAB2FCC33C7D3618DF8098E641D159 /* Window.swift */; }; - A70295D2F70FF80D9490A9AB377E0E2B /* PublishSubject.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E9940D9817166477856DE65094A6260 /* PublishSubject.swift */; }; - A76AD9032F03DA4799CE35D58DB5F8EA /* SchedulerType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83C0B77EBE2FB832EAE703B2C7CBC016 /* SchedulerType.swift */; }; - A86474A13C3C51C31371E82963801E42 /* UISearchController+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = C7CFFB1B95915EA0A6DEAC76D897C750 /* UISearchController+Rx.swift */; }; - AAF1D9A9C0EFD64F9F2C72CF446A58A6 /* Observable+Binding.swift in Sources */ = {isa = PBXBuildFile; fileRef = B26E3722D77F9BA616724AD27F4B8306 /* Observable+Binding.swift */; }; - AB5F231DEC1BD5467A23076BEFB7B9BA /* ConnectableObservable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32F23A0961AAA6C01A1397AD90EDA9AA /* ConnectableObservable.swift */; }; - AC2935ED54A42D1AEA1990451BE7734B /* ObservableConvertibleType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 15466AD4A01ACC05B816711C276C94B7 /* ObservableConvertibleType.swift */; }; - AC37CDEAC53525CFFECC9DC7B2E672A7 /* _RXDelegateProxy.h in Headers */ = {isa = PBXBuildFile; fileRef = 9AC9BD3FAF4ABFC987FFA707AB9FCB90 /* _RXDelegateProxy.h */; settings = {ATTRIBUTES = (Public, ); }; }; - AC67EBBE20EA95E7146E8A8FE1D3DFD7 /* ObservableConvertibleType+Driver.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC52A4B9B72983EFAAA1E64B54FCFB1C /* ObservableConvertibleType+Driver.swift */; }; - AD29D9597C9C927EB1B8F56CE5D38FF4 /* ControlProperty+Driver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 286DB0BF724E24E942AE4449F63394D1 /* ControlProperty+Driver.swift */; }; - AE65348724534E93B2F12589A22C1034 /* KVOObservable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 199CEC87F4AF077D9B4762389FF6570A /* KVOObservable.swift */; }; - B0CE7A0CB812B682E338EF2AD0EC3F42 /* RxTableViewReactiveArrayDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A3E07C7438E3C2F64512F819995155B /* RxTableViewReactiveArrayDataSource.swift */; }; - B15872FCE46CA6CF1DE4C47CD53BE6F3 /* SubscribeOn.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AED7DC8C3D8A832530DA381920BFB08 /* SubscribeOn.swift */; }; - B1E3FDBB4CC2D72ABE41FFAAF7397A6D /* Sink.swift in Sources */ = {isa = PBXBuildFile; fileRef = DF856C60360336D059EF8E28D4E2D337 /* Sink.swift */; }; - B1FB6E4AC5DDA34A5AA2A263D0AA75FF /* _RX.m in Sources */ = {isa = PBXBuildFile; fileRef = 1BD6B800FB60FC0B73E545E9998902FA /* _RX.m */; }; - B47060D878E1E37F85DCEDB36800C85C /* ToArray.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9CBA23DF232206FCB1D8C7619BBCF69 /* ToArray.swift */; }; - B4D7E64AD57C0D46B75EB92E32172892 /* Repeat.swift in Sources */ = {isa = PBXBuildFile; fileRef = 56CD2AB385BBA88DE1DE00A07B0CA260 /* Repeat.swift */; }; - BB619071AF0E86D7A5B22924D2142E6D /* HistoricalScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 60A3F4FA5EC0032B138E22C350C8571D /* HistoricalScheduler.swift */; }; - BBB15CC012D05C82D5338A8E23835850 /* Errors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 643BFED33D2FF050AB233EDE00E2796B /* Errors.swift */; }; - BBF577DD793C204677DA247DF29FE125 /* Timeout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F9CB9AD270F4ADB7C1CF43E412EFB8B /* Timeout.swift */; }; - BC0BC892C8CECA95BE8FA2436D0FBBDB /* OperationQueueScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E6D9A74A10BE89BAE9BD57C3C3EF0B5 /* OperationQueueScheduler.swift */; }; - BD83F0B46F36278289C9EEEF35191B7B /* Take.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4331958ADDFBB46E5D9FAAE5F90CFFCA /* Take.swift */; }; - BE34E1CAB4AF783460B78882BF8344F0 /* Observable+Concurrency.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0691E2AF4F4BC07A24EC93D184A3FDEB /* Observable+Concurrency.swift */; }; - BFF516A585EDECC462E0BB1A572C3D6A /* ScheduledDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1285CF0D4E016A4A056142FBCEC4BDB /* ScheduledDisposable.swift */; }; - C0631C19397001DC37B9D308F8110316 /* UITextField+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C4EF32E91A5BCD94FC3E346B25FA5E6 /* UITextField+Rx.swift */; }; - C2F7ED905D7C6A7C599451D158769447 /* ElementAt.swift in Sources */ = {isa = PBXBuildFile; fileRef = 659A04497CFF6C207849FC691F605817 /* ElementAt.swift */; }; - C4C426FCC9B13409E9EAB9596258AD24 /* StableCompositeDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1DD88DD612366A084B53815C8B8EC26 /* StableCompositeDisposable.swift */; }; - C5C304C12FCEFCE027BE90A90B026FBD /* RxPickerViewDelegateProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7154F41F690DF671B3D84AA233D0EF4F /* RxPickerViewDelegateProxy.swift */; }; - C6FDF37E3DD19B89482B19C6156F4590 /* RxSearchControllerDelegateProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32070195AC7FF295DC13483699433136 /* RxSearchControllerDelegateProxy.swift */; }; - C7AB004966EA8C686A1B82A576ECFE93 /* Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC83E68B8055E29D4512897B677B4A6E /* Rx.swift */; }; - C7EB0E6F0E403DBCF935D755AD0A3A89 /* UIImageView+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3355C93B63CA5FE5B47101DF7E77B25F /* UIImageView+Rx.swift */; }; - C803E2EEE84433D4E14F3145C688585C /* Driver+Subscription.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08999F9E91C67F502F2B31AB37B21F34 /* Driver+Subscription.swift */; }; - C8D30BE8CAFEA991769593EDABBFA3F5 /* SkipWhile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53EA419F2CBBC7553305D19102BB4686 /* SkipWhile.swift */; }; - CCE710FCE321C50437747CA48DFB550D /* RxTableViewDelegateProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6B71409803A083925CFBC4C15E50F28A /* RxTableViewDelegateProxy.swift */; }; - D1253B52A297F8C2EC822749D3578A1D /* KVOObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = EF62970ED89CFEB3578CE909A25AAAD7 /* KVOObserver.swift */; }; - D1BE7B3C706DC2904142838BAB01C9FA /* RetryWhen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B20CE34F081F11DCAF386BDBD06A858 /* RetryWhen.swift */; }; - D2DD8831B9B685F798DB590503187BBF /* UICollectionView+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48CC2FA6C0E67819D548633EB23EA5A1 /* UICollectionView+Rx.swift */; }; - D3FA548E4A33EA8679AFA023EEADEAA8 /* UIProgressView+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = CF31863D0607B6C66F28E0D629CCD337 /* UIProgressView+Rx.swift */; }; - D4A8376AE4BAE44614DC25EA4ACBE610 /* TakeWhile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E928C29A41850F7AC97548FE0213AF0 /* TakeWhile.swift */; }; - D4E5C3266245EEC495A4A7598146AC23 /* TailRecursiveSink.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F3B2427854E0EBD6D65C83D0820471B /* TailRecursiveSink.swift */; }; - D58DC4FD347A34D3524377C5F6CFC8E6 /* Amb.swift in Sources */ = {isa = PBXBuildFile; fileRef = D1DDC1727726DF2FBA676B44135BAD22 /* Amb.swift */; }; - D73D0168BE4DBFFCB4149A5C46B6C3F3 /* AnonymousObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3E6953D9F4B6EAC7C0C428E98BC2111 /* AnonymousObserver.swift */; }; - D7B9459FB76EC99338E8C900294F6D27 /* ControlEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1C16CDD1C24EF1E943954022D241AB1 /* ControlEvent.swift */; }; - D912ACF721DA79933899B1E5372716ED /* RxMutableBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51588A5611E67C994212A30648416D83 /* RxMutableBox.swift */; }; - D970DE2C185F97A198B7785855940664 /* RxCocoa.swift in Sources */ = {isa = PBXBuildFile; fileRef = F6DE40FA76E07D0387C2A2F07829B2D8 /* RxCocoa.swift */; }; - DB0E4476A1328740B85AF1C5A9DB649A /* Reactive.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35BCDAFC104DCC94AF1FE83D7487AA10 /* Reactive.swift */; }; - DC6EC6A53C277DF95A872F6C21744024 /* SchedulerServices+Emulation.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9D1250F3B0AF2AF712290A1D5F29022 /* SchedulerServices+Emulation.swift */; }; - DE41ADC85BDBD18D3660715B3731FA4F /* SerialDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = BEAE74107F4B28F464DC349437C5F181 /* SerialDisposable.swift */; }; - DE7B7B17930E25419A5FF8B5F2CA0686 /* NSLayoutConstraint+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB9FB80A2BE7A2D6D2CEBC2DA6C23241 /* NSLayoutConstraint+Rx.swift */; }; - DF02AD7321CB3A3DCC21ABCD8F699B20 /* Disposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6EB6106BD2433BD6C6302174B3572DF5 /* Disposable.swift */; }; - DFDE6995FAD0DAFBB4DCBD3C2F03C991 /* Cancelable.swift in Sources */ = {isa = PBXBuildFile; fileRef = D14F1E665D122388B423977C35B4E23C /* Cancelable.swift */; }; - E0020D79307C9C0603A63451915BEC3F /* Buffer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58F5BFFF06B17780F8789D51CED460B1 /* Buffer.swift */; }; - E003D58EBFEFCB2342B73D1429EA5691 /* UIView+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = D05B527152D8472611DE378D3CA32C5C /* UIView+Rx.swift */; }; - E018ACB5AB39E7A76183EF702F879E5E /* Catch.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3B4B0240401064916F34863D58160922 /* Catch.swift */; }; - E110CA5AA9DF7F7921382B26E776A1DE /* SectionedViewDataSourceType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8AD5AD248511D190A6E701665766BBDD /* SectionedViewDataSourceType.swift */; }; - E1B0183CCE4F47767FB7134A9E4B167C /* UIStepper+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5F4E301F50554D39406C9FFC72A4E37 /* UIStepper+Rx.swift */; }; - E526DE33BD7DF1D7384983EB3C0922AA /* AnyObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37B3D6613A18DC598DA7ABCA1D9CED33 /* AnyObserver.swift */; }; - E5F9E74AE2732FB04E0F2B83FDF979E9 /* DeallocObservable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F083B32C768C775786BB21ECF548208 /* DeallocObservable.swift */; }; - E60781387E03838FAF4376F5DBAA49C8 /* AddRef.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8CDB77694CD9C3932E642FFB98BD6507 /* AddRef.swift */; }; - E64EB054C5BC86969A52B038C7AB0DE1 /* RxTableViewDataSourceType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 07938BBC6989A110F1642C7C78A2A03A /* RxTableViewDataSourceType.swift */; }; - E6AEC992D0816418D9B16BA1F71DA944 /* ItemEvents.swift in Sources */ = {isa = PBXBuildFile; fileRef = 765B1BE6E4F79831A8A7224E12E11764 /* ItemEvents.swift */; }; - E7CBA70E9DB022D4BB1AE80E941342BC /* Debug.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D255DFA39931004E6FBAE8524E21D29 /* Debug.swift */; }; - E816355A0C00B33C263C008913E3C33D /* PriorityQueue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 023474758DA44A2BFAF627F30F635E6B /* PriorityQueue.swift */; }; - E942407C1EC578C56138EE876E94B219 /* Merge.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCD947C828DA82D599B109870F06B1FA /* Merge.swift */; }; - EAE88874696C2D88074A70271C8890DF /* UIControl+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E99330FCEF837CF0D351DB099579357 /* UIControl+Rx.swift */; }; - EB30D8D46F7ED6D7FE623FE4F43DF543 /* UIActivityIndicatorView+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 934E59DFC7BBF5FBC3A87F0CE7EA73C3 /* UIActivityIndicatorView+Rx.swift */; }; - EDCA0BFDCE78E404FF02B958DC257F6D /* StartWith.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2E6D3537ED14D45E6751B0AD3FEBCCA /* StartWith.swift */; }; - EE480903C0C190CB08FCFB2228F1563F /* ConcurrentDispatchQueueScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = EFF6F9B62AB6F4362CE23C73E7687DA9 /* ConcurrentDispatchQueueScheduler.swift */; }; - EEF0428CEA5E57201723EA7A976AEE53 /* UIPickerView+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B9F3F843F9671E9FD1952F33BCE7253 /* UIPickerView+Rx.swift */; }; - EF27EC21F4788A2C5683826659E39BF2 /* CombineLatest.swift in Sources */ = {isa = PBXBuildFile; fileRef = B23153EC62F1F9EA1CEB3C4F8B959BA6 /* CombineLatest.swift */; }; - F153A4BE3B383C99D7E5F24CE3B2E3C3 /* KVORepresentable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 366E4D0AB9A75F2A5712473C8D3EAE38 /* KVORepresentable.swift */; }; - F2EC2531D78764CE4516986208318567 /* ObserverBase.swift in Sources */ = {isa = PBXBuildFile; fileRef = F194F3656CC6F93A70571D3B8B010A40 /* ObserverBase.swift */; }; - F317E84799C431E809E84B37BE3B7132 /* SkipUntil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A58EC30FC7221C14AC9ACB41355285E /* SkipUntil.swift */; }; - F3B7A8258B85F1F2D521D80762EF9475 /* UIButton+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50DD92299AA92A6C6145174B972294EE /* UIButton+Rx.swift */; }; - F3E515690F406E9BD1AC7C6DF0D58AE5 /* Multicast.swift in Sources */ = {isa = PBXBuildFile; fileRef = A0D835DD2D2251EAB0B27F31CB72B341 /* Multicast.swift */; }; - F4535646B0A55879A1654F882D81C599 /* Deferred.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00053BD5230150E958799E47A48EA895 /* Deferred.swift */; }; - F6736CCAC15E8F96F162FBF35874A2A1 /* Scan.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D8B5E655F870573D98C16B1C6D1D89E /* Scan.swift */; }; - F7D64A5BD270F910BAD37A383C4870DF /* Event.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4EDF14B3F8E3980581A28E403F9D60F /* Event.swift */; }; - F82E6FC0DD274C938779B0A7D0F5B929 /* UIDatePicker+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2FE39B9E067C4AFC9544CBF93C985681 /* UIDatePicker+Rx.swift */; }; - F98E2131336DAD30F560EEC7DA762CF8 /* ImmediateSchedulerType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24189EB6F723B40C817F8408B893EB7B /* ImmediateSchedulerType.swift */; }; - FB716709367B7BA7ED37B0358A6F72BB /* UITableView+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59C8995F28CDF1F322C4DE32ED3DD05E /* UITableView+Rx.swift */; }; - FBB63CBC2A63B540B0AA1DA3DFC53C23 /* RxCocoa-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = E1C4AE2D0D182DAB04E7BC7722F8596B /* RxCocoa-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - FC19866931A6FA56F72616BAAA03ABA2 /* SerialDispatchQueueScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D7F8AC7906D8F3573813543E119E9C2 /* SerialDispatchQueueScheduler.swift */; }; - FC5248937A4EDF3CDB88810F7E1AA581 /* CurrentThreadScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = DF524EC65D9848AEED1A00F4EFB42E2A /* CurrentThreadScheduler.swift */; }; - FF077555B87FBF2DCF0468D215AC5D94 /* Variable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23966E1D2B24C6547A2B15D92C5671D0 /* Variable.swift */; }; - FF25F4E9276C786626D891B65EEA1E54 /* NSURLSession+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC4A87492F76B55135B5E95225CFE327 /* NSURLSession+Rx.swift */; }; + 000BB78BE73265E73FA8E67AAB060D9B /* RxCocoa.h in Headers */ = {isa = PBXBuildFile; fileRef = 87BC050FB87821C41A468209D2009104 /* RxCocoa.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 021F03CC102E3F7283E76D686B414011 /* RxTableViewDataSourceProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A6B4401BAE249952C98F64BBC95B2F2 /* RxTableViewDataSourceProxy.swift */; }; + 0383E4D8A2C2C9924F5CF0D2C646D60D /* SectionedViewDataSourceType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75ABE3C993505D8042AD462010472F26 /* SectionedViewDataSourceType.swift */; }; + 05C2B48F96C07F82511E666001B5FE47 /* ConcurrentDispatchQueueScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = F5C23F45A786EB4A2BD40E493EF53048 /* ConcurrentDispatchQueueScheduler.swift */; }; + 064ABF8291397CFE3E961D56D9238BFA /* Sequence.swift in Sources */ = {isa = PBXBuildFile; fileRef = 610DB064B05FCBD4916354840E5F3BB9 /* Sequence.swift */; }; + 07BA8B2610299686205DDCCB468FC0F6 /* SingleAssignmentDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F6F79C0E9CA7600FB215083C59C7A24 /* SingleAssignmentDisposable.swift */; }; + 07C2568F53ED8C6B08A1CA2D15A56F51 /* Disposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63A4ACA827648C32714CC30BD1C8ACFF /* Disposable.swift */; }; + 08BC583AC7D5B2CB1977896CBD6A6280 /* UIBindingObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 901947D2C0E18FFE2271B6FD7F73BB9A /* UIBindingObserver.swift */; }; + 09C7DE145B7D88971EE597EE4C0806FE /* Zip.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD7EED0AA031AA341A779500B334BD8A /* Zip.swift */; }; + 0A2A3E1539B4293B3BC2247FFBBCD572 /* _RXDelegateProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = 5C3EDF144FD709E2DDA039349EE33AFE /* _RXDelegateProxy.m */; }; + 0AF1F8216E9E91A6ACBDABA550AFBA03 /* RefCountDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 586104488AC56629FFE01E4729C93D2F /* RefCountDisposable.swift */; }; + 0C3C7020F10AB56539A4CD967E44E336 /* Disposables.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04627568BE8263B246C8542E44BEB84E /* Disposables.swift */; }; + 0FC07576E903FD7D08710B3B13AA8E04 /* Observable+Binding.swift in Sources */ = {isa = PBXBuildFile; fileRef = DAA446133815BDAB6DA48EA5D2B04EA7 /* Observable+Binding.swift */; }; + 10649A07433609593448F997B93A2D43 /* RxCollectionViewDataSourceProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05154EFEAF12E5BBAE9E13E095EDFAEA /* RxCollectionViewDataSourceProxy.swift */; }; + 1084A71F235AF15198D7515E937143A8 /* BehaviorSubject.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0DC7413C45CB819C77DBA74D1CE67334 /* BehaviorSubject.swift */; }; + 10A93C53F966AC5C47EF907A7F0BC704 /* Observable+Concurrency.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3DE5921D384D083F148002565A98CA7D /* Observable+Concurrency.swift */; }; + 129D651BFE1C326871BBDB3D0E1B7E19 /* SubscriptionDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EF39FC951C6CC263EDFD7124E057FCF /* SubscriptionDisposable.swift */; }; + 12C9843D7C50B3F5D662DCE99A2AF6DF /* UIButton+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBE355A845BA6A27C05F9442D9F089A2 /* UIButton+Rx.swift */; }; + 1346B85CAB24326BF8E5E56A6954AC93 /* Zip+arity.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35DBF02092FEBD822B83924EB54C422A /* Zip+arity.swift */; }; + 14452F1421140835B1A5466E3967A8CE /* UINavigationItem+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9CEFCBF2EC15CC86F7A0399EC348D23D /* UINavigationItem+Rx.swift */; }; + 14667FE180867DE13DEDD46D7F09B285 /* Throttle.swift in Sources */ = {isa = PBXBuildFile; fileRef = B29D89D8E6B5E4D8F0779ED978A0A8C5 /* Throttle.swift */; }; + 1576FC7D9496DF6373ADD504879C67B5 /* CombineLatest+arity.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58B871E4C2567F0F4779EF41BA4CEC0E /* CombineLatest+arity.swift */; }; + 1579E04D9661BF972D1C98FA0B5DC722 /* RxCollectionViewReactiveArrayDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE6EDEF18E45893ED7529E82BE61D19F /* RxCollectionViewReactiveArrayDataSource.swift */; }; + 16904F77708C5B0F20F0FCCA32BD31E9 /* ObservableType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30DFCE2B63D2C2FE3331E73B770B4903 /* ObservableType.swift */; }; + 172B7BFFF98FF4EBDD46CA46BA79BEF7 /* Timeout.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8D4D84407A974744557BF4FC86C0EA9 /* Timeout.swift */; }; + 1A1AE8136C2802D337B7120D661ADA17 /* TakeUntil.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A746282E628E8F2A9EB17EE33CD0C91 /* TakeUntil.swift */; }; + 1B90B20CE3E6AB0DC8F94293885A5BBF /* Platform.Linux.swift in Sources */ = {isa = PBXBuildFile; fileRef = F5F1CEA9B9E1814EFE1F235EC30A2E20 /* Platform.Linux.swift */; }; + 1D5FEDD333ED9BCF9C1DCD7ED4BD24C4 /* NSObject+Rx+KVORepresentable.swift in Sources */ = {isa = PBXBuildFile; fileRef = F47D6CBA7260571DF35B88A530815708 /* NSObject+Rx+KVORepresentable.swift */; }; + 1DE8724FC95C791AD47F6B885DF855F0 /* RxTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = F4879DF6BE30A70D84B8CD0F3EB6F87C /* RxTarget.swift */; }; + 1DEBDBAE98CCCF73742931B465A3D98B /* UIBarButtonItem+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B0EA98FA3B129968C423DB5EF0ABEF8 /* UIBarButtonItem+Rx.swift */; }; + 1F7D93BFD36480AC8A33333A7D936A33 /* Variable+SharedSequence.swift in Sources */ = {isa = PBXBuildFile; fileRef = A550F2813AC8DAA63F881EBF2D00ADF1 /* Variable+SharedSequence.swift */; }; + 23F552367F9F12149C16697309FA1528 /* _RXKVOObserver.h in Headers */ = {isa = PBXBuildFile; fileRef = C0DDE7EC5814AA6C8E13CA02A487C60F /* _RXKVOObserver.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 241D0F6C662A3991A43CF9B059E5FDC4 /* Bag.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBD99D2D368A3A8AFE7C5DA7E99FA61F /* Bag.swift */; }; + 24C4C1C4E196867335B31FAD70A91620 /* Pods-PokedexGo-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 48AF5E6DB322F1C2C0209B854CE73993 /* Pods-PokedexGo-dummy.m */; }; + 25860974D252E772F986A088D4C9053F /* UIScrollView+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = FCFB96B6EC2B0114D1FCE5362270E334 /* UIScrollView+Rx.swift */; }; + 25F0AB43C7575360296292D9BB64842D /* RxSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 397ED6A120A7323FEFFD443352B8A3B8 /* RxSwift.framework */; }; + 27CF960A8BA7BA8EF791CC060F81C1E7 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F4E6CE1422565F9D01918EE903F3772E /* Foundation.framework */; }; + 287C1FFD2C49BE2C49A16B8AD59E15C6 /* ControlProperty.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D0F791088E9C7CC17CC8E64A0BCF99D /* ControlProperty.swift */; }; + 29B16EB7250FD61AEDD066D0AEB359D9 /* Debug.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AB5988F61EF072B265241572954BDCF /* Debug.swift */; }; + 2A166D31F5542BA58657104BF3A2982D /* Observable+Multiple.swift in Sources */ = {isa = PBXBuildFile; fileRef = 864CE2D64C2CB6BAF14E112E648566F7 /* Observable+Multiple.swift */; }; + 2A477B3B0B9FB4231B48456AB5A3BC1D /* Platform.Linux.swift in Sources */ = {isa = PBXBuildFile; fileRef = FDB32327B68A41D415AC5BDAF953BD49 /* Platform.Linux.swift */; }; + 2AF03C41DF03B943B3B94C671C9D9AFD /* UIImageView+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 420ED71D6CB2021AB9A4176B03D0C320 /* UIImageView+Rx.swift */; }; + 2B004C68074139E480C4252B98B4C948 /* ElementAt.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1491FA56387C07FA701050A6BAB1217B /* ElementAt.swift */; }; + 2C0861DB041620D38C38F5A4491343CA /* UIView+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = EBFCF9BC4A552C0B77721F53808F4173 /* UIView+Rx.swift */; }; + 2C61F409436BDADA9DC4F3AE6095B83B /* _RXDelegateProxy.h in Headers */ = {isa = PBXBuildFile; fileRef = 1C5D30C37343EEFCC746F2C0DAE0E218 /* _RXDelegateProxy.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 2C66E75B76300F1C931A514421FF6D99 /* SerialDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 769CCB9780B036CB1F097BC2E027FD0F /* SerialDisposable.swift */; }; + 2D7384435B6637373A311D6901A9CB60 /* StartWith.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00243578A2429FC5E1FFE03292FAFF64 /* StartWith.swift */; }; + 2DC629C569D7275E0D6CD34ED9752B16 /* Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 796281A7F1F3D29CE27096717B6AE3F7 /* Rx.swift */; }; + 2E05A63DD51D9C9C9FA46BAE2C8E71C9 /* ControlEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = D7155FD418E3EC3A8C86E9E3BA0B79EF /* ControlEvent.swift */; }; + 2E11D6FCF111D03B708A65640DDC4ADF /* ObserveOnSerialDispatchQueue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29639B573EB1412C4230E3B09B9ECAC5 /* ObserveOnSerialDispatchQueue.swift */; }; + 325E76037DE7CBCD52DA4AEFC1ACB654 /* NSLayoutConstraint+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC21BF5E703ACB95DC96961494CE91A1 /* NSLayoutConstraint+Rx.swift */; }; + 33112944329971F27C0AAA50E34D6128 /* RxSearchControllerDelegateProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D3967211EDE74A259D45C68D0919CCD /* RxSearchControllerDelegateProxy.swift */; }; + 339086CD50565C77FA81089DBF7F8226 /* UIApplication+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5071B74B5041F60D8DAFC145DDADAB26 /* UIApplication+Rx.swift */; }; + 340C0536EEE1DAC84A49C73A61212813 /* Range.swift in Sources */ = {isa = PBXBuildFile; fileRef = A4FC7AAE283EB68E81E9D97FDF1162BB /* Range.swift */; }; + 353D56ABF6CB45B1C7964AD8B011C576 /* Observable+Single.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14F32DA16234790E73FEEB15D52896DA /* Observable+Single.swift */; }; + 3635855E261991611001B8F34AB61CBB /* _RX.h in Headers */ = {isa = PBXBuildFile; fileRef = 313763C6108D9C46316D32780D3A5ED1 /* _RX.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 39E7036C42C3E751AA0F53ADCFCDFD3C /* RxMutableBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B983B555CBEC50516E21B9835EBA92E /* RxMutableBox.swift */; }; + 3CE2FC3AF82CF03D3CD41D066F728ADF /* RxTableViewReactiveArrayDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D25AAE822F5498D26DE6953DC295481 /* RxTableViewReactiveArrayDataSource.swift */; }; + 3D69CC680C7E06ADEAFDBCB607713AD8 /* RxTableViewDataSourceType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48E7453369B45B5ED73A948623A3B1CD /* RxTableViewDataSourceType.swift */; }; + 3D9349C31A2B054BC382CA29015CAFF8 /* UIRefreshControl+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = C17B264E2D2E13B18D5DEFA475D436F4 /* UIRefreshControl+Rx.swift */; }; + 3D9C6FDE282B84AF9237FF7B99114663 /* Buffer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 532E8934BACCE9965E1B50AAD52DFB1C /* Buffer.swift */; }; + 3F586EE283532EDAABAF75439961D6ED /* HistoricalSchedulerTimeConverter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4610BE88BD9A69E7311E15CCA3C9C30D /* HistoricalSchedulerTimeConverter.swift */; }; + 3FC471D71E9182035347995A85DA4F3D /* RxCocoa-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 8F942E49DBEB13C498BFF44B05FBFF97 /* RxCocoa-dummy.m */; }; + 3FDDEE9E82EEADE6F95943B544A329D5 /* Using.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90897DE0AF5AED02A7EE2AC32B3E4F3B /* Using.swift */; }; + 408D29A066137BAAA90A78A012CD3C91 /* UIDatePicker+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2FAD8B62333EE46C5A33F9FE50E5918A /* UIDatePicker+Rx.swift */; }; + 4202EFAB59455AE74D9B1E6C9AB520BB /* SchedulerType.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3B1490DA3282F84E441342FFF586BFB /* SchedulerType.swift */; }; + 428629547475AF8293C1F7022581804B /* KVORepresentable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0949D3D804F8DA073BC481DA1ACA5DFE /* KVORepresentable.swift */; }; + 435C75AEE249942C6E9B7BE323CB52BD /* UISlider+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98B128798CB6E65617AC3DA66FE5C6FC /* UISlider+Rx.swift */; }; + 43D9DB2E6CC9E5A1985B19025A29D184 /* DelegateProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9E6D96B5553D499A43AC75B225DDA1B0 /* DelegateProxy.swift */; }; + 45293DF3ECBC150338C9AC23AF0B0609 /* DisposeBag.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9EDE28D1EE46BE33F7AD632B68E1E56A /* DisposeBag.swift */; }; + 463B3383D3134496D0D532AD9C6F5C6F /* ShareReplay1WhileConnected.swift in Sources */ = {isa = PBXBuildFile; fileRef = CF8BF315C6E2458176C75F8D0F0C4B9B /* ShareReplay1WhileConnected.swift */; }; + 467A45A5CBD7A8C257EE1C954540284E /* Delay.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30D2A54F9FD3E9B455E0BC2E62C15FA3 /* Delay.swift */; }; + 4871C259D8B4ED46266C0A8CCFBBB473 /* CompositeDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = F1C61FB2FCFAB4944005E3BAF9EEADC1 /* CompositeDisposable.swift */; }; + 48986E4E74B3F796261DBC6FF5839951 /* ObserverType.swift in Sources */ = {isa = PBXBuildFile; fileRef = E88037730944DBB5C828F0A95E996EA1 /* ObserverType.swift */; }; + 4A182820143401A8DA92E419DFE4A4BB /* UISwitch+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = DF6A14B15E0BEB5A7B777FEB4AE1B914 /* UISwitch+Rx.swift */; }; + 4A99A445C54B950702B8AF395618776B /* CombineLatest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 122E690AFB6AC805905FAC5D63EE4098 /* CombineLatest.swift */; }; + 4B136E06955AE58FB2476F824F7B341B /* ControlProperty+Driver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34CAF15FDB134CCB47A9BE558BA936CE /* ControlProperty+Driver.swift */; }; + 4BBF1CD267DDD66996B161F0B1B48B98 /* SkipUntil.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA37963CF786335E8A84A7085375C732 /* SkipUntil.swift */; }; + 4BEB0D2BB14D3E01EF142F82C9DDFC7B /* Event.swift in Sources */ = {isa = PBXBuildFile; fileRef = CAFA3361761013BBC637D1DBBBFF0726 /* Event.swift */; }; + 4CC9B3F615375E6A51B543CD3DF2E55E /* Do.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26CF7CCE8663939B828C53DF2B9BA2B4 /* Do.swift */; }; + 4CEE20D554A8B09D045F3E480CA3DD47 /* ControlTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 13E02371A6891FF6803B48F80CEB4A26 /* ControlTarget.swift */; }; + 4DAAC12BAA13E8509170E5146770BB28 /* LockOwnerType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C2907A619D445EBAC4FE4C582FFBFC6 /* LockOwnerType.swift */; }; + 4EBF1EB98F7D5EFCDDA461543814097A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F4E6CE1422565F9D01918EE903F3772E /* Foundation.framework */; }; + 4FCB88884951824DFAA64E759DABB9BC /* UITextField+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4488DC730219AA10C54CA340A3D5E405 /* UITextField+Rx.swift */; }; + 518963F1BF2447CB199C044BBF6004C6 /* SchedulerServices+Emulation.swift in Sources */ = {isa = PBXBuildFile; fileRef = E37AD316312C2037DAE0A3063683AA3A /* SchedulerServices+Emulation.swift */; }; + 524E9615DCAB7C2F76E33B84668C7372 /* TextInput.swift in Sources */ = {isa = PBXBuildFile; fileRef = 054F1DF36495EC9708AF0BFF1889B1B1 /* TextInput.swift */; }; + 5316DAA30B39C49DCDA7EC5B7A715533 /* Platform.Darwin.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29B44F83E55B949CDDD1F0AFEAEC880E /* Platform.Darwin.swift */; }; + 53B96D4F73D2A55B475D1DFE041FB50C /* Variable.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE16A12DC1A9C64C2730087402ABA7F4 /* Variable.swift */; }; + 5605DC169D11F66A44CD43EFC2E2D70B /* InvocableType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B619CE407B9403711BDFBAEE67207A9 /* InvocableType.swift */; }; + 57D5464BE825AB76759A09437D8AD4FA /* Bag+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 771BE5F88179512E7E55B1693BFDE338 /* Bag+Rx.swift */; }; + 59BE4366D2801AD5BA180CF437EDF32A /* ImmediateSchedulerType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 20184E13B8706FF2BEC9F6F5162F5287 /* ImmediateSchedulerType.swift */; }; + 5A11E733104FC70E013E6E27EF79D557 /* Observable+Bind.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3379A9C5DF632BB854582CE0439F9A48 /* Observable+Bind.swift */; }; + 5F16CFCB025D837C01C9B9BEEB65B81E /* AnonymousDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C48857A37E0B818288C17716A394120 /* AnonymousDisposable.swift */; }; + 603B785802BD341E287793B385D8763D /* Platform.Darwin.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0390599D2CE39A885EAF2242027BEDFB /* Platform.Darwin.swift */; }; + 60AF9D34182321D50BE60739EDEFDEBB /* WithLatestFrom.swift in Sources */ = {isa = PBXBuildFile; fileRef = E451C04B736566F48C34167C04D48251 /* WithLatestFrom.swift */; }; + 60C4522593BA7DADA33970F71B1FECB9 /* Producer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 516D56CA8911D20905D7832AE8C17587 /* Producer.swift */; }; + 60D48C9B7E5C80DAD307F4F287D83047 /* Bag.swift in Sources */ = {isa = PBXBuildFile; fileRef = 001721082AD1820BF14628A28649996E /* Bag.swift */; }; + 61400AADE7F027101B5CA629B3CE369C /* UIGestureRecognizer+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5329F8CBE02FC97E42D8E68A6440EDD3 /* UIGestureRecognizer+Rx.swift */; }; + 625ADF703FECA0E43978A031BADF5D48 /* Pods-PokedexGo-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = CD0C2708ACBC7809074D8DBFBAE2CF6F /* Pods-PokedexGo-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6470CAE016FF5FE6E6870ADE258250B8 /* ConnectableObservableType.swift in Sources */ = {isa = PBXBuildFile; fileRef = E50FF775C27E7F52C4BE67E387384E3D /* ConnectableObservableType.swift */; }; + 65BCCEEFE86506F966D67EDE583D1D9A /* ObserverBase.swift in Sources */ = {isa = PBXBuildFile; fileRef = E39BD822F4B90F9AAF1FA187CFD88D80 /* ObserverBase.swift */; }; + 666F856983371B01BEBBAF4440848E44 /* Variable+Driver.swift in Sources */ = {isa = PBXBuildFile; fileRef = F16765FC78C53140C4109BCCE206E88C /* Variable+Driver.swift */; }; + 67630EE9AE15DAB11D827E99583E7CBA /* UIViewController+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = FAFF1EF43696A19F3C0BA1A4B9629DFD /* UIViewController+Rx.swift */; }; + 69379C3A91EED16179E67B84640F58BD /* NSTextStorage+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C4D8309F4A7F25A8EC6FE8843F5CCC0 /* NSTextStorage+Rx.swift */; }; + 696454199FBCE2017184A47B1848318E /* RecursiveScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9ECCB50F74580AB2A9E02A3B96EF07BB /* RecursiveScheduler.swift */; }; + 6D1204F2C17D25FBD642EEF8EAD4B9AA /* Observable+Time.swift in Sources */ = {isa = PBXBuildFile; fileRef = E0BEBBB4958B7F4D65A5DA54FF0580E7 /* Observable+Time.swift */; }; + 6E385BB132724A37AA78D523E6773F69 /* RxTableViewDelegateProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58BB980A41382A481029292D36611E1F /* RxTableViewDelegateProxy.swift */; }; + 6FD69465008280047A400FCBC575B0FA /* RxSearchBarDelegateProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E36B0DA3408346FB92A93AB6C45E069 /* RxSearchBarDelegateProxy.swift */; }; + 725767C408C8475FD46184A92160B63F /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F4E6CE1422565F9D01918EE903F3772E /* Foundation.framework */; }; + 72C0F0BFD26DF413287E7C2D9EF2AC2A /* SharedSequence.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95BDAA537E0F690A0B8FED31611B5D85 /* SharedSequence.swift */; }; + 74B86089474801570A75A89A63E33073 /* Skip.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87FCD9ED2C7E8DF83D4C84940FF4D5D5 /* Skip.swift */; }; + 756AEEF4CF2F709810B050B97889CC3E /* SharedSequence+Operators.swift in Sources */ = {isa = PBXBuildFile; fileRef = 313873C00506CBE738D855EED5608303 /* SharedSequence+Operators.swift */; }; + 77566600D46D25410ED8911CF00A67ED /* AddRef.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9466E765E5E6CE61C67AC9380B9DB093 /* AddRef.swift */; }; + 77C182D0C24A813074A53AE5E1632356 /* _RX.m in Sources */ = {isa = PBXBuildFile; fileRef = 782FC7557C91148E434A34BB30E17340 /* _RX.m */; }; + 78BD7AA53EFFC1B1E6FA8E7904091BD4 /* KVORepresentable+Swift.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC8CD3A95BB52F3F626088379FCBECE6 /* KVORepresentable+Swift.swift */; }; + 78DDE64BDA461DDD99164B6F57B7A6B1 /* UIControl+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = E474A1E0AB9BFBD84BC89E665507E060 /* UIControl+Rx.swift */; }; + 79110C3D44003087AF3A6F50F33B4A25 /* VirtualTimeConverterType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46529E285EEFBC21FADDCE1616A0D778 /* VirtualTimeConverterType.swift */; }; + 7A5531D8F6637F601A458D558873F321 /* RxTabBarDelegateProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F8D42C676712C383D2B710A1F35C6F7 /* RxTabBarDelegateProxy.swift */; }; + 7B4A012AB83EA24B0109584FA3E412CD /* UIAlertAction+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = A2679310F5C1EFC93514C61E7D4946C9 /* UIAlertAction+Rx.swift */; }; + 7E4578403AF9E519B2F5E8C8F22FA7B7 /* Timer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AE6BC71DAEFE73CEC12110AAF4933D0 /* Timer.swift */; }; + 7E52A9625C18CA8C1BE5B25DFCE3799A /* AnonymousInvocable.swift in Sources */ = {isa = PBXBuildFile; fileRef = DFA5AFEC44A99D12BF2AAB9FF9B30CD0 /* AnonymousInvocable.swift */; }; + 821413DA27D4C52186989ACF6F4CAAEB /* ImmediateScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCBD161681343C2F0E2EDA6686257063 /* ImmediateScheduler.swift */; }; + 822C8B28E86F2C841327CA3376FE78B3 /* Observable+Creation.swift in Sources */ = {isa = PBXBuildFile; fileRef = F1DEE4224C3135D5E03DE40DC0095DCB /* Observable+Creation.swift */; }; + 825D11BB5580546AD789880EAD4B8C62 /* ItemEvents.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4D6C7D1B059B7CAD9ED94FDB26655FF4 /* ItemEvents.swift */; }; + 844C335CA2C61EB6E5B131CB61386509 /* ShareReplay1.swift in Sources */ = {isa = PBXBuildFile; fileRef = 477CA47455652DA6E23FF8C42DCD3247 /* ShareReplay1.swift */; }; + 84F8E9C004DF457E558BEB5350893A74 /* Switch.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50627C97E6A0FDF747368316C1A7E9B8 /* Switch.swift */; }; + 85491F58B4BD3DD0CFC771F861A660D3 /* NSObject+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = D740BC5E318263CF4C86F2FF57AAB534 /* NSObject+Rx.swift */; }; + 856332B9A729EDEAE7CC0302027CDC0F /* Catch.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A6C92C57DEAD46320212E648D6FEE52 /* Catch.swift */; }; + 85782EC2598D333ADC637BB955FE36FC /* DispatchQueue+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30F24BBC537B71BDBC5816F0B5117B87 /* DispatchQueue+Extensions.swift */; }; + 86AC77160E0C5DD95BEB019628E879E6 /* CombineLatest+Collection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35A28FA391DB06D29D19DA4447AD37CA /* CombineLatest+Collection.swift */; }; + 8726DEDCA5817E614592ADE14FB76BB6 /* RefCount.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5269C00D54CBA238331E7D259F465609 /* RefCount.swift */; }; + 88EB3F9158721C0195CBC3E6E88FFAC4 /* RxSwift-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 275C278EB8ECC1D443F42A7648BE8554 /* RxSwift-dummy.m */; }; + 8AA42C32C0B2DBED3EAF429A231CDB21 /* BooleanDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22954F1D4615BBFF718FD64924CADC93 /* BooleanDisposable.swift */; }; + 8B57DE6CED50D92E8E27C4FD267DA15E /* SubscribeOn.swift in Sources */ = {isa = PBXBuildFile; fileRef = E3DC6CF6E770FCD8D53D32AF0F9DA126 /* SubscribeOn.swift */; }; + 8BC2D471DF877174F872D957FE534419 /* Reduce.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8DA1E31F9BB5BC5A606A2C48ECE47B24 /* Reduce.swift */; }; + 8BDF3002A8ED36B2B13CFD9C4C6FCDC0 /* String+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3B00D7B6E0CBFE12E1D5A6C30B939190 /* String+Rx.swift */; }; + 8C13E631B96C8A69BFC2D6082E9FA241 /* ObservableConvertibleType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9BE0D1B70A2AD1DA432E686EAC99DB0D /* ObservableConvertibleType.swift */; }; + 8CC6BE81F2727BDD00091E8EDC3DC797 /* Sample.swift in Sources */ = {isa = PBXBuildFile; fileRef = CFC8BCA7484913B73E111710A621095F /* Sample.swift */; }; + 8D03029BB0EEC41E0A024682FF09EE6A /* DistinctUntilChanged.swift in Sources */ = {isa = PBXBuildFile; fileRef = 703AFAD4C44A49D75794591FD54C09FC /* DistinctUntilChanged.swift */; }; + 8DA194776C8097962BC733989FDD632D /* Take.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9B2526BF51A53AAF05BAC6CB090FE6EA /* Take.swift */; }; + 8DFE7A2870E6C91810945B8E80241C5C /* UICollectionView+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = B37CED7A1B33FD4AF9119A53F2C13769 /* UICollectionView+Rx.swift */; }; + 8E167D3B396C7D754C8E8DE80F38477E /* Reactive.swift in Sources */ = {isa = PBXBuildFile; fileRef = 99AB1D099C10F2E5620A6BDF34588975 /* Reactive.swift */; }; + 8E7DFE12E409B4A1E5EEC52FEFE399D3 /* RxCocoa.swift in Sources */ = {isa = PBXBuildFile; fileRef = E733411C01B6E1B1C9923630CA83DF0D /* RxCocoa.swift */; }; + 8F08A0A21CAD3869D45C2F7D8C74E256 /* AsyncLock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AD6F3F3F6855D2DDD205D5E9C2FF90B /* AsyncLock.swift */; }; + 8FC74123F7EDFCF0E2E9CB8F12D75565 /* AnonymousObservable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 68392D6EEA0ED3393891F448EC65B15F /* AnonymousObservable.swift */; }; + 9044181820DB4607D7438D84F31874D0 /* RxPickerViewDelegateProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 960737347ABB0497D5D165AF6F04383D /* RxPickerViewDelegateProxy.swift */; }; + 90A1D93A172B7D93D12A546EAD1BFE19 /* Cancelable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 310E2059CCB59758D74FA623B7341F35 /* Cancelable.swift */; }; + 944B2C6C4BB844DF8B653A08E009D3D1 /* OperationQueueScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97627C4204F674A421353E2CC5C35C59 /* OperationQueueScheduler.swift */; }; + 954B0A0489598AB2D063241B46F62C8C /* DispatchQueue+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E5396250362A8B8FCE1C3628C7D789F /* DispatchQueue+Extensions.swift */; }; + 957639EF75D0DBDC62FBFBE54364B973 /* UISearchBar+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD056A186F36500A58F7BAB90D9785B0 /* UISearchBar+Rx.swift */; }; + 96D3B761549C658F3BBE325C3D6E9AD3 /* ObserveOn.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0DBADAF4942134897BCBFC9D3F0ECCCE /* ObserveOn.swift */; }; + 97AE0A128FB54CC0A02A65DD22A371CA /* UITabBar+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 55AFE841CAB03336F9EE30E219DB303F /* UITabBar+Rx.swift */; }; + 99F3866ABEC5BBE8E325CDA76B27BE57 /* AnyObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9CAD519CA31004643A5A6D099089890 /* AnyObserver.swift */; }; + 9A1AC9703382C22DAB05E2F8AEC95C32 /* SynchronizedOnType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0DF9CCC07A8F8899DAA3468E098F34B2 /* SynchronizedOnType.swift */; }; + 9A46E657438F1EADB4F3C013925408FE /* InfiniteSequence.swift in Sources */ = {isa = PBXBuildFile; fileRef = 006A85CAF9C458F13EBCC787756720A2 /* InfiniteSequence.swift */; }; + 9AADC4D8700A16928411D2C269422474 /* TakeLast.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8DBBA77CC1DEEE524C517B5F5ECFF34 /* TakeLast.swift */; }; + 9B38F5893F0D186AEAD699466A3B8836 /* Observable+Debug.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F702A0D040E23B8F7C4A2B2D7BF3D6D /* Observable+Debug.swift */; }; + 9E8F409E27A4179D15B755B5B3B2832C /* Queue.swift in Sources */ = {isa = PBXBuildFile; fileRef = D14765FD8943F9837F5C8428CA03C7F7 /* Queue.swift */; }; + 9EB7A8CE5046636E0437BB98CF496ED0 /* ScheduledItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EB9C7DEE1C140DE14C9A3D09E024BC3 /* ScheduledItem.swift */; }; + 9FE76BDCD0A12B8A09F394733F26A516 /* SynchronizedSubscribeType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11C615CBD6201F948CE3830F3EFABFA3 /* SynchronizedSubscribeType.swift */; }; + A462ED2113ECD649E947018C08E1715B /* Logging.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6AC09569D823CC48FED33FF4592029CF /* Logging.swift */; }; + A4E00A2CAD0ECB2F148C419F3558DA07 /* UIPageControl+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = AC38374D82B1743060DCD93295E41C3D /* UIPageControl+Rx.swift */; }; + A62F38C06D02956EF0FEE7CB545DFF0B /* VirtualTimeScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A4169BB7B76EC937D94F6BEF9FB9E0B /* VirtualTimeScheduler.swift */; }; + A7542150C35BE5A5C48B202E928066C6 /* RxCollectionViewDataSourceType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0261DA91C20FBC3AFF3A0D05B073CBA7 /* RxCollectionViewDataSourceType.swift */; }; + A7DD8CDCEA4132FDBB931915303513DB /* Never.swift in Sources */ = {isa = PBXBuildFile; fileRef = 187761E03C1F7B58183B7320406658AE /* Never.swift */; }; + A8F46A9F07392BE6AD81A6181EF0592E /* SerialDispatchQueueScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6349A034EDF8823A796F029B3FC91AB1 /* SerialDispatchQueueScheduler.swift */; }; + A918EBE37A98B6A9E7AE09490969A6F7 /* SynchronizedDisposeType.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9D1CEBFA68ED0016AF36A402C8AA348 /* SynchronizedDisposeType.swift */; }; + A91C34EC6DD5EE9250AD2D9F241E09B3 /* UIStepper+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02229AFE0B4BCF0FFE5A1F61A6A3E6E3 /* UIStepper+Rx.swift */; }; + AB4D751C9E2AB7A713033C10D3D8706D /* Filter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06AA53BF1102449A2CF3379F0B8C89C7 /* Filter.swift */; }; + ABC1261AF722C75EBB5034EF5CF2910D /* Map.swift in Sources */ = {isa = PBXBuildFile; fileRef = 57C98EC1D350E642FD6513F7DC84A7B7 /* Map.swift */; }; + AD58B2E686C181A5E2A38340E6382AA6 /* ObservableConvertibleType+Driver.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9680E698A96391123754AEF6500344A /* ObservableConvertibleType+Driver.swift */; }; + AE02FD1657561DFB785E09AC35BBCD72 /* Deferred.swift in Sources */ = {isa = PBXBuildFile; fileRef = F041C3A61D24A55BA6D02865982F4948 /* Deferred.swift */; }; + AE3E0437C711028E325A0930030B90E4 /* Concat.swift in Sources */ = {isa = PBXBuildFile; fileRef = A3FBA08BED4CF780F286F7C578ABE18D /* Concat.swift */; }; + AF164AC62EF67AE504DD0C2F5F804A33 /* Errors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5FBD523F1A092AD394DD5292F1ECB3EC /* Errors.swift */; }; + B07B93E8533A80E21077FE81985D8F6A /* Observable+Aggregate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F443EFBEEE15048C942B3E1F2FEC5B3 /* Observable+Aggregate.swift */; }; + B3424BF565F7184D27EF7D67E88F7B12 /* Queue.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8B1297039F6EA16D423A90A12D7CC06 /* Queue.swift */; }; + B79D764BF6355209267A93A6685333A5 /* _RXObjCRuntime.m in Sources */ = {isa = PBXBuildFile; fileRef = EB09B4EEFE017AD8A7AA8A8C1F163812 /* _RXObjCRuntime.m */; }; + B7A9C4B9DB5E7B1D77DD3775C49B3E66 /* SharedSequence+Operators+arity.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6FB449CBDFAE6FD7EE6029B5BEFBFE5E /* SharedSequence+Operators+arity.swift */; }; + BB7DCB75FA9AC2458ED3A5662BA40ED7 /* SubjectType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 60C321E6B0BC2E19F7F38DD6F2C09E62 /* SubjectType.swift */; }; + BD530FCAC7D4C00EC656A7CA17206CD1 /* Observable+StandardSequenceOperators.swift in Sources */ = {isa = PBXBuildFile; fileRef = 772E2994B6C7F8AF414BCF19AF96C9CD /* Observable+StandardSequenceOperators.swift */; }; + BD549F5A74F74D82D543C792C27F049E /* Amb.swift in Sources */ = {isa = PBXBuildFile; fileRef = B741543663BD6C9BAD832B9EE5B969BF /* Amb.swift */; }; + BDB52602A520BBC270E051F0A669A7FF /* MainScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 368C2CCC6A55F4D761B07A4A01E238F8 /* MainScheduler.swift */; }; + BEC06180957AED23FABD97CFAF33ACF6 /* PriorityQueue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 934C51BE545B2C1E082E7D38BE92D043 /* PriorityQueue.swift */; }; + C0E21F295CC1608BCF28C9C03C45DE1A /* HistoricalScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17FAD3C510F874695845F53E92CDEFCE /* HistoricalScheduler.swift */; }; + C1E3BDD55C24EC009C5DE956D1F7C7D7 /* Merge.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02E3FD64DE9F3F7935D3A66FC3A660AD /* Merge.swift */; }; + C459E1CB96638B30A7BE880452A188CD /* Lock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BD37F2E2DCDC1316E634A329394F90C /* Lock.swift */; }; + C5494AA6BD2FEBDBC7BA8C12153614E1 /* DisposeBase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F204260242C3B57DA94787B81F9A379 /* DisposeBase.swift */; }; + C5F5AA378B2A55CA3EABD6A83C7317F2 /* Zip+Collection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9DCFB51A1C7EA0AC6AD367B4C3872DA1 /* Zip+Collection.swift */; }; + C61B877F57B32344E031D0E5A72A979C /* Window.swift in Sources */ = {isa = PBXBuildFile; fileRef = AAE171203123A28D26CC10698CA05898 /* Window.swift */; }; + C823788D0F5829EA6AEB13E9AE81FCC5 /* RetryWhen.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDAAB3AB88BA20FDE9B79631F269019B /* RetryWhen.swift */; }; + C83F71D4EE4E02BA7C4D150F136D42CF /* UITableView+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A1A0CB1F9C1205703FF5508B7DEEDC6 /* UITableView+Rx.swift */; }; + CA1E15B731CBF82AEE676915A6226DF4 /* NopDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3887B94073C7C1FFAEA8E2F5181F29E3 /* NopDisposable.swift */; }; + CAC20FE152F2C44B01217125C9248E8E /* Error.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76F3D3BBF234D5C633588D9B4E75987C /* Error.swift */; }; + CACD9B0932614E29AB490A7D1990E2AB /* ObservableType+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E64EE928569D9CE1F1B07ECF93FEA6D /* ObservableType+Extensions.swift */; }; + CB51294DAF1ECC45EC6167BECCFFACF4 /* CurrentThreadScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = C72045F1DD316A8D8D667EBBC62BCCAA /* CurrentThreadScheduler.swift */; }; + CBE99CCFFFCB849212B6FB6D2F9A53E6 /* DelegateProxyType.swift in Sources */ = {isa = PBXBuildFile; fileRef = B109B815703349C9B6BB84A3259F9FD7 /* DelegateProxyType.swift */; }; + CC1EB4C5C523C46291EF99F9F0A66E97 /* Generate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24241E179BF63060B757331E8BD99D63 /* Generate.swift */; }; + CD7400ADE6FF0E05F394324483FCB151 /* AnonymousObserver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E895275489876F09F432CA67FE21439 /* AnonymousObserver.swift */; }; + CF2F08EA082E653EF617D7FBC4A001FA /* ConcurrentMainScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75783B38979EC3CF3F54AAF108D075E8 /* ConcurrentMainScheduler.swift */; }; + D0CEC81294324172CE1D575D5C80C50F /* UIProgressView+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6379DC98FC6B0CAF284139D189FD8DA4 /* UIProgressView+Rx.swift */; }; + D0EA7B4C3BCEF31050AABF47A9374E32 /* ControlEvent+Driver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 500B41C5329236B01D0FEA05256B9F5B /* ControlEvent+Driver.swift */; }; + D1D616533BC802BD3BE04E6EE1D0A8DA /* ReplaySubject.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5F16912A8FB1C45DBFADC2B5B479072A /* ReplaySubject.swift */; }; + D21B2AF6315E5232DA13772993018C7F /* ScheduledDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 785EBC3F90F0A66D18749E6F62C511CD /* ScheduledDisposable.swift */; }; + D251342CAD00B3A0E7EC3678592B650A /* NSNotificationCenter+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = A54D6A8E2EA2035685149FA65AE9DE1E /* NSNotificationCenter+Rx.swift */; }; + D27AACEB710DB866716A338DB3B84694 /* RxCocoaRuntime.h in Headers */ = {isa = PBXBuildFile; fileRef = 9C2D178E75F7BE054DFB902ECC4E1A7A /* RxCocoaRuntime.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D2C3EA028CBF9B6A7384EAD8C06CC3F1 /* Multicast.swift in Sources */ = {isa = PBXBuildFile; fileRef = 55A20BFFF5369A00113A30E4B7F15842 /* Multicast.swift */; }; + D3BF51C7656E71BB071936417BFD8177 /* UILabel+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 92099190C99C0C391E3B475FA824CA7B /* UILabel+Rx.swift */; }; + D472D1486D700F27A6D2EE4C04DD8B25 /* UIPickerView+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0B97480CAF8B38BAFCC58CA4C786FC9B /* UIPickerView+Rx.swift */; }; + D5D6327F15D70764FC1C2074D149B5F8 /* InvocableScheduledItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE315409B48FCE8A0AC462617E487561 /* InvocableScheduledItem.swift */; }; + D62ED4125C3C5D7EF9058163D7AAC96A /* UISegmentedControl+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE749C4F2DBA7A407D5B33D5DF514412 /* UISegmentedControl+Rx.swift */; }; + D7D77A6D4E380168BC2F7F0814447B43 /* KVORepresentable+CoreGraphics.swift in Sources */ = {isa = PBXBuildFile; fileRef = A45777551AC14459252CB963743F760D /* KVORepresentable+CoreGraphics.swift */; }; + D82AD2D5137003784582FC3F27860574 /* RxScrollViewDelegateProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A28F295BCB3239E3D8E97C8253DEF32 /* RxScrollViewDelegateProxy.swift */; }; + D833970A227876D7037712FEEB20B58D /* Debunce.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33E24CBC32BF736F401E2C0002F4C163 /* Debunce.swift */; }; + DBAE3679FFD79C4092885470CE375B2D /* SynchronizedUnsubscribeType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 323235124BDF04A1A2262894B9B69BF0 /* SynchronizedUnsubscribeType.swift */; }; + DC5D4611375E3C8D187CBC2BC359BCF1 /* SkipWhile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1A72650E19D579EB5CDDC6E40B590B11 /* SkipWhile.swift */; }; + DE14A09490B74F598F7836CFC456E8F3 /* _RXObjCRuntime.h in Headers */ = {isa = PBXBuildFile; fileRef = 01DBF7C725D0BA477B3AA3A94377F2C9 /* _RXObjCRuntime.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E2133A288FFB0418CF6D3C65D758E4C4 /* RxSwift-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 2CA4CF3BFBE7871ADCF8FBBE747810FE /* RxSwift-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E27C8069BE899CCA7E53D4BFBEF8F627 /* Observable.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABE1BFBE9D3B127015A516D9CB9F9F7E /* Observable.swift */; }; + E2F43F799241F99480D799BE7DC6F0E6 /* URLSession+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = E73E7800B5D05C4608E7658D76BB09F6 /* URLSession+Rx.swift */; }; + E34B5956A142C76A16BE8E0A47614C76 /* RxCollectionViewDelegateProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = B35A50095178D9C3BC723C286B94F534 /* RxCollectionViewDelegateProxy.swift */; }; + E3D9C194890984A380E38076AF97EE74 /* DispatchQueueConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 250DB34FC592CA01F9AC40F5B72D1E4E /* DispatchQueueConfiguration.swift */; }; + E452567751DB804F05E8C7DB56231FF6 /* UITabBarItem+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5F286BF9AEB10DD62CD1CF950796B015 /* UITabBarItem+Rx.swift */; }; + E58994E13807BF5B2632CB07829FB897 /* ConnectableObservable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2836FC17C9639B40E5BE53E2A461D59D /* ConnectableObservable.swift */; }; + E6DD4FC5B7A12BF6711D0D6C893A4947 /* RxCocoa-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 3A84C7DDCCB01DD68DB69FDFAF2A317D /* RxCocoa-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E7EB802E0E101339BEBF8787B22CA823 /* _RXKVOObserver.m in Sources */ = {isa = PBXBuildFile; fileRef = B2DA51A804997AC8E091499D75D9B949 /* _RXKVOObserver.m */; }; + E85CE4AC7329B2A28C3962A44CC74954 /* DelaySubscription.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0563A182248FB9D6E2EE2A227B4278CB /* DelaySubscription.swift */; }; + E85DC682EBB400586E00721AAD6A40AA /* ToArray.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32ECE316C2C08F2FBD9CD6146C162FE8 /* ToArray.swift */; }; + E88CB065BEF379BD60E2AD72A871EA07 /* Empty.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC4CE9E69BD3692E25435DFF08150281 /* Empty.swift */; }; + E8B5392D7D672E1DD3D9C1F4D92DF86C /* RxTextViewDelegateProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = D65D17F873F72D6B1E8794F5ACEAEB44 /* RxTextViewDelegateProxy.swift */; }; + EDC6A6B90C7D781DABBD5B532280290D /* Scan.swift in Sources */ = {isa = PBXBuildFile; fileRef = C16C8AA6F97D21BFD0A3AF26373731E2 /* Scan.swift */; }; + EEA9485CD9D29F85D2E5B3C2B4BFBF80 /* PriorityQueue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C79970530D93F05F8B7C9A8203921AE /* PriorityQueue.swift */; }; + EFEC1B345021E5A2BE3133767DDF7E6C /* Driver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 41C211BF6B589CAD8CA0808923658DA3 /* Driver.swift */; }; + F1911CB1828788BCFD2429BF4F5C0B9D /* ScheduledItemType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5293B9C508D858D18F9BE98E4D8B1CC8 /* ScheduledItemType.swift */; }; + F294ADC6B119C71445AE2255E11864CD /* RxTextStorageDelegateProxy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A652EC57C21EEA7396AB93AEEBB70CC /* RxTextStorageDelegateProxy.swift */; }; + F2A94E48D7DF9478DB6FF71D6C313BB6 /* SingleAsync.swift in Sources */ = {isa = PBXBuildFile; fileRef = A6BF6EC7286419E2A0093926F0D54024 /* SingleAsync.swift */; }; + F4C471FA29B17704F82CD8E7C836EB96 /* Repeat.swift in Sources */ = {isa = PBXBuildFile; fileRef = E36A10AAB04A4E5683AE4B1269CB55E5 /* Repeat.swift */; }; + F6DE98FB2098E3B5B7615FF5FDFE306A /* RxCocoaObjCRuntimeError+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C895F323C80D99491E20AB3A88797A3B /* RxCocoaObjCRuntimeError+Extensions.swift */; }; + F7BD7BECE29FB3419524A0D164C9F43F /* UIActivityIndicatorView+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = BCD4BE4C69C97611CDD16209D2A26860 /* UIActivityIndicatorView+Rx.swift */; }; + F7EFEF5679DD9DF9EBCFF6578BE49FA0 /* InfiniteSequence.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC509A14DB241C28206B889097C413B9 /* InfiniteSequence.swift */; }; + F8C423BF8821B72D24686FEA562733A8 /* UITextView+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCDB67B12D350E3712C3713A5DDC3AC1 /* UITextView+Rx.swift */; }; + F8E7AA6F959A6D6B8DB65C5F6D44388E /* ObservableConvertibleType+SharedSequence.swift in Sources */ = {isa = PBXBuildFile; fileRef = F08D070993EE189DEDBE2E8283769ECA /* ObservableConvertibleType+SharedSequence.swift */; }; + FA253AC265EDACA7B86680AC62340985 /* TakeWhile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3B8B3247A709B4FD22813E354E88EC39 /* TakeWhile.swift */; }; + FA46C6FB94B7CA84EAA05F67F2C43762 /* UISearchController+Rx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9613FBA8885E8CDF0C27E2941C96A0BB /* UISearchController+Rx.swift */; }; + FAB534525B9EA54B097DA8CD8E0BEC56 /* PublishSubject.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F11A7D0074CE30A7AB58FD1A7200979 /* PublishSubject.swift */; }; + FBEE54B193FDF37E1B786DA47B3DB098 /* TailRecursiveSink.swift in Sources */ = {isa = PBXBuildFile; fileRef = 41CD03D4537993C97D5E596580296103 /* TailRecursiveSink.swift */; }; + FC2E222A7AEA3DE73F21DE6984814C41 /* NSObject+Rx+RawRepresentable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83ECFEBCF63AD537C7DEAF180BC8E0E8 /* NSObject+Rx+RawRepresentable.swift */; }; + FC9C041BD469A2A9A6217F7C3704ADAB /* Driver+Subscription.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19DDBF45DE47B160F7AA4FDBEF06DACC /* Driver+Subscription.swift */; }; + FD21FEB5C3FE29950613F9A99491B723 /* BinaryDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 80F462850F0C496E63D68311F38EB7B0 /* BinaryDisposable.swift */; }; + FDEC0DDC235B4C3005565D39740E8183 /* Sink.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E550FA6BA79CDA1CCCD9FCB9D6E4E6C /* Sink.swift */; }; + FF824085592FCA110E19CCE569A99EAE /* Just.swift in Sources */ = {isa = PBXBuildFile; fileRef = B36737DB51F1433B35E27DAAADB90905 /* Just.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - 7A59EA3B6E12321FD6DB829EA8F42F42 /* PBXContainerItemProxy */ = { + 03049E43A3F87053D3119C8267AE04FB /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = 402EBD6070F177670CD20F26A5CB58BC; - remoteInfo = RxSwift; + remoteGlobalIDString = CB4A3212CE222664E222C962519D604B; + remoteInfo = RxCocoa; }; - 8F40DEC3F6744894271C630614C19039 /* PBXContainerItemProxy */ = { + 25FD2DDB690168D174CD0CC5A5230362 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = 46F8D42C1E9780D15104E1B62753218F; - remoteInfo = RxCocoa; + remoteGlobalIDString = 6111906DD6556E6699AC0D1C05078A02; + remoteInfo = RxSwift; }; - F617D0BDD720063910D36DFF582CC31B /* PBXContainerItemProxy */ = { + 6393888B492465F2D50047FFA427087D /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; proxyType = 1; - remoteGlobalIDString = 402EBD6070F177670CD20F26A5CB58BC; + remoteGlobalIDString = 6111906DD6556E6699AC0D1C05078A02; remoteInfo = RxSwift; }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ - 00053BD5230150E958799E47A48EA895 /* Deferred.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Deferred.swift; path = RxSwift/Observables/Implementations/Deferred.swift; sourceTree = ""; }; - 00ED64DA988B533B84EB169AFCED363E /* WithLatestFrom.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = WithLatestFrom.swift; path = RxSwift/Observables/Implementations/WithLatestFrom.swift; sourceTree = ""; }; + 001721082AD1820BF14628A28649996E /* Bag.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Bag.swift; path = Platform/DataStructures/Bag.swift; sourceTree = ""; }; + 00243578A2429FC5E1FFE03292FAFF64 /* StartWith.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StartWith.swift; path = RxSwift/Observables/Implementations/StartWith.swift; sourceTree = ""; }; + 006A85CAF9C458F13EBCC787756720A2 /* InfiniteSequence.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = InfiniteSequence.swift; path = Platform/DataStructures/InfiniteSequence.swift; sourceTree = ""; }; 0158974CA472DE568A4D35AE3DABD751 /* Pods-PokedexGo.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-PokedexGo.release.xcconfig"; sourceTree = ""; }; - 023474758DA44A2BFAF627F30F635E6B /* PriorityQueue.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PriorityQueue.swift; path = RxSwift/DataStructures/PriorityQueue.swift; sourceTree = ""; }; - 02811E0858D470F34B739A6BFD2056F3 /* ObserveOn.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ObserveOn.swift; path = RxSwift/Observables/Implementations/ObserveOn.swift; sourceTree = ""; }; - 0291CC41E092EBFDF54D42B02E6424D3 /* Driver+Operators+arity.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Driver+Operators+arity.swift"; path = "RxCocoa/Common/CocoaUnits/Driver/Driver+Operators+arity.swift"; sourceTree = ""; }; - 03A4D1610491EEC726F17C86B0EEADB0 /* UIViewController+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIViewController+Rx.swift"; path = "RxCocoa/iOS/UIViewController+Rx.swift"; sourceTree = ""; }; - 0691E2AF4F4BC07A24EC93D184A3FDEB /* Observable+Concurrency.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Observable+Concurrency.swift"; path = "RxSwift/Observables/Observable+Concurrency.swift"; sourceTree = ""; }; - 07938BBC6989A110F1642C7C78A2A03A /* RxTableViewDataSourceType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxTableViewDataSourceType.swift; path = RxCocoa/iOS/Protocols/RxTableViewDataSourceType.swift; sourceTree = ""; }; - 08999F9E91C67F502F2B31AB37B21F34 /* Driver+Subscription.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Driver+Subscription.swift"; path = "RxCocoa/Common/CocoaUnits/Driver/Driver+Subscription.swift"; sourceTree = ""; }; + 01DBF7C725D0BA477B3AA3A94377F2C9 /* _RXObjCRuntime.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = _RXObjCRuntime.h; path = RxCocoa/Runtime/include/_RXObjCRuntime.h; sourceTree = ""; }; + 02229AFE0B4BCF0FFE5A1F61A6A3E6E3 /* UIStepper+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIStepper+Rx.swift"; path = "RxCocoa/iOS/UIStepper+Rx.swift"; sourceTree = ""; }; + 0261DA91C20FBC3AFF3A0D05B073CBA7 /* RxCollectionViewDataSourceType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxCollectionViewDataSourceType.swift; path = RxCocoa/iOS/Protocols/RxCollectionViewDataSourceType.swift; sourceTree = ""; }; + 02E3FD64DE9F3F7935D3A66FC3A660AD /* Merge.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Merge.swift; path = RxSwift/Observables/Implementations/Merge.swift; sourceTree = ""; }; + 0390599D2CE39A885EAF2242027BEDFB /* Platform.Darwin.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Platform.Darwin.swift; path = Platform/Platform.Darwin.swift; sourceTree = ""; }; + 04627568BE8263B246C8542E44BEB84E /* Disposables.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Disposables.swift; path = RxSwift/Disposables/Disposables.swift; sourceTree = ""; }; + 05154EFEAF12E5BBAE9E13E095EDFAEA /* RxCollectionViewDataSourceProxy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxCollectionViewDataSourceProxy.swift; path = RxCocoa/iOS/Proxies/RxCollectionViewDataSourceProxy.swift; sourceTree = ""; }; + 054F1DF36495EC9708AF0BFF1889B1B1 /* TextInput.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TextInput.swift; path = RxCocoa/Common/TextInput.swift; sourceTree = ""; }; + 0563A182248FB9D6E2EE2A227B4278CB /* DelaySubscription.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DelaySubscription.swift; path = RxSwift/Observables/Implementations/DelaySubscription.swift; sourceTree = ""; }; + 06AA53BF1102449A2CF3379F0B8C89C7 /* Filter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Filter.swift; path = RxSwift/Observables/Implementations/Filter.swift; sourceTree = ""; }; + 0949D3D804F8DA073BC481DA1ACA5DFE /* KVORepresentable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = KVORepresentable.swift; path = RxCocoa/Foundation/KVORepresentable.swift; sourceTree = ""; }; 0A383D28A120663F29BAD0538E848E8B /* Pods-PokedexGo-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-PokedexGo-acknowledgements.plist"; sourceTree = ""; }; - 0AED7DC8C3D8A832530DA381920BFB08 /* SubscribeOn.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SubscribeOn.swift; path = RxSwift/Observables/Implementations/SubscribeOn.swift; sourceTree = ""; }; - 0B365A38BCEEABC88B67EA39D80A861F /* ConcurrentMainScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConcurrentMainScheduler.swift; path = RxSwift/Schedulers/ConcurrentMainScheduler.swift; sourceTree = ""; }; - 0D255DFA39931004E6FBAE8524E21D29 /* Debug.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Debug.swift; path = RxSwift/Observables/Implementations/Debug.swift; sourceTree = ""; }; - 0D7F8AC7906D8F3573813543E119E9C2 /* SerialDispatchQueueScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SerialDispatchQueueScheduler.swift; path = RxSwift/Schedulers/SerialDispatchQueueScheduler.swift; sourceTree = ""; }; - 0DE82875BF092ABF63F0129F1D66C342 /* _RXDelegateProxy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = _RXDelegateProxy.m; path = RxCocoa/Common/_RXDelegateProxy.m; sourceTree = ""; }; + 0A4169BB7B76EC937D94F6BEF9FB9E0B /* VirtualTimeScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = VirtualTimeScheduler.swift; path = RxSwift/Schedulers/VirtualTimeScheduler.swift; sourceTree = ""; }; + 0A652EC57C21EEA7396AB93AEEBB70CC /* RxTextStorageDelegateProxy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxTextStorageDelegateProxy.swift; path = RxCocoa/iOS/Proxies/RxTextStorageDelegateProxy.swift; sourceTree = ""; }; + 0A746282E628E8F2A9EB17EE33CD0C91 /* TakeUntil.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TakeUntil.swift; path = RxSwift/Observables/Implementations/TakeUntil.swift; sourceTree = ""; }; + 0B97480CAF8B38BAFCC58CA4C786FC9B /* UIPickerView+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIPickerView+Rx.swift"; path = "RxCocoa/iOS/UIPickerView+Rx.swift"; sourceTree = ""; }; + 0C0C11784D64D692E0050ED48F989D57 /* RxCocoa-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "RxCocoa-prefix.pch"; sourceTree = ""; }; + 0C4D8309F4A7F25A8EC6FE8843F5CCC0 /* NSTextStorage+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSTextStorage+Rx.swift"; path = "RxCocoa/iOS/NSTextStorage+Rx.swift"; sourceTree = ""; }; + 0C79970530D93F05F8B7C9A8203921AE /* PriorityQueue.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PriorityQueue.swift; path = Platform/DataStructures/PriorityQueue.swift; sourceTree = ""; }; + 0DBADAF4942134897BCBFC9D3F0ECCCE /* ObserveOn.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ObserveOn.swift; path = RxSwift/Observables/Implementations/ObserveOn.swift; sourceTree = ""; }; + 0DC7413C45CB819C77DBA74D1CE67334 /* BehaviorSubject.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BehaviorSubject.swift; path = RxSwift/Subjects/BehaviorSubject.swift; sourceTree = ""; }; + 0DF9CCC07A8F8899DAA3468E098F34B2 /* SynchronizedOnType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SynchronizedOnType.swift; path = RxSwift/Concurrency/SynchronizedOnType.swift; sourceTree = ""; }; + 0EF39FC951C6CC263EDFD7124E057FCF /* SubscriptionDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SubscriptionDisposable.swift; path = RxSwift/Disposables/SubscriptionDisposable.swift; sourceTree = ""; }; 0F1EE5FBEBAD64A518D583451C6D84F8 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 1186161B975100A7DFC409B8C396D8B0 /* UITabBarItem+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UITabBarItem+Rx.swift"; path = "RxCocoa/iOS/UITabBarItem+Rx.swift"; sourceTree = ""; }; - 12D37A1D8E30A99C0CA998A5F87E2EB9 /* RxCocoa-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "RxCocoa-prefix.pch"; sourceTree = ""; }; - 14BF84797953369156C57EB5452EBF9E /* TextInput.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TextInput.swift; path = RxCocoa/Common/TextInput.swift; sourceTree = ""; }; - 14C6018EB8ED3D2D4687001C575AFF19 /* RxTextStorageDelegateProxy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxTextStorageDelegateProxy.swift; path = RxCocoa/iOS/Proxies/RxTextStorageDelegateProxy.swift; sourceTree = ""; }; - 15466AD4A01ACC05B816711C276C94B7 /* ObservableConvertibleType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ObservableConvertibleType.swift; path = RxSwift/ObservableConvertibleType.swift; sourceTree = ""; }; - 16BBBD04181474EAD0A97986ADBDE173 /* DispatchQueueSchedulerQOS.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DispatchQueueSchedulerQOS.swift; path = RxSwift/Schedulers/DispatchQueueSchedulerQOS.swift; sourceTree = ""; }; + 0F6F79C0E9CA7600FB215083C59C7A24 /* SingleAssignmentDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SingleAssignmentDisposable.swift; path = RxSwift/Disposables/SingleAssignmentDisposable.swift; sourceTree = ""; }; + 0F702A0D040E23B8F7C4A2B2D7BF3D6D /* Observable+Debug.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Observable+Debug.swift"; path = "RxSwift/Observables/Observable+Debug.swift"; sourceTree = ""; }; + 11C615CBD6201F948CE3830F3EFABFA3 /* SynchronizedSubscribeType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SynchronizedSubscribeType.swift; path = RxSwift/Concurrency/SynchronizedSubscribeType.swift; sourceTree = ""; }; + 122E690AFB6AC805905FAC5D63EE4098 /* CombineLatest.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CombineLatest.swift; path = RxSwift/Observables/Implementations/CombineLatest.swift; sourceTree = ""; }; + 13E02371A6891FF6803B48F80CEB4A26 /* ControlTarget.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ControlTarget.swift; path = RxCocoa/Common/ControlTarget.swift; sourceTree = ""; }; + 1491FA56387C07FA701050A6BAB1217B /* ElementAt.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ElementAt.swift; path = RxSwift/Observables/Implementations/ElementAt.swift; sourceTree = ""; }; + 14F32DA16234790E73FEEB15D52896DA /* Observable+Single.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Observable+Single.swift"; path = "RxSwift/Observables/Observable+Single.swift"; sourceTree = ""; }; 17237AA00C6DE7CADBCBC1A37C8642C2 /* Pods-PokedexGo.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-PokedexGo.debug.xcconfig"; sourceTree = ""; }; - 199CEC87F4AF077D9B4762389FF6570A /* KVOObservable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = KVOObservable.swift; path = RxCocoa/Common/Observables/Implementations/KVOObservable.swift; sourceTree = ""; }; - 1A0B4A186840C963BFED5950C240F664 /* RxCocoa.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = RxCocoa.modulemap; sourceTree = ""; }; - 1A1611E18D67AF94FDC0B20D1CAF3A5F /* SynchronizedSubscribeType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SynchronizedSubscribeType.swift; path = RxSwift/Concurrency/SynchronizedSubscribeType.swift; sourceTree = ""; }; - 1A47F6ED70808C18751C82FE05C97E84 /* RxCocoa.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RxCocoa.h; path = RxCocoa/RxCocoa.h; sourceTree = ""; }; - 1BD6B800FB60FC0B73E545E9998902FA /* _RX.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = _RX.m; path = RxCocoa/Common/_RX.m; sourceTree = ""; }; - 1E41312BC41502D9EC683B790A5DEC59 /* RefCount.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RefCount.swift; path = RxSwift/Observables/Implementations/RefCount.swift; sourceTree = ""; }; - 1EC5D0239E634C375CA320C1CA5F9FDF /* TakeLast.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TakeLast.swift; path = RxSwift/Observables/Implementations/TakeLast.swift; sourceTree = ""; }; - 23966E1D2B24C6547A2B15D92C5671D0 /* Variable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Variable.swift; path = RxSwift/Subjects/Variable.swift; sourceTree = ""; }; - 24189EB6F723B40C817F8408B893EB7B /* ImmediateSchedulerType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImmediateSchedulerType.swift; path = RxSwift/ImmediateSchedulerType.swift; sourceTree = ""; }; - 24EDBAF23688A76BA859735A2C8F3194 /* Just.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Just.swift; path = RxSwift/Observables/Implementations/Just.swift; sourceTree = ""; }; - 257340FD101A7D19D51F5261F0468333 /* SynchronizedOnType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SynchronizedOnType.swift; path = RxSwift/Concurrency/SynchronizedOnType.swift; sourceTree = ""; }; - 27AC0F00E0539EE6BB3CA625F08F2A21 /* Reduce.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Reduce.swift; path = RxSwift/Observables/Implementations/Reduce.swift; sourceTree = ""; }; - 286DB0BF724E24E942AE4449F63394D1 /* ControlProperty+Driver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "ControlProperty+Driver.swift"; path = "RxCocoa/Common/CocoaUnits/Driver/ControlProperty+Driver.swift"; sourceTree = ""; }; - 2D8B5E655F870573D98C16B1C6D1D89E /* Scan.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Scan.swift; path = RxSwift/Observables/Implementations/Scan.swift; sourceTree = ""; }; - 2FE39B9E067C4AFC9544CBF93C985681 /* UIDatePicker+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIDatePicker+Rx.swift"; path = "RxCocoa/iOS/UIDatePicker+Rx.swift"; sourceTree = ""; }; - 3193F1228BF29C5E2A301B4B72B7980E /* ScheduledItemType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ScheduledItemType.swift; path = RxSwift/Schedulers/Internal/ScheduledItemType.swift; sourceTree = ""; }; - 32070195AC7FF295DC13483699433136 /* RxSearchControllerDelegateProxy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxSearchControllerDelegateProxy.swift; path = RxCocoa/iOS/Proxies/RxSearchControllerDelegateProxy.swift; sourceTree = ""; }; - 322CA81233C08A654C0E044DCDC6F33D /* UIBarButtonItem+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIBarButtonItem+Rx.swift"; path = "RxCocoa/iOS/UIBarButtonItem+Rx.swift"; sourceTree = ""; }; - 32F23A0961AAA6C01A1397AD90EDA9AA /* ConnectableObservable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConnectableObservable.swift; path = RxSwift/Observables/Implementations/ConnectableObservable.swift; sourceTree = ""; }; - 3355C93B63CA5FE5B47101DF7E77B25F /* UIImageView+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIImageView+Rx.swift"; path = "RxCocoa/iOS/UIImageView+Rx.swift"; sourceTree = ""; }; - 357DF1CCC5063151569BCAC8BF4E9C6D /* MainScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MainScheduler.swift; path = RxSwift/Schedulers/MainScheduler.swift; sourceTree = ""; }; - 35BCDAFC104DCC94AF1FE83D7487AA10 /* Reactive.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Reactive.swift; path = RxCocoa/Common/Reactive.swift; sourceTree = ""; }; - 360DB4FE725B14D1B4A919CAE6C07BD0 /* ControlProperty.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ControlProperty.swift; path = RxCocoa/Common/CocoaUnits/ControlProperty.swift; sourceTree = ""; }; - 363274368317697F561BB2ED8F6AB66A /* NSObject+Rx+KVORepresentable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSObject+Rx+KVORepresentable.swift"; path = "RxCocoa/Common/Observables/NSObject+Rx+KVORepresentable.swift"; sourceTree = ""; }; - 366E4D0AB9A75F2A5712473C8D3EAE38 /* KVORepresentable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = KVORepresentable.swift; path = RxCocoa/Common/KVORepresentable.swift; sourceTree = ""; }; - 3777004EB16505CA6386B7D9FDBD7ED7 /* Observable+Debug.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Observable+Debug.swift"; path = "RxSwift/Observables/Observable+Debug.swift"; sourceTree = ""; }; - 37B3D6613A18DC598DA7ABCA1D9CED33 /* AnyObserver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AnyObserver.swift; path = RxSwift/AnyObserver.swift; sourceTree = ""; }; - 383F17D9EBD7C4F32343FBA6C5743F68 /* ScheduledItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ScheduledItem.swift; path = RxSwift/Schedulers/Internal/ScheduledItem.swift; sourceTree = ""; }; + 17FAD3C510F874695845F53E92CDEFCE /* HistoricalScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HistoricalScheduler.swift; path = RxSwift/Schedulers/HistoricalScheduler.swift; sourceTree = ""; }; + 187761E03C1F7B58183B7320406658AE /* Never.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Never.swift; path = RxSwift/Observables/Implementations/Never.swift; sourceTree = ""; }; + 19DDBF45DE47B160F7AA4FDBEF06DACC /* Driver+Subscription.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Driver+Subscription.swift"; path = "RxCocoa/CocoaUnits/Driver/Driver+Subscription.swift"; sourceTree = ""; }; + 1A6B4401BAE249952C98F64BBC95B2F2 /* RxTableViewDataSourceProxy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxTableViewDataSourceProxy.swift; path = RxCocoa/iOS/Proxies/RxTableViewDataSourceProxy.swift; sourceTree = ""; }; + 1A72650E19D579EB5CDDC6E40B590B11 /* SkipWhile.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SkipWhile.swift; path = RxSwift/Observables/Implementations/SkipWhile.swift; sourceTree = ""; }; + 1C5D30C37343EEFCC746F2C0DAE0E218 /* _RXDelegateProxy.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = _RXDelegateProxy.h; path = RxCocoa/Runtime/include/_RXDelegateProxy.h; sourceTree = ""; }; + 1D0F791088E9C7CC17CC8E64A0BCF99D /* ControlProperty.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ControlProperty.swift; path = RxCocoa/CocoaUnits/ControlProperty.swift; sourceTree = ""; }; + 20184E13B8706FF2BEC9F6F5162F5287 /* ImmediateSchedulerType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImmediateSchedulerType.swift; path = RxSwift/ImmediateSchedulerType.swift; sourceTree = ""; }; + 2087DF11C7599522350EA04DE6B4156E /* RxCocoa.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = RxCocoa.modulemap; sourceTree = ""; }; + 22954F1D4615BBFF718FD64924CADC93 /* BooleanDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BooleanDisposable.swift; path = RxSwift/Disposables/BooleanDisposable.swift; sourceTree = ""; }; + 24241E179BF63060B757331E8BD99D63 /* Generate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Generate.swift; path = RxSwift/Observables/Implementations/Generate.swift; sourceTree = ""; }; + 250DB34FC592CA01F9AC40F5B72D1E4E /* DispatchQueueConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DispatchQueueConfiguration.swift; path = RxSwift/Schedulers/Internal/DispatchQueueConfiguration.swift; sourceTree = ""; }; + 26CF7CCE8663939B828C53DF2B9BA2B4 /* Do.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Do.swift; path = RxSwift/Observables/Implementations/Do.swift; sourceTree = ""; }; + 275C278EB8ECC1D443F42A7648BE8554 /* RxSwift-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "RxSwift-dummy.m"; sourceTree = ""; }; + 2836FC17C9639B40E5BE53E2A461D59D /* ConnectableObservable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConnectableObservable.swift; path = RxSwift/Observables/Implementations/ConnectableObservable.swift; sourceTree = ""; }; + 29639B573EB1412C4230E3B09B9ECAC5 /* ObserveOnSerialDispatchQueue.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ObserveOnSerialDispatchQueue.swift; path = RxSwift/Observables/Implementations/ObserveOnSerialDispatchQueue.swift; sourceTree = ""; }; + 29B44F83E55B949CDDD1F0AFEAEC880E /* Platform.Darwin.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Platform.Darwin.swift; path = Platform/Platform.Darwin.swift; sourceTree = ""; }; + 2A1A0CB1F9C1205703FF5508B7DEEDC6 /* UITableView+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UITableView+Rx.swift"; path = "RxCocoa/iOS/UITableView+Rx.swift"; sourceTree = ""; }; + 2B619CE407B9403711BDFBAEE67207A9 /* InvocableType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = InvocableType.swift; path = RxSwift/Schedulers/Internal/InvocableType.swift; sourceTree = ""; }; + 2B983B555CBEC50516E21B9835EBA92E /* RxMutableBox.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxMutableBox.swift; path = RxSwift/RxMutableBox.swift; sourceTree = ""; }; + 2BD37F2E2DCDC1316E634A329394F90C /* Lock.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Lock.swift; path = RxSwift/Concurrency/Lock.swift; sourceTree = ""; }; + 2CA4CF3BFBE7871ADCF8FBBE747810FE /* RxSwift-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "RxSwift-umbrella.h"; sourceTree = ""; }; + 2D3967211EDE74A259D45C68D0919CCD /* RxSearchControllerDelegateProxy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxSearchControllerDelegateProxy.swift; path = RxCocoa/iOS/Proxies/RxSearchControllerDelegateProxy.swift; sourceTree = ""; }; + 2E3E5238F35763575B4EA04D71B648D1 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 2E550FA6BA79CDA1CCCD9FCB9D6E4E6C /* Sink.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Sink.swift; path = RxSwift/Observables/Implementations/Sink.swift; sourceTree = ""; }; + 2FAD8B62333EE46C5A33F9FE50E5918A /* UIDatePicker+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIDatePicker+Rx.swift"; path = "RxCocoa/iOS/UIDatePicker+Rx.swift"; sourceTree = ""; }; + 30D2A54F9FD3E9B455E0BC2E62C15FA3 /* Delay.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Delay.swift; path = RxSwift/Observables/Implementations/Delay.swift; sourceTree = ""; }; + 30DFCE2B63D2C2FE3331E73B770B4903 /* ObservableType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ObservableType.swift; path = RxSwift/ObservableType.swift; sourceTree = ""; }; + 30F24BBC537B71BDBC5816F0B5117B87 /* DispatchQueue+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "DispatchQueue+Extensions.swift"; path = "Platform/DispatchQueue+Extensions.swift"; sourceTree = ""; }; + 310E2059CCB59758D74FA623B7341F35 /* Cancelable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Cancelable.swift; path = RxSwift/Cancelable.swift; sourceTree = ""; }; + 313763C6108D9C46316D32780D3A5ED1 /* _RX.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = _RX.h; path = RxCocoa/Runtime/include/_RX.h; sourceTree = ""; }; + 313873C00506CBE738D855EED5608303 /* SharedSequence+Operators.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "SharedSequence+Operators.swift"; path = "RxCocoa/CocoaUnits/SharedSequence/SharedSequence+Operators.swift"; sourceTree = ""; }; + 323235124BDF04A1A2262894B9B69BF0 /* SynchronizedUnsubscribeType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SynchronizedUnsubscribeType.swift; path = RxSwift/Concurrency/SynchronizedUnsubscribeType.swift; sourceTree = ""; }; + 32ECE316C2C08F2FBD9CD6146C162FE8 /* ToArray.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ToArray.swift; path = RxSwift/Observables/Implementations/ToArray.swift; sourceTree = ""; }; + 3379A9C5DF632BB854582CE0439F9A48 /* Observable+Bind.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Observable+Bind.swift"; path = "RxCocoa/Common/Observable+Bind.swift"; sourceTree = ""; }; + 33E24CBC32BF736F401E2C0002F4C163 /* Debunce.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Debunce.swift; path = RxSwift/Observables/Implementations/Debunce.swift; sourceTree = ""; }; + 34CAF15FDB134CCB47A9BE558BA936CE /* ControlProperty+Driver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "ControlProperty+Driver.swift"; path = "RxCocoa/CocoaUnits/Driver/ControlProperty+Driver.swift"; sourceTree = ""; }; + 35A28FA391DB06D29D19DA4447AD37CA /* CombineLatest+Collection.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "CombineLatest+Collection.swift"; path = "RxSwift/Observables/Implementations/CombineLatest+Collection.swift"; sourceTree = ""; }; + 35DBF02092FEBD822B83924EB54C422A /* Zip+arity.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Zip+arity.swift"; path = "RxSwift/Observables/Implementations/Zip+arity.swift"; sourceTree = ""; }; + 368C2CCC6A55F4D761B07A4A01E238F8 /* MainScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MainScheduler.swift; path = RxSwift/Schedulers/MainScheduler.swift; sourceTree = ""; }; + 3887B94073C7C1FFAEA8E2F5181F29E3 /* NopDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NopDisposable.swift; path = RxSwift/Disposables/NopDisposable.swift; sourceTree = ""; }; 397ED6A120A7323FEFFD443352B8A3B8 /* RxSwift.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RxSwift.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 3A111DDC4C1EB87CD4BE69AB57654306 /* Observable+Multiple.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Observable+Multiple.swift"; path = "RxSwift/Observables/Observable+Multiple.swift"; sourceTree = ""; }; - 3ADEF916724C3CD33414826B3075629D /* SingleAssignmentDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SingleAssignmentDisposable.swift; path = RxSwift/Disposables/SingleAssignmentDisposable.swift; sourceTree = ""; }; - 3B4B0240401064916F34863D58160922 /* Catch.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Catch.swift; path = RxSwift/Observables/Implementations/Catch.swift; sourceTree = ""; }; - 3C72E0D48DA28CC03E4EC00234F52265 /* Pods-PokedexGo.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = "Pods-PokedexGo.modulemap"; sourceTree = ""; }; - 3D2E6375EF514E682DD5E099DEEA3C10 /* DisposeBase.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DisposeBase.swift; path = RxSwift/Disposables/DisposeBase.swift; sourceTree = ""; }; - 3E9940D9817166477856DE65094A6260 /* PublishSubject.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PublishSubject.swift; path = RxSwift/Subjects/PublishSubject.swift; sourceTree = ""; }; - 3F083B32C768C775786BB21ECF548208 /* DeallocObservable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DeallocObservable.swift; path = RxCocoa/Common/Observables/Implementations/DeallocObservable.swift; sourceTree = ""; }; - 3F3B2427854E0EBD6D65C83D0820471B /* TailRecursiveSink.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TailRecursiveSink.swift; path = RxSwift/Observers/TailRecursiveSink.swift; sourceTree = ""; }; - 40AAB2FCC33C7D3618DF8098E641D159 /* Window.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Window.swift; path = RxSwift/Observables/Implementations/Window.swift; sourceTree = ""; }; - 4331958ADDFBB46E5D9FAAE5F90CFFCA /* Take.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Take.swift; path = RxSwift/Observables/Implementations/Take.swift; sourceTree = ""; }; - 438E2DC43570497DBE921AEB89518230 /* UISlider+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UISlider+Rx.swift"; path = "RxCocoa/iOS/UISlider+Rx.swift"; sourceTree = ""; }; - 43FC3978A8C9F39C7800B21748B1C0EF /* DistinctUntilChanged.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DistinctUntilChanged.swift; path = RxSwift/Observables/Implementations/DistinctUntilChanged.swift; sourceTree = ""; }; - 45B87E1492D431B8BA1E5AEB616A1AB4 /* Map.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Map.swift; path = RxSwift/Observables/Implementations/Map.swift; sourceTree = ""; }; - 4706890E176FBF3A8D3F02AC3051B9CC /* UISearchBar+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UISearchBar+Rx.swift"; path = "RxCocoa/iOS/UISearchBar+Rx.swift"; sourceTree = ""; }; - 4742034066CBC30A03A7231BA909C2B8 /* ControlTarget.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ControlTarget.swift; path = RxCocoa/Common/Observables/Implementations/ControlTarget.swift; sourceTree = ""; }; - 47C615A0C1C7CB0D93B1B59AAE7AE2FF /* RxTabBarDelegateProxy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxTabBarDelegateProxy.swift; path = RxCocoa/iOS/Proxies/RxTabBarDelegateProxy.swift; sourceTree = ""; }; + 3A84C7DDCCB01DD68DB69FDFAF2A317D /* RxCocoa-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "RxCocoa-umbrella.h"; sourceTree = ""; }; + 3B00D7B6E0CBFE12E1D5A6C30B939190 /* String+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "String+Rx.swift"; path = "RxSwift/Extensions/String+Rx.swift"; sourceTree = ""; }; + 3B8B3247A709B4FD22813E354E88EC39 /* TakeWhile.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TakeWhile.swift; path = RxSwift/Observables/Implementations/TakeWhile.swift; sourceTree = ""; }; + 3C2907A619D445EBAC4FE4C582FFBFC6 /* LockOwnerType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LockOwnerType.swift; path = RxSwift/Concurrency/LockOwnerType.swift; sourceTree = ""; }; + 3C72E0D48DA28CC03E4EC00234F52265 /* Pods-PokedexGo.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = "Pods-PokedexGo.modulemap"; sourceTree = ""; }; + 3DE5921D384D083F148002565A98CA7D /* Observable+Concurrency.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Observable+Concurrency.swift"; path = "RxSwift/Observables/Observable+Concurrency.swift"; sourceTree = ""; }; + 3E36B0DA3408346FB92A93AB6C45E069 /* RxSearchBarDelegateProxy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxSearchBarDelegateProxy.swift; path = RxCocoa/iOS/Proxies/RxSearchBarDelegateProxy.swift; sourceTree = ""; }; + 3F204260242C3B57DA94787B81F9A379 /* DisposeBase.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DisposeBase.swift; path = RxSwift/Disposables/DisposeBase.swift; sourceTree = ""; }; + 40B18BDB18A0F71D3408DC5B3D9CAB9C /* RxSwift.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = RxSwift.modulemap; sourceTree = ""; }; + 41C211BF6B589CAD8CA0808923658DA3 /* Driver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Driver.swift; path = RxCocoa/CocoaUnits/Driver/Driver.swift; sourceTree = ""; }; + 41CD03D4537993C97D5E596580296103 /* TailRecursiveSink.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TailRecursiveSink.swift; path = RxSwift/Observers/TailRecursiveSink.swift; sourceTree = ""; }; + 420ED71D6CB2021AB9A4176B03D0C320 /* UIImageView+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIImageView+Rx.swift"; path = "RxCocoa/iOS/UIImageView+Rx.swift"; sourceTree = ""; }; + 4488DC730219AA10C54CA340A3D5E405 /* UITextField+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UITextField+Rx.swift"; path = "RxCocoa/iOS/UITextField+Rx.swift"; sourceTree = ""; }; + 4610BE88BD9A69E7311E15CCA3C9C30D /* HistoricalSchedulerTimeConverter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HistoricalSchedulerTimeConverter.swift; path = RxSwift/Schedulers/HistoricalSchedulerTimeConverter.swift; sourceTree = ""; }; + 46529E285EEFBC21FADDCE1616A0D778 /* VirtualTimeConverterType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = VirtualTimeConverterType.swift; path = RxSwift/Schedulers/VirtualTimeConverterType.swift; sourceTree = ""; }; + 477CA47455652DA6E23FF8C42DCD3247 /* ShareReplay1.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ShareReplay1.swift; path = RxSwift/Observables/Implementations/ShareReplay1.swift; sourceTree = ""; }; 48AF5E6DB322F1C2C0209B854CE73993 /* Pods-PokedexGo-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-PokedexGo-dummy.m"; sourceTree = ""; }; - 48CC2FA6C0E67819D548633EB23EA5A1 /* UICollectionView+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UICollectionView+Rx.swift"; path = "RxCocoa/iOS/UICollectionView+Rx.swift"; sourceTree = ""; }; - 4B5D4368EAAEDBE617887F4EFB6EB0FB /* Never.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Never.swift; path = RxSwift/Observables/Implementations/Never.swift; sourceTree = ""; }; - 4C4EF32E91A5BCD94FC3E346B25FA5E6 /* UITextField+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UITextField+Rx.swift"; path = "RxCocoa/iOS/UITextField+Rx.swift"; sourceTree = ""; }; - 4ECD634CA1C212F31539A5E94F027EEB /* DelegateProxyType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DelegateProxyType.swift; path = RxCocoa/Common/DelegateProxyType.swift; sourceTree = ""; }; - 4F1518F3631A490DAC3F9FCF8B227E1D /* Zip+CollectionType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Zip+CollectionType.swift"; path = "RxSwift/Observables/Implementations/Zip+CollectionType.swift"; sourceTree = ""; }; - 50DD92299AA92A6C6145174B972294EE /* UIButton+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIButton+Rx.swift"; path = "RxCocoa/iOS/UIButton+Rx.swift"; sourceTree = ""; }; - 51588A5611E67C994212A30648416D83 /* RxMutableBox.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxMutableBox.swift; path = RxSwift/RxMutableBox.swift; sourceTree = ""; }; - 52AA199050F22DB9F9654B0E79A1B72D /* NSNotificationCenter+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSNotificationCenter+Rx.swift"; path = "RxCocoa/Common/Observables/NSNotificationCenter+Rx.swift"; sourceTree = ""; }; - 52CCD0DF27D758124EE0BE12C033A336 /* SubjectType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SubjectType.swift; path = RxSwift/Subjects/SubjectType.swift; sourceTree = ""; }; - 53EA419F2CBBC7553305D19102BB4686 /* SkipWhile.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SkipWhile.swift; path = RxSwift/Observables/Implementations/SkipWhile.swift; sourceTree = ""; }; - 5496796606D494C97794B6F90DF06136 /* Observable+Time.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Observable+Time.swift"; path = "RxSwift/Observables/Observable+Time.swift"; sourceTree = ""; }; + 48E7453369B45B5ED73A948623A3B1CD /* RxTableViewDataSourceType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxTableViewDataSourceType.swift; path = RxCocoa/iOS/Protocols/RxTableViewDataSourceType.swift; sourceTree = ""; }; + 4A6C92C57DEAD46320212E648D6FEE52 /* Catch.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Catch.swift; path = RxSwift/Observables/Implementations/Catch.swift; sourceTree = ""; }; + 4C48857A37E0B818288C17716A394120 /* AnonymousDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AnonymousDisposable.swift; path = RxSwift/Disposables/AnonymousDisposable.swift; sourceTree = ""; }; + 4D6C7D1B059B7CAD9ED94FDB26655FF4 /* ItemEvents.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ItemEvents.swift; path = RxCocoa/iOS/Events/ItemEvents.swift; sourceTree = ""; }; + 4E895275489876F09F432CA67FE21439 /* AnonymousObserver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AnonymousObserver.swift; path = RxSwift/Observers/AnonymousObserver.swift; sourceTree = ""; }; + 4EB9C7DEE1C140DE14C9A3D09E024BC3 /* ScheduledItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ScheduledItem.swift; path = RxSwift/Schedulers/Internal/ScheduledItem.swift; sourceTree = ""; }; + 4F443EFBEEE15048C942B3E1F2FEC5B3 /* Observable+Aggregate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Observable+Aggregate.swift"; path = "RxSwift/Observables/Observable+Aggregate.swift"; sourceTree = ""; }; + 500B41C5329236B01D0FEA05256B9F5B /* ControlEvent+Driver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "ControlEvent+Driver.swift"; path = "RxCocoa/CocoaUnits/Driver/ControlEvent+Driver.swift"; sourceTree = ""; }; + 50627C97E6A0FDF747368316C1A7E9B8 /* Switch.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Switch.swift; path = RxSwift/Observables/Implementations/Switch.swift; sourceTree = ""; }; + 5071B74B5041F60D8DAFC145DDADAB26 /* UIApplication+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIApplication+Rx.swift"; path = "RxCocoa/iOS/UIApplication+Rx.swift"; sourceTree = ""; }; + 516D56CA8911D20905D7832AE8C17587 /* Producer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Producer.swift; path = RxSwift/Observables/Implementations/Producer.swift; sourceTree = ""; }; + 5269C00D54CBA238331E7D259F465609 /* RefCount.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RefCount.swift; path = RxSwift/Observables/Implementations/RefCount.swift; sourceTree = ""; }; + 5293B9C508D858D18F9BE98E4D8B1CC8 /* ScheduledItemType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ScheduledItemType.swift; path = RxSwift/Schedulers/Internal/ScheduledItemType.swift; sourceTree = ""; }; + 5329F8CBE02FC97E42D8E68A6440EDD3 /* UIGestureRecognizer+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIGestureRecognizer+Rx.swift"; path = "RxCocoa/iOS/UIGestureRecognizer+Rx.swift"; sourceTree = ""; }; + 532E8934BACCE9965E1B50AAD52DFB1C /* Buffer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Buffer.swift; path = RxSwift/Observables/Implementations/Buffer.swift; sourceTree = ""; }; + 55A20BFFF5369A00113A30E4B7F15842 /* Multicast.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Multicast.swift; path = RxSwift/Observables/Implementations/Multicast.swift; sourceTree = ""; }; + 55AFE841CAB03336F9EE30E219DB303F /* UITabBar+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UITabBar+Rx.swift"; path = "RxCocoa/iOS/UITabBar+Rx.swift"; sourceTree = ""; }; 565CD1E58D0CC2C71D1273BA6C4972FF /* Pods-PokedexGo-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-PokedexGo-acknowledgements.markdown"; sourceTree = ""; }; - 56CD2AB385BBA88DE1DE00A07B0CA260 /* Repeat.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Repeat.swift; path = RxSwift/Observables/Implementations/Repeat.swift; sourceTree = ""; }; - 56D9D0405D1B795B6655805AC1CC4429 /* Filter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Filter.swift; path = RxSwift/Observables/Implementations/Filter.swift; sourceTree = ""; }; - 58AB0072B17C75AB1A21ECC38A91ACA1 /* Using.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Using.swift; path = RxSwift/Observables/Implementations/Using.swift; sourceTree = ""; }; - 58ECDE291B6C4966870B10DAAAC54753 /* ReplaySubject.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ReplaySubject.swift; path = RxSwift/Subjects/ReplaySubject.swift; sourceTree = ""; }; - 58F525F5B278210733C9EFC92FFEE06C /* UINavigationItem+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UINavigationItem+Rx.swift"; path = "RxCocoa/iOS/UINavigationItem+Rx.swift"; sourceTree = ""; }; - 58F5BFFF06B17780F8789D51CED460B1 /* Buffer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Buffer.swift; path = RxSwift/Observables/Implementations/Buffer.swift; sourceTree = ""; }; - 5912F2821234C2DC94784AB7BA0E7F3E /* _RX.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = _RX.h; path = RxCocoa/Common/_RX.h; sourceTree = ""; }; - 59C8995F28CDF1F322C4DE32ED3DD05E /* UITableView+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UITableView+Rx.swift"; path = "RxCocoa/iOS/UITableView+Rx.swift"; sourceTree = ""; }; - 59CA3C0ABB91378BF6FE484D94481D88 /* AnonymousDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AnonymousDisposable.swift; path = RxSwift/Disposables/AnonymousDisposable.swift; sourceTree = ""; }; - 5AE9D22F7092B5D8E7E9F479D6B48A32 /* Pods_PokedexGo.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_PokedexGo.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 5AF7610675E023203BE8EEE19C0F3F40 /* Variable+Driver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Variable+Driver.swift"; path = "RxCocoa/Common/CocoaUnits/Driver/Variable+Driver.swift"; sourceTree = ""; }; - 5B14971A9FD6B467BD6C09B2379A9395 /* Driver+Operators.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Driver+Operators.swift"; path = "RxCocoa/Common/CocoaUnits/Driver/Driver+Operators.swift"; sourceTree = ""; }; - 5B20CE34F081F11DCAF386BDBD06A858 /* RetryWhen.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RetryWhen.swift; path = RxSwift/Observables/Implementations/RetryWhen.swift; sourceTree = ""; }; - 5B9F3F843F9671E9FD1952F33BCE7253 /* UIPickerView+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIPickerView+Rx.swift"; path = "RxCocoa/iOS/UIPickerView+Rx.swift"; sourceTree = ""; }; - 5BD593F3D0565668D7CC5990CE36818C /* Platform.Darwin.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Platform.Darwin.swift; path = RxSwift/Platform/Platform.Darwin.swift; sourceTree = ""; }; - 5C939E6C52D2B5B921536AB609A6DF9A /* UIGestureRecognizer+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIGestureRecognizer+Rx.swift"; path = "RxCocoa/iOS/UIGestureRecognizer+Rx.swift"; sourceTree = ""; }; - 5D4B079C6BF22EB60FB4059831740F9A /* KVORepresentable+Swift.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "KVORepresentable+Swift.swift"; path = "RxCocoa/Common/KVORepresentable+Swift.swift"; sourceTree = ""; }; - 5E09E844F9BC7D5598D6EF366D27BCA9 /* Switch.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Switch.swift; path = RxSwift/Observables/Implementations/Switch.swift; sourceTree = ""; }; - 5E3556A091491F30496F2E31FD3DCCAF /* Skip.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Skip.swift; path = RxSwift/Observables/Implementations/Skip.swift; sourceTree = ""; }; - 5E76C507568E7ADA82A3ED8A726F5358 /* Observable+Creation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Observable+Creation.swift"; path = "RxSwift/Observables/Observable+Creation.swift"; sourceTree = ""; }; - 5E99330FCEF837CF0D351DB099579357 /* UIControl+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIControl+Rx.swift"; path = "RxCocoa/iOS/UIControl+Rx.swift"; sourceTree = ""; }; - 5FAF129F0D5E633DA019E3F6BD799E0B /* ShareReplay1WhileConnected.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ShareReplay1WhileConnected.swift; path = RxSwift/Observables/Implementations/ShareReplay1WhileConnected.swift; sourceTree = ""; }; - 601AE0DC6A3E86F516609C6D06CB60E2 /* UILabel+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UILabel+Rx.swift"; path = "RxCocoa/iOS/UILabel+Rx.swift"; sourceTree = ""; }; - 60A3F4FA5EC0032B138E22C350C8571D /* HistoricalScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HistoricalScheduler.swift; path = RxSwift/Schedulers/HistoricalScheduler.swift; sourceTree = ""; }; - 614501176A095DC28303FD6091BAF437 /* ConnectableObservableType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConnectableObservableType.swift; path = RxSwift/ConnectableObservableType.swift; sourceTree = ""; }; - 622E80E3BE45B199242F59CB43CB499B /* _RXObjCRuntime.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = _RXObjCRuntime.h; path = RxCocoa/Common/_RXObjCRuntime.h; sourceTree = ""; }; - 63DA3DD4CA65031F9D6C2404057153C5 /* Logging.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Logging.swift; path = RxCocoa/Common/Logging.swift; sourceTree = ""; }; - 643BFED33D2FF050AB233EDE00E2796B /* Errors.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Errors.swift; path = RxSwift/Errors.swift; sourceTree = ""; }; - 659A04497CFF6C207849FC691F605817 /* ElementAt.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ElementAt.swift; path = RxSwift/Observables/Implementations/ElementAt.swift; sourceTree = ""; }; - 668941189481BE4222233E27880CEAD4 /* RxCocoa.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = RxCocoa.xcconfig; sourceTree = ""; }; - 67A7308A253850F00B05819855D27377 /* _RXObjCRuntime.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = _RXObjCRuntime.m; path = RxCocoa/Common/_RXObjCRuntime.m; sourceTree = ""; }; - 67C395039E40CCBAAF192350C12B9B6A /* RxScrollViewDelegateProxy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxScrollViewDelegateProxy.swift; path = RxCocoa/iOS/Proxies/RxScrollViewDelegateProxy.swift; sourceTree = ""; }; - 67E42E4C26C38702416C0FA860FE4966 /* Empty.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Empty.swift; path = RxSwift/Observables/Implementations/Empty.swift; sourceTree = ""; }; - 68902A22C3070C8404E89BEF8A6F5FE5 /* RxTableViewDataSourceProxy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxTableViewDataSourceProxy.swift; path = RxCocoa/iOS/Proxies/RxTableViewDataSourceProxy.swift; sourceTree = ""; }; + 574D04700F1188B0D770FD0D7BE084D8 /* RxSwift.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = RxSwift.xcconfig; sourceTree = ""; }; + 57C98EC1D350E642FD6513F7DC84A7B7 /* Map.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Map.swift; path = RxSwift/Observables/Implementations/Map.swift; sourceTree = ""; }; + 586104488AC56629FFE01E4729C93D2F /* RefCountDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RefCountDisposable.swift; path = RxSwift/Disposables/RefCountDisposable.swift; sourceTree = ""; }; + 58B871E4C2567F0F4779EF41BA4CEC0E /* CombineLatest+arity.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "CombineLatest+arity.swift"; path = "RxSwift/Observables/Implementations/CombineLatest+arity.swift"; sourceTree = ""; }; + 58BB980A41382A481029292D36611E1F /* RxTableViewDelegateProxy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxTableViewDelegateProxy.swift; path = RxCocoa/iOS/Proxies/RxTableViewDelegateProxy.swift; sourceTree = ""; }; + 5AE9D22F7092B5D8E7E9F479D6B48A32 /* Pods_PokedexGo.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_PokedexGo.framework; path = "Pods-PokedexGo.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; + 5C3EDF144FD709E2DDA039349EE33AFE /* _RXDelegateProxy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = _RXDelegateProxy.m; path = RxCocoa/Runtime/_RXDelegateProxy.m; sourceTree = ""; }; + 5E64EE928569D9CE1F1B07ECF93FEA6D /* ObservableType+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "ObservableType+Extensions.swift"; path = "RxSwift/ObservableType+Extensions.swift"; sourceTree = ""; }; + 5F16912A8FB1C45DBFADC2B5B479072A /* ReplaySubject.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ReplaySubject.swift; path = RxSwift/Subjects/ReplaySubject.swift; sourceTree = ""; }; + 5F286BF9AEB10DD62CD1CF950796B015 /* UITabBarItem+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UITabBarItem+Rx.swift"; path = "RxCocoa/iOS/UITabBarItem+Rx.swift"; sourceTree = ""; }; + 5FBD523F1A092AD394DD5292F1ECB3EC /* Errors.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Errors.swift; path = RxSwift/Errors.swift; sourceTree = ""; }; + 60C321E6B0BC2E19F7F38DD6F2C09E62 /* SubjectType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SubjectType.swift; path = RxSwift/Subjects/SubjectType.swift; sourceTree = ""; }; + 610DB064B05FCBD4916354840E5F3BB9 /* Sequence.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Sequence.swift; path = RxSwift/Observables/Implementations/Sequence.swift; sourceTree = ""; }; + 6349A034EDF8823A796F029B3FC91AB1 /* SerialDispatchQueueScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SerialDispatchQueueScheduler.swift; path = RxSwift/Schedulers/SerialDispatchQueueScheduler.swift; sourceTree = ""; }; + 6379DC98FC6B0CAF284139D189FD8DA4 /* UIProgressView+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIProgressView+Rx.swift"; path = "RxCocoa/iOS/UIProgressView+Rx.swift"; sourceTree = ""; }; + 63A4ACA827648C32714CC30BD1C8ACFF /* Disposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Disposable.swift; path = RxSwift/Disposable.swift; sourceTree = ""; }; + 68392D6EEA0ED3393891F448EC65B15F /* AnonymousObservable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AnonymousObservable.swift; path = RxSwift/Observables/Implementations/AnonymousObservable.swift; sourceTree = ""; }; 68E8AFAC8943C7A672969B2024AB0A76 /* Pods-PokedexGo-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-PokedexGo-resources.sh"; sourceTree = ""; }; - 692544D6FE00282284D2344E91536B0F /* Platform.Linux.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Platform.Linux.swift; path = RxSwift/Platform/Platform.Linux.swift; sourceTree = ""; }; - 69A4F803D759819D60EA7B093FEBBE3E /* Driver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Driver.swift; path = RxCocoa/Common/CocoaUnits/Driver/Driver.swift; sourceTree = ""; }; - 6B71409803A083925CFBC4C15E50F28A /* RxTableViewDelegateProxy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxTableViewDelegateProxy.swift; path = RxCocoa/iOS/Proxies/RxTableViewDelegateProxy.swift; sourceTree = ""; }; - 6C948102FFA85AF99FA4BDC4B31CEF66 /* ControlEvent+Driver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "ControlEvent+Driver.swift"; path = "RxCocoa/Common/CocoaUnits/Driver/ControlEvent+Driver.swift"; sourceTree = ""; }; - 6D0291CEF66C870D5E9E719C0EA72C1B /* UIBindingObserver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = UIBindingObserver.swift; path = RxCocoa/Common/CocoaUnits/UIBindingObserver.swift; sourceTree = ""; }; - 6EB6106BD2433BD6C6302174B3572DF5 /* Disposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Disposable.swift; path = RxSwift/Disposable.swift; sourceTree = ""; }; - 6FA875C719138BA80C24ECFC28FDBF53 /* SynchronizedUnsubscribeType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SynchronizedUnsubscribeType.swift; path = RxSwift/Concurrency/SynchronizedUnsubscribeType.swift; sourceTree = ""; }; - 7120F33703B8BB8862848546B1FD3393 /* Zip+arity.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Zip+arity.swift"; path = "RxSwift/Observables/Implementations/Zip+arity.swift"; sourceTree = ""; }; - 7154F41F690DF671B3D84AA233D0EF4F /* RxPickerViewDelegateProxy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxPickerViewDelegateProxy.swift; path = RxCocoa/iOS/Proxies/RxPickerViewDelegateProxy.swift; sourceTree = ""; }; - 73D332413223B3E4D33CDBF39A1C0F62 /* RxCollectionViewDelegateProxy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxCollectionViewDelegateProxy.swift; path = RxCocoa/iOS/Proxies/RxCollectionViewDelegateProxy.swift; sourceTree = ""; }; - 75BB3296A6C3E9773C545F0323C2659E /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.3.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; - 763DCEB0D5A66E991CC1B858DDC91E5F /* KVORepresentable+CoreGraphics.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "KVORepresentable+CoreGraphics.swift"; path = "RxCocoa/Common/KVORepresentable+CoreGraphics.swift"; sourceTree = ""; }; - 765B1BE6E4F79831A8A7224E12E11764 /* ItemEvents.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ItemEvents.swift; path = RxCocoa/iOS/Events/ItemEvents.swift; sourceTree = ""; }; - 77092120A3A3512BD4BC7DD2BF7F07B5 /* Observable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Observable.swift; path = RxSwift/Observable.swift; sourceTree = ""; }; - 78D9CB1DCF4A368A286D9D843A1A4000 /* LockOwnerType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LockOwnerType.swift; path = RxSwift/Concurrency/LockOwnerType.swift; sourceTree = ""; }; - 7A3E07C7438E3C2F64512F819995155B /* RxTableViewReactiveArrayDataSource.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxTableViewReactiveArrayDataSource.swift; path = RxCocoa/iOS/DataSources/RxTableViewReactiveArrayDataSource.swift; sourceTree = ""; }; - 7B207B09ACA2B7C1A5955D4A670DF155 /* Debunce.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Debunce.swift; path = RxSwift/Observables/Implementations/Debunce.swift; sourceTree = ""; }; - 7C919C040B85DF8BA3198306E66C6217 /* CompositeDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CompositeDisposable.swift; path = RxSwift/Disposables/CompositeDisposable.swift; sourceTree = ""; }; - 7CADEFCECC0EB186A12C0B291342D1CC /* UIApplication+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIApplication+Rx.swift"; path = "RxCocoa/iOS/UIApplication+Rx.swift"; sourceTree = ""; }; - 7D320004447B001CBF0382B778DA6BEB /* UISegmentedControl+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UISegmentedControl+Rx.swift"; path = "RxCocoa/iOS/UISegmentedControl+Rx.swift"; sourceTree = ""; }; - 7F48A7A2FF100CA7C630D332D34B7F3D /* RxCollectionViewDataSourceProxy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxCollectionViewDataSourceProxy.swift; path = RxCocoa/iOS/Proxies/RxCollectionViewDataSourceProxy.swift; sourceTree = ""; }; - 7F73756FE68B6364B365C9083D70B121 /* NSObject+Rx+RawRepresentable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSObject+Rx+RawRepresentable.swift"; path = "RxCocoa/Common/Observables/NSObject+Rx+RawRepresentable.swift"; sourceTree = ""; }; - 7F9CB9AD270F4ADB7C1CF43E412EFB8B /* Timeout.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Timeout.swift; path = RxSwift/Observables/Implementations/Timeout.swift; sourceTree = ""; }; - 804BC3384434439D1B1A243BE02DAD4A /* AsyncLock.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AsyncLock.swift; path = RxSwift/Concurrency/AsyncLock.swift; sourceTree = ""; }; - 80671F727A9868EBE4018ED741F933D5 /* ObservableType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ObservableType.swift; path = RxSwift/ObservableType.swift; sourceTree = ""; }; - 8159E4F028E7BA3CFBDD0AE376E74D30 /* RxSwift-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "RxSwift-prefix.pch"; sourceTree = ""; }; - 815BE4D54328DCCC3EC688E99D515B84 /* SynchronizedDisposeType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SynchronizedDisposeType.swift; path = RxSwift/Concurrency/SynchronizedDisposeType.swift; sourceTree = ""; }; - 83C0B77EBE2FB832EAE703B2C7CBC016 /* SchedulerType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SchedulerType.swift; path = RxSwift/SchedulerType.swift; sourceTree = ""; }; - 86CAE837680F6C8A2BDE31076089C27D /* RxSwift.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RxSwift.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 86FF2384DCA4A4841ADF1FC2C0A9B331 /* InvocableType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = InvocableType.swift; path = RxSwift/Schedulers/Internal/InvocableType.swift; sourceTree = ""; }; - 875AD7325E306F32D856D41E705AFBE8 /* String+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "String+Rx.swift"; path = "RxSwift/Extensions/String+Rx.swift"; sourceTree = ""; }; - 8AD5AD248511D190A6E701665766BBDD /* SectionedViewDataSourceType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SectionedViewDataSourceType.swift; path = RxCocoa/Common/SectionedViewDataSourceType.swift; sourceTree = ""; }; - 8CD370C39CCD9BFAD67AB8BD32F90797 /* Generate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Generate.swift; path = RxSwift/Observables/Implementations/Generate.swift; sourceTree = ""; }; - 8CDB77694CD9C3932E642FFB98BD6507 /* AddRef.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AddRef.swift; path = RxSwift/Observables/Implementations/AddRef.swift; sourceTree = ""; }; - 8DB2248BB5C162FE70B6060C71BC1BA7 /* RxSwift.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = RxSwift.xcconfig; sourceTree = ""; }; - 8E928C29A41850F7AC97548FE0213AF0 /* TakeWhile.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TakeWhile.swift; path = RxSwift/Observables/Implementations/TakeWhile.swift; sourceTree = ""; }; - 8F597BF92F8C72C9FD96C8DAE1655E9B /* DisposeBag.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DisposeBag.swift; path = RxSwift/Disposables/DisposeBag.swift; sourceTree = ""; }; - 91424C7C57633DD3F57059F4E54A7DA0 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 9175FC6544DCDA825575330E821C7D3F /* UITabBar+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UITabBar+Rx.swift"; path = "RxCocoa/iOS/UITabBar+Rx.swift"; sourceTree = ""; }; - 923D369B7E87DEBE70A5D19C80932394 /* NopDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NopDisposable.swift; path = RxSwift/Disposables/NopDisposable.swift; sourceTree = ""; }; - 93307CD2F54897156D970EBDF97FA4F6 /* ObserverType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ObserverType.swift; path = RxSwift/ObserverType.swift; sourceTree = ""; }; - 934E59DFC7BBF5FBC3A87F0CE7EA73C3 /* UIActivityIndicatorView+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIActivityIndicatorView+Rx.swift"; path = "RxCocoa/iOS/UIActivityIndicatorView+Rx.swift"; sourceTree = ""; }; - 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; - 945831043EEFA936E358129A58ED1C11 /* NSObject+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSObject+Rx.swift"; path = "RxCocoa/Common/Observables/NSObject+Rx.swift"; sourceTree = ""; }; - 974451D2E3E510B8E8A63654E04ACDD5 /* Lock.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Lock.swift; path = RxSwift/Concurrency/Lock.swift; sourceTree = ""; }; - 9909A3B04F5BD9E0986A29DF4B5C9934 /* ObserveOnSerialDispatchQueue.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ObserveOnSerialDispatchQueue.swift; path = RxSwift/Observables/Implementations/ObserveOnSerialDispatchQueue.swift; sourceTree = ""; }; - 9A58EC30FC7221C14AC9ACB41355285E /* SkipUntil.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SkipUntil.swift; path = RxSwift/Observables/Implementations/SkipUntil.swift; sourceTree = ""; }; - 9AC9BD3FAF4ABFC987FFA707AB9FCB90 /* _RXDelegateProxy.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = _RXDelegateProxy.h; path = RxCocoa/Common/_RXDelegateProxy.h; sourceTree = ""; }; - 9E6D9A74A10BE89BAE9BD57C3C3EF0B5 /* OperationQueueScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = OperationQueueScheduler.swift; path = RxSwift/Schedulers/OperationQueueScheduler.swift; sourceTree = ""; }; - 9E727D5CC6EEBE70CCC6502058E01F37 /* NSTextStorage+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSTextStorage+Rx.swift"; path = "RxCocoa/iOS/NSTextStorage+Rx.swift"; sourceTree = ""; }; - 9FE90752083D12290474BC5BAA176969 /* Observable+Aggregate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Observable+Aggregate.swift"; path = "RxSwift/Observables/Observable+Aggregate.swift"; sourceTree = ""; }; - A056920DC5F216195680972D62F4E985 /* Timer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Timer.swift; path = RxSwift/Observables/Implementations/Timer.swift; sourceTree = ""; }; - A070DEC2D90F2C3579F76D9FE69599F5 /* _RXKVOObserver.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = _RXKVOObserver.m; path = RxCocoa/Common/_RXKVOObserver.m; sourceTree = ""; }; - A0D835DD2D2251EAB0B27F31CB72B341 /* Multicast.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Multicast.swift; path = RxSwift/Observables/Implementations/Multicast.swift; sourceTree = ""; }; - A1DD88DD612366A084B53815C8B8EC26 /* StableCompositeDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StableCompositeDisposable.swift; path = RxSwift/Disposables/StableCompositeDisposable.swift; sourceTree = ""; }; - A45E326290449ED1728E999DE8CD3CE2 /* VirtualTimeScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = VirtualTimeScheduler.swift; path = RxSwift/Schedulers/VirtualTimeScheduler.swift; sourceTree = ""; }; - A63EFF26965AFE7FFE18E68C039E6555 /* _RXKVOObserver.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = _RXKVOObserver.h; path = RxCocoa/Common/_RXKVOObserver.h; sourceTree = ""; }; - A6CAB229EDDF2297965B52C92A2B5A76 /* RxTarget.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxTarget.swift; path = RxCocoa/Common/RxTarget.swift; sourceTree = ""; }; - A9D1250F3B0AF2AF712290A1D5F29022 /* SchedulerServices+Emulation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "SchedulerServices+Emulation.swift"; path = "RxSwift/Schedulers/SchedulerServices+Emulation.swift"; sourceTree = ""; }; - AD661F853C0E03E91523D62109EFAE7E /* RefCountDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RefCountDisposable.swift; path = RxSwift/Disposables/RefCountDisposable.swift; sourceTree = ""; }; - AD760FDEF3325452D1956E31DA16DF94 /* SingleAsync.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SingleAsync.swift; path = RxSwift/Observables/Implementations/SingleAsync.swift; sourceTree = ""; }; - AEA91F7AF9BF7F6119E6D1CFBA138B64 /* ObservableType+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "ObservableType+Extensions.swift"; path = "RxSwift/ObservableType+Extensions.swift"; sourceTree = ""; }; - B19D13BC17648E846D58611097F395F6 /* InvocableScheduledItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = InvocableScheduledItem.swift; path = RxSwift/Schedulers/Internal/InvocableScheduledItem.swift; sourceTree = ""; }; - B23153EC62F1F9EA1CEB3C4F8B959BA6 /* CombineLatest.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CombineLatest.swift; path = RxSwift/Observables/Implementations/CombineLatest.swift; sourceTree = ""; }; - B26E3722D77F9BA616724AD27F4B8306 /* Observable+Binding.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Observable+Binding.swift"; path = "RxSwift/Observables/Observable+Binding.swift"; sourceTree = ""; }; - B323F07EDFADF3FA093F86A088170A96 /* UIAlertAction+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIAlertAction+Rx.swift"; path = "RxCocoa/iOS/UIAlertAction+Rx.swift"; sourceTree = ""; }; - B3F95B7A11DFE661FB160F43DBA4B0B4 /* Observable+StandardSequenceOperators.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Observable+StandardSequenceOperators.swift"; path = "RxSwift/Observables/Observable+StandardSequenceOperators.swift"; sourceTree = ""; }; - B4E71A7E8F33A5D0D3B543950D968DCC /* Throttle.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Throttle.swift; path = RxSwift/Observables/Implementations/Throttle.swift; sourceTree = ""; }; - B4EDF14B3F8E3980581A28E403F9D60F /* Event.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Event.swift; path = RxSwift/Event.swift; sourceTree = ""; }; - B58B58F4778B78D196858693A192BFEC /* Queue.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Queue.swift; path = RxSwift/DataStructures/Queue.swift; sourceTree = ""; }; - B5DBAF6BF762831583034F466DD72623 /* RxCocoa.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RxCocoa.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - B6709E98277C4B1371C21EEF7734944C /* DelaySubscription.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DelaySubscription.swift; path = RxSwift/Observables/Implementations/DelaySubscription.swift; sourceTree = ""; }; - B6E3FBE0F1D7C28F9585CE363E110E1E /* BinaryDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BinaryDisposable.swift; path = RxSwift/Disposables/BinaryDisposable.swift; sourceTree = ""; }; - B9E7251AB28157263C195FC6E7D0D6A8 /* DelegateProxy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DelegateProxy.swift; path = RxCocoa/Common/DelegateProxy.swift; sourceTree = ""; }; - BB9FB80A2BE7A2D6D2CEBC2DA6C23241 /* NSLayoutConstraint+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSLayoutConstraint+Rx.swift"; path = "RxCocoa/Common/NSLayoutConstraint+Rx.swift"; sourceTree = ""; }; - BC83E68B8055E29D4512897B677B4A6E /* Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Rx.swift; path = RxSwift/Rx.swift; sourceTree = ""; }; - BE6847941FEFEBAD130A00A342EB2462 /* RecursiveScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RecursiveScheduler.swift; path = RxSwift/Schedulers/RecursiveScheduler.swift; sourceTree = ""; }; - BEAE74107F4B28F464DC349437C5F181 /* SerialDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SerialDisposable.swift; path = RxSwift/Disposables/SerialDisposable.swift; sourceTree = ""; }; - C012DED32C78F3BC4893FBB11ADB1866 /* CombineLatest+arity.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "CombineLatest+arity.swift"; path = "RxSwift/Observables/Implementations/CombineLatest+arity.swift"; sourceTree = ""; }; - C04FFC0F79AC98E453AA5ECC691D397A /* UIRefreshControl+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIRefreshControl+Rx.swift"; path = "RxCocoa/iOS/UIRefreshControl+Rx.swift"; sourceTree = ""; }; - C09A7A805374E513BC23516FE2414379 /* DispatchQueueConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DispatchQueueConfiguration.swift; path = RxSwift/Schedulers/Internal/DispatchQueueConfiguration.swift; sourceTree = ""; }; - C0FAFF56A663DBECFB5CCB4D170959B3 /* RxSearchBarDelegateProxy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxSearchBarDelegateProxy.swift; path = RxCocoa/iOS/Proxies/RxSearchBarDelegateProxy.swift; sourceTree = ""; }; - C24EA368C4E55B5D1ADDAFB78767AB90 /* MessageSentObserver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = MessageSentObserver.swift; path = RxCocoa/Common/Observables/Implementations/MessageSentObserver.swift; sourceTree = ""; }; - C2FFC8DFE23B2D54E75C8888A95AA6C1 /* Observable+Bind.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Observable+Bind.swift"; path = "RxCocoa/Common/Observable+Bind.swift"; sourceTree = ""; }; - C4D0141EACF4F5D67D5961B4AA466A47 /* AnonymousInvocable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AnonymousInvocable.swift; path = RxSwift/Schedulers/Internal/AnonymousInvocable.swift; sourceTree = ""; }; - C642634FB859E1CBD5D098944AA629E7 /* VirtualTimeConverterType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = VirtualTimeConverterType.swift; path = RxSwift/Schedulers/VirtualTimeConverterType.swift; sourceTree = ""; }; - C7715463243BDD5175442CD871B06B2C /* RxCollectionViewReactiveArrayDataSource.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxCollectionViewReactiveArrayDataSource.swift; path = RxCocoa/iOS/DataSources/RxCollectionViewReactiveArrayDataSource.swift; sourceTree = ""; }; - C7771C5D99A775DA150DF545D573C1EF /* Sample.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Sample.swift; path = RxSwift/Observables/Implementations/Sample.swift; sourceTree = ""; }; - C7CFFB1B95915EA0A6DEAC76D897C750 /* UISearchController+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UISearchController+Rx.swift"; path = "RxCocoa/iOS/UISearchController+Rx.swift"; sourceTree = ""; }; - CAF80653BBA27BB38CCC9ADB1B8989F7 /* Range.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Range.swift; path = RxSwift/Observables/Implementations/Range.swift; sourceTree = ""; }; + 6AB5988F61EF072B265241572954BDCF /* Debug.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Debug.swift; path = RxSwift/Observables/Implementations/Debug.swift; sourceTree = ""; }; + 6AC09569D823CC48FED33FF4592029CF /* Logging.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Logging.swift; path = RxCocoa/Foundation/Logging.swift; sourceTree = ""; }; + 6AE6BC71DAEFE73CEC12110AAF4933D0 /* Timer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Timer.swift; path = RxSwift/Observables/Implementations/Timer.swift; sourceTree = ""; }; + 6D25AAE822F5498D26DE6953DC295481 /* RxTableViewReactiveArrayDataSource.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxTableViewReactiveArrayDataSource.swift; path = RxCocoa/iOS/DataSources/RxTableViewReactiveArrayDataSource.swift; sourceTree = ""; }; + 6FB449CBDFAE6FD7EE6029B5BEFBFE5E /* SharedSequence+Operators+arity.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "SharedSequence+Operators+arity.swift"; path = "RxCocoa/CocoaUnits/SharedSequence/SharedSequence+Operators+arity.swift"; sourceTree = ""; }; + 703AFAD4C44A49D75794591FD54C09FC /* DistinctUntilChanged.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DistinctUntilChanged.swift; path = RxSwift/Observables/Implementations/DistinctUntilChanged.swift; sourceTree = ""; }; + 75783B38979EC3CF3F54AAF108D075E8 /* ConcurrentMainScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConcurrentMainScheduler.swift; path = RxSwift/Schedulers/ConcurrentMainScheduler.swift; sourceTree = ""; }; + 75ABE3C993505D8042AD462010472F26 /* SectionedViewDataSourceType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SectionedViewDataSourceType.swift; path = RxCocoa/Common/SectionedViewDataSourceType.swift; sourceTree = ""; }; + 769CCB9780B036CB1F097BC2E027FD0F /* SerialDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SerialDisposable.swift; path = RxSwift/Disposables/SerialDisposable.swift; sourceTree = ""; }; + 76F3D3BBF234D5C633588D9B4E75987C /* Error.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Error.swift; path = RxSwift/Observables/Implementations/Error.swift; sourceTree = ""; }; + 771BE5F88179512E7E55B1693BFDE338 /* Bag+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Bag+Rx.swift"; path = "RxSwift/Extensions/Bag+Rx.swift"; sourceTree = ""; }; + 772E2994B6C7F8AF414BCF19AF96C9CD /* Observable+StandardSequenceOperators.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Observable+StandardSequenceOperators.swift"; path = "RxSwift/Observables/Observable+StandardSequenceOperators.swift"; sourceTree = ""; }; + 782FC7557C91148E434A34BB30E17340 /* _RX.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = _RX.m; path = RxCocoa/Runtime/_RX.m; sourceTree = ""; }; + 785EBC3F90F0A66D18749E6F62C511CD /* ScheduledDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ScheduledDisposable.swift; path = RxSwift/Disposables/ScheduledDisposable.swift; sourceTree = ""; }; + 796281A7F1F3D29CE27096717B6AE3F7 /* Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Rx.swift; path = RxSwift/Rx.swift; sourceTree = ""; }; + 7AD6F3F3F6855D2DDD205D5E9C2FF90B /* AsyncLock.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AsyncLock.swift; path = RxSwift/Concurrency/AsyncLock.swift; sourceTree = ""; }; + 7B0EA98FA3B129968C423DB5EF0ABEF8 /* UIBarButtonItem+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIBarButtonItem+Rx.swift"; path = "RxCocoa/iOS/UIBarButtonItem+Rx.swift"; sourceTree = ""; }; + 7E5396250362A8B8FCE1C3628C7D789F /* DispatchQueue+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "DispatchQueue+Extensions.swift"; path = "Platform/DispatchQueue+Extensions.swift"; sourceTree = ""; }; + 80F462850F0C496E63D68311F38EB7B0 /* BinaryDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BinaryDisposable.swift; path = RxSwift/Disposables/BinaryDisposable.swift; sourceTree = ""; }; + 83ECFEBCF63AD537C7DEAF180BC8E0E8 /* NSObject+Rx+RawRepresentable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSObject+Rx+RawRepresentable.swift"; path = "RxCocoa/Foundation/NSObject+Rx+RawRepresentable.swift"; sourceTree = ""; }; + 85B6BBFDBD71085797E59200F2F66563 /* RxSwift-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "RxSwift-prefix.pch"; sourceTree = ""; }; + 864CE2D64C2CB6BAF14E112E648566F7 /* Observable+Multiple.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Observable+Multiple.swift"; path = "RxSwift/Observables/Observable+Multiple.swift"; sourceTree = ""; }; + 86CAE837680F6C8A2BDE31076089C27D /* RxSwift.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = RxSwift.framework; path = RxSwift.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 87BC050FB87821C41A468209D2009104 /* RxCocoa.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RxCocoa.h; path = RxCocoa/RxCocoa.h; sourceTree = ""; }; + 87FCD9ED2C7E8DF83D4C84940FF4D5D5 /* Skip.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Skip.swift; path = RxSwift/Observables/Implementations/Skip.swift; sourceTree = ""; }; + 8A28F295BCB3239E3D8E97C8253DEF32 /* RxScrollViewDelegateProxy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxScrollViewDelegateProxy.swift; path = RxCocoa/iOS/Proxies/RxScrollViewDelegateProxy.swift; sourceTree = ""; }; + 8DA1E31F9BB5BC5A606A2C48ECE47B24 /* Reduce.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Reduce.swift; path = RxSwift/Observables/Implementations/Reduce.swift; sourceTree = ""; }; + 8F942E49DBEB13C498BFF44B05FBFF97 /* RxCocoa-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "RxCocoa-dummy.m"; sourceTree = ""; }; + 901947D2C0E18FFE2271B6FD7F73BB9A /* UIBindingObserver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = UIBindingObserver.swift; path = RxCocoa/CocoaUnits/UIBindingObserver.swift; sourceTree = ""; }; + 90897DE0AF5AED02A7EE2AC32B3E4F3B /* Using.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Using.swift; path = RxSwift/Observables/Implementations/Using.swift; sourceTree = ""; }; + 92099190C99C0C391E3B475FA824CA7B /* UILabel+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UILabel+Rx.swift"; path = "RxCocoa/iOS/UILabel+Rx.swift"; sourceTree = ""; }; + 934C51BE545B2C1E082E7D38BE92D043 /* PriorityQueue.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PriorityQueue.swift; path = Platform/DataStructures/PriorityQueue.swift; sourceTree = ""; }; + 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; + 9466E765E5E6CE61C67AC9380B9DB093 /* AddRef.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AddRef.swift; path = RxSwift/Observables/Implementations/AddRef.swift; sourceTree = ""; }; + 95BDAA537E0F690A0B8FED31611B5D85 /* SharedSequence.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SharedSequence.swift; path = RxCocoa/CocoaUnits/SharedSequence/SharedSequence.swift; sourceTree = ""; }; + 960737347ABB0497D5D165AF6F04383D /* RxPickerViewDelegateProxy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxPickerViewDelegateProxy.swift; path = RxCocoa/iOS/Proxies/RxPickerViewDelegateProxy.swift; sourceTree = ""; }; + 9613FBA8885E8CDF0C27E2941C96A0BB /* UISearchController+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UISearchController+Rx.swift"; path = "RxCocoa/iOS/UISearchController+Rx.swift"; sourceTree = ""; }; + 97627C4204F674A421353E2CC5C35C59 /* OperationQueueScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = OperationQueueScheduler.swift; path = RxSwift/Schedulers/OperationQueueScheduler.swift; sourceTree = ""; }; + 98B128798CB6E65617AC3DA66FE5C6FC /* UISlider+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UISlider+Rx.swift"; path = "RxCocoa/iOS/UISlider+Rx.swift"; sourceTree = ""; }; + 99AB1D099C10F2E5620A6BDF34588975 /* Reactive.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Reactive.swift; path = RxSwift/Reactive.swift; sourceTree = ""; }; + 9B2526BF51A53AAF05BAC6CB090FE6EA /* Take.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Take.swift; path = RxSwift/Observables/Implementations/Take.swift; sourceTree = ""; }; + 9BE0D1B70A2AD1DA432E686EAC99DB0D /* ObservableConvertibleType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ObservableConvertibleType.swift; path = RxSwift/ObservableConvertibleType.swift; sourceTree = ""; }; + 9C2D178E75F7BE054DFB902ECC4E1A7A /* RxCocoaRuntime.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = RxCocoaRuntime.h; path = RxCocoa/Runtime/include/RxCocoaRuntime.h; sourceTree = ""; }; + 9CEFCBF2EC15CC86F7A0399EC348D23D /* UINavigationItem+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UINavigationItem+Rx.swift"; path = "RxCocoa/iOS/UINavigationItem+Rx.swift"; sourceTree = ""; }; + 9DCFB51A1C7EA0AC6AD367B4C3872DA1 /* Zip+Collection.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Zip+Collection.swift"; path = "RxSwift/Observables/Implementations/Zip+Collection.swift"; sourceTree = ""; }; + 9E6D96B5553D499A43AC75B225DDA1B0 /* DelegateProxy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DelegateProxy.swift; path = RxCocoa/Common/DelegateProxy.swift; sourceTree = ""; }; + 9ECCB50F74580AB2A9E02A3B96EF07BB /* RecursiveScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RecursiveScheduler.swift; path = RxSwift/Schedulers/RecursiveScheduler.swift; sourceTree = ""; }; + 9EDE28D1EE46BE33F7AD632B68E1E56A /* DisposeBag.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DisposeBag.swift; path = RxSwift/Disposables/DisposeBag.swift; sourceTree = ""; }; + 9F11A7D0074CE30A7AB58FD1A7200979 /* PublishSubject.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PublishSubject.swift; path = RxSwift/Subjects/PublishSubject.swift; sourceTree = ""; }; + 9F8D42C676712C383D2B710A1F35C6F7 /* RxTabBarDelegateProxy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxTabBarDelegateProxy.swift; path = RxCocoa/iOS/Proxies/RxTabBarDelegateProxy.swift; sourceTree = ""; }; + A2679310F5C1EFC93514C61E7D4946C9 /* UIAlertAction+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIAlertAction+Rx.swift"; path = "RxCocoa/iOS/UIAlertAction+Rx.swift"; sourceTree = ""; }; + A3FBA08BED4CF780F286F7C578ABE18D /* Concat.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Concat.swift; path = RxSwift/Observables/Implementations/Concat.swift; sourceTree = ""; }; + A45777551AC14459252CB963743F760D /* KVORepresentable+CoreGraphics.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "KVORepresentable+CoreGraphics.swift"; path = "RxCocoa/Foundation/KVORepresentable+CoreGraphics.swift"; sourceTree = ""; }; + A4FC7AAE283EB68E81E9D97FDF1162BB /* Range.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Range.swift; path = RxSwift/Observables/Implementations/Range.swift; sourceTree = ""; }; + A54D6A8E2EA2035685149FA65AE9DE1E /* NSNotificationCenter+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSNotificationCenter+Rx.swift"; path = "RxCocoa/Foundation/NSNotificationCenter+Rx.swift"; sourceTree = ""; }; + A550F2813AC8DAA63F881EBF2D00ADF1 /* Variable+SharedSequence.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Variable+SharedSequence.swift"; path = "RxCocoa/CocoaUnits/SharedSequence/Variable+SharedSequence.swift"; sourceTree = ""; }; + A6BF6EC7286419E2A0093926F0D54024 /* SingleAsync.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SingleAsync.swift; path = RxSwift/Observables/Implementations/SingleAsync.swift; sourceTree = ""; }; + A9CAD519CA31004643A5A6D099089890 /* AnyObserver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AnyObserver.swift; path = RxSwift/AnyObserver.swift; sourceTree = ""; }; + AAE171203123A28D26CC10698CA05898 /* Window.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Window.swift; path = RxSwift/Observables/Implementations/Window.swift; sourceTree = ""; }; + ABE1BFBE9D3B127015A516D9CB9F9F7E /* Observable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Observable.swift; path = RxSwift/Observable.swift; sourceTree = ""; }; + AC38374D82B1743060DCD93295E41C3D /* UIPageControl+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIPageControl+Rx.swift"; path = "RxCocoa/iOS/UIPageControl+Rx.swift"; sourceTree = ""; }; + AD7EED0AA031AA341A779500B334BD8A /* Zip.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Zip.swift; path = RxSwift/Observables/Implementations/Zip.swift; sourceTree = ""; }; + B109B815703349C9B6BB84A3259F9FD7 /* DelegateProxyType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DelegateProxyType.swift; path = RxCocoa/Common/DelegateProxyType.swift; sourceTree = ""; }; + B29D89D8E6B5E4D8F0779ED978A0A8C5 /* Throttle.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Throttle.swift; path = RxSwift/Observables/Implementations/Throttle.swift; sourceTree = ""; }; + B2DA51A804997AC8E091499D75D9B949 /* _RXKVOObserver.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = _RXKVOObserver.m; path = RxCocoa/Runtime/_RXKVOObserver.m; sourceTree = ""; }; + B35A50095178D9C3BC723C286B94F534 /* RxCollectionViewDelegateProxy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxCollectionViewDelegateProxy.swift; path = RxCocoa/iOS/Proxies/RxCollectionViewDelegateProxy.swift; sourceTree = ""; }; + B36737DB51F1433B35E27DAAADB90905 /* Just.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Just.swift; path = RxSwift/Observables/Implementations/Just.swift; sourceTree = ""; }; + B37CED7A1B33FD4AF9119A53F2C13769 /* UICollectionView+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UICollectionView+Rx.swift"; path = "RxCocoa/iOS/UICollectionView+Rx.swift"; sourceTree = ""; }; + B5DBAF6BF762831583034F466DD72623 /* RxCocoa.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = RxCocoa.framework; path = RxCocoa.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + B741543663BD6C9BAD832B9EE5B969BF /* Amb.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Amb.swift; path = RxSwift/Observables/Implementations/Amb.swift; sourceTree = ""; }; + B8B1297039F6EA16D423A90A12D7CC06 /* Queue.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Queue.swift; path = Platform/DataStructures/Queue.swift; sourceTree = ""; }; + BBFBC6C4B5DDDC7A22732AA51382F26D /* RxCocoa.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = RxCocoa.xcconfig; sourceTree = ""; }; + BC21BF5E703ACB95DC96961494CE91A1 /* NSLayoutConstraint+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSLayoutConstraint+Rx.swift"; path = "RxCocoa/Common/NSLayoutConstraint+Rx.swift"; sourceTree = ""; }; + BCD4BE4C69C97611CDD16209D2A26860 /* UIActivityIndicatorView+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIActivityIndicatorView+Rx.swift"; path = "RxCocoa/iOS/UIActivityIndicatorView+Rx.swift"; sourceTree = ""; }; + BE315409B48FCE8A0AC462617E487561 /* InvocableScheduledItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = InvocableScheduledItem.swift; path = RxSwift/Schedulers/Internal/InvocableScheduledItem.swift; sourceTree = ""; }; + BE6EDEF18E45893ED7529E82BE61D19F /* RxCollectionViewReactiveArrayDataSource.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxCollectionViewReactiveArrayDataSource.swift; path = RxCocoa/iOS/DataSources/RxCollectionViewReactiveArrayDataSource.swift; sourceTree = ""; }; + BE749C4F2DBA7A407D5B33D5DF514412 /* UISegmentedControl+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UISegmentedControl+Rx.swift"; path = "RxCocoa/iOS/UISegmentedControl+Rx.swift"; sourceTree = ""; }; + C0DDE7EC5814AA6C8E13CA02A487C60F /* _RXKVOObserver.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = _RXKVOObserver.h; path = RxCocoa/Runtime/include/_RXKVOObserver.h; sourceTree = ""; }; + C16C8AA6F97D21BFD0A3AF26373731E2 /* Scan.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Scan.swift; path = RxSwift/Observables/Implementations/Scan.swift; sourceTree = ""; }; + C17B264E2D2E13B18D5DEFA475D436F4 /* UIRefreshControl+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIRefreshControl+Rx.swift"; path = "RxCocoa/iOS/UIRefreshControl+Rx.swift"; sourceTree = ""; }; + C72045F1DD316A8D8D667EBBC62BCCAA /* CurrentThreadScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CurrentThreadScheduler.swift; path = RxSwift/Schedulers/CurrentThreadScheduler.swift; sourceTree = ""; }; + C895F323C80D99491E20AB3A88797A3B /* RxCocoaObjCRuntimeError+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "RxCocoaObjCRuntimeError+Extensions.swift"; path = "RxCocoa/Common/RxCocoaObjCRuntimeError+Extensions.swift"; sourceTree = ""; }; + CA37963CF786335E8A84A7085375C732 /* SkipUntil.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SkipUntil.swift; path = RxSwift/Observables/Implementations/SkipUntil.swift; sourceTree = ""; }; + CAFA3361761013BBC637D1DBBBFF0726 /* Event.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Event.swift; path = RxSwift/Event.swift; sourceTree = ""; }; + CBD99D2D368A3A8AFE7C5DA7E99FA61F /* Bag.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Bag.swift; path = Platform/DataStructures/Bag.swift; sourceTree = ""; }; CBDF46AB7FB36DFC8FC3DED831E475D9 /* Pods-PokedexGo-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-PokedexGo-frameworks.sh"; sourceTree = ""; }; - CC1D5F202F14E89C94DC8C8E9D3F2C35 /* Delay.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Delay.swift; path = RxSwift/Observables/Implementations/Delay.swift; sourceTree = ""; }; - CC4A87492F76B55135B5E95225CFE327 /* NSURLSession+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSURLSession+Rx.swift"; path = "RxCocoa/Common/Observables/NSURLSession+Rx.swift"; sourceTree = ""; }; - CCD947C828DA82D599B109870F06B1FA /* Merge.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Merge.swift; path = RxSwift/Observables/Implementations/Merge.swift; sourceTree = ""; }; + CBE355A845BA6A27C05F9442D9F089A2 /* UIButton+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIButton+Rx.swift"; path = "RxCocoa/iOS/UIButton+Rx.swift"; sourceTree = ""; }; + CCDB67B12D350E3712C3713A5DDC3AC1 /* UITextView+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UITextView+Rx.swift"; path = "RxCocoa/iOS/UITextView+Rx.swift"; sourceTree = ""; }; + CD056A186F36500A58F7BAB90D9785B0 /* UISearchBar+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UISearchBar+Rx.swift"; path = "RxCocoa/iOS/UISearchBar+Rx.swift"; sourceTree = ""; }; CD0C2708ACBC7809074D8DBFBAE2CF6F /* Pods-PokedexGo-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-PokedexGo-umbrella.h"; sourceTree = ""; }; - CE7470DD24D55539FE38B33354609932 /* Disposables.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Disposables.swift; path = RxSwift/Disposables/Disposables.swift; sourceTree = ""; }; - CF31863D0607B6C66F28E0D629CCD337 /* UIProgressView+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIProgressView+Rx.swift"; path = "RxCocoa/iOS/UIProgressView+Rx.swift"; sourceTree = ""; }; - D05B527152D8472611DE378D3CA32C5C /* UIView+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIView+Rx.swift"; path = "RxCocoa/iOS/UIView+Rx.swift"; sourceTree = ""; }; - D14F1E665D122388B423977C35B4E23C /* Cancelable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Cancelable.swift; path = RxSwift/Cancelable.swift; sourceTree = ""; }; - D1DDC1727726DF2FBA676B44135BAD22 /* Amb.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Amb.swift; path = RxSwift/Observables/Implementations/Amb.swift; sourceTree = ""; }; - D2E6D3537ED14D45E6751B0AD3FEBCCA /* StartWith.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = StartWith.swift; path = RxSwift/Observables/Implementations/StartWith.swift; sourceTree = ""; }; - D39FA6AC4938B92E4C0E1C3BFA0BBC38 /* UISwitch+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UISwitch+Rx.swift"; path = "RxCocoa/iOS/UISwitch+Rx.swift"; sourceTree = ""; }; - D402D1E02B23CC1DAFF711945E6C7C01 /* Error.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Error.swift; path = RxSwift/Observables/Implementations/Error.swift; sourceTree = ""; }; - D4B00B3C6C7431F4D4550AD43C84F160 /* BehaviorSubject.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BehaviorSubject.swift; path = RxSwift/Subjects/BehaviorSubject.swift; sourceTree = ""; }; - D5A426A280FBE79041A555EBDCC8F41B /* RxSwift.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = RxSwift.modulemap; sourceTree = ""; }; - D5F4E301F50554D39406C9FFC72A4E37 /* UIStepper+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIStepper+Rx.swift"; path = "RxCocoa/iOS/UIStepper+Rx.swift"; sourceTree = ""; }; - D6E65FFF0964AFA4A351C3DC3DCB3049 /* Do.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Do.swift; path = RxSwift/Observables/Implementations/Do.swift; sourceTree = ""; }; - DA042F18C4D096E30CA6636B17CEC3C4 /* CombineLatest+CollectionType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "CombineLatest+CollectionType.swift"; path = "RxSwift/Observables/Implementations/CombineLatest+CollectionType.swift"; sourceTree = ""; }; - DABE43FFA22A5DC6DB547C6A26CA3F12 /* ImmediateScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImmediateScheduler.swift; path = RxSwift/Schedulers/ImmediateScheduler.swift; sourceTree = ""; }; - DDDBDF06D1B6E91266A572AA103E794F /* RxCollectionViewDataSourceType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxCollectionViewDataSourceType.swift; path = RxCocoa/iOS/Protocols/RxCollectionViewDataSourceType.swift; sourceTree = ""; }; - DE59B946AC888EB09684FEE661093D15 /* RxSwift-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "RxSwift-dummy.m"; sourceTree = ""; }; - DF524EC65D9848AEED1A00F4EFB42E2A /* CurrentThreadScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CurrentThreadScheduler.swift; path = RxSwift/Schedulers/CurrentThreadScheduler.swift; sourceTree = ""; }; - DF856C60360336D059EF8E28D4E2D337 /* Sink.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Sink.swift; path = RxSwift/Observables/Implementations/Sink.swift; sourceTree = ""; }; - E1285CF0D4E016A4A056142FBCEC4BDB /* ScheduledDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ScheduledDisposable.swift; path = RxSwift/Disposables/ScheduledDisposable.swift; sourceTree = ""; }; - E14999237B0ADBAEE8885532CFF4C230 /* RxCocoa-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "RxCocoa-dummy.m"; sourceTree = ""; }; - E15CFC2139EC375288323D99AF8ED04F /* UITextView+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UITextView+Rx.swift"; path = "RxCocoa/iOS/UITextView+Rx.swift"; sourceTree = ""; }; - E1C16CDD1C24EF1E943954022D241AB1 /* ControlEvent.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ControlEvent.swift; path = RxCocoa/Common/CocoaUnits/ControlEvent.swift; sourceTree = ""; }; - E1C4AE2D0D182DAB04E7BC7722F8596B /* RxCocoa-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "RxCocoa-umbrella.h"; sourceTree = ""; }; - E3E6953D9F4B6EAC7C0C428E98BC2111 /* AnonymousObserver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AnonymousObserver.swift; path = RxSwift/Observers/AnonymousObserver.swift; sourceTree = ""; }; - E3EA8D80D27873339FD839408A4206D3 /* TakeUntil.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TakeUntil.swift; path = RxSwift/Observables/Implementations/TakeUntil.swift; sourceTree = ""; }; - E42385DC3EDBFE2B12B9925A28D2F600 /* SubscriptionDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SubscriptionDisposable.swift; path = RxSwift/Disposables/SubscriptionDisposable.swift; sourceTree = ""; }; - E68FEF97896DC2C7B815D611FE2A2997 /* UIScrollView+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIScrollView+Rx.swift"; path = "RxCocoa/iOS/UIScrollView+Rx.swift"; sourceTree = ""; }; - E7437F81B9A645215265A83BA900C24E /* Concat.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Concat.swift; path = RxSwift/Observables/Implementations/Concat.swift; sourceTree = ""; }; - E9CBA23DF232206FCB1D8C7619BBCF69 /* ToArray.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ToArray.swift; path = RxSwift/Observables/Implementations/ToArray.swift; sourceTree = ""; }; - EB11497F37FF7943862F286A1651D042 /* Bag.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Bag.swift; path = RxSwift/DataStructures/Bag.swift; sourceTree = ""; }; - EBA4D3419DA92747E9480E3892A0C2A1 /* RxSwift-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "RxSwift-umbrella.h"; sourceTree = ""; }; - EBA62AF7E35D7F2AA1960DCF36A8A854 /* InfiniteSequence.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = InfiniteSequence.swift; path = RxSwift/DataStructures/InfiniteSequence.swift; sourceTree = ""; }; - EDE391691D8B5DF2142BD6D8E5BED61C /* Producer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Producer.swift; path = RxSwift/Observables/Implementations/Producer.swift; sourceTree = ""; }; - EF62970ED89CFEB3578CE909A25AAAD7 /* KVOObserver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = KVOObserver.swift; path = RxCocoa/Common/Observables/Implementations/KVOObserver.swift; sourceTree = ""; }; - EF811611BEC6E64AEDFA7326DDB269C6 /* ShareReplay1.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ShareReplay1.swift; path = RxSwift/Observables/Implementations/ShareReplay1.swift; sourceTree = ""; }; - EFF6F9B62AB6F4362CE23C73E7687DA9 /* ConcurrentDispatchQueueScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConcurrentDispatchQueueScheduler.swift; path = RxSwift/Schedulers/ConcurrentDispatchQueueScheduler.swift; sourceTree = ""; }; - F122B20E85DCC0A43C1773DA9A43FD01 /* HistoricalSchedulerTimeConverter.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = HistoricalSchedulerTimeConverter.swift; path = RxSwift/Schedulers/HistoricalSchedulerTimeConverter.swift; sourceTree = ""; }; - F194F3656CC6F93A70571D3B8B010A40 /* ObserverBase.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ObserverBase.swift; path = RxSwift/Observers/ObserverBase.swift; sourceTree = ""; }; - F231F1E47F983ACDA69EFC946613F57A /* Sequence.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Sequence.swift; path = RxSwift/Observables/Implementations/Sequence.swift; sourceTree = ""; }; - F27D858F62ECFB1BA73D63121A6A8EF0 /* RxImagePickerDelegateProxy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxImagePickerDelegateProxy.swift; path = RxCocoa/iOS/Proxies/RxImagePickerDelegateProxy.swift; sourceTree = ""; }; - F435E99579B5D417F9A5FFC0F7965B24 /* Observable+Single.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Observable+Single.swift"; path = "RxSwift/Observables/Observable+Single.swift"; sourceTree = ""; }; - F46EAA6E7E1BEF4896DF2CEC4B29DF0A /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - F6DE40FA76E07D0387C2A2F07829B2D8 /* RxCocoa.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxCocoa.swift; path = RxCocoa/Common/RxCocoa.swift; sourceTree = ""; }; - F91980105679FB515A28F75DC6473584 /* Zip.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Zip.swift; path = RxSwift/Observables/Implementations/Zip.swift; sourceTree = ""; }; - FC52A4B9B72983EFAAA1E64B54FCFB1C /* ObservableConvertibleType+Driver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "ObservableConvertibleType+Driver.swift"; path = "RxCocoa/Common/CocoaUnits/Driver/ObservableConvertibleType+Driver.swift"; sourceTree = ""; }; - FD2637FEE9AF1F14498DE84B56DAC41F /* RxTextViewDelegateProxy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxTextViewDelegateProxy.swift; path = RxCocoa/iOS/Proxies/RxTextViewDelegateProxy.swift; sourceTree = ""; }; - FDDC303D9A217476756CF5B9D1EBA5B7 /* AnonymousObservable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AnonymousObservable.swift; path = RxSwift/Observables/Implementations/AnonymousObservable.swift; sourceTree = ""; }; - FF298074EB8EE70D6C90A0F816301B1B /* UIPageControl+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIPageControl+Rx.swift"; path = "RxCocoa/iOS/UIPageControl+Rx.swift"; sourceTree = ""; }; - FF7C0B8064B13EF1B178438E7E83C24F /* BooleanDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BooleanDisposable.swift; path = RxSwift/Disposables/BooleanDisposable.swift; sourceTree = ""; }; + CDAAB3AB88BA20FDE9B79631F269019B /* RetryWhen.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RetryWhen.swift; path = RxSwift/Observables/Implementations/RetryWhen.swift; sourceTree = ""; }; + CF8BF315C6E2458176C75F8D0F0C4B9B /* ShareReplay1WhileConnected.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ShareReplay1WhileConnected.swift; path = RxSwift/Observables/Implementations/ShareReplay1WhileConnected.swift; sourceTree = ""; }; + CFC8BCA7484913B73E111710A621095F /* Sample.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Sample.swift; path = RxSwift/Observables/Implementations/Sample.swift; sourceTree = ""; }; + D14765FD8943F9837F5C8428CA03C7F7 /* Queue.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Queue.swift; path = Platform/DataStructures/Queue.swift; sourceTree = ""; }; + D65D17F873F72D6B1E8794F5ACEAEB44 /* RxTextViewDelegateProxy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxTextViewDelegateProxy.swift; path = RxCocoa/iOS/Proxies/RxTextViewDelegateProxy.swift; sourceTree = ""; }; + D7155FD418E3EC3A8C86E9E3BA0B79EF /* ControlEvent.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ControlEvent.swift; path = RxCocoa/CocoaUnits/ControlEvent.swift; sourceTree = ""; }; + D740BC5E318263CF4C86F2FF57AAB534 /* NSObject+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSObject+Rx.swift"; path = "RxCocoa/Foundation/NSObject+Rx.swift"; sourceTree = ""; }; + DAA446133815BDAB6DA48EA5D2B04EA7 /* Observable+Binding.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Observable+Binding.swift"; path = "RxSwift/Observables/Observable+Binding.swift"; sourceTree = ""; }; + DB16A82BF3BAA61F43D6C9742AF8AE19 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + DC8CD3A95BB52F3F626088379FCBECE6 /* KVORepresentable+Swift.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "KVORepresentable+Swift.swift"; path = "RxCocoa/Foundation/KVORepresentable+Swift.swift"; sourceTree = ""; }; + DCBD161681343C2F0E2EDA6686257063 /* ImmediateScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ImmediateScheduler.swift; path = RxSwift/Schedulers/ImmediateScheduler.swift; sourceTree = ""; }; + DE16A12DC1A9C64C2730087402ABA7F4 /* Variable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Variable.swift; path = RxSwift/Subjects/Variable.swift; sourceTree = ""; }; + DF6A14B15E0BEB5A7B777FEB4AE1B914 /* UISwitch+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UISwitch+Rx.swift"; path = "RxCocoa/iOS/UISwitch+Rx.swift"; sourceTree = ""; }; + DFA5AFEC44A99D12BF2AAB9FF9B30CD0 /* AnonymousInvocable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AnonymousInvocable.swift; path = RxSwift/Schedulers/Internal/AnonymousInvocable.swift; sourceTree = ""; }; + E0BEBBB4958B7F4D65A5DA54FF0580E7 /* Observable+Time.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Observable+Time.swift"; path = "RxSwift/Observables/Observable+Time.swift"; sourceTree = ""; }; + E36A10AAB04A4E5683AE4B1269CB55E5 /* Repeat.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Repeat.swift; path = RxSwift/Observables/Implementations/Repeat.swift; sourceTree = ""; }; + E37AD316312C2037DAE0A3063683AA3A /* SchedulerServices+Emulation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "SchedulerServices+Emulation.swift"; path = "RxSwift/Schedulers/SchedulerServices+Emulation.swift"; sourceTree = ""; }; + E39BD822F4B90F9AAF1FA187CFD88D80 /* ObserverBase.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ObserverBase.swift; path = RxSwift/Observers/ObserverBase.swift; sourceTree = ""; }; + E3DC6CF6E770FCD8D53D32AF0F9DA126 /* SubscribeOn.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SubscribeOn.swift; path = RxSwift/Observables/Implementations/SubscribeOn.swift; sourceTree = ""; }; + E451C04B736566F48C34167C04D48251 /* WithLatestFrom.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = WithLatestFrom.swift; path = RxSwift/Observables/Implementations/WithLatestFrom.swift; sourceTree = ""; }; + E474A1E0AB9BFBD84BC89E665507E060 /* UIControl+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIControl+Rx.swift"; path = "RxCocoa/iOS/UIControl+Rx.swift"; sourceTree = ""; }; + E50FF775C27E7F52C4BE67E387384E3D /* ConnectableObservableType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConnectableObservableType.swift; path = RxSwift/ConnectableObservableType.swift; sourceTree = ""; }; + E733411C01B6E1B1C9923630CA83DF0D /* RxCocoa.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxCocoa.swift; path = RxCocoa/RxCocoa.swift; sourceTree = ""; }; + E73E7800B5D05C4608E7658D76BB09F6 /* URLSession+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "URLSession+Rx.swift"; path = "RxCocoa/Foundation/URLSession+Rx.swift"; sourceTree = ""; }; + E88037730944DBB5C828F0A95E996EA1 /* ObserverType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ObserverType.swift; path = RxSwift/ObserverType.swift; sourceTree = ""; }; + EB09B4EEFE017AD8A7AA8A8C1F163812 /* _RXObjCRuntime.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = _RXObjCRuntime.m; path = RxCocoa/Runtime/_RXObjCRuntime.m; sourceTree = ""; }; + EBFCF9BC4A552C0B77721F53808F4173 /* UIView+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIView+Rx.swift"; path = "RxCocoa/iOS/UIView+Rx.swift"; sourceTree = ""; }; + F041C3A61D24A55BA6D02865982F4948 /* Deferred.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Deferred.swift; path = RxSwift/Observables/Implementations/Deferred.swift; sourceTree = ""; }; + F08D070993EE189DEDBE2E8283769ECA /* ObservableConvertibleType+SharedSequence.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "ObservableConvertibleType+SharedSequence.swift"; path = "RxCocoa/CocoaUnits/SharedSequence/ObservableConvertibleType+SharedSequence.swift"; sourceTree = ""; }; + F16765FC78C53140C4109BCCE206E88C /* Variable+Driver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Variable+Driver.swift"; path = "RxCocoa/CocoaUnits/Driver/Variable+Driver.swift"; sourceTree = ""; }; + F1C61FB2FCFAB4944005E3BAF9EEADC1 /* CompositeDisposable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CompositeDisposable.swift; path = RxSwift/Disposables/CompositeDisposable.swift; sourceTree = ""; }; + F1DEE4224C3135D5E03DE40DC0095DCB /* Observable+Creation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Observable+Creation.swift"; path = "RxSwift/Observables/Observable+Creation.swift"; sourceTree = ""; }; + F3B1490DA3282F84E441342FFF586BFB /* SchedulerType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SchedulerType.swift; path = RxSwift/SchedulerType.swift; sourceTree = ""; }; + F47D6CBA7260571DF35B88A530815708 /* NSObject+Rx+KVORepresentable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSObject+Rx+KVORepresentable.swift"; path = "RxCocoa/Foundation/NSObject+Rx+KVORepresentable.swift"; sourceTree = ""; }; + F4879DF6BE30A70D84B8CD0F3EB6F87C /* RxTarget.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RxTarget.swift; path = RxCocoa/Common/RxTarget.swift; sourceTree = ""; }; + F4E6CE1422565F9D01918EE903F3772E /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; + F5C23F45A786EB4A2BD40E493EF53048 /* ConcurrentDispatchQueueScheduler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConcurrentDispatchQueueScheduler.swift; path = RxSwift/Schedulers/ConcurrentDispatchQueueScheduler.swift; sourceTree = ""; }; + F5F1CEA9B9E1814EFE1F235EC30A2E20 /* Platform.Linux.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Platform.Linux.swift; path = Platform/Platform.Linux.swift; sourceTree = ""; }; + F8D4D84407A974744557BF4FC86C0EA9 /* Timeout.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Timeout.swift; path = RxSwift/Observables/Implementations/Timeout.swift; sourceTree = ""; }; + F8DBBA77CC1DEEE524C517B5F5ECFF34 /* TakeLast.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TakeLast.swift; path = RxSwift/Observables/Implementations/TakeLast.swift; sourceTree = ""; }; + F9680E698A96391123754AEF6500344A /* ObservableConvertibleType+Driver.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "ObservableConvertibleType+Driver.swift"; path = "RxCocoa/CocoaUnits/Driver/ObservableConvertibleType+Driver.swift"; sourceTree = ""; }; + F9D1CEBFA68ED0016AF36A402C8AA348 /* SynchronizedDisposeType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SynchronizedDisposeType.swift; path = RxSwift/Concurrency/SynchronizedDisposeType.swift; sourceTree = ""; }; + FAFF1EF43696A19F3C0BA1A4B9629DFD /* UIViewController+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIViewController+Rx.swift"; path = "RxCocoa/iOS/UIViewController+Rx.swift"; sourceTree = ""; }; + FC4CE9E69BD3692E25435DFF08150281 /* Empty.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Empty.swift; path = RxSwift/Observables/Implementations/Empty.swift; sourceTree = ""; }; + FC509A14DB241C28206B889097C413B9 /* InfiniteSequence.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = InfiniteSequence.swift; path = Platform/DataStructures/InfiniteSequence.swift; sourceTree = ""; }; + FCFB96B6EC2B0114D1FCE5362270E334 /* UIScrollView+Rx.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIScrollView+Rx.swift"; path = "RxCocoa/iOS/UIScrollView+Rx.swift"; sourceTree = ""; }; + FDB32327B68A41D415AC5BDAF953BD49 /* Platform.Linux.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Platform.Linux.swift; path = Platform/Platform.Linux.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 2A3CDA339E0F039B11B9F77A26EB3CA2 /* Frameworks */ = { + 1EFFE41FB7E8CB65FE06D1DC7DA5E074 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 43D6ACABD794D862A6E86F6B52868B55 /* Foundation.framework in Frameworks */, + 725767C408C8475FD46184A92160B63F /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - CE63E854FE924D6C251F966E6B275A85 /* Frameworks */ = { + 8E71B9089C80C0EDD09C8243CF865465 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 121D0412D6ED7B71C1AAC420CC31DE0A /* Foundation.framework in Frameworks */, - A10C76937225217C6056E552E03B230A /* RxSwift.framework in Frameworks */, + 27CF960A8BA7BA8EF791CC060F81C1E7 /* Foundation.framework in Frameworks */, + 25F0AB43C7575360296292D9BB64842D /* RxSwift.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; - E0FEDBC74A0576919464EA2B84FBCEA7 /* Frameworks */ = { + D570AD028A4A54870063F3746712530B /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 32FA55C677F991160DE3F2658E843217 /* Foundation.framework in Frameworks */, + 4EBF1EB98F7D5EFCDDA461543814097A /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 050D347DFFFAB9789B77E1824197A1AB /* Pods */ = { + 061C1447C88329782BD5055FEEE471C9 /* Support Files */ = { isa = PBXGroup; children = ( - B2E3AFD7CE52F2337F05319833D7477F /* RxCocoa */, - 875292A24C2826594DD9C5D8E04A4A48 /* RxSwift */, + DB16A82BF3BAA61F43D6C9742AF8AE19 /* Info.plist */, + 2087DF11C7599522350EA04DE6B4156E /* RxCocoa.modulemap */, + BBFBC6C4B5DDDC7A22732AA51382F26D /* RxCocoa.xcconfig */, + 8F942E49DBEB13C498BFF44B05FBFF97 /* RxCocoa-dummy.m */, + 0C0C11784D64D692E0050ED48F989D57 /* RxCocoa-prefix.pch */, + 3A84C7DDCCB01DD68DB69FDFAF2A317D /* RxCocoa-umbrella.h */, ); - name = Pods; + name = "Support Files"; + path = "../Target Support Files/RxCocoa"; sourceTree = ""; }; 13FC1851B01F595225151F50B05C0771 /* Targets Support Files */ = { @@ -586,319 +605,323 @@ name = "Targets Support Files"; sourceTree = ""; }; - 5F420D8E0FADDD8C365F94A8F2C4CC81 /* Products */ = { + 1580459C876DA0DEE54CC1EFEB5FD74D /* RxSwift */ = { isa = PBXGroup; children = ( - 5AE9D22F7092B5D8E7E9F479D6B48A32 /* Pods_PokedexGo.framework */, - B5DBAF6BF762831583034F466DD72623 /* RxCocoa.framework */, - 86CAE837680F6C8A2BDE31076089C27D /* RxSwift.framework */, + 9466E765E5E6CE61C67AC9380B9DB093 /* AddRef.swift */, + B741543663BD6C9BAD832B9EE5B969BF /* Amb.swift */, + 4C48857A37E0B818288C17716A394120 /* AnonymousDisposable.swift */, + DFA5AFEC44A99D12BF2AAB9FF9B30CD0 /* AnonymousInvocable.swift */, + 68392D6EEA0ED3393891F448EC65B15F /* AnonymousObservable.swift */, + 4E895275489876F09F432CA67FE21439 /* AnonymousObserver.swift */, + A9CAD519CA31004643A5A6D099089890 /* AnyObserver.swift */, + 7AD6F3F3F6855D2DDD205D5E9C2FF90B /* AsyncLock.swift */, + 001721082AD1820BF14628A28649996E /* Bag.swift */, + 771BE5F88179512E7E55B1693BFDE338 /* Bag+Rx.swift */, + 0DC7413C45CB819C77DBA74D1CE67334 /* BehaviorSubject.swift */, + 80F462850F0C496E63D68311F38EB7B0 /* BinaryDisposable.swift */, + 22954F1D4615BBFF718FD64924CADC93 /* BooleanDisposable.swift */, + 532E8934BACCE9965E1B50AAD52DFB1C /* Buffer.swift */, + 310E2059CCB59758D74FA623B7341F35 /* Cancelable.swift */, + 4A6C92C57DEAD46320212E648D6FEE52 /* Catch.swift */, + 122E690AFB6AC805905FAC5D63EE4098 /* CombineLatest.swift */, + 58B871E4C2567F0F4779EF41BA4CEC0E /* CombineLatest+arity.swift */, + 35A28FA391DB06D29D19DA4447AD37CA /* CombineLatest+Collection.swift */, + F1C61FB2FCFAB4944005E3BAF9EEADC1 /* CompositeDisposable.swift */, + A3FBA08BED4CF780F286F7C578ABE18D /* Concat.swift */, + F5C23F45A786EB4A2BD40E493EF53048 /* ConcurrentDispatchQueueScheduler.swift */, + 75783B38979EC3CF3F54AAF108D075E8 /* ConcurrentMainScheduler.swift */, + 2836FC17C9639B40E5BE53E2A461D59D /* ConnectableObservable.swift */, + E50FF775C27E7F52C4BE67E387384E3D /* ConnectableObservableType.swift */, + C72045F1DD316A8D8D667EBBC62BCCAA /* CurrentThreadScheduler.swift */, + 6AB5988F61EF072B265241572954BDCF /* Debug.swift */, + 33E24CBC32BF736F401E2C0002F4C163 /* Debunce.swift */, + F041C3A61D24A55BA6D02865982F4948 /* Deferred.swift */, + 30D2A54F9FD3E9B455E0BC2E62C15FA3 /* Delay.swift */, + 0563A182248FB9D6E2EE2A227B4278CB /* DelaySubscription.swift */, + 30F24BBC537B71BDBC5816F0B5117B87 /* DispatchQueue+Extensions.swift */, + 250DB34FC592CA01F9AC40F5B72D1E4E /* DispatchQueueConfiguration.swift */, + 63A4ACA827648C32714CC30BD1C8ACFF /* Disposable.swift */, + 04627568BE8263B246C8542E44BEB84E /* Disposables.swift */, + 9EDE28D1EE46BE33F7AD632B68E1E56A /* DisposeBag.swift */, + 3F204260242C3B57DA94787B81F9A379 /* DisposeBase.swift */, + 703AFAD4C44A49D75794591FD54C09FC /* DistinctUntilChanged.swift */, + 26CF7CCE8663939B828C53DF2B9BA2B4 /* Do.swift */, + 1491FA56387C07FA701050A6BAB1217B /* ElementAt.swift */, + FC4CE9E69BD3692E25435DFF08150281 /* Empty.swift */, + 76F3D3BBF234D5C633588D9B4E75987C /* Error.swift */, + 5FBD523F1A092AD394DD5292F1ECB3EC /* Errors.swift */, + CAFA3361761013BBC637D1DBBBFF0726 /* Event.swift */, + 06AA53BF1102449A2CF3379F0B8C89C7 /* Filter.swift */, + 24241E179BF63060B757331E8BD99D63 /* Generate.swift */, + 17FAD3C510F874695845F53E92CDEFCE /* HistoricalScheduler.swift */, + 4610BE88BD9A69E7311E15CCA3C9C30D /* HistoricalSchedulerTimeConverter.swift */, + DCBD161681343C2F0E2EDA6686257063 /* ImmediateScheduler.swift */, + 20184E13B8706FF2BEC9F6F5162F5287 /* ImmediateSchedulerType.swift */, + FC509A14DB241C28206B889097C413B9 /* InfiniteSequence.swift */, + BE315409B48FCE8A0AC462617E487561 /* InvocableScheduledItem.swift */, + 2B619CE407B9403711BDFBAEE67207A9 /* InvocableType.swift */, + B36737DB51F1433B35E27DAAADB90905 /* Just.swift */, + 2BD37F2E2DCDC1316E634A329394F90C /* Lock.swift */, + 3C2907A619D445EBAC4FE4C582FFBFC6 /* LockOwnerType.swift */, + 368C2CCC6A55F4D761B07A4A01E238F8 /* MainScheduler.swift */, + 57C98EC1D350E642FD6513F7DC84A7B7 /* Map.swift */, + 02E3FD64DE9F3F7935D3A66FC3A660AD /* Merge.swift */, + 55A20BFFF5369A00113A30E4B7F15842 /* Multicast.swift */, + 187761E03C1F7B58183B7320406658AE /* Never.swift */, + 3887B94073C7C1FFAEA8E2F5181F29E3 /* NopDisposable.swift */, + ABE1BFBE9D3B127015A516D9CB9F9F7E /* Observable.swift */, + 4F443EFBEEE15048C942B3E1F2FEC5B3 /* Observable+Aggregate.swift */, + DAA446133815BDAB6DA48EA5D2B04EA7 /* Observable+Binding.swift */, + 3DE5921D384D083F148002565A98CA7D /* Observable+Concurrency.swift */, + F1DEE4224C3135D5E03DE40DC0095DCB /* Observable+Creation.swift */, + 0F702A0D040E23B8F7C4A2B2D7BF3D6D /* Observable+Debug.swift */, + 864CE2D64C2CB6BAF14E112E648566F7 /* Observable+Multiple.swift */, + 14F32DA16234790E73FEEB15D52896DA /* Observable+Single.swift */, + 772E2994B6C7F8AF414BCF19AF96C9CD /* Observable+StandardSequenceOperators.swift */, + E0BEBBB4958B7F4D65A5DA54FF0580E7 /* Observable+Time.swift */, + 9BE0D1B70A2AD1DA432E686EAC99DB0D /* ObservableConvertibleType.swift */, + 30DFCE2B63D2C2FE3331E73B770B4903 /* ObservableType.swift */, + 5E64EE928569D9CE1F1B07ECF93FEA6D /* ObservableType+Extensions.swift */, + 0DBADAF4942134897BCBFC9D3F0ECCCE /* ObserveOn.swift */, + 29639B573EB1412C4230E3B09B9ECAC5 /* ObserveOnSerialDispatchQueue.swift */, + E39BD822F4B90F9AAF1FA187CFD88D80 /* ObserverBase.swift */, + E88037730944DBB5C828F0A95E996EA1 /* ObserverType.swift */, + 97627C4204F674A421353E2CC5C35C59 /* OperationQueueScheduler.swift */, + 0390599D2CE39A885EAF2242027BEDFB /* Platform.Darwin.swift */, + F5F1CEA9B9E1814EFE1F235EC30A2E20 /* Platform.Linux.swift */, + 0C79970530D93F05F8B7C9A8203921AE /* PriorityQueue.swift */, + 516D56CA8911D20905D7832AE8C17587 /* Producer.swift */, + 9F11A7D0074CE30A7AB58FD1A7200979 /* PublishSubject.swift */, + B8B1297039F6EA16D423A90A12D7CC06 /* Queue.swift */, + A4FC7AAE283EB68E81E9D97FDF1162BB /* Range.swift */, + 99AB1D099C10F2E5620A6BDF34588975 /* Reactive.swift */, + 9ECCB50F74580AB2A9E02A3B96EF07BB /* RecursiveScheduler.swift */, + 8DA1E31F9BB5BC5A606A2C48ECE47B24 /* Reduce.swift */, + 5269C00D54CBA238331E7D259F465609 /* RefCount.swift */, + 586104488AC56629FFE01E4729C93D2F /* RefCountDisposable.swift */, + E36A10AAB04A4E5683AE4B1269CB55E5 /* Repeat.swift */, + 5F16912A8FB1C45DBFADC2B5B479072A /* ReplaySubject.swift */, + CDAAB3AB88BA20FDE9B79631F269019B /* RetryWhen.swift */, + 796281A7F1F3D29CE27096717B6AE3F7 /* Rx.swift */, + 2B983B555CBEC50516E21B9835EBA92E /* RxMutableBox.swift */, + CFC8BCA7484913B73E111710A621095F /* Sample.swift */, + C16C8AA6F97D21BFD0A3AF26373731E2 /* Scan.swift */, + 785EBC3F90F0A66D18749E6F62C511CD /* ScheduledDisposable.swift */, + 4EB9C7DEE1C140DE14C9A3D09E024BC3 /* ScheduledItem.swift */, + 5293B9C508D858D18F9BE98E4D8B1CC8 /* ScheduledItemType.swift */, + E37AD316312C2037DAE0A3063683AA3A /* SchedulerServices+Emulation.swift */, + F3B1490DA3282F84E441342FFF586BFB /* SchedulerType.swift */, + 610DB064B05FCBD4916354840E5F3BB9 /* Sequence.swift */, + 6349A034EDF8823A796F029B3FC91AB1 /* SerialDispatchQueueScheduler.swift */, + 769CCB9780B036CB1F097BC2E027FD0F /* SerialDisposable.swift */, + 477CA47455652DA6E23FF8C42DCD3247 /* ShareReplay1.swift */, + CF8BF315C6E2458176C75F8D0F0C4B9B /* ShareReplay1WhileConnected.swift */, + 0F6F79C0E9CA7600FB215083C59C7A24 /* SingleAssignmentDisposable.swift */, + A6BF6EC7286419E2A0093926F0D54024 /* SingleAsync.swift */, + 2E550FA6BA79CDA1CCCD9FCB9D6E4E6C /* Sink.swift */, + 87FCD9ED2C7E8DF83D4C84940FF4D5D5 /* Skip.swift */, + CA37963CF786335E8A84A7085375C732 /* SkipUntil.swift */, + 1A72650E19D579EB5CDDC6E40B590B11 /* SkipWhile.swift */, + 00243578A2429FC5E1FFE03292FAFF64 /* StartWith.swift */, + 3B00D7B6E0CBFE12E1D5A6C30B939190 /* String+Rx.swift */, + 60C321E6B0BC2E19F7F38DD6F2C09E62 /* SubjectType.swift */, + E3DC6CF6E770FCD8D53D32AF0F9DA126 /* SubscribeOn.swift */, + 0EF39FC951C6CC263EDFD7124E057FCF /* SubscriptionDisposable.swift */, + 50627C97E6A0FDF747368316C1A7E9B8 /* Switch.swift */, + F9D1CEBFA68ED0016AF36A402C8AA348 /* SynchronizedDisposeType.swift */, + 0DF9CCC07A8F8899DAA3468E098F34B2 /* SynchronizedOnType.swift */, + 11C615CBD6201F948CE3830F3EFABFA3 /* SynchronizedSubscribeType.swift */, + 323235124BDF04A1A2262894B9B69BF0 /* SynchronizedUnsubscribeType.swift */, + 41CD03D4537993C97D5E596580296103 /* TailRecursiveSink.swift */, + 9B2526BF51A53AAF05BAC6CB090FE6EA /* Take.swift */, + F8DBBA77CC1DEEE524C517B5F5ECFF34 /* TakeLast.swift */, + 0A746282E628E8F2A9EB17EE33CD0C91 /* TakeUntil.swift */, + 3B8B3247A709B4FD22813E354E88EC39 /* TakeWhile.swift */, + B29D89D8E6B5E4D8F0779ED978A0A8C5 /* Throttle.swift */, + F8D4D84407A974744557BF4FC86C0EA9 /* Timeout.swift */, + 6AE6BC71DAEFE73CEC12110AAF4933D0 /* Timer.swift */, + 32ECE316C2C08F2FBD9CD6146C162FE8 /* ToArray.swift */, + 90897DE0AF5AED02A7EE2AC32B3E4F3B /* Using.swift */, + DE16A12DC1A9C64C2730087402ABA7F4 /* Variable.swift */, + 46529E285EEFBC21FADDCE1616A0D778 /* VirtualTimeConverterType.swift */, + 0A4169BB7B76EC937D94F6BEF9FB9E0B /* VirtualTimeScheduler.swift */, + AAE171203123A28D26CC10698CA05898 /* Window.swift */, + E451C04B736566F48C34167C04D48251 /* WithLatestFrom.swift */, + AD7EED0AA031AA341A779500B334BD8A /* Zip.swift */, + 35DBF02092FEBD822B83924EB54C422A /* Zip+arity.swift */, + 9DCFB51A1C7EA0AC6AD367B4C3872DA1 /* Zip+Collection.swift */, + 566EEA78F64DE937CF81CB4ACFF3C9FF /* Support Files */, ); - name = Products; + name = RxSwift; + path = RxSwift; sourceTree = ""; }; - 7A3BD000B1FD8E4011DC534B33BDD0E9 /* Frameworks */ = { + 3E98B00DD4CAD76CB8B27C1829AFBD1C /* iOS */ = { isa = PBXGroup; children = ( - 397ED6A120A7323FEFFD443352B8A3B8 /* RxSwift.framework */, - DA97D57276CAA0116D4C78E8F7F4127E /* iOS */, + F4E6CE1422565F9D01918EE903F3772E /* Foundation.framework */, ); - name = Frameworks; + name = iOS; sourceTree = ""; }; - 7DB346D0F39D3F0E887471402A8071AB = { + 566EEA78F64DE937CF81CB4ACFF3C9FF /* Support Files */ = { isa = PBXGroup; children = ( - 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */, - 7A3BD000B1FD8E4011DC534B33BDD0E9 /* Frameworks */, - 050D347DFFFAB9789B77E1824197A1AB /* Pods */, - 5F420D8E0FADDD8C365F94A8F2C4CC81 /* Products */, - 13FC1851B01F595225151F50B05C0771 /* Targets Support Files */, + 2E3E5238F35763575B4EA04D71B648D1 /* Info.plist */, + 40B18BDB18A0F71D3408DC5B3D9CAB9C /* RxSwift.modulemap */, + 574D04700F1188B0D770FD0D7BE084D8 /* RxSwift.xcconfig */, + 275C278EB8ECC1D443F42A7648BE8554 /* RxSwift-dummy.m */, + 85B6BBFDBD71085797E59200F2F66563 /* RxSwift-prefix.pch */, + 2CA4CF3BFBE7871ADCF8FBBE747810FE /* RxSwift-umbrella.h */, ); + name = "Support Files"; + path = "../Target Support Files/RxSwift"; sourceTree = ""; }; - 875292A24C2826594DD9C5D8E04A4A48 /* RxSwift */ = { + 5F420D8E0FADDD8C365F94A8F2C4CC81 /* Products */ = { isa = PBXGroup; children = ( - 8CDB77694CD9C3932E642FFB98BD6507 /* AddRef.swift */, - D1DDC1727726DF2FBA676B44135BAD22 /* Amb.swift */, - 59CA3C0ABB91378BF6FE484D94481D88 /* AnonymousDisposable.swift */, - C4D0141EACF4F5D67D5961B4AA466A47 /* AnonymousInvocable.swift */, - FDDC303D9A217476756CF5B9D1EBA5B7 /* AnonymousObservable.swift */, - E3E6953D9F4B6EAC7C0C428E98BC2111 /* AnonymousObserver.swift */, - 37B3D6613A18DC598DA7ABCA1D9CED33 /* AnyObserver.swift */, - 804BC3384434439D1B1A243BE02DAD4A /* AsyncLock.swift */, - EB11497F37FF7943862F286A1651D042 /* Bag.swift */, - D4B00B3C6C7431F4D4550AD43C84F160 /* BehaviorSubject.swift */, - B6E3FBE0F1D7C28F9585CE363E110E1E /* BinaryDisposable.swift */, - FF7C0B8064B13EF1B178438E7E83C24F /* BooleanDisposable.swift */, - 58F5BFFF06B17780F8789D51CED460B1 /* Buffer.swift */, - D14F1E665D122388B423977C35B4E23C /* Cancelable.swift */, - 3B4B0240401064916F34863D58160922 /* Catch.swift */, - B23153EC62F1F9EA1CEB3C4F8B959BA6 /* CombineLatest.swift */, - C012DED32C78F3BC4893FBB11ADB1866 /* CombineLatest+arity.swift */, - DA042F18C4D096E30CA6636B17CEC3C4 /* CombineLatest+CollectionType.swift */, - 7C919C040B85DF8BA3198306E66C6217 /* CompositeDisposable.swift */, - E7437F81B9A645215265A83BA900C24E /* Concat.swift */, - EFF6F9B62AB6F4362CE23C73E7687DA9 /* ConcurrentDispatchQueueScheduler.swift */, - 0B365A38BCEEABC88B67EA39D80A861F /* ConcurrentMainScheduler.swift */, - 32F23A0961AAA6C01A1397AD90EDA9AA /* ConnectableObservable.swift */, - 614501176A095DC28303FD6091BAF437 /* ConnectableObservableType.swift */, - DF524EC65D9848AEED1A00F4EFB42E2A /* CurrentThreadScheduler.swift */, - 0D255DFA39931004E6FBAE8524E21D29 /* Debug.swift */, - 7B207B09ACA2B7C1A5955D4A670DF155 /* Debunce.swift */, - 00053BD5230150E958799E47A48EA895 /* Deferred.swift */, - CC1D5F202F14E89C94DC8C8E9D3F2C35 /* Delay.swift */, - B6709E98277C4B1371C21EEF7734944C /* DelaySubscription.swift */, - C09A7A805374E513BC23516FE2414379 /* DispatchQueueConfiguration.swift */, - 16BBBD04181474EAD0A97986ADBDE173 /* DispatchQueueSchedulerQOS.swift */, - 6EB6106BD2433BD6C6302174B3572DF5 /* Disposable.swift */, - CE7470DD24D55539FE38B33354609932 /* Disposables.swift */, - 8F597BF92F8C72C9FD96C8DAE1655E9B /* DisposeBag.swift */, - 3D2E6375EF514E682DD5E099DEEA3C10 /* DisposeBase.swift */, - 43FC3978A8C9F39C7800B21748B1C0EF /* DistinctUntilChanged.swift */, - D6E65FFF0964AFA4A351C3DC3DCB3049 /* Do.swift */, - 659A04497CFF6C207849FC691F605817 /* ElementAt.swift */, - 67E42E4C26C38702416C0FA860FE4966 /* Empty.swift */, - D402D1E02B23CC1DAFF711945E6C7C01 /* Error.swift */, - 643BFED33D2FF050AB233EDE00E2796B /* Errors.swift */, - B4EDF14B3F8E3980581A28E403F9D60F /* Event.swift */, - 56D9D0405D1B795B6655805AC1CC4429 /* Filter.swift */, - 8CD370C39CCD9BFAD67AB8BD32F90797 /* Generate.swift */, - 60A3F4FA5EC0032B138E22C350C8571D /* HistoricalScheduler.swift */, - F122B20E85DCC0A43C1773DA9A43FD01 /* HistoricalSchedulerTimeConverter.swift */, - DABE43FFA22A5DC6DB547C6A26CA3F12 /* ImmediateScheduler.swift */, - 24189EB6F723B40C817F8408B893EB7B /* ImmediateSchedulerType.swift */, - EBA62AF7E35D7F2AA1960DCF36A8A854 /* InfiniteSequence.swift */, - B19D13BC17648E846D58611097F395F6 /* InvocableScheduledItem.swift */, - 86FF2384DCA4A4841ADF1FC2C0A9B331 /* InvocableType.swift */, - 24EDBAF23688A76BA859735A2C8F3194 /* Just.swift */, - 974451D2E3E510B8E8A63654E04ACDD5 /* Lock.swift */, - 78D9CB1DCF4A368A286D9D843A1A4000 /* LockOwnerType.swift */, - 357DF1CCC5063151569BCAC8BF4E9C6D /* MainScheduler.swift */, - 45B87E1492D431B8BA1E5AEB616A1AB4 /* Map.swift */, - CCD947C828DA82D599B109870F06B1FA /* Merge.swift */, - A0D835DD2D2251EAB0B27F31CB72B341 /* Multicast.swift */, - 4B5D4368EAAEDBE617887F4EFB6EB0FB /* Never.swift */, - 923D369B7E87DEBE70A5D19C80932394 /* NopDisposable.swift */, - 77092120A3A3512BD4BC7DD2BF7F07B5 /* Observable.swift */, - 9FE90752083D12290474BC5BAA176969 /* Observable+Aggregate.swift */, - B26E3722D77F9BA616724AD27F4B8306 /* Observable+Binding.swift */, - 0691E2AF4F4BC07A24EC93D184A3FDEB /* Observable+Concurrency.swift */, - 5E76C507568E7ADA82A3ED8A726F5358 /* Observable+Creation.swift */, - 3777004EB16505CA6386B7D9FDBD7ED7 /* Observable+Debug.swift */, - 3A111DDC4C1EB87CD4BE69AB57654306 /* Observable+Multiple.swift */, - F435E99579B5D417F9A5FFC0F7965B24 /* Observable+Single.swift */, - B3F95B7A11DFE661FB160F43DBA4B0B4 /* Observable+StandardSequenceOperators.swift */, - 5496796606D494C97794B6F90DF06136 /* Observable+Time.swift */, - 15466AD4A01ACC05B816711C276C94B7 /* ObservableConvertibleType.swift */, - 80671F727A9868EBE4018ED741F933D5 /* ObservableType.swift */, - AEA91F7AF9BF7F6119E6D1CFBA138B64 /* ObservableType+Extensions.swift */, - 02811E0858D470F34B739A6BFD2056F3 /* ObserveOn.swift */, - 9909A3B04F5BD9E0986A29DF4B5C9934 /* ObserveOnSerialDispatchQueue.swift */, - F194F3656CC6F93A70571D3B8B010A40 /* ObserverBase.swift */, - 93307CD2F54897156D970EBDF97FA4F6 /* ObserverType.swift */, - 9E6D9A74A10BE89BAE9BD57C3C3EF0B5 /* OperationQueueScheduler.swift */, - 5BD593F3D0565668D7CC5990CE36818C /* Platform.Darwin.swift */, - 692544D6FE00282284D2344E91536B0F /* Platform.Linux.swift */, - 023474758DA44A2BFAF627F30F635E6B /* PriorityQueue.swift */, - EDE391691D8B5DF2142BD6D8E5BED61C /* Producer.swift */, - 3E9940D9817166477856DE65094A6260 /* PublishSubject.swift */, - B58B58F4778B78D196858693A192BFEC /* Queue.swift */, - CAF80653BBA27BB38CCC9ADB1B8989F7 /* Range.swift */, - BE6847941FEFEBAD130A00A342EB2462 /* RecursiveScheduler.swift */, - 27AC0F00E0539EE6BB3CA625F08F2A21 /* Reduce.swift */, - 1E41312BC41502D9EC683B790A5DEC59 /* RefCount.swift */, - AD661F853C0E03E91523D62109EFAE7E /* RefCountDisposable.swift */, - 56CD2AB385BBA88DE1DE00A07B0CA260 /* Repeat.swift */, - 58ECDE291B6C4966870B10DAAAC54753 /* ReplaySubject.swift */, - 5B20CE34F081F11DCAF386BDBD06A858 /* RetryWhen.swift */, - BC83E68B8055E29D4512897B677B4A6E /* Rx.swift */, - 51588A5611E67C994212A30648416D83 /* RxMutableBox.swift */, - C7771C5D99A775DA150DF545D573C1EF /* Sample.swift */, - 2D8B5E655F870573D98C16B1C6D1D89E /* Scan.swift */, - E1285CF0D4E016A4A056142FBCEC4BDB /* ScheduledDisposable.swift */, - 383F17D9EBD7C4F32343FBA6C5743F68 /* ScheduledItem.swift */, - 3193F1228BF29C5E2A301B4B72B7980E /* ScheduledItemType.swift */, - A9D1250F3B0AF2AF712290A1D5F29022 /* SchedulerServices+Emulation.swift */, - 83C0B77EBE2FB832EAE703B2C7CBC016 /* SchedulerType.swift */, - F231F1E47F983ACDA69EFC946613F57A /* Sequence.swift */, - 0D7F8AC7906D8F3573813543E119E9C2 /* SerialDispatchQueueScheduler.swift */, - BEAE74107F4B28F464DC349437C5F181 /* SerialDisposable.swift */, - EF811611BEC6E64AEDFA7326DDB269C6 /* ShareReplay1.swift */, - 5FAF129F0D5E633DA019E3F6BD799E0B /* ShareReplay1WhileConnected.swift */, - 3ADEF916724C3CD33414826B3075629D /* SingleAssignmentDisposable.swift */, - AD760FDEF3325452D1956E31DA16DF94 /* SingleAsync.swift */, - DF856C60360336D059EF8E28D4E2D337 /* Sink.swift */, - 5E3556A091491F30496F2E31FD3DCCAF /* Skip.swift */, - 9A58EC30FC7221C14AC9ACB41355285E /* SkipUntil.swift */, - 53EA419F2CBBC7553305D19102BB4686 /* SkipWhile.swift */, - A1DD88DD612366A084B53815C8B8EC26 /* StableCompositeDisposable.swift */, - D2E6D3537ED14D45E6751B0AD3FEBCCA /* StartWith.swift */, - 875AD7325E306F32D856D41E705AFBE8 /* String+Rx.swift */, - 52CCD0DF27D758124EE0BE12C033A336 /* SubjectType.swift */, - 0AED7DC8C3D8A832530DA381920BFB08 /* SubscribeOn.swift */, - E42385DC3EDBFE2B12B9925A28D2F600 /* SubscriptionDisposable.swift */, - 5E09E844F9BC7D5598D6EF366D27BCA9 /* Switch.swift */, - 815BE4D54328DCCC3EC688E99D515B84 /* SynchronizedDisposeType.swift */, - 257340FD101A7D19D51F5261F0468333 /* SynchronizedOnType.swift */, - 1A1611E18D67AF94FDC0B20D1CAF3A5F /* SynchronizedSubscribeType.swift */, - 6FA875C719138BA80C24ECFC28FDBF53 /* SynchronizedUnsubscribeType.swift */, - 3F3B2427854E0EBD6D65C83D0820471B /* TailRecursiveSink.swift */, - 4331958ADDFBB46E5D9FAAE5F90CFFCA /* Take.swift */, - 1EC5D0239E634C375CA320C1CA5F9FDF /* TakeLast.swift */, - E3EA8D80D27873339FD839408A4206D3 /* TakeUntil.swift */, - 8E928C29A41850F7AC97548FE0213AF0 /* TakeWhile.swift */, - B4E71A7E8F33A5D0D3B543950D968DCC /* Throttle.swift */, - 7F9CB9AD270F4ADB7C1CF43E412EFB8B /* Timeout.swift */, - A056920DC5F216195680972D62F4E985 /* Timer.swift */, - E9CBA23DF232206FCB1D8C7619BBCF69 /* ToArray.swift */, - 58AB0072B17C75AB1A21ECC38A91ACA1 /* Using.swift */, - 23966E1D2B24C6547A2B15D92C5671D0 /* Variable.swift */, - C642634FB859E1CBD5D098944AA629E7 /* VirtualTimeConverterType.swift */, - A45E326290449ED1728E999DE8CD3CE2 /* VirtualTimeScheduler.swift */, - 40AAB2FCC33C7D3618DF8098E641D159 /* Window.swift */, - 00ED64DA988B533B84EB169AFCED363E /* WithLatestFrom.swift */, - F91980105679FB515A28F75DC6473584 /* Zip.swift */, - 7120F33703B8BB8862848546B1FD3393 /* Zip+arity.swift */, - 4F1518F3631A490DAC3F9FCF8B227E1D /* Zip+CollectionType.swift */, - 985C1AF3C510ECF0295CD377D2F12E41 /* Support Files */, + 5AE9D22F7092B5D8E7E9F479D6B48A32 /* Pods_PokedexGo.framework */, + B5DBAF6BF762831583034F466DD72623 /* RxCocoa.framework */, + 86CAE837680F6C8A2BDE31076089C27D /* RxSwift.framework */, ); - path = RxSwift; + name = Products; sourceTree = ""; }; - 8B242AB1F4DC313A474D7E1F3D75CA73 /* Support Files */ = { + 7A3BD000B1FD8E4011DC534B33BDD0E9 /* Frameworks */ = { isa = PBXGroup; children = ( - F46EAA6E7E1BEF4896DF2CEC4B29DF0A /* Info.plist */, - 1A0B4A186840C963BFED5950C240F664 /* RxCocoa.modulemap */, - 668941189481BE4222233E27880CEAD4 /* RxCocoa.xcconfig */, - E14999237B0ADBAEE8885532CFF4C230 /* RxCocoa-dummy.m */, - 12D37A1D8E30A99C0CA998A5F87E2EB9 /* RxCocoa-prefix.pch */, - E1C4AE2D0D182DAB04E7BC7722F8596B /* RxCocoa-umbrella.h */, + 397ED6A120A7323FEFFD443352B8A3B8 /* RxSwift.framework */, + 3E98B00DD4CAD76CB8B27C1829AFBD1C /* iOS */, ); - name = "Support Files"; - path = "../Target Support Files/RxCocoa"; + name = Frameworks; sourceTree = ""; }; - 985C1AF3C510ECF0295CD377D2F12E41 /* Support Files */ = { + 7DB346D0F39D3F0E887471402A8071AB = { isa = PBXGroup; children = ( - 91424C7C57633DD3F57059F4E54A7DA0 /* Info.plist */, - D5A426A280FBE79041A555EBDCC8F41B /* RxSwift.modulemap */, - 8DB2248BB5C162FE70B6060C71BC1BA7 /* RxSwift.xcconfig */, - DE59B946AC888EB09684FEE661093D15 /* RxSwift-dummy.m */, - 8159E4F028E7BA3CFBDD0AE376E74D30 /* RxSwift-prefix.pch */, - EBA4D3419DA92747E9480E3892A0C2A1 /* RxSwift-umbrella.h */, + 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */, + 7A3BD000B1FD8E4011DC534B33BDD0E9 /* Frameworks */, + AC41D7925FEC15D56DCDA543A34214E1 /* Pods */, + 5F420D8E0FADDD8C365F94A8F2C4CC81 /* Products */, + 13FC1851B01F595225151F50B05C0771 /* Targets Support Files */, ); - name = "Support Files"; - path = "../Target Support Files/RxSwift"; sourceTree = ""; }; - B2E3AFD7CE52F2337F05319833D7477F /* RxCocoa */ = { + 886697A10836DB36CCA4A28826A6B14A /* RxCocoa */ = { isa = PBXGroup; children = ( - 5912F2821234C2DC94784AB7BA0E7F3E /* _RX.h */, - 1BD6B800FB60FC0B73E545E9998902FA /* _RX.m */, - 9AC9BD3FAF4ABFC987FFA707AB9FCB90 /* _RXDelegateProxy.h */, - 0DE82875BF092ABF63F0129F1D66C342 /* _RXDelegateProxy.m */, - A63EFF26965AFE7FFE18E68C039E6555 /* _RXKVOObserver.h */, - A070DEC2D90F2C3579F76D9FE69599F5 /* _RXKVOObserver.m */, - 622E80E3BE45B199242F59CB43CB499B /* _RXObjCRuntime.h */, - 67A7308A253850F00B05819855D27377 /* _RXObjCRuntime.m */, - E1C16CDD1C24EF1E943954022D241AB1 /* ControlEvent.swift */, - 6C948102FFA85AF99FA4BDC4B31CEF66 /* ControlEvent+Driver.swift */, - 360DB4FE725B14D1B4A919CAE6C07BD0 /* ControlProperty.swift */, - 286DB0BF724E24E942AE4449F63394D1 /* ControlProperty+Driver.swift */, - 4742034066CBC30A03A7231BA909C2B8 /* ControlTarget.swift */, - 3F083B32C768C775786BB21ECF548208 /* DeallocObservable.swift */, - B9E7251AB28157263C195FC6E7D0D6A8 /* DelegateProxy.swift */, - 4ECD634CA1C212F31539A5E94F027EEB /* DelegateProxyType.swift */, - 69A4F803D759819D60EA7B093FEBBE3E /* Driver.swift */, - 5B14971A9FD6B467BD6C09B2379A9395 /* Driver+Operators.swift */, - 0291CC41E092EBFDF54D42B02E6424D3 /* Driver+Operators+arity.swift */, - 08999F9E91C67F502F2B31AB37B21F34 /* Driver+Subscription.swift */, - 765B1BE6E4F79831A8A7224E12E11764 /* ItemEvents.swift */, - 199CEC87F4AF077D9B4762389FF6570A /* KVOObservable.swift */, - EF62970ED89CFEB3578CE909A25AAAD7 /* KVOObserver.swift */, - 366E4D0AB9A75F2A5712473C8D3EAE38 /* KVORepresentable.swift */, - 763DCEB0D5A66E991CC1B858DDC91E5F /* KVORepresentable+CoreGraphics.swift */, - 5D4B079C6BF22EB60FB4059831740F9A /* KVORepresentable+Swift.swift */, - 63DA3DD4CA65031F9D6C2404057153C5 /* Logging.swift */, - C24EA368C4E55B5D1ADDAFB78767AB90 /* MessageSentObserver.swift */, - BB9FB80A2BE7A2D6D2CEBC2DA6C23241 /* NSLayoutConstraint+Rx.swift */, - 52AA199050F22DB9F9654B0E79A1B72D /* NSNotificationCenter+Rx.swift */, - 945831043EEFA936E358129A58ED1C11 /* NSObject+Rx.swift */, - 363274368317697F561BB2ED8F6AB66A /* NSObject+Rx+KVORepresentable.swift */, - 7F73756FE68B6364B365C9083D70B121 /* NSObject+Rx+RawRepresentable.swift */, - 9E727D5CC6EEBE70CCC6502058E01F37 /* NSTextStorage+Rx.swift */, - CC4A87492F76B55135B5E95225CFE327 /* NSURLSession+Rx.swift */, - C2FFC8DFE23B2D54E75C8888A95AA6C1 /* Observable+Bind.swift */, - FC52A4B9B72983EFAAA1E64B54FCFB1C /* ObservableConvertibleType+Driver.swift */, - 35BCDAFC104DCC94AF1FE83D7487AA10 /* Reactive.swift */, - 1A47F6ED70808C18751C82FE05C97E84 /* RxCocoa.h */, - F6DE40FA76E07D0387C2A2F07829B2D8 /* RxCocoa.swift */, - 7F48A7A2FF100CA7C630D332D34B7F3D /* RxCollectionViewDataSourceProxy.swift */, - DDDBDF06D1B6E91266A572AA103E794F /* RxCollectionViewDataSourceType.swift */, - 73D332413223B3E4D33CDBF39A1C0F62 /* RxCollectionViewDelegateProxy.swift */, - C7715463243BDD5175442CD871B06B2C /* RxCollectionViewReactiveArrayDataSource.swift */, - F27D858F62ECFB1BA73D63121A6A8EF0 /* RxImagePickerDelegateProxy.swift */, - 7154F41F690DF671B3D84AA233D0EF4F /* RxPickerViewDelegateProxy.swift */, - 67C395039E40CCBAAF192350C12B9B6A /* RxScrollViewDelegateProxy.swift */, - C0FAFF56A663DBECFB5CCB4D170959B3 /* RxSearchBarDelegateProxy.swift */, - 32070195AC7FF295DC13483699433136 /* RxSearchControllerDelegateProxy.swift */, - 47C615A0C1C7CB0D93B1B59AAE7AE2FF /* RxTabBarDelegateProxy.swift */, - 68902A22C3070C8404E89BEF8A6F5FE5 /* RxTableViewDataSourceProxy.swift */, - 07938BBC6989A110F1642C7C78A2A03A /* RxTableViewDataSourceType.swift */, - 6B71409803A083925CFBC4C15E50F28A /* RxTableViewDelegateProxy.swift */, - 7A3E07C7438E3C2F64512F819995155B /* RxTableViewReactiveArrayDataSource.swift */, - A6CAB229EDDF2297965B52C92A2B5A76 /* RxTarget.swift */, - 14C6018EB8ED3D2D4687001C575AFF19 /* RxTextStorageDelegateProxy.swift */, - FD2637FEE9AF1F14498DE84B56DAC41F /* RxTextViewDelegateProxy.swift */, - 8AD5AD248511D190A6E701665766BBDD /* SectionedViewDataSourceType.swift */, - 14BF84797953369156C57EB5452EBF9E /* TextInput.swift */, - 934E59DFC7BBF5FBC3A87F0CE7EA73C3 /* UIActivityIndicatorView+Rx.swift */, - B323F07EDFADF3FA093F86A088170A96 /* UIAlertAction+Rx.swift */, - 7CADEFCECC0EB186A12C0B291342D1CC /* UIApplication+Rx.swift */, - 322CA81233C08A654C0E044DCDC6F33D /* UIBarButtonItem+Rx.swift */, - 6D0291CEF66C870D5E9E719C0EA72C1B /* UIBindingObserver.swift */, - 50DD92299AA92A6C6145174B972294EE /* UIButton+Rx.swift */, - 48CC2FA6C0E67819D548633EB23EA5A1 /* UICollectionView+Rx.swift */, - 5E99330FCEF837CF0D351DB099579357 /* UIControl+Rx.swift */, - 2FE39B9E067C4AFC9544CBF93C985681 /* UIDatePicker+Rx.swift */, - 5C939E6C52D2B5B921536AB609A6DF9A /* UIGestureRecognizer+Rx.swift */, - 3355C93B63CA5FE5B47101DF7E77B25F /* UIImageView+Rx.swift */, - 601AE0DC6A3E86F516609C6D06CB60E2 /* UILabel+Rx.swift */, - 58F525F5B278210733C9EFC92FFEE06C /* UINavigationItem+Rx.swift */, - FF298074EB8EE70D6C90A0F816301B1B /* UIPageControl+Rx.swift */, - 5B9F3F843F9671E9FD1952F33BCE7253 /* UIPickerView+Rx.swift */, - CF31863D0607B6C66F28E0D629CCD337 /* UIProgressView+Rx.swift */, - C04FFC0F79AC98E453AA5ECC691D397A /* UIRefreshControl+Rx.swift */, - E68FEF97896DC2C7B815D611FE2A2997 /* UIScrollView+Rx.swift */, - 4706890E176FBF3A8D3F02AC3051B9CC /* UISearchBar+Rx.swift */, - C7CFFB1B95915EA0A6DEAC76D897C750 /* UISearchController+Rx.swift */, - 7D320004447B001CBF0382B778DA6BEB /* UISegmentedControl+Rx.swift */, - 438E2DC43570497DBE921AEB89518230 /* UISlider+Rx.swift */, - D5F4E301F50554D39406C9FFC72A4E37 /* UIStepper+Rx.swift */, - D39FA6AC4938B92E4C0E1C3BFA0BBC38 /* UISwitch+Rx.swift */, - 9175FC6544DCDA825575330E821C7D3F /* UITabBar+Rx.swift */, - 1186161B975100A7DFC409B8C396D8B0 /* UITabBarItem+Rx.swift */, - 59C8995F28CDF1F322C4DE32ED3DD05E /* UITableView+Rx.swift */, - 4C4EF32E91A5BCD94FC3E346B25FA5E6 /* UITextField+Rx.swift */, - E15CFC2139EC375288323D99AF8ED04F /* UITextView+Rx.swift */, - D05B527152D8472611DE378D3CA32C5C /* UIView+Rx.swift */, - 03A4D1610491EEC726F17C86B0EEADB0 /* UIViewController+Rx.swift */, - 5AF7610675E023203BE8EEE19C0F3F40 /* Variable+Driver.swift */, - 8B242AB1F4DC313A474D7E1F3D75CA73 /* Support Files */, + 313763C6108D9C46316D32780D3A5ED1 /* _RX.h */, + 782FC7557C91148E434A34BB30E17340 /* _RX.m */, + 1C5D30C37343EEFCC746F2C0DAE0E218 /* _RXDelegateProxy.h */, + 5C3EDF144FD709E2DDA039349EE33AFE /* _RXDelegateProxy.m */, + C0DDE7EC5814AA6C8E13CA02A487C60F /* _RXKVOObserver.h */, + B2DA51A804997AC8E091499D75D9B949 /* _RXKVOObserver.m */, + 01DBF7C725D0BA477B3AA3A94377F2C9 /* _RXObjCRuntime.h */, + EB09B4EEFE017AD8A7AA8A8C1F163812 /* _RXObjCRuntime.m */, + CBD99D2D368A3A8AFE7C5DA7E99FA61F /* Bag.swift */, + D7155FD418E3EC3A8C86E9E3BA0B79EF /* ControlEvent.swift */, + 500B41C5329236B01D0FEA05256B9F5B /* ControlEvent+Driver.swift */, + 1D0F791088E9C7CC17CC8E64A0BCF99D /* ControlProperty.swift */, + 34CAF15FDB134CCB47A9BE558BA936CE /* ControlProperty+Driver.swift */, + 13E02371A6891FF6803B48F80CEB4A26 /* ControlTarget.swift */, + 9E6D96B5553D499A43AC75B225DDA1B0 /* DelegateProxy.swift */, + B109B815703349C9B6BB84A3259F9FD7 /* DelegateProxyType.swift */, + 7E5396250362A8B8FCE1C3628C7D789F /* DispatchQueue+Extensions.swift */, + 41C211BF6B589CAD8CA0808923658DA3 /* Driver.swift */, + 19DDBF45DE47B160F7AA4FDBEF06DACC /* Driver+Subscription.swift */, + 006A85CAF9C458F13EBCC787756720A2 /* InfiniteSequence.swift */, + 4D6C7D1B059B7CAD9ED94FDB26655FF4 /* ItemEvents.swift */, + 0949D3D804F8DA073BC481DA1ACA5DFE /* KVORepresentable.swift */, + A45777551AC14459252CB963743F760D /* KVORepresentable+CoreGraphics.swift */, + DC8CD3A95BB52F3F626088379FCBECE6 /* KVORepresentable+Swift.swift */, + 6AC09569D823CC48FED33FF4592029CF /* Logging.swift */, + BC21BF5E703ACB95DC96961494CE91A1 /* NSLayoutConstraint+Rx.swift */, + A54D6A8E2EA2035685149FA65AE9DE1E /* NSNotificationCenter+Rx.swift */, + D740BC5E318263CF4C86F2FF57AAB534 /* NSObject+Rx.swift */, + F47D6CBA7260571DF35B88A530815708 /* NSObject+Rx+KVORepresentable.swift */, + 83ECFEBCF63AD537C7DEAF180BC8E0E8 /* NSObject+Rx+RawRepresentable.swift */, + 0C4D8309F4A7F25A8EC6FE8843F5CCC0 /* NSTextStorage+Rx.swift */, + 3379A9C5DF632BB854582CE0439F9A48 /* Observable+Bind.swift */, + F9680E698A96391123754AEF6500344A /* ObservableConvertibleType+Driver.swift */, + F08D070993EE189DEDBE2E8283769ECA /* ObservableConvertibleType+SharedSequence.swift */, + 29B44F83E55B949CDDD1F0AFEAEC880E /* Platform.Darwin.swift */, + FDB32327B68A41D415AC5BDAF953BD49 /* Platform.Linux.swift */, + 934C51BE545B2C1E082E7D38BE92D043 /* PriorityQueue.swift */, + D14765FD8943F9837F5C8428CA03C7F7 /* Queue.swift */, + 87BC050FB87821C41A468209D2009104 /* RxCocoa.h */, + E733411C01B6E1B1C9923630CA83DF0D /* RxCocoa.swift */, + C895F323C80D99491E20AB3A88797A3B /* RxCocoaObjCRuntimeError+Extensions.swift */, + 9C2D178E75F7BE054DFB902ECC4E1A7A /* RxCocoaRuntime.h */, + 05154EFEAF12E5BBAE9E13E095EDFAEA /* RxCollectionViewDataSourceProxy.swift */, + 0261DA91C20FBC3AFF3A0D05B073CBA7 /* RxCollectionViewDataSourceType.swift */, + B35A50095178D9C3BC723C286B94F534 /* RxCollectionViewDelegateProxy.swift */, + BE6EDEF18E45893ED7529E82BE61D19F /* RxCollectionViewReactiveArrayDataSource.swift */, + 960737347ABB0497D5D165AF6F04383D /* RxPickerViewDelegateProxy.swift */, + 8A28F295BCB3239E3D8E97C8253DEF32 /* RxScrollViewDelegateProxy.swift */, + 3E36B0DA3408346FB92A93AB6C45E069 /* RxSearchBarDelegateProxy.swift */, + 2D3967211EDE74A259D45C68D0919CCD /* RxSearchControllerDelegateProxy.swift */, + 9F8D42C676712C383D2B710A1F35C6F7 /* RxTabBarDelegateProxy.swift */, + 1A6B4401BAE249952C98F64BBC95B2F2 /* RxTableViewDataSourceProxy.swift */, + 48E7453369B45B5ED73A948623A3B1CD /* RxTableViewDataSourceType.swift */, + 58BB980A41382A481029292D36611E1F /* RxTableViewDelegateProxy.swift */, + 6D25AAE822F5498D26DE6953DC295481 /* RxTableViewReactiveArrayDataSource.swift */, + F4879DF6BE30A70D84B8CD0F3EB6F87C /* RxTarget.swift */, + 0A652EC57C21EEA7396AB93AEEBB70CC /* RxTextStorageDelegateProxy.swift */, + D65D17F873F72D6B1E8794F5ACEAEB44 /* RxTextViewDelegateProxy.swift */, + 75ABE3C993505D8042AD462010472F26 /* SectionedViewDataSourceType.swift */, + 95BDAA537E0F690A0B8FED31611B5D85 /* SharedSequence.swift */, + 313873C00506CBE738D855EED5608303 /* SharedSequence+Operators.swift */, + 6FB449CBDFAE6FD7EE6029B5BEFBFE5E /* SharedSequence+Operators+arity.swift */, + 054F1DF36495EC9708AF0BFF1889B1B1 /* TextInput.swift */, + BCD4BE4C69C97611CDD16209D2A26860 /* UIActivityIndicatorView+Rx.swift */, + A2679310F5C1EFC93514C61E7D4946C9 /* UIAlertAction+Rx.swift */, + 5071B74B5041F60D8DAFC145DDADAB26 /* UIApplication+Rx.swift */, + 7B0EA98FA3B129968C423DB5EF0ABEF8 /* UIBarButtonItem+Rx.swift */, + 901947D2C0E18FFE2271B6FD7F73BB9A /* UIBindingObserver.swift */, + CBE355A845BA6A27C05F9442D9F089A2 /* UIButton+Rx.swift */, + B37CED7A1B33FD4AF9119A53F2C13769 /* UICollectionView+Rx.swift */, + E474A1E0AB9BFBD84BC89E665507E060 /* UIControl+Rx.swift */, + 2FAD8B62333EE46C5A33F9FE50E5918A /* UIDatePicker+Rx.swift */, + 5329F8CBE02FC97E42D8E68A6440EDD3 /* UIGestureRecognizer+Rx.swift */, + 420ED71D6CB2021AB9A4176B03D0C320 /* UIImageView+Rx.swift */, + 92099190C99C0C391E3B475FA824CA7B /* UILabel+Rx.swift */, + 9CEFCBF2EC15CC86F7A0399EC348D23D /* UINavigationItem+Rx.swift */, + AC38374D82B1743060DCD93295E41C3D /* UIPageControl+Rx.swift */, + 0B97480CAF8B38BAFCC58CA4C786FC9B /* UIPickerView+Rx.swift */, + 6379DC98FC6B0CAF284139D189FD8DA4 /* UIProgressView+Rx.swift */, + C17B264E2D2E13B18D5DEFA475D436F4 /* UIRefreshControl+Rx.swift */, + FCFB96B6EC2B0114D1FCE5362270E334 /* UIScrollView+Rx.swift */, + CD056A186F36500A58F7BAB90D9785B0 /* UISearchBar+Rx.swift */, + 9613FBA8885E8CDF0C27E2941C96A0BB /* UISearchController+Rx.swift */, + BE749C4F2DBA7A407D5B33D5DF514412 /* UISegmentedControl+Rx.swift */, + 98B128798CB6E65617AC3DA66FE5C6FC /* UISlider+Rx.swift */, + 02229AFE0B4BCF0FFE5A1F61A6A3E6E3 /* UIStepper+Rx.swift */, + DF6A14B15E0BEB5A7B777FEB4AE1B914 /* UISwitch+Rx.swift */, + 55AFE841CAB03336F9EE30E219DB303F /* UITabBar+Rx.swift */, + 5F286BF9AEB10DD62CD1CF950796B015 /* UITabBarItem+Rx.swift */, + 2A1A0CB1F9C1205703FF5508B7DEEDC6 /* UITableView+Rx.swift */, + 4488DC730219AA10C54CA340A3D5E405 /* UITextField+Rx.swift */, + CCDB67B12D350E3712C3713A5DDC3AC1 /* UITextView+Rx.swift */, + EBFCF9BC4A552C0B77721F53808F4173 /* UIView+Rx.swift */, + FAFF1EF43696A19F3C0BA1A4B9629DFD /* UIViewController+Rx.swift */, + E73E7800B5D05C4608E7658D76BB09F6 /* URLSession+Rx.swift */, + F16765FC78C53140C4109BCCE206E88C /* Variable+Driver.swift */, + A550F2813AC8DAA63F881EBF2D00ADF1 /* Variable+SharedSequence.swift */, + 061C1447C88329782BD5055FEEE471C9 /* Support Files */, ); + name = RxCocoa; path = RxCocoa; sourceTree = ""; }; - DA97D57276CAA0116D4C78E8F7F4127E /* iOS */ = { + AC41D7925FEC15D56DCDA543A34214E1 /* Pods */ = { isa = PBXGroup; children = ( - 75BB3296A6C3E9773C545F0323C2659E /* Foundation.framework */, + 886697A10836DB36CCA4A28826A6B14A /* RxCocoa */, + 1580459C876DA0DEE54CC1EFEB5FD74D /* RxSwift */, ); - name = iOS; + name = Pods; sourceTree = ""; }; F7710888CDC69132A3FECB87A7E87BF5 /* Pods-PokedexGo */ = { @@ -922,86 +945,87 @@ /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ - 8244154EBFB43A0CBE1FC5AB0A67DFE0 /* Headers */ = { + 83DC5BB729AE0449B8FE6B09D460A4E0 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 6F07E168515898D6C8878BB88C50D72C /* RxSwift-umbrella.h in Headers */, + E2133A288FFB0418CF6D3C65D758E4C4 /* RxSwift-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - C4DAD72DDFEB0E58700B257B46392953 /* Headers */ = { + 977DAF13E8BF02F633BF768DA823CBAB /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 7F0E8DBC543D0E81FE073E2E3F39FA09 /* Pods-PokedexGo-umbrella.h in Headers */, + 3635855E261991611001B8F34AB61CBB /* _RX.h in Headers */, + 2C61F409436BDADA9DC4F3AE6095B83B /* _RXDelegateProxy.h in Headers */, + 23F552367F9F12149C16697309FA1528 /* _RXKVOObserver.h in Headers */, + DE14A09490B74F598F7836CFC456E8F3 /* _RXObjCRuntime.h in Headers */, + E6DD4FC5B7A12BF6711D0D6C893A4947 /* RxCocoa-umbrella.h in Headers */, + 000BB78BE73265E73FA8E67AAB060D9B /* RxCocoa.h in Headers */, + D27AACEB710DB866716A338DB3B84694 /* RxCocoaRuntime.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; - C7620DFF427FBB34FF8B6A168116889C /* Headers */ = { + A0BB664DAAE3645E383F511C009A598B /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 5302D92F05F8E1F5DD28E2F733B89A3E /* _RX.h in Headers */, - AC37CDEAC53525CFFECC9DC7B2E672A7 /* _RXDelegateProxy.h in Headers */, - 2A1C6A8E7B0DB05623F91821D3988FC8 /* _RXKVOObserver.h in Headers */, - 8963FB3DD4ED2AE1D2747CD27AB29F79 /* _RXObjCRuntime.h in Headers */, - FBB63CBC2A63B540B0AA1DA3DFC53C23 /* RxCocoa-umbrella.h in Headers */, - 4210F63FDD2369A54E4142B218F2D716 /* RxCocoa.h in Headers */, + 625ADF703FECA0E43978A031BADF5D48 /* Pods-PokedexGo-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ - 2A28498AA2CFB73EA88DFA6E806A8BFC /* Pods-PokedexGo */ = { + 6111906DD6556E6699AC0D1C05078A02 /* RxSwift */ = { isa = PBXNativeTarget; - buildConfigurationList = D440088947B4D248B30487A8A06ECEA6 /* Build configuration list for PBXNativeTarget "Pods-PokedexGo" */; + buildConfigurationList = D70D4E04374A5C15A7A3B2AD5EC7F911 /* Build configuration list for PBXNativeTarget "RxSwift" */; buildPhases = ( - D45EA75169122321196E2364967595AA /* Sources */, - E0FEDBC74A0576919464EA2B84FBCEA7 /* Frameworks */, - C4DAD72DDFEB0E58700B257B46392953 /* Headers */, + 25FB611799798214C5731EFD4935BF71 /* Sources */, + D570AD028A4A54870063F3746712530B /* Frameworks */, + 83DC5BB729AE0449B8FE6B09D460A4E0 /* Headers */, ); buildRules = ( ); dependencies = ( - F99D0B6E6E058362D1D80890B35C0B30 /* PBXTargetDependency */, - 3AF56D3637A5D6EC5BA15A0B2F6BB4FE /* PBXTargetDependency */, ); - name = "Pods-PokedexGo"; - productName = "Pods-PokedexGo"; - productReference = 5AE9D22F7092B5D8E7E9F479D6B48A32 /* Pods_PokedexGo.framework */; + name = RxSwift; + productName = RxSwift; + productReference = 86CAE837680F6C8A2BDE31076089C27D /* RxSwift.framework */; productType = "com.apple.product-type.framework"; }; - 402EBD6070F177670CD20F26A5CB58BC /* RxSwift */ = { + 8218DE044D5B99F636F43E0C5DFDFBCD /* Pods-PokedexGo */ = { isa = PBXNativeTarget; - buildConfigurationList = C279DA118513C4227746B4205816D5CB /* Build configuration list for PBXNativeTarget "RxSwift" */; + buildConfigurationList = 3F9E45FFEFB3C849116501311B54F5D7 /* Build configuration list for PBXNativeTarget "Pods-PokedexGo" */; buildPhases = ( - 1C4FE17F796786E4C3569E951343CC4A /* Sources */, - 2A3CDA339E0F039B11B9F77A26EB3CA2 /* Frameworks */, - 8244154EBFB43A0CBE1FC5AB0A67DFE0 /* Headers */, + 4A2009C8443C3E17CBF14FACAEA0CB10 /* Sources */, + 1EFFE41FB7E8CB65FE06D1DC7DA5E074 /* Frameworks */, + A0BB664DAAE3645E383F511C009A598B /* Headers */, ); buildRules = ( ); dependencies = ( + 1BCBC2BD7C900A4AE7FCD87122935EFE /* PBXTargetDependency */, + 65BA864D14C9D4F910A39296BD04517A /* PBXTargetDependency */, ); - name = RxSwift; - productName = RxSwift; - productReference = 86CAE837680F6C8A2BDE31076089C27D /* RxSwift.framework */; + name = "Pods-PokedexGo"; + productName = "Pods-PokedexGo"; + productReference = 5AE9D22F7092B5D8E7E9F479D6B48A32 /* Pods_PokedexGo.framework */; productType = "com.apple.product-type.framework"; }; - 46F8D42C1E9780D15104E1B62753218F /* RxCocoa */ = { + CB4A3212CE222664E222C962519D604B /* RxCocoa */ = { isa = PBXNativeTarget; - buildConfigurationList = BDB869A1911382C27756660643CF09AF /* Build configuration list for PBXNativeTarget "RxCocoa" */; + buildConfigurationList = 4ABF43E2ED9FE8A34682CBD66B67D03F /* Build configuration list for PBXNativeTarget "RxCocoa" */; buildPhases = ( - A2B478E9103200CAB121B556798C930A /* Sources */, - CE63E854FE924D6C251F966E6B275A85 /* Frameworks */, - C7620DFF427FBB34FF8B6A168116889C /* Headers */, + 3E3A5DA31363A46FE541DDBA8A01BA7C /* Sources */, + 8E71B9089C80C0EDD09C8243CF865465 /* Frameworks */, + 977DAF13E8BF02F633BF768DA823CBAB /* Headers */, ); buildRules = ( ); dependencies = ( - BF5B5E47DFA6F34802C12C7FFF06DA84 /* PBXTargetDependency */, + 1C964D34337F5C6AD27C14E9B79D841C /* PBXTargetDependency */, ); name = RxCocoa; productName = RxCocoa; @@ -1029,329 +1053,299 @@ projectDirPath = ""; projectRoot = ""; targets = ( - 2A28498AA2CFB73EA88DFA6E806A8BFC /* Pods-PokedexGo */, - 46F8D42C1E9780D15104E1B62753218F /* RxCocoa */, - 402EBD6070F177670CD20F26A5CB58BC /* RxSwift */, + 8218DE044D5B99F636F43E0C5DFDFBCD /* Pods-PokedexGo */, + CB4A3212CE222664E222C962519D604B /* RxCocoa */, + 6111906DD6556E6699AC0D1C05078A02 /* RxSwift */, ); }; /* End PBXProject section */ /* Begin PBXSourcesBuildPhase section */ - 1C4FE17F796786E4C3569E951343CC4A /* Sources */ = { + 25FB611799798214C5731EFD4935BF71 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - E60781387E03838FAF4376F5DBAA49C8 /* AddRef.swift in Sources */, - D58DC4FD347A34D3524377C5F6CFC8E6 /* Amb.swift in Sources */, - 3484D496EC5F2E7A300319F44A5710CF /* AnonymousDisposable.swift in Sources */, - 8D18BFDA8A1C379934E7C76A0DBBAD79 /* AnonymousInvocable.swift in Sources */, - 9095FFEE4A59CDC37E05F226E25C665A /* AnonymousObservable.swift in Sources */, - D73D0168BE4DBFFCB4149A5C46B6C3F3 /* AnonymousObserver.swift in Sources */, - E526DE33BD7DF1D7384983EB3C0922AA /* AnyObserver.swift in Sources */, - 8B45821DCADB3F6BC24F3E2711C42E3B /* AsyncLock.swift in Sources */, - 9043847379ECC7C512BDC6B89C0030AE /* Bag.swift in Sources */, - 6942EB131AD4F0CCD6E5B60F88B8EDAB /* BehaviorSubject.swift in Sources */, - 0EC4CEF1E3132FB1AEB0D781818D6D6D /* BinaryDisposable.swift in Sources */, - 82B80B81D224402623C4DB4E358D32E6 /* BooleanDisposable.swift in Sources */, - E0020D79307C9C0603A63451915BEC3F /* Buffer.swift in Sources */, - DFDE6995FAD0DAFBB4DCBD3C2F03C991 /* Cancelable.swift in Sources */, - E018ACB5AB39E7A76183EF702F879E5E /* Catch.swift in Sources */, - 139F2DDB3C00644885AC74E0DC7D69D8 /* CombineLatest+arity.swift in Sources */, - 05375DD8BA8B0C62D6BD5CB8136C23F2 /* CombineLatest+CollectionType.swift in Sources */, - EF27EC21F4788A2C5683826659E39BF2 /* CombineLatest.swift in Sources */, - 12CB5D267916999E0DCE991355A51F49 /* CompositeDisposable.swift in Sources */, - 4EDE709A8D80B39DAFF8E8AAE8FDF7D2 /* Concat.swift in Sources */, - EE480903C0C190CB08FCFB2228F1563F /* ConcurrentDispatchQueueScheduler.swift in Sources */, - 26381F45E3C7A769E893500A9185B214 /* ConcurrentMainScheduler.swift in Sources */, - AB5F231DEC1BD5467A23076BEFB7B9BA /* ConnectableObservable.swift in Sources */, - 5DF4F3950FC69C869DCD333388F9A2AC /* ConnectableObservableType.swift in Sources */, - FC5248937A4EDF3CDB88810F7E1AA581 /* CurrentThreadScheduler.swift in Sources */, - E7CBA70E9DB022D4BB1AE80E941342BC /* Debug.swift in Sources */, - 6F4D85A44A7CA416C9F280D4B00D2597 /* Debunce.swift in Sources */, - F4535646B0A55879A1654F882D81C599 /* Deferred.swift in Sources */, - 526F658B2DFB22E2B897D95CAB61459A /* Delay.swift in Sources */, - 9B0C23910EF280F64DC2EC303FF903D0 /* DelaySubscription.swift in Sources */, - 6ED51F4BFCEFBAD3C2AA38CB9293FEB2 /* DispatchQueueConfiguration.swift in Sources */, - 62CC7CCAB23419773EA8F05FD1BF8F46 /* DispatchQueueSchedulerQOS.swift in Sources */, - DF02AD7321CB3A3DCC21ABCD8F699B20 /* Disposable.swift in Sources */, - 5DA1DA267B7C6F0C6F0E740CA08B0ACF /* Disposables.swift in Sources */, - 842DAA3E11FE3F9528597D860F6DA6D6 /* DisposeBag.swift in Sources */, - 8692E98F7E2FB3C77B77CBA3FBA511FC /* DisposeBase.swift in Sources */, - 5EE6A029304C5322AE71A0BAC6395DBB /* DistinctUntilChanged.swift in Sources */, - 9D9AA21DCD5F437F30AF75A4DBC6C32D /* Do.swift in Sources */, - C2F7ED905D7C6A7C599451D158769447 /* ElementAt.swift in Sources */, - 84814A43FA9B7B3B881073E583427380 /* Empty.swift in Sources */, - 562385BF0FC589222A183666DCDA5400 /* Error.swift in Sources */, - BBB15CC012D05C82D5338A8E23835850 /* Errors.swift in Sources */, - F7D64A5BD270F910BAD37A383C4870DF /* Event.swift in Sources */, - 5ADA010E21F0DD0418EBF462DF0459EA /* Filter.swift in Sources */, - A057AE65C3CCA3CE2A6AA15A253D2450 /* Generate.swift in Sources */, - BB619071AF0E86D7A5B22924D2142E6D /* HistoricalScheduler.swift in Sources */, - 067820A308D5CCAAA9EF50952578CD61 /* HistoricalSchedulerTimeConverter.swift in Sources */, - 822B9B2D31DBEB3BC1470891BB9E346F /* ImmediateScheduler.swift in Sources */, - F98E2131336DAD30F560EEC7DA762CF8 /* ImmediateSchedulerType.swift in Sources */, - 65743D917885947A81777BAEE977C456 /* InfiniteSequence.swift in Sources */, - 80D411ABB47575CEC00B164415356439 /* InvocableScheduledItem.swift in Sources */, - 64241BCF6445B010E2A1EB0670AA3D42 /* InvocableType.swift in Sources */, - 3B34B15249AE1BD1BE4187FAC9873EA6 /* Just.swift in Sources */, - 099DA1BDFD5892901146348B998D3D66 /* Lock.swift in Sources */, - 0BFAFB96C3AAACEDF809C2C85EEE7D9B /* LockOwnerType.swift in Sources */, - 7F49FDF50F834786A24A1595D5C50718 /* MainScheduler.swift in Sources */, - 827F5BFFA3091EB4E72B617586A8F1A5 /* Map.swift in Sources */, - E942407C1EC578C56138EE876E94B219 /* Merge.swift in Sources */, - F3E515690F406E9BD1AC7C6DF0D58AE5 /* Multicast.swift in Sources */, - 3B8F5148F9F09D670822F3C34B58D871 /* Never.swift in Sources */, - 03349F7DB26471557DBA3BEC6AD66AA7 /* NopDisposable.swift in Sources */, - 853B999E3BCE9F97DE3A615190A0C8A1 /* Observable+Aggregate.swift in Sources */, - AAF1D9A9C0EFD64F9F2C72CF446A58A6 /* Observable+Binding.swift in Sources */, - BE34E1CAB4AF783460B78882BF8344F0 /* Observable+Concurrency.swift in Sources */, - 000B063FD301679731F8FFF30B6E5733 /* Observable+Creation.swift in Sources */, - 258DDC4D40D56198DBAA5750B20167D5 /* Observable+Debug.swift in Sources */, - 902D49F6915B5AA29CACDBDA87321FD3 /* Observable+Multiple.swift in Sources */, - 5F65FAFF82D57FEE3D17D9D97006D914 /* Observable+Single.swift in Sources */, - 5F2D15A384B5E4A0FC6DE365D6D3574E /* Observable+StandardSequenceOperators.swift in Sources */, - 0738F0FAE4360B87C55BFCA3BCC1B30B /* Observable+Time.swift in Sources */, - 7C5493B6455831A091803F51972CDA8E /* Observable.swift in Sources */, - AC2935ED54A42D1AEA1990451BE7734B /* ObservableConvertibleType.swift in Sources */, - 038E7D217E8AF9B056F12B6022607BAC /* ObservableType+Extensions.swift in Sources */, - 0923FCEEF2D4FCADE1727D61D99BDF05 /* ObservableType.swift in Sources */, - 13A3A6073FA3C3C35FB71D7F068CD495 /* ObserveOn.swift in Sources */, - 5D7EBAE24A93B4C36D704B7959A68D91 /* ObserveOnSerialDispatchQueue.swift in Sources */, - F2EC2531D78764CE4516986208318567 /* ObserverBase.swift in Sources */, - 43577F0B35EDE5C8CAD3985C85AED6BB /* ObserverType.swift in Sources */, - BC0BC892C8CECA95BE8FA2436D0FBBDB /* OperationQueueScheduler.swift in Sources */, - 585C95DBEFB469249E9EF27658647965 /* Platform.Darwin.swift in Sources */, - A459DB9C44891DD97058C0C2499C96FB /* Platform.Linux.swift in Sources */, - E816355A0C00B33C263C008913E3C33D /* PriorityQueue.swift in Sources */, - 54C485DCB6BA1622B49FC3089DEBFBC1 /* Producer.swift in Sources */, - A70295D2F70FF80D9490A9AB377E0E2B /* PublishSubject.swift in Sources */, - 799A9FC2149DF784CABC966AE38308B0 /* Queue.swift in Sources */, - 7E748810A566B9CD0BD8AB40A667F929 /* Range.swift in Sources */, - 2FE6A5B69FF76C6573D8C9B8D8EB5789 /* RecursiveScheduler.swift in Sources */, - 7B711100E8EC1981415FBC7F63D0B7FD /* Reduce.swift in Sources */, - 2469ABD273088B429C3D2D5F81F3F754 /* RefCount.swift in Sources */, - A2A95C5735862A712D566BEA75D200CE /* RefCountDisposable.swift in Sources */, - B4D7E64AD57C0D46B75EB92E32172892 /* Repeat.swift in Sources */, - 3DA26A5A37F9D76BD7F425906B08A561 /* ReplaySubject.swift in Sources */, - D1BE7B3C706DC2904142838BAB01C9FA /* RetryWhen.swift in Sources */, - C7AB004966EA8C686A1B82A576ECFE93 /* Rx.swift in Sources */, - D912ACF721DA79933899B1E5372716ED /* RxMutableBox.swift in Sources */, - 402E8D815B06D252DD6E6D527FB031A1 /* RxSwift-dummy.m in Sources */, - 0FD76A04CAC5537F85A14A05E41B7AF1 /* Sample.swift in Sources */, - F6736CCAC15E8F96F162FBF35874A2A1 /* Scan.swift in Sources */, - BFF516A585EDECC462E0BB1A572C3D6A /* ScheduledDisposable.swift in Sources */, - 264DB6CCFB81FD481F9505279EDCCAAD /* ScheduledItem.swift in Sources */, - 2DE2638032226CA289337A10058BA8CC /* ScheduledItemType.swift in Sources */, - DC6EC6A53C277DF95A872F6C21744024 /* SchedulerServices+Emulation.swift in Sources */, - A76AD9032F03DA4799CE35D58DB5F8EA /* SchedulerType.swift in Sources */, - A56C60396A7689818FA6D5D12B41FABB /* Sequence.swift in Sources */, - FC19866931A6FA56F72616BAAA03ABA2 /* SerialDispatchQueueScheduler.swift in Sources */, - DE41ADC85BDBD18D3660715B3731FA4F /* SerialDisposable.swift in Sources */, - 5BA6238EB2518E8DB7EA41BFB453F64C /* ShareReplay1.swift in Sources */, - 9CBF604FF8CF14BD6DAD363F4BFE1AD5 /* ShareReplay1WhileConnected.swift in Sources */, - 84E8EAFEAB5002513564F99F9C14C3C4 /* SingleAssignmentDisposable.swift in Sources */, - 410081D0FC3368E5FEEE568AC262BF63 /* SingleAsync.swift in Sources */, - B1E3FDBB4CC2D72ABE41FFAAF7397A6D /* Sink.swift in Sources */, - 1083539F27F8C4A38F263A9655B3EB6B /* Skip.swift in Sources */, - F317E84799C431E809E84B37BE3B7132 /* SkipUntil.swift in Sources */, - C8D30BE8CAFEA991769593EDABBFA3F5 /* SkipWhile.swift in Sources */, - C4C426FCC9B13409E9EAB9596258AD24 /* StableCompositeDisposable.swift in Sources */, - EDCA0BFDCE78E404FF02B958DC257F6D /* StartWith.swift in Sources */, - 02ED9C39332CDA21BC1ABB82D3C0CBD0 /* String+Rx.swift in Sources */, - 3AEF12CACDD31E3E49F34D33372F4D1A /* SubjectType.swift in Sources */, - B15872FCE46CA6CF1DE4C47CD53BE6F3 /* SubscribeOn.swift in Sources */, - 49DEE03177E6DC81647C32BE0D3FAAEB /* SubscriptionDisposable.swift in Sources */, - A0B69A7A4559D8C3A628299126D263BD /* Switch.swift in Sources */, - 4354A4AB284D5CB7F60170EC9AA45C56 /* SynchronizedDisposeType.swift in Sources */, - 7169C08262F574788CB29875468617EB /* SynchronizedOnType.swift in Sources */, - 7BF138F0EA1C2F1B831531B5A6C0A64F /* SynchronizedSubscribeType.swift in Sources */, - 936D423DA529913F7A96CD1EDE161446 /* SynchronizedUnsubscribeType.swift in Sources */, - D4E5C3266245EEC495A4A7598146AC23 /* TailRecursiveSink.swift in Sources */, - BD83F0B46F36278289C9EEEF35191B7B /* Take.swift in Sources */, - 9244FC69DDCCA91D041F5EEAB590C29B /* TakeLast.swift in Sources */, - 11C6D2B3912E2C8D012A347429216A97 /* TakeUntil.swift in Sources */, - D4A8376AE4BAE44614DC25EA4ACBE610 /* TakeWhile.swift in Sources */, - 21E47814734174E5577E9B6E489DB2EB /* Throttle.swift in Sources */, - BBF577DD793C204677DA247DF29FE125 /* Timeout.swift in Sources */, - 9F165611E7FC0E29356C3BC02956BEAF /* Timer.swift in Sources */, - B47060D878E1E37F85DCEDB36800C85C /* ToArray.swift in Sources */, - 065CB7E7FCD725744876B59BBCDA7173 /* Using.swift in Sources */, - FF077555B87FBF2DCF0468D215AC5D94 /* Variable.swift in Sources */, - 39090DBB52FF620EAD0813499C55F238 /* VirtualTimeConverterType.swift in Sources */, - 9EEE7265F1B76348C5ED599076DCFFCD /* VirtualTimeScheduler.swift in Sources */, - A6CE70378DC461284BC023DC93FCEEFA /* Window.swift in Sources */, - 250B4E7CF26413EF2FB28815B1B62C3B /* WithLatestFrom.swift in Sources */, - 6E6C0314350BCDE34E2BDC540FD6FFF2 /* Zip+arity.swift in Sources */, - 79978C870BB6B31A0CF9B4B3DCC4FC0A /* Zip+CollectionType.swift in Sources */, - 8CE91102D2CE432063BA65003DCB7475 /* Zip.swift in Sources */, + 77566600D46D25410ED8911CF00A67ED /* AddRef.swift in Sources */, + BD549F5A74F74D82D543C792C27F049E /* Amb.swift in Sources */, + 5F16CFCB025D837C01C9B9BEEB65B81E /* AnonymousDisposable.swift in Sources */, + 7E52A9625C18CA8C1BE5B25DFCE3799A /* AnonymousInvocable.swift in Sources */, + 8FC74123F7EDFCF0E2E9CB8F12D75565 /* AnonymousObservable.swift in Sources */, + CD7400ADE6FF0E05F394324483FCB151 /* AnonymousObserver.swift in Sources */, + 99F3866ABEC5BBE8E325CDA76B27BE57 /* AnyObserver.swift in Sources */, + 8F08A0A21CAD3869D45C2F7D8C74E256 /* AsyncLock.swift in Sources */, + 57D5464BE825AB76759A09437D8AD4FA /* Bag+Rx.swift in Sources */, + 60D48C9B7E5C80DAD307F4F287D83047 /* Bag.swift in Sources */, + 1084A71F235AF15198D7515E937143A8 /* BehaviorSubject.swift in Sources */, + FD21FEB5C3FE29950613F9A99491B723 /* BinaryDisposable.swift in Sources */, + 8AA42C32C0B2DBED3EAF429A231CDB21 /* BooleanDisposable.swift in Sources */, + 3D9C6FDE282B84AF9237FF7B99114663 /* Buffer.swift in Sources */, + 90A1D93A172B7D93D12A546EAD1BFE19 /* Cancelable.swift in Sources */, + 856332B9A729EDEAE7CC0302027CDC0F /* Catch.swift in Sources */, + 1576FC7D9496DF6373ADD504879C67B5 /* CombineLatest+arity.swift in Sources */, + 86AC77160E0C5DD95BEB019628E879E6 /* CombineLatest+Collection.swift in Sources */, + 4A99A445C54B950702B8AF395618776B /* CombineLatest.swift in Sources */, + 4871C259D8B4ED46266C0A8CCFBBB473 /* CompositeDisposable.swift in Sources */, + AE3E0437C711028E325A0930030B90E4 /* Concat.swift in Sources */, + 05C2B48F96C07F82511E666001B5FE47 /* ConcurrentDispatchQueueScheduler.swift in Sources */, + CF2F08EA082E653EF617D7FBC4A001FA /* ConcurrentMainScheduler.swift in Sources */, + E58994E13807BF5B2632CB07829FB897 /* ConnectableObservable.swift in Sources */, + 6470CAE016FF5FE6E6870ADE258250B8 /* ConnectableObservableType.swift in Sources */, + CB51294DAF1ECC45EC6167BECCFFACF4 /* CurrentThreadScheduler.swift in Sources */, + 29B16EB7250FD61AEDD066D0AEB359D9 /* Debug.swift in Sources */, + D833970A227876D7037712FEEB20B58D /* Debunce.swift in Sources */, + AE02FD1657561DFB785E09AC35BBCD72 /* Deferred.swift in Sources */, + 467A45A5CBD7A8C257EE1C954540284E /* Delay.swift in Sources */, + E85CE4AC7329B2A28C3962A44CC74954 /* DelaySubscription.swift in Sources */, + 85782EC2598D333ADC637BB955FE36FC /* DispatchQueue+Extensions.swift in Sources */, + E3D9C194890984A380E38076AF97EE74 /* DispatchQueueConfiguration.swift in Sources */, + 07C2568F53ED8C6B08A1CA2D15A56F51 /* Disposable.swift in Sources */, + 0C3C7020F10AB56539A4CD967E44E336 /* Disposables.swift in Sources */, + 45293DF3ECBC150338C9AC23AF0B0609 /* DisposeBag.swift in Sources */, + C5494AA6BD2FEBDBC7BA8C12153614E1 /* DisposeBase.swift in Sources */, + 8D03029BB0EEC41E0A024682FF09EE6A /* DistinctUntilChanged.swift in Sources */, + 4CC9B3F615375E6A51B543CD3DF2E55E /* Do.swift in Sources */, + 2B004C68074139E480C4252B98B4C948 /* ElementAt.swift in Sources */, + E88CB065BEF379BD60E2AD72A871EA07 /* Empty.swift in Sources */, + CAC20FE152F2C44B01217125C9248E8E /* Error.swift in Sources */, + AF164AC62EF67AE504DD0C2F5F804A33 /* Errors.swift in Sources */, + 4BEB0D2BB14D3E01EF142F82C9DDFC7B /* Event.swift in Sources */, + AB4D751C9E2AB7A713033C10D3D8706D /* Filter.swift in Sources */, + CC1EB4C5C523C46291EF99F9F0A66E97 /* Generate.swift in Sources */, + C0E21F295CC1608BCF28C9C03C45DE1A /* HistoricalScheduler.swift in Sources */, + 3F586EE283532EDAABAF75439961D6ED /* HistoricalSchedulerTimeConverter.swift in Sources */, + 821413DA27D4C52186989ACF6F4CAAEB /* ImmediateScheduler.swift in Sources */, + 59BE4366D2801AD5BA180CF437EDF32A /* ImmediateSchedulerType.swift in Sources */, + F7EFEF5679DD9DF9EBCFF6578BE49FA0 /* InfiniteSequence.swift in Sources */, + D5D6327F15D70764FC1C2074D149B5F8 /* InvocableScheduledItem.swift in Sources */, + 5605DC169D11F66A44CD43EFC2E2D70B /* InvocableType.swift in Sources */, + FF824085592FCA110E19CCE569A99EAE /* Just.swift in Sources */, + C459E1CB96638B30A7BE880452A188CD /* Lock.swift in Sources */, + 4DAAC12BAA13E8509170E5146770BB28 /* LockOwnerType.swift in Sources */, + BDB52602A520BBC270E051F0A669A7FF /* MainScheduler.swift in Sources */, + ABC1261AF722C75EBB5034EF5CF2910D /* Map.swift in Sources */, + C1E3BDD55C24EC009C5DE956D1F7C7D7 /* Merge.swift in Sources */, + D2C3EA028CBF9B6A7384EAD8C06CC3F1 /* Multicast.swift in Sources */, + A7DD8CDCEA4132FDBB931915303513DB /* Never.swift in Sources */, + CA1E15B731CBF82AEE676915A6226DF4 /* NopDisposable.swift in Sources */, + B07B93E8533A80E21077FE81985D8F6A /* Observable+Aggregate.swift in Sources */, + 0FC07576E903FD7D08710B3B13AA8E04 /* Observable+Binding.swift in Sources */, + 10A93C53F966AC5C47EF907A7F0BC704 /* Observable+Concurrency.swift in Sources */, + 822C8B28E86F2C841327CA3376FE78B3 /* Observable+Creation.swift in Sources */, + 9B38F5893F0D186AEAD699466A3B8836 /* Observable+Debug.swift in Sources */, + 2A166D31F5542BA58657104BF3A2982D /* Observable+Multiple.swift in Sources */, + 353D56ABF6CB45B1C7964AD8B011C576 /* Observable+Single.swift in Sources */, + BD530FCAC7D4C00EC656A7CA17206CD1 /* Observable+StandardSequenceOperators.swift in Sources */, + 6D1204F2C17D25FBD642EEF8EAD4B9AA /* Observable+Time.swift in Sources */, + E27C8069BE899CCA7E53D4BFBEF8F627 /* Observable.swift in Sources */, + 8C13E631B96C8A69BFC2D6082E9FA241 /* ObservableConvertibleType.swift in Sources */, + CACD9B0932614E29AB490A7D1990E2AB /* ObservableType+Extensions.swift in Sources */, + 16904F77708C5B0F20F0FCCA32BD31E9 /* ObservableType.swift in Sources */, + 96D3B761549C658F3BBE325C3D6E9AD3 /* ObserveOn.swift in Sources */, + 2E11D6FCF111D03B708A65640DDC4ADF /* ObserveOnSerialDispatchQueue.swift in Sources */, + 65BCCEEFE86506F966D67EDE583D1D9A /* ObserverBase.swift in Sources */, + 48986E4E74B3F796261DBC6FF5839951 /* ObserverType.swift in Sources */, + 944B2C6C4BB844DF8B653A08E009D3D1 /* OperationQueueScheduler.swift in Sources */, + 603B785802BD341E287793B385D8763D /* Platform.Darwin.swift in Sources */, + 1B90B20CE3E6AB0DC8F94293885A5BBF /* Platform.Linux.swift in Sources */, + EEA9485CD9D29F85D2E5B3C2B4BFBF80 /* PriorityQueue.swift in Sources */, + 60C4522593BA7DADA33970F71B1FECB9 /* Producer.swift in Sources */, + FAB534525B9EA54B097DA8CD8E0BEC56 /* PublishSubject.swift in Sources */, + B3424BF565F7184D27EF7D67E88F7B12 /* Queue.swift in Sources */, + 340C0536EEE1DAC84A49C73A61212813 /* Range.swift in Sources */, + 8E167D3B396C7D754C8E8DE80F38477E /* Reactive.swift in Sources */, + 696454199FBCE2017184A47B1848318E /* RecursiveScheduler.swift in Sources */, + 8BC2D471DF877174F872D957FE534419 /* Reduce.swift in Sources */, + 8726DEDCA5817E614592ADE14FB76BB6 /* RefCount.swift in Sources */, + 0AF1F8216E9E91A6ACBDABA550AFBA03 /* RefCountDisposable.swift in Sources */, + F4C471FA29B17704F82CD8E7C836EB96 /* Repeat.swift in Sources */, + D1D616533BC802BD3BE04E6EE1D0A8DA /* ReplaySubject.swift in Sources */, + C823788D0F5829EA6AEB13E9AE81FCC5 /* RetryWhen.swift in Sources */, + 2DC629C569D7275E0D6CD34ED9752B16 /* Rx.swift in Sources */, + 39E7036C42C3E751AA0F53ADCFCDFD3C /* RxMutableBox.swift in Sources */, + 88EB3F9158721C0195CBC3E6E88FFAC4 /* RxSwift-dummy.m in Sources */, + 8CC6BE81F2727BDD00091E8EDC3DC797 /* Sample.swift in Sources */, + EDC6A6B90C7D781DABBD5B532280290D /* Scan.swift in Sources */, + D21B2AF6315E5232DA13772993018C7F /* ScheduledDisposable.swift in Sources */, + 9EB7A8CE5046636E0437BB98CF496ED0 /* ScheduledItem.swift in Sources */, + F1911CB1828788BCFD2429BF4F5C0B9D /* ScheduledItemType.swift in Sources */, + 518963F1BF2447CB199C044BBF6004C6 /* SchedulerServices+Emulation.swift in Sources */, + 4202EFAB59455AE74D9B1E6C9AB520BB /* SchedulerType.swift in Sources */, + 064ABF8291397CFE3E961D56D9238BFA /* Sequence.swift in Sources */, + A8F46A9F07392BE6AD81A6181EF0592E /* SerialDispatchQueueScheduler.swift in Sources */, + 2C66E75B76300F1C931A514421FF6D99 /* SerialDisposable.swift in Sources */, + 844C335CA2C61EB6E5B131CB61386509 /* ShareReplay1.swift in Sources */, + 463B3383D3134496D0D532AD9C6F5C6F /* ShareReplay1WhileConnected.swift in Sources */, + 07BA8B2610299686205DDCCB468FC0F6 /* SingleAssignmentDisposable.swift in Sources */, + F2A94E48D7DF9478DB6FF71D6C313BB6 /* SingleAsync.swift in Sources */, + FDEC0DDC235B4C3005565D39740E8183 /* Sink.swift in Sources */, + 74B86089474801570A75A89A63E33073 /* Skip.swift in Sources */, + 4BBF1CD267DDD66996B161F0B1B48B98 /* SkipUntil.swift in Sources */, + DC5D4611375E3C8D187CBC2BC359BCF1 /* SkipWhile.swift in Sources */, + 2D7384435B6637373A311D6901A9CB60 /* StartWith.swift in Sources */, + 8BDF3002A8ED36B2B13CFD9C4C6FCDC0 /* String+Rx.swift in Sources */, + BB7DCB75FA9AC2458ED3A5662BA40ED7 /* SubjectType.swift in Sources */, + 8B57DE6CED50D92E8E27C4FD267DA15E /* SubscribeOn.swift in Sources */, + 129D651BFE1C326871BBDB3D0E1B7E19 /* SubscriptionDisposable.swift in Sources */, + 84F8E9C004DF457E558BEB5350893A74 /* Switch.swift in Sources */, + A918EBE37A98B6A9E7AE09490969A6F7 /* SynchronizedDisposeType.swift in Sources */, + 9A1AC9703382C22DAB05E2F8AEC95C32 /* SynchronizedOnType.swift in Sources */, + 9FE76BDCD0A12B8A09F394733F26A516 /* SynchronizedSubscribeType.swift in Sources */, + DBAE3679FFD79C4092885470CE375B2D /* SynchronizedUnsubscribeType.swift in Sources */, + FBEE54B193FDF37E1B786DA47B3DB098 /* TailRecursiveSink.swift in Sources */, + 8DA194776C8097962BC733989FDD632D /* Take.swift in Sources */, + 9AADC4D8700A16928411D2C269422474 /* TakeLast.swift in Sources */, + 1A1AE8136C2802D337B7120D661ADA17 /* TakeUntil.swift in Sources */, + FA253AC265EDACA7B86680AC62340985 /* TakeWhile.swift in Sources */, + 14667FE180867DE13DEDD46D7F09B285 /* Throttle.swift in Sources */, + 172B7BFFF98FF4EBDD46CA46BA79BEF7 /* Timeout.swift in Sources */, + 7E4578403AF9E519B2F5E8C8F22FA7B7 /* Timer.swift in Sources */, + E85DC682EBB400586E00721AAD6A40AA /* ToArray.swift in Sources */, + 3FDDEE9E82EEADE6F95943B544A329D5 /* Using.swift in Sources */, + 53B96D4F73D2A55B475D1DFE041FB50C /* Variable.swift in Sources */, + 79110C3D44003087AF3A6F50F33B4A25 /* VirtualTimeConverterType.swift in Sources */, + A62F38C06D02956EF0FEE7CB545DFF0B /* VirtualTimeScheduler.swift in Sources */, + C61B877F57B32344E031D0E5A72A979C /* Window.swift in Sources */, + 60AF9D34182321D50BE60739EDEFDEBB /* WithLatestFrom.swift in Sources */, + 1346B85CAB24326BF8E5E56A6954AC93 /* Zip+arity.swift in Sources */, + C5F5AA378B2A55CA3EABD6A83C7317F2 /* Zip+Collection.swift in Sources */, + 09C7DE145B7D88971EE597EE4C0806FE /* Zip.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - A2B478E9103200CAB121B556798C930A /* Sources */ = { + 3E3A5DA31363A46FE541DDBA8A01BA7C /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - B1FB6E4AC5DDA34A5AA2A263D0AA75FF /* _RX.m in Sources */, - 75E8D0BA3AE5FBDE9A73C4F68B61F9BF /* _RXDelegateProxy.m in Sources */, - 798D24B759179C918B3C181E9C7A99CB /* _RXKVOObserver.m in Sources */, - 023ACADEFB83DF1D3C198C428DCF38AA /* _RXObjCRuntime.m in Sources */, - 7A7CFAEEC2DCD04B97FDD4C24DAE8146 /* ControlEvent+Driver.swift in Sources */, - D7B9459FB76EC99338E8C900294F6D27 /* ControlEvent.swift in Sources */, - AD29D9597C9C927EB1B8F56CE5D38FF4 /* ControlProperty+Driver.swift in Sources */, - 26C95DD0018660F8458E31B0CB1A671E /* ControlProperty.swift in Sources */, - 4A6969C2FF43B8F29467829DA857ED58 /* ControlTarget.swift in Sources */, - E5F9E74AE2732FB04E0F2B83FDF979E9 /* DeallocObservable.swift in Sources */, - 4270933FB3F4B96E628CE1FA13A10F2B /* DelegateProxy.swift in Sources */, - 0226A0AEE44C36AF973682CB4E1F7AA8 /* DelegateProxyType.swift in Sources */, - 9325E91F0D5BCABEA1A221652D95AE53 /* Driver+Operators+arity.swift in Sources */, - 568B2FF1D4BEF3605B4738BB5024D2E8 /* Driver+Operators.swift in Sources */, - C803E2EEE84433D4E14F3145C688585C /* Driver+Subscription.swift in Sources */, - 6416015FB86AEEED018CB78AAA46790E /* Driver.swift in Sources */, - E6AEC992D0816418D9B16BA1F71DA944 /* ItemEvents.swift in Sources */, - AE65348724534E93B2F12589A22C1034 /* KVOObservable.swift in Sources */, - D1253B52A297F8C2EC822749D3578A1D /* KVOObserver.swift in Sources */, - 114AF7633716B810F80CD33CC340B909 /* KVORepresentable+CoreGraphics.swift in Sources */, - 76F654CD972132327C048291F268C8B0 /* KVORepresentable+Swift.swift in Sources */, - F153A4BE3B383C99D7E5F24CE3B2E3C3 /* KVORepresentable.swift in Sources */, - 1FA72CFE5EA8AD4AF5B50822AD02DE32 /* Logging.swift in Sources */, - 10E959E45D4D428635056928219C5475 /* MessageSentObserver.swift in Sources */, - DE7B7B17930E25419A5FF8B5F2CA0686 /* NSLayoutConstraint+Rx.swift in Sources */, - A2BC4F1279CFA1C735ECCA7125A70B2E /* NSNotificationCenter+Rx.swift in Sources */, - A6AC25617FC2ED12F0A27CFD039AA3F1 /* NSObject+Rx+KVORepresentable.swift in Sources */, - 02EEDEC0A12BC1A14F24D1B4CC20313C /* NSObject+Rx+RawRepresentable.swift in Sources */, - A5FF9B1CEDB7FD51B137660A49B48565 /* NSObject+Rx.swift in Sources */, - 29EC70D2CA454BE2052C9EC3CB904FEA /* NSTextStorage+Rx.swift in Sources */, - FF25F4E9276C786626D891B65EEA1E54 /* NSURLSession+Rx.swift in Sources */, - 2F1A3059466F0A841A3254B0DBD8BACD /* Observable+Bind.swift in Sources */, - AC67EBBE20EA95E7146E8A8FE1D3DFD7 /* ObservableConvertibleType+Driver.swift in Sources */, - DB0E4476A1328740B85AF1C5A9DB649A /* Reactive.swift in Sources */, - 4BC7122279FAA452B5FFFF73BD3EAE9F /* RxCocoa-dummy.m in Sources */, - D970DE2C185F97A198B7785855940664 /* RxCocoa.swift in Sources */, - 10530B2996D799370BF1D002D3EA9286 /* RxCollectionViewDataSourceProxy.swift in Sources */, - 8A7B6E452DF412F5A64E9ECD424D2F22 /* RxCollectionViewDataSourceType.swift in Sources */, - 7363ACC8A29B4B8D4F6804BC5929B3E8 /* RxCollectionViewDelegateProxy.swift in Sources */, - 61BEF0E4F3056C2AE5244886D9E8CD6A /* RxCollectionViewReactiveArrayDataSource.swift in Sources */, - 7F8D3FAEA342967C3B01FA6564D516E8 /* RxImagePickerDelegateProxy.swift in Sources */, - C5C304C12FCEFCE027BE90A90B026FBD /* RxPickerViewDelegateProxy.swift in Sources */, - 898D45A6CB05AC31969F4ECBF4CB05AE /* RxScrollViewDelegateProxy.swift in Sources */, - 7A0E20A7C149A126249CE2764497FF13 /* RxSearchBarDelegateProxy.swift in Sources */, - C6FDF37E3DD19B89482B19C6156F4590 /* RxSearchControllerDelegateProxy.swift in Sources */, - 478243AB17606EA714C45C1C745968D6 /* RxTabBarDelegateProxy.swift in Sources */, - 7FAE419D4D86D5809B677DF91CD043E7 /* RxTableViewDataSourceProxy.swift in Sources */, - E64EB054C5BC86969A52B038C7AB0DE1 /* RxTableViewDataSourceType.swift in Sources */, - CCE710FCE321C50437747CA48DFB550D /* RxTableViewDelegateProxy.swift in Sources */, - B0CE7A0CB812B682E338EF2AD0EC3F42 /* RxTableViewReactiveArrayDataSource.swift in Sources */, - 7BE874E302F827B41F0DA43B1DDE68DE /* RxTarget.swift in Sources */, - 5BEA1515F5BF10D217029C67551F19B3 /* RxTextStorageDelegateProxy.swift in Sources */, - 2546F9E0F230393F3116C65D708CD339 /* RxTextViewDelegateProxy.swift in Sources */, - E110CA5AA9DF7F7921382B26E776A1DE /* SectionedViewDataSourceType.swift in Sources */, - 159E21E449E35A0B0AD11826D1C2E911 /* TextInput.swift in Sources */, - EB30D8D46F7ED6D7FE623FE4F43DF543 /* UIActivityIndicatorView+Rx.swift in Sources */, - 0C5587DCDD5C7DBB42B0B8A02882B368 /* UIAlertAction+Rx.swift in Sources */, - 654B482A8926A6C774C98664388658C5 /* UIApplication+Rx.swift in Sources */, - 5BEAF300718433931253845E3ED3B29E /* UIBarButtonItem+Rx.swift in Sources */, - 93987D0C6E16433D86D9DD338F07795A /* UIBindingObserver.swift in Sources */, - F3B7A8258B85F1F2D521D80762EF9475 /* UIButton+Rx.swift in Sources */, - D2DD8831B9B685F798DB590503187BBF /* UICollectionView+Rx.swift in Sources */, - EAE88874696C2D88074A70271C8890DF /* UIControl+Rx.swift in Sources */, - F82E6FC0DD274C938779B0A7D0F5B929 /* UIDatePicker+Rx.swift in Sources */, - 9534FB6966E51DFA0116C5AD6422C026 /* UIGestureRecognizer+Rx.swift in Sources */, - C7EB0E6F0E403DBCF935D755AD0A3A89 /* UIImageView+Rx.swift in Sources */, - 060BB7EDFED8C8F38EAB1C75419A6984 /* UILabel+Rx.swift in Sources */, - 8B65BFC93E68DEB7F12D1B27FD57BC13 /* UINavigationItem+Rx.swift in Sources */, - 1591B5BD6CA1678FD501EF69D85EDB22 /* UIPageControl+Rx.swift in Sources */, - EEF0428CEA5E57201723EA7A976AEE53 /* UIPickerView+Rx.swift in Sources */, - D3FA548E4A33EA8679AFA023EEADEAA8 /* UIProgressView+Rx.swift in Sources */, - 27B825CB7B26AA4455DE2DB1EBAE68D4 /* UIRefreshControl+Rx.swift in Sources */, - 1032B74EC7A00AF022076C108643AD7E /* UIScrollView+Rx.swift in Sources */, - 8C00CB51D3C776341791C661ACA57C2B /* UISearchBar+Rx.swift in Sources */, - A86474A13C3C51C31371E82963801E42 /* UISearchController+Rx.swift in Sources */, - 31673C97F052AF47444F89EFEE80403F /* UISegmentedControl+Rx.swift in Sources */, - 14928CC74400DA81629E25E7E5AB08AF /* UISlider+Rx.swift in Sources */, - E1B0183CCE4F47767FB7134A9E4B167C /* UIStepper+Rx.swift in Sources */, - 44FC239A0596D8DF873A3335E9CB9D54 /* UISwitch+Rx.swift in Sources */, - 6F95234234C5A7E07EB683381130F423 /* UITabBar+Rx.swift in Sources */, - 3E0A23FB1C4EECC5DD016E55E4F8EC5C /* UITabBarItem+Rx.swift in Sources */, - FB716709367B7BA7ED37B0358A6F72BB /* UITableView+Rx.swift in Sources */, - C0631C19397001DC37B9D308F8110316 /* UITextField+Rx.swift in Sources */, - 71B42A3E2FB3C7F7CE0EAD2710F59C0A /* UITextView+Rx.swift in Sources */, - E003D58EBFEFCB2342B73D1429EA5691 /* UIView+Rx.swift in Sources */, - 718D7B7FB427D42DFDEA6FE094F36DCA /* UIViewController+Rx.swift in Sources */, - 66C957B4D0415A249E3EE833E4371994 /* Variable+Driver.swift in Sources */, + 77C182D0C24A813074A53AE5E1632356 /* _RX.m in Sources */, + 0A2A3E1539B4293B3BC2247FFBBCD572 /* _RXDelegateProxy.m in Sources */, + E7EB802E0E101339BEBF8787B22CA823 /* _RXKVOObserver.m in Sources */, + B79D764BF6355209267A93A6685333A5 /* _RXObjCRuntime.m in Sources */, + 241D0F6C662A3991A43CF9B059E5FDC4 /* Bag.swift in Sources */, + D0EA7B4C3BCEF31050AABF47A9374E32 /* ControlEvent+Driver.swift in Sources */, + 2E05A63DD51D9C9C9FA46BAE2C8E71C9 /* ControlEvent.swift in Sources */, + 4B136E06955AE58FB2476F824F7B341B /* ControlProperty+Driver.swift in Sources */, + 287C1FFD2C49BE2C49A16B8AD59E15C6 /* ControlProperty.swift in Sources */, + 4CEE20D554A8B09D045F3E480CA3DD47 /* ControlTarget.swift in Sources */, + 43D9DB2E6CC9E5A1985B19025A29D184 /* DelegateProxy.swift in Sources */, + CBE99CCFFFCB849212B6FB6D2F9A53E6 /* DelegateProxyType.swift in Sources */, + 954B0A0489598AB2D063241B46F62C8C /* DispatchQueue+Extensions.swift in Sources */, + FC9C041BD469A2A9A6217F7C3704ADAB /* Driver+Subscription.swift in Sources */, + EFEC1B345021E5A2BE3133767DDF7E6C /* Driver.swift in Sources */, + 9A46E657438F1EADB4F3C013925408FE /* InfiniteSequence.swift in Sources */, + 825D11BB5580546AD789880EAD4B8C62 /* ItemEvents.swift in Sources */, + D7D77A6D4E380168BC2F7F0814447B43 /* KVORepresentable+CoreGraphics.swift in Sources */, + 78BD7AA53EFFC1B1E6FA8E7904091BD4 /* KVORepresentable+Swift.swift in Sources */, + 428629547475AF8293C1F7022581804B /* KVORepresentable.swift in Sources */, + A462ED2113ECD649E947018C08E1715B /* Logging.swift in Sources */, + 325E76037DE7CBCD52DA4AEFC1ACB654 /* NSLayoutConstraint+Rx.swift in Sources */, + D251342CAD00B3A0E7EC3678592B650A /* NSNotificationCenter+Rx.swift in Sources */, + 1D5FEDD333ED9BCF9C1DCD7ED4BD24C4 /* NSObject+Rx+KVORepresentable.swift in Sources */, + FC2E222A7AEA3DE73F21DE6984814C41 /* NSObject+Rx+RawRepresentable.swift in Sources */, + 85491F58B4BD3DD0CFC771F861A660D3 /* NSObject+Rx.swift in Sources */, + 69379C3A91EED16179E67B84640F58BD /* NSTextStorage+Rx.swift in Sources */, + 5A11E733104FC70E013E6E27EF79D557 /* Observable+Bind.swift in Sources */, + AD58B2E686C181A5E2A38340E6382AA6 /* ObservableConvertibleType+Driver.swift in Sources */, + F8E7AA6F959A6D6B8DB65C5F6D44388E /* ObservableConvertibleType+SharedSequence.swift in Sources */, + 5316DAA30B39C49DCDA7EC5B7A715533 /* Platform.Darwin.swift in Sources */, + 2A477B3B0B9FB4231B48456AB5A3BC1D /* Platform.Linux.swift in Sources */, + BEC06180957AED23FABD97CFAF33ACF6 /* PriorityQueue.swift in Sources */, + 9E8F409E27A4179D15B755B5B3B2832C /* Queue.swift in Sources */, + 3FC471D71E9182035347995A85DA4F3D /* RxCocoa-dummy.m in Sources */, + 8E7DFE12E409B4A1E5EEC52FEFE399D3 /* RxCocoa.swift in Sources */, + F6DE98FB2098E3B5B7615FF5FDFE306A /* RxCocoaObjCRuntimeError+Extensions.swift in Sources */, + 10649A07433609593448F997B93A2D43 /* RxCollectionViewDataSourceProxy.swift in Sources */, + A7542150C35BE5A5C48B202E928066C6 /* RxCollectionViewDataSourceType.swift in Sources */, + E34B5956A142C76A16BE8E0A47614C76 /* RxCollectionViewDelegateProxy.swift in Sources */, + 1579E04D9661BF972D1C98FA0B5DC722 /* RxCollectionViewReactiveArrayDataSource.swift in Sources */, + 9044181820DB4607D7438D84F31874D0 /* RxPickerViewDelegateProxy.swift in Sources */, + D82AD2D5137003784582FC3F27860574 /* RxScrollViewDelegateProxy.swift in Sources */, + 6FD69465008280047A400FCBC575B0FA /* RxSearchBarDelegateProxy.swift in Sources */, + 33112944329971F27C0AAA50E34D6128 /* RxSearchControllerDelegateProxy.swift in Sources */, + 7A5531D8F6637F601A458D558873F321 /* RxTabBarDelegateProxy.swift in Sources */, + 021F03CC102E3F7283E76D686B414011 /* RxTableViewDataSourceProxy.swift in Sources */, + 3D69CC680C7E06ADEAFDBCB607713AD8 /* RxTableViewDataSourceType.swift in Sources */, + 6E385BB132724A37AA78D523E6773F69 /* RxTableViewDelegateProxy.swift in Sources */, + 3CE2FC3AF82CF03D3CD41D066F728ADF /* RxTableViewReactiveArrayDataSource.swift in Sources */, + 1DE8724FC95C791AD47F6B885DF855F0 /* RxTarget.swift in Sources */, + F294ADC6B119C71445AE2255E11864CD /* RxTextStorageDelegateProxy.swift in Sources */, + E8B5392D7D672E1DD3D9C1F4D92DF86C /* RxTextViewDelegateProxy.swift in Sources */, + 0383E4D8A2C2C9924F5CF0D2C646D60D /* SectionedViewDataSourceType.swift in Sources */, + B7A9C4B9DB5E7B1D77DD3775C49B3E66 /* SharedSequence+Operators+arity.swift in Sources */, + 756AEEF4CF2F709810B050B97889CC3E /* SharedSequence+Operators.swift in Sources */, + 72C0F0BFD26DF413287E7C2D9EF2AC2A /* SharedSequence.swift in Sources */, + 524E9615DCAB7C2F76E33B84668C7372 /* TextInput.swift in Sources */, + F7BD7BECE29FB3419524A0D164C9F43F /* UIActivityIndicatorView+Rx.swift in Sources */, + 7B4A012AB83EA24B0109584FA3E412CD /* UIAlertAction+Rx.swift in Sources */, + 339086CD50565C77FA81089DBF7F8226 /* UIApplication+Rx.swift in Sources */, + 1DEBDBAE98CCCF73742931B465A3D98B /* UIBarButtonItem+Rx.swift in Sources */, + 08BC583AC7D5B2CB1977896CBD6A6280 /* UIBindingObserver.swift in Sources */, + 12C9843D7C50B3F5D662DCE99A2AF6DF /* UIButton+Rx.swift in Sources */, + 8DFE7A2870E6C91810945B8E80241C5C /* UICollectionView+Rx.swift in Sources */, + 78DDE64BDA461DDD99164B6F57B7A6B1 /* UIControl+Rx.swift in Sources */, + 408D29A066137BAAA90A78A012CD3C91 /* UIDatePicker+Rx.swift in Sources */, + 61400AADE7F027101B5CA629B3CE369C /* UIGestureRecognizer+Rx.swift in Sources */, + 2AF03C41DF03B943B3B94C671C9D9AFD /* UIImageView+Rx.swift in Sources */, + D3BF51C7656E71BB071936417BFD8177 /* UILabel+Rx.swift in Sources */, + 14452F1421140835B1A5466E3967A8CE /* UINavigationItem+Rx.swift in Sources */, + A4E00A2CAD0ECB2F148C419F3558DA07 /* UIPageControl+Rx.swift in Sources */, + D472D1486D700F27A6D2EE4C04DD8B25 /* UIPickerView+Rx.swift in Sources */, + D0CEC81294324172CE1D575D5C80C50F /* UIProgressView+Rx.swift in Sources */, + 3D9349C31A2B054BC382CA29015CAFF8 /* UIRefreshControl+Rx.swift in Sources */, + 25860974D252E772F986A088D4C9053F /* UIScrollView+Rx.swift in Sources */, + 957639EF75D0DBDC62FBFBE54364B973 /* UISearchBar+Rx.swift in Sources */, + FA46C6FB94B7CA84EAA05F67F2C43762 /* UISearchController+Rx.swift in Sources */, + D62ED4125C3C5D7EF9058163D7AAC96A /* UISegmentedControl+Rx.swift in Sources */, + 435C75AEE249942C6E9B7BE323CB52BD /* UISlider+Rx.swift in Sources */, + A91C34EC6DD5EE9250AD2D9F241E09B3 /* UIStepper+Rx.swift in Sources */, + 4A182820143401A8DA92E419DFE4A4BB /* UISwitch+Rx.swift in Sources */, + 97AE0A128FB54CC0A02A65DD22A371CA /* UITabBar+Rx.swift in Sources */, + E452567751DB804F05E8C7DB56231FF6 /* UITabBarItem+Rx.swift in Sources */, + C83F71D4EE4E02BA7C4D150F136D42CF /* UITableView+Rx.swift in Sources */, + 4FCB88884951824DFAA64E759DABB9BC /* UITextField+Rx.swift in Sources */, + F8C423BF8821B72D24686FEA562733A8 /* UITextView+Rx.swift in Sources */, + 2C0861DB041620D38C38F5A4491343CA /* UIView+Rx.swift in Sources */, + 67630EE9AE15DAB11D827E99583E7CBA /* UIViewController+Rx.swift in Sources */, + E2F43F799241F99480D799BE7DC6F0E6 /* URLSession+Rx.swift in Sources */, + 666F856983371B01BEBBAF4440848E44 /* Variable+Driver.swift in Sources */, + 1F7D93BFD36480AC8A33333A7D936A33 /* Variable+SharedSequence.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; - D45EA75169122321196E2364967595AA /* Sources */ = { + 4A2009C8443C3E17CBF14FACAEA0CB10 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 5F847F03D5F09995DB0784844F330A21 /* Pods-PokedexGo-dummy.m in Sources */, + 24C4C1C4E196867335B31FAD70A91620 /* Pods-PokedexGo-dummy.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - 3AF56D3637A5D6EC5BA15A0B2F6BB4FE /* PBXTargetDependency */ = { + 1BCBC2BD7C900A4AE7FCD87122935EFE /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = RxSwift; - target = 402EBD6070F177670CD20F26A5CB58BC /* RxSwift */; - targetProxy = F617D0BDD720063910D36DFF582CC31B /* PBXContainerItemProxy */; + name = RxCocoa; + target = CB4A3212CE222664E222C962519D604B /* RxCocoa */; + targetProxy = 03049E43A3F87053D3119C8267AE04FB /* PBXContainerItemProxy */; }; - BF5B5E47DFA6F34802C12C7FFF06DA84 /* PBXTargetDependency */ = { + 1C964D34337F5C6AD27C14E9B79D841C /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = RxSwift; - target = 402EBD6070F177670CD20F26A5CB58BC /* RxSwift */; - targetProxy = 7A59EA3B6E12321FD6DB829EA8F42F42 /* PBXContainerItemProxy */; + target = 6111906DD6556E6699AC0D1C05078A02 /* RxSwift */; + targetProxy = 25FD2DDB690168D174CD0CC5A5230362 /* PBXContainerItemProxy */; }; - F99D0B6E6E058362D1D80890B35C0B30 /* PBXTargetDependency */ = { + 65BA864D14C9D4F910A39296BD04517A /* PBXTargetDependency */ = { isa = PBXTargetDependency; - name = RxCocoa; - target = 46F8D42C1E9780D15104E1B62753218F /* RxCocoa */; - targetProxy = 8F40DEC3F6744894271C630614C19039 /* PBXContainerItemProxy */; + name = RxSwift; + target = 6111906DD6556E6699AC0D1C05078A02 /* RxSwift */; + targetProxy = 6393888B492465F2D50047FFA427087D /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ - 03CAB078E014EC8ABDADB263335D7282 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 17237AA00C6DE7CADBCBC1A37C8642C2 /* Pods-PokedexGo.debug.xcconfig */; - buildSettings = { - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = dwarf; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_NO_COMMON_BLOCKS = YES; - INFOPLIST_FILE = "Target Support Files/Pods-PokedexGo/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-PokedexGo/Pods-PokedexGo.modulemap"; - MTL_ENABLE_DEBUG_INFO = YES; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = Pods_PokedexGo; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - 0D3F3F4278AD0D2ADF181F15ABB2C37D /* Debug */ = { + 0B78E8A1BE6053C51807AEFC3989CFC7 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 668941189481BE4222233E27880CEAD4 /* RxCocoa.xcconfig */; + baseConfigurationReference = 574D04700F1188B0D770FD0D7BE084D8 /* RxSwift.xcconfig */; buildSettings = { "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -1364,14 +1358,14 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/RxCocoa/RxCocoa-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/RxCocoa/Info.plist"; + GCC_PREFIX_HEADER = "Target Support Files/RxSwift/RxSwift-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/RxSwift/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/RxCocoa/RxCocoa.modulemap"; + MODULEMAP_FILE = "Target Support Files/RxSwift/RxSwift.modulemap"; MTL_ENABLE_DEBUG_INFO = YES; - PRODUCT_NAME = RxCocoa; + PRODUCT_NAME = RxSwift; SDKROOT = iphoneos; SKIP_INSTALL = YES; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; @@ -1382,9 +1376,9 @@ }; name = Debug; }; - 1B49298BBF19AE97632905D1B0E0D051 /* Debug */ = { + 2C2DE607A60631F8D56DB8CEB1AB6701 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 8DB2248BB5C162FE70B6060C71BC1BA7 /* RxSwift.xcconfig */; + baseConfigurationReference = 17237AA00C6DE7CADBCBC1A37C8642C2 /* Pods-PokedexGo.debug.xcconfig */; buildSettings = { "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -1397,27 +1391,30 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/RxSwift/RxSwift-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/RxSwift/Info.plist"; + INFOPLIST_FILE = "Target Support Files/Pods-PokedexGo/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/RxSwift/RxSwift.modulemap"; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-PokedexGo/Pods-PokedexGo.modulemap"; MTL_ENABLE_DEBUG_INFO = YES; - PRODUCT_NAME = RxSwift; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = Pods_PokedexGo; SDKROOT = iphoneos; SKIP_INSTALL = YES; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 3.0; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; name = Debug; }; - 2583DA1934E137263ECEE9D4563706DE /* Release */ = { + 55FD43E6B5BA2EC2CE0FF00606A32513 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 668941189481BE4222233E27880CEAD4 /* RxCocoa.xcconfig */; + baseConfigurationReference = BBFBC6C4B5DDDC7A22732AA51382F26D /* RxCocoa.xcconfig */; buildSettings = { "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -1447,41 +1444,6 @@ }; name = Release; }; - 39FE3CA760A0E7825505545B5CF158EC /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 0158974CA472DE568A4D35AE3DABD751 /* Pods-PokedexGo.release.xcconfig */; - buildSettings = { - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_NO_COMMON_BLOCKS = YES; - INFOPLIST_FILE = "Target Support Files/Pods-PokedexGo/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-PokedexGo/Pods-PokedexGo.modulemap"; - MTL_ENABLE_DEBUG_INFO = NO; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = Pods_PokedexGo; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; 59B042A655B7C20CBAB90E385BF4E4C7 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -1526,9 +1488,9 @@ }; name = Debug; }; - 9078754285217F9A729D2019610F0BB3 /* Release */ = { + 7202D81C1DA88CC02E015D6C3049302D /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 8DB2248BB5C162FE70B6060C71BC1BA7 /* RxSwift.xcconfig */; + baseConfigurationReference = 0158974CA472DE568A4D35AE3DABD751 /* Pods-PokedexGo.release.xcconfig */; buildSettings = { "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -1541,17 +1503,20 @@ DYLIB_INSTALL_NAME_BASE = "@rpath"; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/RxSwift/RxSwift-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/RxSwift/Info.plist"; + INFOPLIST_FILE = "Target Support Files/Pods-PokedexGo/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/RxSwift/RxSwift.modulemap"; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-PokedexGo/Pods-PokedexGo.modulemap"; MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_NAME = RxSwift; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = Pods_PokedexGo; SDKROOT = iphoneos; SKIP_INSTALL = YES; - SWIFT_VERSION = 3.0; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; @@ -1598,6 +1563,71 @@ }; name = Release; }; + DF6E3E453184E363877302082CF5C259 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = BBFBC6C4B5DDDC7A22732AA51382F26D /* RxCocoa.xcconfig */; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_NO_COMMON_BLOCKS = YES; + GCC_PREFIX_HEADER = "Target Support Files/RxCocoa/RxCocoa-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/RxCocoa/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/RxCocoa/RxCocoa.modulemap"; + MTL_ENABLE_DEBUG_INFO = YES; + PRODUCT_NAME = RxCocoa; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 3.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + F5003D16FC039D537EA22CB6D087D3D2 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 574D04700F1188B0D770FD0D7BE084D8 /* RxSwift.xcconfig */; + buildSettings = { + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_NO_COMMON_BLOCKS = YES; + GCC_PREFIX_HEADER = "Target Support Files/RxSwift/RxSwift-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/RxSwift/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/RxSwift/RxSwift.modulemap"; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_NAME = RxSwift; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_VERSION = 3.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ @@ -1610,29 +1640,29 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - BDB869A1911382C27756660643CF09AF /* Build configuration list for PBXNativeTarget "RxCocoa" */ = { + 3F9E45FFEFB3C849116501311B54F5D7 /* Build configuration list for PBXNativeTarget "Pods-PokedexGo" */ = { isa = XCConfigurationList; buildConfigurations = ( - 0D3F3F4278AD0D2ADF181F15ABB2C37D /* Debug */, - 2583DA1934E137263ECEE9D4563706DE /* Release */, + 2C2DE607A60631F8D56DB8CEB1AB6701 /* Debug */, + 7202D81C1DA88CC02E015D6C3049302D /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - C279DA118513C4227746B4205816D5CB /* Build configuration list for PBXNativeTarget "RxSwift" */ = { + 4ABF43E2ED9FE8A34682CBD66B67D03F /* Build configuration list for PBXNativeTarget "RxCocoa" */ = { isa = XCConfigurationList; buildConfigurations = ( - 1B49298BBF19AE97632905D1B0E0D051 /* Debug */, - 9078754285217F9A729D2019610F0BB3 /* Release */, + DF6E3E453184E363877302082CF5C259 /* Debug */, + 55FD43E6B5BA2EC2CE0FF00606A32513 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - D440088947B4D248B30487A8A06ECEA6 /* Build configuration list for PBXNativeTarget "Pods-PokedexGo" */ = { + D70D4E04374A5C15A7A3B2AD5EC7F911 /* Build configuration list for PBXNativeTarget "RxSwift" */ = { isa = XCConfigurationList; buildConfigurations = ( - 03CAB078E014EC8ABDADB263335D7282 /* Debug */, - 39FE3CA760A0E7825505545B5CF158EC /* Release */, + 0B78E8A1BE6053C51807AEFC3989CFC7 /* Debug */, + F5003D16FC039D537EA22CB6D087D3D2 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; diff --git a/Project 07 - PokedexGo/Pods/Pods.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/Pods-PokedexGo.xcscheme b/Project 07 - PokedexGo/Pods/Pods.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/Pods-PokedexGo.xcscheme index 0135745f..d5c2c03e 100644 --- a/Project 07 - PokedexGo/Pods/Pods.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/Pods-PokedexGo.xcscheme +++ b/Project 07 - PokedexGo/Pods/Pods.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/Pods-PokedexGo.xcscheme @@ -1,6 +1,6 @@ @@ -45,7 +45,7 @@ diff --git a/Project 07 - PokedexGo/Pods/Pods.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/RxCocoa.xcscheme b/Project 07 - PokedexGo/Pods/Pods.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/RxCocoa.xcscheme index 1547da13..f5df0f5c 100644 --- a/Project 07 - PokedexGo/Pods/Pods.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/RxCocoa.xcscheme +++ b/Project 07 - PokedexGo/Pods/Pods.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/RxCocoa.xcscheme @@ -1,39 +1,36 @@ + buildForArchiving = "YES"> + BuildableIdentifier = 'primary' + BlueprintIdentifier = 'CB4A3212CE222664E222C962519D604B' + BlueprintName = 'RxCocoa' + ReferencedContainer = 'container:Pods.xcodeproj' + BuildableName = 'RxCocoa.framework'> - - + shouldUseLaunchSchemeArgsEnv = "YES" + buildConfiguration = "Debug"> - - - - + debugDocumentVersioning = "YES" + buildConfiguration = "Release" + shouldUseLaunchSchemeArgsEnv = "YES"> diff --git a/Project 07 - PokedexGo/Pods/Pods.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/RxSwift.xcscheme b/Project 07 - PokedexGo/Pods/Pods.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/RxSwift.xcscheme index e97076ca..501e3080 100644 --- a/Project 07 - PokedexGo/Pods/Pods.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/RxSwift.xcscheme +++ b/Project 07 - PokedexGo/Pods/Pods.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/RxSwift.xcscheme @@ -1,39 +1,36 @@ + buildForArchiving = "YES"> + BuildableIdentifier = 'primary' + BlueprintIdentifier = '6111906DD6556E6699AC0D1C05078A02' + BlueprintName = 'RxSwift' + ReferencedContainer = 'container:Pods.xcodeproj' + BuildableName = 'RxSwift.framework'> - - + shouldUseLaunchSchemeArgsEnv = "YES" + buildConfiguration = "Debug"> - - - - + debugDocumentVersioning = "YES" + buildConfiguration = "Release" + shouldUseLaunchSchemeArgsEnv = "YES"> diff --git a/Project 07 - PokedexGo/Pods/Pods.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/xcschememanagement.plist b/Project 07 - PokedexGo/Pods/Pods.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/xcschememanagement.plist index b8f50a0f..c8130860 100644 --- a/Project 07 - PokedexGo/Pods/Pods.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/Project 07 - PokedexGo/Pods/Pods.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/xcschememanagement.plist @@ -22,17 +22,17 @@ SuppressBuildableAutocreation - 2A28498AA2CFB73EA88DFA6E806A8BFC + 6111906DD6556E6699AC0D1C05078A02 primary - 402EBD6070F177670CD20F26A5CB58BC + 8218DE044D5B99F636F43E0C5DFDFBCD primary - 46F8D42C1E9780D15104E1B62753218F + CB4A3212CE222664E222C962519D604B primary diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/Platform/DataStructures/Bag.swift b/Project 07 - PokedexGo/Pods/RxCocoa/Platform/DataStructures/Bag.swift new file mode 100644 index 00000000..4ab6f942 --- /dev/null +++ b/Project 07 - PokedexGo/Pods/RxCocoa/Platform/DataStructures/Bag.swift @@ -0,0 +1,167 @@ +// +// Bag.swift +// Platform +// +// Created by Krunoslav Zaher on 2/28/15. +// Copyright © 2015 Krunoslav Zaher. All rights reserved. +// + +import Foundation +import Swift + +let arrayDictionaryMaxSize = 30 + +struct BagKey { + /** + Unique identifier for object added to `Bag`. + + It's underlying type is UInt64. If we assume there in an idealized CPU that works at 4GHz, + it would take ~150 years of continuous running time for it to overflow. + */ + fileprivate let rawValue: UInt64 +} + +/** +Data structure that represents a bag of elements typed `T`. + +Single element can be stored multiple times. + +Time and space complexity of insertion an deletion is O(n). + +It is suitable for storing small number of elements. +*/ +struct Bag : CustomDebugStringConvertible { + /// Type of identifier for inserted elements. + typealias KeyType = BagKey + + typealias Entry = (key: BagKey, value: T) + + fileprivate var _nextKey: BagKey = BagKey(rawValue: 0) + + // data + + // first fill inline variables + var _key0: BagKey? = nil + var _value0: T? = nil + + // last is sparse dictionary + var _dictionary: [BagKey : T]? = nil + + var _onlyFastPath = true + + /// Creates new empty `Bag`. + init() { + } + + /** + Inserts `value` into bag. + + - parameter element: Element to insert. + - returns: Key that can be used to remove element from bag. + */ + mutating func insert(_ element: T) -> BagKey { + let key = _nextKey + + _nextKey = BagKey(rawValue: _nextKey.rawValue &+ 1) + + if _key0 == nil { + _key0 = key + _value0 = element + return key + } + + _onlyFastPath = false + + if _dictionary != nil { + _dictionary![key] = element + return key + } + + if _dictionary == nil { + _dictionary = [:] + } + + _dictionary![key] = element + + return key + } + + /// - returns: Number of elements in bag. + var count: Int { + let dictionaryCount: Int = _dictionary?.count ?? 0 + return (_value0 != nil ? 1 : 0) + dictionaryCount + } + + /// Removes all elements from bag and clears capacity. + mutating func removeAll() { + _key0 = nil + _value0 = nil + + _dictionary?.removeAll(keepingCapacity: false) + } + + /** + Removes element with a specific `key` from bag. + + - parameter key: Key that identifies element to remove from bag. + - returns: Element that bag contained, or nil in case element was already removed. + */ + mutating func removeKey(_ key: BagKey) -> T? { + if _key0 == key { + _key0 = nil + let value = _value0! + _value0 = nil + return value + } + + if let existingObject = _dictionary?.removeValue(forKey: key) { + return existingObject + } + + return nil + } +} + +extension Bag { + /// A textual representation of `self`, suitable for debugging. + var debugDescription : String { + return "\(self.count) elements in Bag" + } +} + +extension Bag { + /// Enumerates elements inside the bag. + /// + /// - parameter action: Enumeration closure. + func forEach(_ action: (T) -> Void) { + if _onlyFastPath { + if let value0 = _value0 { + action(value0) + } + return + } + + let value0 = _value0 + let dictionary = _dictionary + + if let value0 = value0 { + action(value0) + } + + if dictionary?.count ?? 0 > 0 { + for element in dictionary!.values { + action(element) + } + } + } +} + +extension BagKey: Hashable { + var hashValue: Int { + return rawValue.hashValue + } +} + +func ==(lhs: BagKey, rhs: BagKey) -> Bool { + return lhs.rawValue == rhs.rawValue +} diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/DataStructures/InfiniteSequence.swift b/Project 07 - PokedexGo/Pods/RxCocoa/Platform/DataStructures/InfiniteSequence.swift similarity index 86% rename from Project 07 - PokedexGo/Pods/RxSwift/RxSwift/DataStructures/InfiniteSequence.swift rename to Project 07 - PokedexGo/Pods/RxCocoa/Platform/DataStructures/InfiniteSequence.swift index a1cce01c..5fad3830 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/DataStructures/InfiniteSequence.swift +++ b/Project 07 - PokedexGo/Pods/RxCocoa/Platform/DataStructures/InfiniteSequence.swift @@ -1,6 +1,6 @@ // // InfiniteSequence.swift -// RxSwift +// Platform // // Created by Krunoslav Zaher on 6/13/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -8,9 +8,7 @@ import Foundation -/** -Sequence that repeats `repeatedValue` infinite number of times. -*/ +/// Sequence that repeats `repeatedValue` infinite number of times. struct InfiniteSequence : Sequence { typealias Element = E typealias Iterator = AnyIterator diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/DataStructures/PriorityQueue.swift b/Project 07 - PokedexGo/Pods/RxCocoa/Platform/DataStructures/PriorityQueue.swift similarity index 79% rename from Project 07 - PokedexGo/Pods/RxSwift/RxSwift/DataStructures/PriorityQueue.swift rename to Project 07 - PokedexGo/Pods/RxCocoa/Platform/DataStructures/PriorityQueue.swift index d37a063f..725feeff 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/DataStructures/PriorityQueue.swift +++ b/Project 07 - PokedexGo/Pods/RxCocoa/Platform/DataStructures/PriorityQueue.swift @@ -1,6 +1,6 @@ // // PriorityQueue.swift -// Rx +// Platform // // Created by Krunoslav Zaher on 12/27/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -8,12 +8,15 @@ import Foundation -struct PriorityQueue { +struct PriorityQueue { private let _hasHigherPriority: (Element, Element) -> Bool + private let _isEqual: (Element, Element) -> Bool + fileprivate var _elements = [Element]() - init(hasHigherPriority: @escaping (Element, Element) -> Bool) { + init(hasHigherPriority: @escaping (Element, Element) -> Bool, isEqual: @escaping (Element, Element) -> Bool) { _hasHigherPriority = hasHigherPriority + _isEqual = isEqual } mutating func enqueue(_ element: Element) { @@ -41,7 +44,7 @@ struct PriorityQueue { mutating func remove(_ element: Element) { for i in 0 ..< _elements.count { - if _elements[i] === element { + if _isEqual(_elements[i], element) { removeAt(i) return } @@ -70,15 +73,10 @@ struct PriorityQueue { while unbalancedIndex > 0 { let parentIndex = (unbalancedIndex - 1) / 2 - - if _hasHigherPriority(_elements[unbalancedIndex], _elements[parentIndex]) { - swap(&_elements[unbalancedIndex], &_elements[parentIndex]) - - unbalancedIndex = parentIndex - } - else { - break - } + guard _hasHigherPriority(_elements[unbalancedIndex], _elements[parentIndex]) else { break } + + swap(&_elements[unbalancedIndex], &_elements[parentIndex]) + unbalancedIndex = parentIndex } } @@ -87,7 +85,7 @@ struct PriorityQueue { precondition(initialUnbalancedIndex < _elements.count) var unbalancedIndex = initialUnbalancedIndex - repeat { + while true { let leftChildIndex = unbalancedIndex * 2 + 1 let rightChildIndex = unbalancedIndex * 2 + 2 @@ -101,15 +99,11 @@ struct PriorityQueue { highestPriorityIndex = rightChildIndex } - if highestPriorityIndex != unbalancedIndex { - swap(&_elements[highestPriorityIndex], &_elements[unbalancedIndex]) + guard highestPriorityIndex != unbalancedIndex else { break } - unbalancedIndex = highestPriorityIndex - } - else { - break - } - } while true + swap(&_elements[highestPriorityIndex], &_elements[unbalancedIndex]) + unbalancedIndex = highestPriorityIndex + } } } diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/DataStructures/Queue.swift b/Project 07 - PokedexGo/Pods/RxCocoa/Platform/DataStructures/Queue.swift similarity index 78% rename from Project 07 - PokedexGo/Pods/RxSwift/RxSwift/DataStructures/Queue.swift rename to Project 07 - PokedexGo/Pods/RxCocoa/Platform/DataStructures/Queue.swift index a82a6ab1..cfe3df4d 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/DataStructures/Queue.swift +++ b/Project 07 - PokedexGo/Pods/RxCocoa/Platform/DataStructures/Queue.swift @@ -1,6 +1,6 @@ // // Queue.swift -// Rx +// Platform // // Created by Krunoslav Zaher on 3/21/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -16,25 +16,23 @@ averaged over N operations. Complexity of `peek` is O(1). */ -public struct Queue: Sequence { - /** - Type of generator. - */ - public typealias Generator = AnyIterator - +struct Queue: Sequence { + /// Type of generator. + typealias Generator = AnyIterator + private let _resizeFactor = 2 private var _storage: ContiguousArray private var _count = 0 private var _pushNextIndex = 0 - private var _initialCapacity: Int + private let _initialCapacity: Int /** Creates new queue. - parameter capacity: Capacity of newly created queue. */ - public init(capacity: Int) { + init(capacity: Int) { _initialCapacity = capacity _storage = ContiguousArray(repeating: nil, count: capacity) @@ -45,24 +43,18 @@ public struct Queue: Sequence { return index < 0 ? index + _storage.count : index } - /** - - returns: Is queue empty. - */ - public var isEmpty: Bool { + /// - returns: Is queue empty. + var isEmpty: Bool { return count == 0 } - /** - - returns: Number of elements inside queue. - */ - public var count: Int { + /// - returns: Number of elements inside queue. + var count: Int { return _count } - /** - - returns: Element in front of a list of elements to `dequeue`. - */ - public func peek() -> T { + /// - returns: Element in front of a list of elements to `dequeue`. + func peek() -> T { precondition(count > 0) return _storage[dequeueIndex]! @@ -89,12 +81,10 @@ public struct Queue: Sequence { _storage = newStorage } - /** - Enqueues `element`. - - - parameter element: Element to enqueue. - */ - public mutating func enqueue(_ element: T) { + /// Enqueues `element`. + /// + /// - parameter element: Element to enqueue. + mutating func enqueue(_ element: T) { if count == _storage.count { resizeTo(Swift.max(_storage.count, 1) * _resizeFactor) } @@ -121,12 +111,10 @@ public struct Queue: Sequence { return _storage[index]! } - /** - Dequeues element or throws an exception in case queue is empty. - - - returns: Dequeued element. - */ - public mutating func dequeue() -> T? { + /// Dequeues element or throws an exception in case queue is empty. + /// + /// - returns: Dequeued element. + mutating func dequeue() -> T? { if self.count == 0 { return nil } @@ -141,10 +129,8 @@ public struct Queue: Sequence { return dequeueElementOnly() } - /** - - returns: Generator of contained elements. - */ - public func makeIterator() -> AnyIterator { + /// - returns: Generator of contained elements. + func makeIterator() -> AnyIterator { var i = dequeueIndex var count = _count diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/Platform/DispatchQueue+Extensions.swift b/Project 07 - PokedexGo/Pods/RxCocoa/Platform/DispatchQueue+Extensions.swift new file mode 100644 index 00000000..0df1ce79 --- /dev/null +++ b/Project 07 - PokedexGo/Pods/RxCocoa/Platform/DispatchQueue+Extensions.swift @@ -0,0 +1,22 @@ +// +// DispatchQueue+Extensions.swift +// Platform +// +// Created by Krunoslav Zaher on 10/22/16. +// Copyright © 2016 Krunoslav Zaher. All rights reserved. +// + +import Foundation +import Dispatch + +extension DispatchQueue { + private static var token: DispatchSpecificKey<()> = { + let key = DispatchSpecificKey<()>() + DispatchQueue.main.setSpecific(key: key, value: ()) + return key + }() + + static var isMain: Bool { + return DispatchQueue.getSpecific(key: token) != nil + } +} diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Platform/Platform.Darwin.swift b/Project 07 - PokedexGo/Pods/RxCocoa/Platform/Platform.Darwin.swift similarity index 56% rename from Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Platform/Platform.Darwin.swift rename to Project 07 - PokedexGo/Pods/RxCocoa/Platform/Platform.Darwin.swift index 9c0b3f9c..e0d7f0de 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Platform/Platform.Darwin.swift +++ b/Project 07 - PokedexGo/Pods/RxCocoa/Platform/Platform.Darwin.swift @@ -1,46 +1,49 @@ // // Platform.Darwin.swift -// Rx +// Platform // // Created by Krunoslav Zaher on 12/29/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. // -#if os(OSX) || os(iOS) || os(tvOS) || os(watchOS) +#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) import Darwin import Foundation - #if TRACE_RESOURCES - public typealias AtomicInt = Int32 - #else typealias AtomicInt = Int32 - #endif - let AtomicCompareAndSwap = OSAtomicCompareAndSwap32 - let AtomicIncrement = OSAtomicIncrement32 - let AtomicDecrement = OSAtomicDecrement32 + let AtomicCompareAndSwap = OSAtomicCompareAndSwap32Barrier + let AtomicIncrement = OSAtomicIncrement32Barrier + let AtomicDecrement = OSAtomicDecrement32Barrier extension Thread { - static func setThreadLocalStorageValue(_ value: T?, forKey key: AnyObject & NSCopying + + static func setThreadLocalStorageValue(_ value: T?, forKey key: String ) { let currentThread = Thread.current let threadDictionary = currentThread.threadDictionary if let newValue = value { - threadDictionary.setObject(newValue, forKey: key) + threadDictionary[key] = newValue } else { - threadDictionary.removeObject(forKey: key) + threadDictionary[key] = nil } } - static func getThreadLocalStorageValueForKey(_ key: AnyObject & NSCopying) -> T? { + static func getThreadLocalStorageValueForKey(_ key: String) -> T? { let currentThread = Thread.current let threadDictionary = currentThread.threadDictionary return threadDictionary[key] as? T } } + + extension AtomicInt { + func valueSnapshot() -> Int32 { + return self + } + } #endif diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/Platform/Platform.Linux.swift b/Project 07 - PokedexGo/Pods/RxCocoa/Platform/Platform.Linux.swift new file mode 100644 index 00000000..ae5a49db --- /dev/null +++ b/Project 07 - PokedexGo/Pods/RxCocoa/Platform/Platform.Linux.swift @@ -0,0 +1,97 @@ +// +// Platform.Linux.swift +// Platform +// +// Created by Krunoslav Zaher on 12/29/15. +// Copyright © 2015 Krunoslav Zaher. All rights reserved. +// + +#if os(Linux) + //////////////////////////////////////////////////////////////////////////////// + // This is not the greatest API in the world, this is just a tribute. + // !!! Proof of concept until libdispatch becomes operational. !!! + //////////////////////////////////////////////////////////////////////////////// + + import Foundation + import XCTest + import Glibc + import SwiftShims + + final class AtomicInt { + typealias IntegerLiteralType = Int + fileprivate var value: Int32 = 0 + fileprivate var _lock = NSRecursiveLock() + + func lock() { + _lock.lock() + } + func unlock() { + _lock.unlock() + } + + func valueSnapshot() -> Int32 { + return value + } + } + + extension AtomicInt: ExpressibleByIntegerLiteral { + convenience init(integerLiteral value: Int) { + self.init() + self.value = Int32(value) + } + } + + func >(lhs: AtomicInt, rhs: Int32) -> Bool { + return lhs.value > rhs + } + func ==(lhs: AtomicInt, rhs: Int32) -> Bool { + return lhs.value == rhs + } + + func AtomicIncrement(_ atomic: inout AtomicInt) -> Int32 { + atomic.lock(); defer { atomic.unlock() } + atomic.value += 1 + return atomic.value + } + + func AtomicDecrement(_ atomic: inout AtomicInt) -> Int32 { + atomic.lock(); defer { atomic.unlock() } + atomic.value -= 1 + return atomic.value + } + + func AtomicCompareAndSwap(_ l: Int32, _ r: Int32, _ atomic: inout AtomicInt) -> Bool { + atomic.lock(); defer { atomic.unlock() } + if atomic.value == l { + atomic.value = r + return true + } + + return false + } + + extension Thread { + + static func setThreadLocalStorageValue(_ value: T?, forKey key: String) { + let currentThread = Thread.current + var threadDictionary = currentThread.threadDictionary + + if let newValue = value { + threadDictionary[key] = newValue + } + else { + threadDictionary[key] = nil + } + + currentThread.threadDictionary = threadDictionary + } + + static func getThreadLocalStorageValueForKey(_ key: String) -> T? { + let currentThread = Thread.current + let threadDictionary = currentThread.threadDictionary + + return threadDictionary[key] as? T + } + } + +#endif diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/README.md b/Project 07 - PokedexGo/Pods/RxCocoa/README.md index 83e397c3..a5749ca1 100644 --- a/Project 07 - PokedexGo/Pods/RxCocoa/README.md +++ b/Project 07 - PokedexGo/Pods/RxCocoa/README.md @@ -1,19 +1,19 @@ Miss Electric Eel 2016 RxSwift: ReactiveX for Swift ====================================== -[![Travis CI](https://travis-ci.org/ReactiveX/RxSwift.svg?branch=master)](https://travis-ci.org/ReactiveX/RxSwift) ![platforms](https://img.shields.io/badge/platforms-iOS%20%7C%20OSX%20%7C%20tvOS%20%7C%20watchOS%20%7C%20Linux%28experimental%29-333333.svg) ![pod](https://img.shields.io/cocoapods/v/RxSwift.svg) [![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) +[![Travis CI](https://travis-ci.org/ReactiveX/RxSwift.svg?branch=master)](https://travis-ci.org/ReactiveX/RxSwift) ![platforms](https://img.shields.io/badge/platforms-iOS%20%7C%20macOS%20%7C%20tvOS%20%7C%20watchOS%20%7C%20Linux-333333.svg) ![pod](https://img.shields.io/cocoapods/v/RxSwift.svg) [![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) [![Swift Package Manager compatible](https://img.shields.io/badge/Swift%20Package%20Manager-compatible-brightgreen.svg)](https://github.com/apple/swift-package-manager) ## About Rx -**:warning: This readme describes RxSwift 3.0 version that requires Swift 3.0:warning:** +**:warning: This readme describes RxSwift 3.0 version that requires Swift 3.0.** -**:warning: If you are looking for Swift 2.3 compatible version, please take a look at RxSwift ~> 2.0 versions and [swift-2.3](https://github.com/ReactiveX/RxSwift/tree/rxswift-2.0) branch :warning:** +**:warning: If you are looking for Swift 2.3 compatible version, please take a look at RxSwift ~> 2.0 versions and [swift-2.3](https://github.com/ReactiveX/RxSwift/tree/rxswift-2.0) branch.** Rx is a [generic abstraction of computation](https://youtu.be/looJcaeboBY) expressed through `Observable` interface. This is a Swift version of [Rx](https://github.com/Reactive-Extensions/Rx.NET). -It tries to port as many concepts from the original version as possible, but some concepts were adapted for more pleasant and performant integration with iOS/OSX environment. +It tries to port as many concepts from the original version as possible, but some concepts were adapted for more pleasant and performant integration with iOS/macOS environment. Cross platform documentation can be found on [ReactiveX.io](http://reactivex.io/). @@ -33,12 +33,10 @@ KVO observing, async operations and streams are all unified under [abstraction o * [debugging](Documentation/GettingStarted.md#debugging) * [the math behind Rx](Documentation/MathBehindRx.md) * [what are hot and cold observable sequences?](Documentation/HotAndColdObservables.md) -* [what does the the public API look like?](Documentation/API.md) - ###### ... install -* Integrate RxSwift/RxCocoa with my app. [Installation Guide](Documentation/Installation.md) +* Integrate RxSwift/RxCocoa with my app. [Installation Guide](#installation) ###### ... hack around @@ -48,7 +46,7 @@ KVO observing, async operations and streams are all unified under [abstraction o ###### ... interact * All of this is great, but it would be nice to talk with other people using RxSwift and exchange experiences.
[![Slack channel](http://rxswift-slack.herokuapp.com/badge.svg)](http://slack.rxswift.org) [Join Slack Channel](http://rxswift-slack.herokuapp.com) -* Report a problem using the library. [Open an Issue With Bug Template](ISSUE_TEMPLATE.md) +* Report a problem using the library. [Open an Issue With Bug Template](.github/ISSUE_TEMPLATE.md) * Request a new feature. [Open an Issue With Feature Request Template](Documentation/NewFeatureRequestTemplate.md) @@ -85,7 +83,7 @@ let searchResults = searchBar.rx.text .distinctUntilChanged() .flatMapLatest { query -> Observable<[Repository]> in if query.isEmpty { - return Observable.just([]) + return .just([]) } return searchGitHub(query) @@ -111,14 +109,9 @@ searchResults ## Requirements -* Xcode 8.0 GM (8A218a) +* Xcode 8.0 * Swift 3.0 -* iOS 8.0+ -* Mac OS X 10.10+ -* tvOS 9.0+ -* watchOS 2.0+ - ## Installation Rx doesn't contain any external dependencies. @@ -131,54 +124,66 @@ Open Rx.xcworkspace, choose `RxExample` and hit run. This method will build ever ### [CocoaPods](https://guides.cocoapods.org/using/using-cocoapods.html) +**Tested with `pod --version`: `1.1.1`** + ``` # Podfile use_frameworks! target 'YOUR_TARGET_NAME' do - pod 'RxSwift', '~> 3.0.0-beta.1' - pod 'RxCocoa', '~> 3.0.0-beta.1' + pod 'RxSwift', '~> 3.0' + pod 'RxCocoa', '~> 3.0' end # RxTests and RxBlocking make the most sense in the context of unit/integration tests target 'YOUR_TESTING_TARGET' do - pod 'RxBlocking', '~> 3.0.0-beta.1' - pod 'RxTests', '~> 3.0.0-beta.1' + pod 'RxBlocking', '~> 3.0' + pod 'RxTest', '~> 3.0' end ``` Replace `YOUR_TARGET_NAME` and then, in the `Podfile` directory, type: -**:warning: If you want to use CocoaPods with Xcode 8.0 beta and Swift 3.0, you might need to add the following -lines to your podfile: :warning:** - -``` -post_install do |installer| - installer.pods_project.targets.each do |target| - target.build_configurations.each do |config| - config.build_settings['SWIFT_VERSION'] = '3.0' - config.build_settings['MACOSX_DEPLOYMENT_TARGET'] = '10.10' - end - end -end -``` - ``` $ pod install ``` ### [Carthage](https://github.com/Carthage/Carthage) +**Tested with `carthage version`: `0.18.1`** + Add this to `Cartfile` ``` -github "ReactiveX/RxSwift" "3.0.0-beta.1" +github "ReactiveX/RxSwift" ~> 3.0 ``` ``` $ carthage update ``` +### [Swift Package Manager](https://github.com/apple/swift-package-manager) + +**Tested with `swift build --version`: `3.0.0 (swiftpm-19)`** + +Create a `Package.swift` file. + +``` +import PackageDescription + +let package = Package( + name: "RxTestProject", + targets: [], + dependencies: [ + .Package(url: "https://github.com/ReactiveX/RxSwift.git", majorVersion: 3) + ] +) +``` + +``` +$ swift build +``` + ### Manually using git submodules * Add RxSwift as a submodule diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/CocoaUnits/ControlEvent.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/CocoaUnits/ControlEvent.swift similarity index 68% rename from Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/CocoaUnits/ControlEvent.swift rename to Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/CocoaUnits/ControlEvent.swift index 3202ad1d..ef8d4301 100644 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/CocoaUnits/ControlEvent.swift +++ b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/CocoaUnits/ControlEvent.swift @@ -1,6 +1,6 @@ // // ControlEvent.swift -// Rx +// RxCocoa // // Created by Krunoslav Zaher on 8/28/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -11,14 +11,10 @@ import Foundation import RxSwift #endif -/** -Protocol that enables extension of `ControlEvent`. -*/ +/// Protocol that enables extension of `ControlEvent`. public protocol ControlEventType : ObservableType { - /** - - returns: `ControlEvent` interface - */ + /// - returns: `ControlEvent` interface func asControlEvent() -> ControlEvent } @@ -48,38 +44,28 @@ public struct ControlEvent : ControlEventType { let _events: Observable - /** - Initializes control event with a observable sequence that represents events. - - - parameter events: Observable sequence that represents events. - - returns: Control event created with a observable sequence of events. - */ + /// Initializes control event with a observable sequence that represents events. + /// + /// - parameter events: Observable sequence that represents events. + /// - returns: Control event created with a observable sequence of events. public init(events: Ev) where Ev.E == E { _events = events.subscribeOn(ConcurrentMainScheduler.instance) } - /** - Subscribes an observer to control events. - - - parameter observer: Observer to subscribe to events. - - returns: Disposable object that can be used to unsubscribe the observer from receiving control events. - */ + /// Subscribes an observer to control events. + /// + /// - parameter observer: Observer to subscribe to events. + /// - returns: Disposable object that can be used to unsubscribe the observer from receiving control events. public func subscribe(_ observer: O) -> Disposable where O.E == E { return _events.subscribe(observer) } - /** - - returns: `Observable` interface. - */ - // @warn_unused_result(message:"http://git.io/rxs.uo") + /// - returns: `Observable` interface. public func asObservable() -> Observable { return _events } - /** - - returns: `ControlEvent` interface. - */ - // @warn_unused_result(message:"http://git.io/rxs.uo") + /// - returns: `ControlEvent` interface. public func asControlEvent() -> ControlEvent { return self } diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/CocoaUnits/ControlProperty.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/CocoaUnits/ControlProperty.swift similarity index 57% rename from Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/CocoaUnits/ControlProperty.swift rename to Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/CocoaUnits/ControlProperty.swift index bc4e7515..3cfe4d59 100644 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/CocoaUnits/ControlProperty.swift +++ b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/CocoaUnits/ControlProperty.swift @@ -1,6 +1,6 @@ // // ControlProperty.swift -// Rx +// RxCocoa // // Created by Krunoslav Zaher on 8/28/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -11,14 +11,10 @@ import Foundation import RxSwift #endif -/** -Protocol that enables extension of `ControlProperty`. -*/ +/// Protocol that enables extension of `ControlProperty`. public protocol ControlPropertyType : ObservableType, ObserverType { - /** - - returns: `ControlProperty` interface - */ + /// - returns: `ControlProperty` interface func asControlProperty() -> ControlProperty } @@ -50,53 +46,41 @@ public struct ControlProperty : ControlPropertyType { let _values: Observable let _valueSink: AnyObserver - /** - Initializes control property with a observable sequence that represents property values and observer that enables - binding values to property. - - - parameter values: Observable sequence that represents property values. - - parameter valueSink: Observer that enables binding values to control property. - - returns: Control property created with a observable sequence of values and an observer that enables binding values - to property. - */ + /// Initializes control property with a observable sequence that represents property values and observer that enables + /// binding values to property. + /// + /// - parameter values: Observable sequence that represents property values. + /// - parameter valueSink: Observer that enables binding values to control property. + /// - returns: Control property created with a observable sequence of values and an observer that enables binding values + /// to property. public init(values: V, valueSink: S) where E == V.E, E == S.E { _values = values.subscribeOn(ConcurrentMainScheduler.instance) _valueSink = valueSink.asObserver() } - /** - Subscribes an observer to control property values. - - - parameter observer: Observer to subscribe to property values. - - returns: Disposable object that can be used to unsubscribe the observer from receiving control property values. - */ + /// Subscribes an observer to control property values. + /// + /// - parameter observer: Observer to subscribe to property values. + /// - returns: Disposable object that can be used to unsubscribe the observer from receiving control property values. public func subscribe(_ observer: O) -> Disposable where O.E == E { return _values.subscribe(observer) } - /** - - returns: `Observable` interface. - */ - // @warn_unused_result(message:"http://git.io/rxs.uo") + /// - returns: `Observable` interface. public func asObservable() -> Observable { return _values } - /** - - returns: `ControlProperty` interface. - */ - // @warn_unused_result(message:"http://git.io/rxs.uo") + /// - returns: `ControlProperty` interface. public func asControlProperty() -> ControlProperty { return self } - /** - Binds event to user interface. - - - In case next element is received, it is being set to control value. - - In case error is received, DEBUG buids raise fatal error, RELEASE builds log event to standard output. - - In case sequence completes, nothing happens. - */ + /// Binds event to user interface. + /// + /// - In case next element is received, it is being set to control value. + /// - In case error is received, DEBUG buids raise fatal error, RELEASE builds log event to standard output. + /// - In case sequence completes, nothing happens. public func on(_ event: Event) { switch event { case .error(let error): @@ -108,3 +92,14 @@ public struct ControlProperty : ControlPropertyType { } } } + +extension ControlPropertyType where E == String? { + /// Transforms control property of type `String?` into control property of type `String`. + public var orEmpty: ControlProperty { + let original: ControlProperty = self.asControlProperty() + + let values: Observable = original._values.map { $0 ?? "" } + let valueSink: AnyObserver = original._valueSink.mapObserver { $0 } + return ControlProperty(values: values, valueSink: valueSink) + } +} diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/CocoaUnits/Driver/ControlEvent+Driver.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/CocoaUnits/Driver/ControlEvent+Driver.swift similarity index 71% rename from Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/CocoaUnits/Driver/ControlEvent+Driver.swift rename to Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/CocoaUnits/Driver/ControlEvent+Driver.swift index 61a25c97..ca732356 100644 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/CocoaUnits/Driver/ControlEvent+Driver.swift +++ b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/CocoaUnits/Driver/ControlEvent+Driver.swift @@ -1,6 +1,6 @@ // // ControlEvent+Driver.swift -// Rx +// RxCocoa // // Created by Krunoslav Zaher on 9/19/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -12,12 +12,9 @@ import RxSwift #endif extension ControlEvent { - /** - Converts `ControlEvent` to `Driver` unit. - - `ControlEvent` already can't fail, so no special case needs to be handled. - */ - // @warn_unused_result(message:"http://git.io/rxs.uo") + /// Converts `ControlEvent` to `Driver` unit. + /// + /// `ControlEvent` already can't fail, so no special case needs to be handled. public func asDriver() -> Driver { return self.asDriver { (error) -> Driver in #if DEBUG diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/CocoaUnits/Driver/ControlProperty+Driver.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/CocoaUnits/Driver/ControlProperty+Driver.swift similarity index 71% rename from Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/CocoaUnits/Driver/ControlProperty+Driver.swift rename to Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/CocoaUnits/Driver/ControlProperty+Driver.swift index c7521564..a8a59e20 100644 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/CocoaUnits/Driver/ControlProperty+Driver.swift +++ b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/CocoaUnits/Driver/ControlProperty+Driver.swift @@ -1,6 +1,6 @@ // // ControlProperty+Driver.swift -// Rx +// RxCocoa // // Created by Krunoslav Zaher on 9/19/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -12,12 +12,9 @@ import RxSwift #endif extension ControlProperty { - /** - Converts `ControlProperty` to `Driver` unit. - - `ControlProperty` already can't fail, so no special case needs to be handled. - */ - // @warn_unused_result(message:"http://git.io/rxs.uo") + /// Converts `ControlProperty` to `Driver` unit. + /// + /// `ControlProperty` already can't fail, so no special case needs to be handled. public func asDriver() -> Driver { return self.asDriver { (error) -> Driver in #if DEBUG diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/CocoaUnits/Driver/Driver+Subscription.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/CocoaUnits/Driver/Driver+Subscription.swift similarity index 74% rename from Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/CocoaUnits/Driver/Driver+Subscription.swift rename to Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/CocoaUnits/Driver/Driver+Subscription.swift index 4d1a4661..d04007df 100644 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/CocoaUnits/Driver/Driver+Subscription.swift +++ b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/CocoaUnits/Driver/Driver+Subscription.swift @@ -1,6 +1,6 @@ // // Driver+Subscription.swift -// Rx +// RxCocoa // // Created by Krunoslav Zaher on 9/19/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -14,7 +14,8 @@ import RxSwift private let driverErrorMessage = "`drive*` family of methods can be only called from `MainThread`.\n" + "This is required to ensure that the last replayed `Driver` element is delivered on `MainThread`.\n" -extension DriverConvertibleType { +// This would ideally be Driver, but unfortunatelly Driver can't be extended in Swift 3.0 +extension SharedSequenceConvertibleType where SharingStrategy == DriverSharingStrategy { /** Creates new subscription and sends elements to observer. This method can be only called from `MainThread`. @@ -24,10 +25,23 @@ extension DriverConvertibleType { - parameter observer: Observer that receives events. - returns: Disposable object that can be used to unsubscribe the observer from the subject. */ - // @warn_unused_result(message:"http://git.io/rxs.ud") public func drive(_ observer: O) -> Disposable where O.E == E { MainScheduler.ensureExecutingOnScheduler(errorMessage: driverErrorMessage) - return self.asObservable().subscribe(observer) + return self.asSharedSequence().asObservable().subscribe(observer) + } + + /** + Creates new subscription and sends elements to observer. + This method can be only called from `MainThread`. + + In this form it's equivalent to `subscribe` method, but it communicates intent better. + + - parameter observer: Observer that receives events. + - returns: Disposable object that can be used to unsubscribe the observer from the subject. + */ + public func drive(_ observer: O) -> Disposable where O.E == E? { + MainScheduler.ensureExecutingOnScheduler(errorMessage: driverErrorMessage) + return self.asSharedSequence().asObservable().map { $0 as E? }.subscribe(observer) } /** @@ -37,7 +51,6 @@ extension DriverConvertibleType { - parameter variable: Target variable for sequence elements. - returns: Disposable object that can be used to unsubscribe the observer from the variable. */ - // @warn_unused_result(message:"http://git.io/rxs.ud") public func drive(_ variable: Variable) -> Disposable { MainScheduler.ensureExecutingOnScheduler(errorMessage: driverErrorMessage) return drive(onNext: { e in @@ -45,6 +58,20 @@ extension DriverConvertibleType { }) } + /** + Creates new subscription and sends elements to variable. + This method can be only called from `MainThread`. + + - parameter variable: Target variable for sequence elements. + - returns: Disposable object that can be used to unsubscribe the observer from the variable. + */ + public func drive(_ variable: Variable) -> Disposable { + MainScheduler.ensureExecutingOnScheduler(errorMessage: driverErrorMessage) + return drive(onNext: { e in + variable.value = e + }) + } + /** Subscribes to observable sequence using custom binder function. This method can be only called from `MainThread`. @@ -52,7 +79,6 @@ extension DriverConvertibleType { - parameter with: Function used to bind elements from `self`. - returns: Object representing subscription. */ - // @warn_unused_result(message:"http://git.io/rxs.ud") public func drive(_ transformation: (Observable) -> R) -> R { MainScheduler.ensureExecutingOnScheduler(errorMessage: driverErrorMessage) return transformation(self.asObservable()) @@ -72,7 +98,6 @@ extension DriverConvertibleType { - parameter curriedArgument: Final argument passed to `binder` to finish binding process. - returns: Object representing subscription. */ - // @warn_unused_result(message:"http://git.io/rxs.ud") public func drive(_ with: (Observable) -> (R1) -> R2, curriedArgument: R1) -> R2 { MainScheduler.ensureExecutingOnScheduler(errorMessage: driverErrorMessage) return with(self.asObservable())(curriedArgument) @@ -91,25 +116,10 @@ extension DriverConvertibleType { gracefully completed, errored, or if the generation is cancelled by disposing subscription) - returns: Subscription object used to unsubscribe from the observable sequence. */ - // @warn_unused_result(message:"http://git.io/rxs.ud") public func drive(onNext: ((E) -> Void)? = nil, onCompleted: (() -> Void)? = nil, onDisposed: (() -> Void)? = nil) -> Disposable { MainScheduler.ensureExecutingOnScheduler(errorMessage: driverErrorMessage) return self.asObservable().subscribe(onNext: onNext, onCompleted: onCompleted, onDisposed: onDisposed) } - - /** - Subscribes an element handler to an observable sequence. - This method can be only called from `MainThread`. - - - parameter onNext: Action to invoke for each element in the observable sequence. - - returns: Subscription object used to unsubscribe from the observable sequence. - */ - // @warn_unused_result(message:"http://git.io/rxs.ud") - @available(*, deprecated, renamed: "drive(onNext:)") - public func driveNext(_ onNext: @escaping (E) -> Void) -> Disposable { - MainScheduler.ensureExecutingOnScheduler(errorMessage: driverErrorMessage) - return self.asObservable().subscribe(onNext: onNext) - } } diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/CocoaUnits/Driver/Driver.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/CocoaUnits/Driver/Driver.swift new file mode 100644 index 00000000..b31c2b57 --- /dev/null +++ b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/CocoaUnits/Driver/Driver.swift @@ -0,0 +1,89 @@ +// +// Driver.swift +// RxCocoa +// +// Created by Krunoslav Zaher on 9/26/16. +// Copyright © 2016 Krunoslav Zaher. All rights reserved. +// + +import Foundation +#if !RX_NO_MODULE + import RxSwift +#endif + + +/** + Unit that represents observable sequence with following properties: + + - it never fails + - it delivers events on `MainScheduler.instance` + - `shareReplayLatestWhileConnected()` behavior + - all observers share sequence computation resources + - it's stateful, upon subscription (calling subscribe) last element is immediatelly replayed if it was produced + - computation of elements is reference counted with respect to the number of observers + - if there are no subscribers, it will release sequence computation resources + + `Driver` can be considered a builder pattern for observable sequences that drive the application. + + If observable sequence has produced at least one element, after new subscription is made last produced element will be + immediately replayed on the same thread on which the subscription was made. + + When using `drive*`, `subscribe*` and `bind*` family of methods, they should always be called from main thread. + + If `drive*`, `subscribe*` and `bind*` are called from background thread, it is possible that initial replay + will happen on background thread, and subsequent events will arrive on main thread. + + To find out more about units and how to use them, please visit `Documentation/Units.md`. + */ +public typealias Driver = SharedSequence + +public struct DriverSharingStrategy: SharingStrategyProtocol { + public static var scheduler: SchedulerType { return driverObserveOnScheduler } + public static func share(_ source: Observable) -> Observable { + return source.shareReplayLatestWhileConnected() + } +} + +extension SharedSequenceConvertibleType where SharingStrategy == DriverSharingStrategy { + /// Adds `asDriver` to `SharingSequence` with `DriverSharingStrategy`. + public func asDriver() -> Driver { + return self.asSharedSequence() + } +} + +/** + This method can be used in unit tests to ensure that driver is using mock schedulers instead of + main schedulers. + + **This shouldn't be used in normal release builds.** +*/ +public func driveOnScheduler(_ scheduler: SchedulerType, action: () -> ()) { + let originalObserveOnScheduler = driverObserveOnScheduler + driverObserveOnScheduler = scheduler + + action() + + // If you remove this line , compiler buggy optimizations will change behavior of this code + _forceCompilerToStopDoingInsaneOptimizationsThatBreakCode(driverObserveOnScheduler) + // Scary, I know + + driverObserveOnScheduler = originalObserveOnScheduler +} + +#if os(Linux) + import Glibc +#endif + +func _forceCompilerToStopDoingInsaneOptimizationsThatBreakCode(_ scheduler: SchedulerType) { + let a: Int32 = 1 +#if os(Linux) + let b = 314 + Int32(Glibc.random() & 1) +#else + let b = 314 + Int32(arc4random() & 1) +#endif + if a == b { + print(scheduler) + } +} + +fileprivate var driverObserveOnScheduler: SchedulerType = MainScheduler.instance diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/CocoaUnits/Driver/ObservableConvertibleType+Driver.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/CocoaUnits/Driver/ObservableConvertibleType+Driver.swift similarity index 83% rename from Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/CocoaUnits/Driver/ObservableConvertibleType+Driver.swift rename to Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/CocoaUnits/Driver/ObservableConvertibleType+Driver.swift index cb38166c..ef97b0e9 100644 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/CocoaUnits/Driver/ObservableConvertibleType+Driver.swift +++ b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/CocoaUnits/Driver/ObservableConvertibleType+Driver.swift @@ -1,6 +1,6 @@ // // ObservableConvertibleType+Driver.swift -// Rx +// RxCocoa // // Created by Krunoslav Zaher on 9/19/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -18,11 +18,10 @@ extension ObservableConvertibleType { - parameter onErrorJustReturn: Element to return in case of error and after that complete the sequence. - returns: Driving observable sequence. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public func asDriver(onErrorJustReturn: E) -> Driver { let source = self .asObservable() - .observeOn(driverObserveOnScheduler) + .observeOn(DriverSharingStrategy.scheduler) .catchErrorJustReturn(onErrorJustReturn) return Driver(source) } @@ -33,11 +32,10 @@ extension ObservableConvertibleType { - parameter onErrorDriveWith: Driver that continues to drive the sequence in case of error. - returns: Driving observable sequence. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public func asDriver(onErrorDriveWith: Driver) -> Driver { let source = self .asObservable() - .observeOn(driverObserveOnScheduler) + .observeOn(DriverSharingStrategy.scheduler) .catchError { _ in onErrorDriveWith.asObservable() } @@ -50,11 +48,10 @@ extension ObservableConvertibleType { - parameter onErrorRecover: Calculates driver that continues to drive the sequence in case of error. - returns: Driving observable sequence. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public func asDriver(onErrorRecover: @escaping (_ error: Swift.Error) -> Driver) -> Driver { let source = self .asObservable() - .observeOn(driverObserveOnScheduler) + .observeOn(DriverSharingStrategy.scheduler) .catchError { error in onErrorRecover(error).asObservable() } diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/CocoaUnits/Driver/Variable+Driver.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/CocoaUnits/Driver/Variable+Driver.swift similarity index 61% rename from Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/CocoaUnits/Driver/Variable+Driver.swift rename to Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/CocoaUnits/Driver/Variable+Driver.swift index 9e7cfd27..9f9b21dd 100644 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/CocoaUnits/Driver/Variable+Driver.swift +++ b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/CocoaUnits/Driver/Variable+Driver.swift @@ -1,6 +1,6 @@ // // Variable+Driver.swift -// Rx +// RxCocoa // // Created by Krunoslav Zaher on 12/28/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -12,15 +12,12 @@ import Foundation #endif extension Variable { - /** - Converts `Variable` to `Driver` unit. - - - returns: Driving observable sequence. - */ - // @warn_unused_result(message:"http://git.io/rxs.uo") + /// Converts `Variable` to `Driver` unit. + /// + /// - returns: Driving observable sequence. public func asDriver() -> Driver { let source = self.asObservable() - .observeOn(driverObserveOnScheduler) + .observeOn(DriverSharingStrategy.scheduler) return Driver(source) } } diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/CocoaUnits/SharedSequence/ObservableConvertibleType+SharedSequence.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/CocoaUnits/SharedSequence/ObservableConvertibleType+SharedSequence.swift new file mode 100644 index 00000000..4cb6de53 --- /dev/null +++ b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/CocoaUnits/SharedSequence/ObservableConvertibleType+SharedSequence.swift @@ -0,0 +1,60 @@ +// +// ObservableConvertibleType+SharedSequence.swift +// RxCocoa +// +// Created by Krunoslav Zaher on 9/19/15. +// Copyright © 2015 Krunoslav Zaher. All rights reserved. +// + +import Foundation +#if !RX_NO_MODULE +import RxSwift +#endif + +extension ObservableConvertibleType { + /** + Converts anything convertible to `Observable` to `SharedSequence` unit. + + - parameter onErrorJustReturn: Element to return in case of error and after that complete the sequence. + - returns: Driving observable sequence. + */ + public func asSharedSequence(sharingStrategy: S.Type = S.self, onErrorJustReturn: E) -> SharedSequence { + let source = self + .asObservable() + .observeOn(S.scheduler) + .catchErrorJustReturn(onErrorJustReturn) + return SharedSequence(source) + } + + /** + Converts anything convertible to `Observable` to `SharedSequence` unit. + + - parameter onErrorDriveWith: SharedSequence that provides elements of the sequence in case of error. + - returns: Driving observable sequence. + */ + public func asSharedSequence(sharingStrategy: S.Type = S.self, onErrorDriveWith: SharedSequence) -> SharedSequence { + let source = self + .asObservable() + .observeOn(S.scheduler) + .catchError { _ in + onErrorDriveWith.asObservable() + } + return SharedSequence(source) + } + + /** + Converts anything convertible to `Observable` to `SharedSequence` unit. + + - parameter onErrorRecover: Calculates driver that continues to drive the sequence in case of error. + - returns: Driving observable sequence. + */ + public func asSharedSequence(sharingStrategy: S.Type = S.self, onErrorRecover: @escaping (_ error: Swift.Error) -> SharedSequence) -> SharedSequence { + let source = self + .asObservable() + .observeOn(S.scheduler) + .catchError { error in + onErrorRecover(error).asObservable() + } + return SharedSequence(source) + } +} diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/CocoaUnits/SharedSequence/SharedSequence+Operators+arity.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/CocoaUnits/SharedSequence/SharedSequence+Operators+arity.swift new file mode 100644 index 00000000..e66fc47c --- /dev/null +++ b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/CocoaUnits/SharedSequence/SharedSequence+Operators+arity.swift @@ -0,0 +1,351 @@ +// This file is autogenerated. Take a look at `Preprocessor` target in RxSwift project +// +// SharedSequence+Operators+arity.swift +// RxCocoa +// +// Created by Krunoslav Zaher on 10/14/15. +// Copyright © 2015 Krunoslav Zaher. All rights reserved. +// + +import Foundation +#if !RX_NO_MODULE +import RxSwift +#endif + + + +// 2 + +extension SharedSequence { + /** + Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index. + + - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources. + - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function. + */ + public static func zip + (_ source1: O1, _ source2: O2, resultSelector: @escaping (O1.E, O2.E) throws -> E) + -> SharedSequence where O1.SharingStrategy == O2.SharingStrategy { + let source = Observable.zip( + source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), + resultSelector: resultSelector + ) + + return SharedSequence(source) + } +} + +extension SharedSequence { + /** + Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element. + + - parameter resultSelector: Function to invoke whenever any of the sources produces an element. + - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function. + */ + public static func combineLatest + (_ source1: O1, _ source2: O2, resultSelector: @escaping (O1.E, O2.E) throws -> E) + -> SharedSequence where O1.SharingStrategy == O2.SharingStrategy { + let source = Observable.combineLatest( + source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), + resultSelector: resultSelector + ) + + return SharedSequence(source) + } +} + + + +// 3 + +extension SharedSequence { + /** + Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index. + + - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources. + - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function. + */ + public static func zip + (_ source1: O1, _ source2: O2, _ source3: O3, resultSelector: @escaping (O1.E, O2.E, O3.E) throws -> E) + -> SharedSequence where O1.SharingStrategy == O2.SharingStrategy, + O1.SharingStrategy == O3.SharingStrategy { + let source = Observable.zip( + source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(), + resultSelector: resultSelector + ) + + return SharedSequence(source) + } +} + +extension SharedSequence { + /** + Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element. + + - parameter resultSelector: Function to invoke whenever any of the sources produces an element. + - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function. + */ + public static func combineLatest + (_ source1: O1, _ source2: O2, _ source3: O3, resultSelector: @escaping (O1.E, O2.E, O3.E) throws -> E) + -> SharedSequence where O1.SharingStrategy == O2.SharingStrategy, + O1.SharingStrategy == O3.SharingStrategy { + let source = Observable.combineLatest( + source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(), + resultSelector: resultSelector + ) + + return SharedSequence(source) + } +} + + + +// 4 + +extension SharedSequence { + /** + Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index. + + - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources. + - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function. + */ + public static func zip + (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, resultSelector: @escaping (O1.E, O2.E, O3.E, O4.E) throws -> E) + -> SharedSequence where O1.SharingStrategy == O2.SharingStrategy, + O1.SharingStrategy == O3.SharingStrategy, + O1.SharingStrategy == O4.SharingStrategy { + let source = Observable.zip( + source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(), source4.asSharedSequence().asObservable(), + resultSelector: resultSelector + ) + + return SharedSequence(source) + } +} + +extension SharedSequence { + /** + Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element. + + - parameter resultSelector: Function to invoke whenever any of the sources produces an element. + - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function. + */ + public static func combineLatest + (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, resultSelector: @escaping (O1.E, O2.E, O3.E, O4.E) throws -> E) + -> SharedSequence where O1.SharingStrategy == O2.SharingStrategy, + O1.SharingStrategy == O3.SharingStrategy, + O1.SharingStrategy == O4.SharingStrategy { + let source = Observable.combineLatest( + source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(), source4.asSharedSequence().asObservable(), + resultSelector: resultSelector + ) + + return SharedSequence(source) + } +} + + + +// 5 + +extension SharedSequence { + /** + Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index. + + - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources. + - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function. + */ + public static func zip + (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, resultSelector: @escaping (O1.E, O2.E, O3.E, O4.E, O5.E) throws -> E) + -> SharedSequence where O1.SharingStrategy == O2.SharingStrategy, + O1.SharingStrategy == O3.SharingStrategy, + O1.SharingStrategy == O4.SharingStrategy, + O1.SharingStrategy == O5.SharingStrategy { + let source = Observable.zip( + source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(), source4.asSharedSequence().asObservable(), source5.asSharedSequence().asObservable(), + resultSelector: resultSelector + ) + + return SharedSequence(source) + } +} + +extension SharedSequence { + /** + Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element. + + - parameter resultSelector: Function to invoke whenever any of the sources produces an element. + - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function. + */ + public static func combineLatest + (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, resultSelector: @escaping (O1.E, O2.E, O3.E, O4.E, O5.E) throws -> E) + -> SharedSequence where O1.SharingStrategy == O2.SharingStrategy, + O1.SharingStrategy == O3.SharingStrategy, + O1.SharingStrategy == O4.SharingStrategy, + O1.SharingStrategy == O5.SharingStrategy { + let source = Observable.combineLatest( + source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(), source4.asSharedSequence().asObservable(), source5.asSharedSequence().asObservable(), + resultSelector: resultSelector + ) + + return SharedSequence(source) + } +} + + + +// 6 + +extension SharedSequence { + /** + Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index. + + - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources. + - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function. + */ + public static func zip + (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, resultSelector: @escaping (O1.E, O2.E, O3.E, O4.E, O5.E, O6.E) throws -> E) + -> SharedSequence where O1.SharingStrategy == O2.SharingStrategy, + O1.SharingStrategy == O3.SharingStrategy, + O1.SharingStrategy == O4.SharingStrategy, + O1.SharingStrategy == O5.SharingStrategy, + O1.SharingStrategy == O6.SharingStrategy { + let source = Observable.zip( + source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(), source4.asSharedSequence().asObservable(), source5.asSharedSequence().asObservable(), source6.asSharedSequence().asObservable(), + resultSelector: resultSelector + ) + + return SharedSequence(source) + } +} + +extension SharedSequence { + /** + Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element. + + - parameter resultSelector: Function to invoke whenever any of the sources produces an element. + - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function. + */ + public static func combineLatest + (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, resultSelector: @escaping (O1.E, O2.E, O3.E, O4.E, O5.E, O6.E) throws -> E) + -> SharedSequence where O1.SharingStrategy == O2.SharingStrategy, + O1.SharingStrategy == O3.SharingStrategy, + O1.SharingStrategy == O4.SharingStrategy, + O1.SharingStrategy == O5.SharingStrategy, + O1.SharingStrategy == O6.SharingStrategy { + let source = Observable.combineLatest( + source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(), source4.asSharedSequence().asObservable(), source5.asSharedSequence().asObservable(), source6.asSharedSequence().asObservable(), + resultSelector: resultSelector + ) + + return SharedSequence(source) + } +} + + + +// 7 + +extension SharedSequence { + /** + Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index. + + - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources. + - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function. + */ + public static func zip + (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, _ source7: O7, resultSelector: @escaping (O1.E, O2.E, O3.E, O4.E, O5.E, O6.E, O7.E) throws -> E) + -> SharedSequence where O1.SharingStrategy == O2.SharingStrategy, + O1.SharingStrategy == O3.SharingStrategy, + O1.SharingStrategy == O4.SharingStrategy, + O1.SharingStrategy == O5.SharingStrategy, + O1.SharingStrategy == O6.SharingStrategy, + O1.SharingStrategy == O7.SharingStrategy { + let source = Observable.zip( + source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(), source4.asSharedSequence().asObservable(), source5.asSharedSequence().asObservable(), source6.asSharedSequence().asObservable(), source7.asSharedSequence().asObservable(), + resultSelector: resultSelector + ) + + return SharedSequence(source) + } +} + +extension SharedSequence { + /** + Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element. + + - parameter resultSelector: Function to invoke whenever any of the sources produces an element. + - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function. + */ + public static func combineLatest + (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, _ source7: O7, resultSelector: @escaping (O1.E, O2.E, O3.E, O4.E, O5.E, O6.E, O7.E) throws -> E) + -> SharedSequence where O1.SharingStrategy == O2.SharingStrategy, + O1.SharingStrategy == O3.SharingStrategy, + O1.SharingStrategy == O4.SharingStrategy, + O1.SharingStrategy == O5.SharingStrategy, + O1.SharingStrategy == O6.SharingStrategy, + O1.SharingStrategy == O7.SharingStrategy { + let source = Observable.combineLatest( + source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(), source4.asSharedSequence().asObservable(), source5.asSharedSequence().asObservable(), source6.asSharedSequence().asObservable(), source7.asSharedSequence().asObservable(), + resultSelector: resultSelector + ) + + return SharedSequence(source) + } +} + + + +// 8 + +extension SharedSequence { + /** + Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index. + + - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources. + - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function. + */ + public static func zip + (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, _ source7: O7, _ source8: O8, resultSelector: @escaping (O1.E, O2.E, O3.E, O4.E, O5.E, O6.E, O7.E, O8.E) throws -> E) + -> SharedSequence where O1.SharingStrategy == O2.SharingStrategy, + O1.SharingStrategy == O3.SharingStrategy, + O1.SharingStrategy == O4.SharingStrategy, + O1.SharingStrategy == O5.SharingStrategy, + O1.SharingStrategy == O6.SharingStrategy, + O1.SharingStrategy == O7.SharingStrategy, + O1.SharingStrategy == O8.SharingStrategy { + let source = Observable.zip( + source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(), source4.asSharedSequence().asObservable(), source5.asSharedSequence().asObservable(), source6.asSharedSequence().asObservable(), source7.asSharedSequence().asObservable(), source8.asSharedSequence().asObservable(), + resultSelector: resultSelector + ) + + return SharedSequence(source) + } +} + +extension SharedSequence { + /** + Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element. + + - parameter resultSelector: Function to invoke whenever any of the sources produces an element. + - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function. + */ + public static func combineLatest + (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, _ source7: O7, _ source8: O8, resultSelector: @escaping (O1.E, O2.E, O3.E, O4.E, O5.E, O6.E, O7.E, O8.E) throws -> E) + -> SharedSequence where O1.SharingStrategy == O2.SharingStrategy, + O1.SharingStrategy == O3.SharingStrategy, + O1.SharingStrategy == O4.SharingStrategy, + O1.SharingStrategy == O5.SharingStrategy, + O1.SharingStrategy == O6.SharingStrategy, + O1.SharingStrategy == O7.SharingStrategy, + O1.SharingStrategy == O8.SharingStrategy { + let source = Observable.combineLatest( + source1.asSharedSequence().asObservable(), source2.asSharedSequence().asObservable(), source3.asSharedSequence().asObservable(), source4.asSharedSequence().asObservable(), source5.asSharedSequence().asObservable(), source6.asSharedSequence().asObservable(), source7.asSharedSequence().asObservable(), source8.asSharedSequence().asObservable(), + resultSelector: resultSelector + ) + + return SharedSequence(source) + } +} + + diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/CocoaUnits/Driver/Driver+Operators.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/CocoaUnits/SharedSequence/SharedSequence+Operators.swift similarity index 53% rename from Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/CocoaUnits/Driver/Driver+Operators.swift rename to Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/CocoaUnits/SharedSequence/SharedSequence+Operators.swift index 7f714eb8..d76fbd39 100644 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/CocoaUnits/Driver/Driver+Operators.swift +++ b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/CocoaUnits/SharedSequence/SharedSequence+Operators.swift @@ -1,6 +1,6 @@ // -// Driver+Operators.swift -// Rx +// SharedSequence+Operators.swift +// RxCocoa // // Created by Krunoslav Zaher on 9/19/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -12,7 +12,7 @@ import RxSwift #endif // MARK: map -extension DriverConvertibleType { +extension SharedSequenceConvertibleType { /** Projects each element of an observable sequence into a new form. @@ -20,34 +20,32 @@ extension DriverConvertibleType { - parameter selector: A transform function to apply to each source element. - returns: An observable sequence whose elements are the result of invoking the transform function on each element of source. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") - public func map(_ selector: @escaping (E) -> R) -> Driver { + public func map(_ selector: @escaping (E) -> R) -> SharedSequence { let source = self .asObservable() .map(selector) - return Driver(source) + return SharedSequence(source) } } // MARK: filter -extension DriverConvertibleType { +extension SharedSequenceConvertibleType { /** Filters the elements of an observable sequence based on a predicate. - parameter predicate: A function to test each source element for a condition. - returns: An observable sequence that contains elements from the input sequence that satisfy the condition. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") - public func filter(_ predicate: @escaping (E) -> Bool) -> Driver { + public func filter(_ predicate: @escaping (E) -> Bool) -> SharedSequence { let source = self .asObservable() .filter(predicate) - return Driver(source) + return SharedSequence(source) } } // MARK: switchLatest -extension DriverConvertibleType where E : DriverConvertibleType { +extension SharedSequenceConvertibleType where E : SharedSequenceConvertibleType, E.SharingStrategy == SharingStrategy { /** Transforms an observable sequence of observable sequences into an observable sequence @@ -58,18 +56,17 @@ extension DriverConvertibleType where E : DriverConvertibleType { - returns: The observable sequence that at any point in time produces the elements of the most recent inner observable sequence that has been received. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") - public func switchLatest() -> Driver { + public func switchLatest() -> SharedSequence { let source: Observable = self .asObservable() - .map { $0.asDriver() } + .map { $0.asSharedSequence() } .switchLatest() - return Driver(source) + return SharedSequence(source) } } // MARK: flatMapLatest -extension DriverConvertibleType { +extension SharedSequenceConvertibleType { /** Projects each element of an observable sequence into a new sequence of observable sequences and then transforms an observable sequence of observable sequences into an observable sequence producing values only from the most recent observable sequence. @@ -80,18 +77,17 @@ extension DriverConvertibleType { - returns: An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences and that at any point in time produces the elements of the most recent inner observable sequence that has been received. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") - public func flatMapLatest(_ selector: @escaping (E) -> Driver) - -> Driver { + public func flatMapLatest(_ selector: @escaping (E) -> SharedSequence) + -> SharedSequence { let source: Observable = self .asObservable() .flatMapLatest(selector) - return Driver(source) + return SharedSequence(source) } } // MARK: flatMapFirst -extension DriverConvertibleType { +extension SharedSequenceConvertibleType { /** Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence. @@ -100,101 +96,37 @@ extension DriverConvertibleType { - parameter selector: A transform function to apply to element that was observed while no observable is executing in parallel. - returns: An observable sequence whose elements are the result of invoking the one-to-many transform function on each element of the input sequence that was received while no other sequence was being calculated. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") - public func flatMapFirst(_ selector: @escaping (E) -> Driver) - -> Driver { + public func flatMapFirst(_ selector: @escaping (E) -> SharedSequence) + -> SharedSequence { let source: Observable = self .asObservable() .flatMapFirst(selector) - return Driver(source) + return SharedSequence(source) } } -// MARK: doOn -extension DriverConvertibleType { - - /** - Invokes an action for each event in the observable sequence, and propagates all observer messages through the result sequence. - - - parameter eventHandler: Action to invoke for each event in the observable sequence. - - returns: The source sequence with the side-effecting behavior applied. - */ - // @warn_unused_result(message:"http://git.io/rxs.uo") - @available(*, deprecated, renamed: "do(onNext:onError:onCompleted:)") - public func doOn(_ eventHandler: @escaping (Event) -> Void) - -> Driver { - let source = self.asObservable() - .doOn(eventHandler) - - return Driver(source) - } - - /** - Invokes an action for each event in the observable sequence, and propagates all observer messages through the result sequence. - - - parameter onNext: Action to invoke for each element in the observable sequence. - - parameter onError: Action to invoke upon errored termination of the observable sequence. This callback will never be invoked since driver can't error out. - - parameter onCompleted: Action to invoke upon graceful termination of the observable sequence. - - returns: The source sequence with the side-effecting behavior applied. - */ - // @warn_unused_result(message:"http://git.io/rxs.uo") - @available(*, deprecated, renamed: "do(onNext:onError:onCompleted:)") - public func doOn(onNext: ((E) -> Void)? = nil, onError: ((Swift.Error) -> Void)? = nil, onCompleted: (() -> Void)? = nil) - -> Driver { - let source = self.asObservable() - .doOn(onNext: onNext, onError: onError, onCompleted: onCompleted) - - return Driver(source) - } - - /** - Invokes an action for each Next event in the observable sequence, and propagates all observer messages through the result sequence. - - - parameter onNext: Action to invoke for each element in the observable sequence. - - returns: The source sequence with the side-effecting behavior applied. - */ - // @warn_unused_result(message:"http://git.io/rxs.uo") - @available(*, deprecated, renamed: "do(onNext:)") - public func doOnNext(_ onNext: @escaping (E) -> Void) - -> Driver { - return self.do(onNext: onNext) - } - - /** - Invokes an action for the Completed event in the observable sequence, and propagates all observer messages through the result sequence. - - - parameter onCompleted: Action to invoke upon graceful termination of the observable sequence. - - returns: The source sequence with the side-effecting behavior applied. - */ - // @warn_unused_result(message:"http://git.io/rxs.uo") - @available(*, deprecated, renamed: "do(onCompleted:)") - public func doOnCompleted(_ onCompleted: @escaping () -> Void) - -> Driver { - return self.do(onCompleted: onCompleted) - } - +// MARK: do +extension SharedSequenceConvertibleType { /** Invokes an action for each event in the observable sequence, and propagates all observer messages through the result sequence. - parameter onNext: Action to invoke for each element in the observable sequence. - - parameter onError: Action to invoke upon errored termination of the observable sequence. This callback will never be invoked since driver can't error out. - parameter onCompleted: Action to invoke upon graceful termination of the observable sequence. - parameter onSubscribe: Action to invoke before subscribing to source observable sequence. - parameter onDispose: Action to invoke after subscription to source observable has been disposed for any reason. It can be either because sequence terminates for some reason or observer subscription being disposed. - returns: The source sequence with the side-effecting behavior applied. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") - public func `do`(onNext: ((E) -> Void)? = nil, onError: ((Swift.Error) -> Void)? = nil, onCompleted: (() -> Void)? = nil, onSubscribe: (() -> ())? = nil, onDispose: (() -> ())? = nil) - -> Driver { + public func `do`(onNext: ((E) -> Void)? = nil, onCompleted: (() -> Void)? = nil, onSubscribe: (() -> ())? = nil, onDispose: (() -> ())? = nil) + -> SharedSequence { let source = self.asObservable() - .do(onNext: onNext, onError: onError, onCompleted: onCompleted, onSubscribe: onSubscribe, onDispose: onDispose) + .do(onNext: onNext, onCompleted: onCompleted, onSubscribe: onSubscribe, onDispose: onDispose) - return Driver(source) + return SharedSequence(source) } } // MARK: debug -extension DriverConvertibleType { +extension SharedSequenceConvertibleType { /** Prints received events for all observers on standard output. @@ -202,33 +134,31 @@ extension DriverConvertibleType { - parameter identifier: Identifier that is printed together with event description to standard output. - returns: An observable sequence whose events are printed to standard output. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") - public func debug(_ identifier: String? = nil, file: String = #file, line: UInt = #line, function: String = #function) -> Driver { + public func debug(_ identifier: String? = nil, file: String = #file, line: UInt = #line, function: String = #function) -> SharedSequence { let source = self.asObservable() .debug(identifier, file: file, line: line, function: function) - return Driver(source) + return SharedSequence(source) } } // MARK: distinctUntilChanged -extension DriverConvertibleType where E: Equatable { +extension SharedSequenceConvertibleType where E: Equatable { /** Returns an observable sequence that contains only distinct contiguous elements according to equality operator. - returns: An observable sequence only containing the distinct contiguous elements, based on equality operator, from the source sequence. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public func distinctUntilChanged() - -> Driver { + -> SharedSequence { let source = self.asObservable() .distinctUntilChanged({ $0 }, comparer: { ($0 == $1) }) - return Driver(source) + return SharedSequence(source) } } -extension DriverConvertibleType { +extension SharedSequenceConvertibleType { /** Returns an observable sequence that contains only distinct contiguous elements according to the `keySelector`. @@ -236,11 +166,10 @@ extension DriverConvertibleType { - parameter keySelector: A function to compute the comparison key for each element. - returns: An observable sequence only containing the distinct contiguous elements, based on a computed key value, from the source sequence. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") - public func distinctUntilChanged(_ keySelector: @escaping (E) -> K) -> Driver { + public func distinctUntilChanged(_ keySelector: @escaping (E) -> K) -> SharedSequence { let source = self.asObservable() .distinctUntilChanged(keySelector, comparer: { $0 == $1 }) - return Driver(source) + return SharedSequence(source) } /** @@ -249,11 +178,10 @@ extension DriverConvertibleType { - parameter comparer: Equality comparer for computed key values. - returns: An observable sequence only containing the distinct contiguous elements, based on `comparer`, from the source sequence. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") - public func distinctUntilChanged(_ comparer: @escaping (E, E) -> Bool) -> Driver { + public func distinctUntilChanged(_ comparer: @escaping (E, E) -> Bool) -> SharedSequence { let source = self.asObservable() .distinctUntilChanged({ $0 }, comparer: comparer) - return Driver(source) + return SharedSequence(source) } /** @@ -263,17 +191,16 @@ extension DriverConvertibleType { - parameter comparer: Equality comparer for computed key values. - returns: An observable sequence only containing the distinct contiguous elements, based on a computed key value and the comparer, from the source sequence. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") - public func distinctUntilChanged(_ keySelector: @escaping (E) -> K, comparer: @escaping (K, K) -> Bool) -> Driver { + public func distinctUntilChanged(_ keySelector: @escaping (E) -> K, comparer: @escaping (K, K) -> Bool) -> SharedSequence { let source = self.asObservable() .distinctUntilChanged(keySelector, comparer: comparer) - return Driver(source) + return SharedSequence(source) } } // MARK: flatMap -extension DriverConvertibleType { +extension SharedSequenceConvertibleType { /** Projects each element of an observable sequence to an observable sequence and merges the resulting observable sequences into one observable sequence. @@ -281,17 +208,16 @@ extension DriverConvertibleType { - parameter selector: A transform function to apply to each element. - returns: An observable sequence whose elements are the result of invoking the one-to-many transform function on each element of the input sequence. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") - public func flatMap(_ selector: @escaping (E) -> Driver) -> Driver { + public func flatMap(_ selector: @escaping (E) -> SharedSequence) -> SharedSequence { let source = self.asObservable() .flatMap(selector) - return Driver(source) + return SharedSequence(source) } } // MARK: merge -extension DriverConvertibleType where E : DriverConvertibleType { +extension SharedSequenceConvertibleType where E : SharedSequenceConvertibleType, E.SharingStrategy == SharingStrategy { /** Merges elements from all observable sequences in the given enumerable sequence into a single observable sequence. @@ -299,12 +225,11 @@ extension DriverConvertibleType where E : DriverConvertibleType { - parameter maxConcurrent: Maximum number of inner observable sequences being subscribed to concurrently. - returns: The observable sequence that merges the elements of the observable sequences. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") - public func merge() -> Driver { + public func merge() -> SharedSequence { let source = self.asObservable() - .map { $0.asDriver() } + .map { $0.asSharedSequence() } .merge() - return Driver(source) + return SharedSequence(source) } /** @@ -312,56 +237,54 @@ extension DriverConvertibleType where E : DriverConvertibleType { - returns: The observable sequence that merges the elements of the inner sequences. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public func merge(maxConcurrent: Int) - -> Driver { + -> SharedSequence { let source = self.asObservable() - .map { $0.asDriver() } + .map { $0.asSharedSequence() } .merge(maxConcurrent: maxConcurrent) - return Driver(source) + return SharedSequence(source) } } // MARK: throttle -extension DriverConvertibleType { +extension SharedSequenceConvertibleType { /** - Ignores elements from an observable sequence which are followed by another element within a specified relative time duration, using the specified scheduler to run throttling timers. - - `throttle` and `debounce` are synonyms. - - - parameter dueTime: Throttling duration for each element. - - returns: The throttled sequence. + Returns an Observable that emits the first and the latest item emitted by the source Observable during sequential time windows of a specified duration. + + This operator makes sure that no two elements are emitted in less then dueTime. + + - seealso: [debounce operator on reactivex.io](http://reactivex.io/documentation/operators/debounce.html) + + - parameter dueTime: Throttling duration for each element. + - parameter latest: Should latest element received in a dueTime wide time window since last element emission be emitted. + - returns: The throttled sequence. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public func throttle(_ dueTime: RxTimeInterval) - -> Driver { + -> SharedSequence { let source = self.asObservable() - .throttle(dueTime, scheduler: driverObserveOnScheduler) + .throttle(dueTime, scheduler: SharingStrategy.scheduler) - return Driver(source) + return SharedSequence(source) } /** Ignores elements from an observable sequence which are followed by another element within a specified relative time duration, using the specified scheduler to run throttling timers. - `throttle` and `debounce` are synonyms. - - parameter dueTime: Throttling duration for each element. - returns: The throttled sequence. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public func debounce(_ dueTime: RxTimeInterval) - -> Driver { + -> SharedSequence { let source = self.asObservable() - .debounce(dueTime, scheduler: driverObserveOnScheduler) + .debounce(dueTime, scheduler: SharingStrategy.scheduler) - return Driver(source) + return SharedSequence(source) } } // MARK: scan -extension DriverConvertibleType { +extension SharedSequenceConvertibleType { /** Applies an accumulator function over an observable sequence and returns each intermediate result. The specified seed value is used as the initial accumulator value. @@ -371,80 +294,74 @@ extension DriverConvertibleType { - parameter accumulator: An accumulator function to be invoked on each element. - returns: An observable sequence containing the accumulated values. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public func scan(_ seed: A, accumulator: @escaping (A, E) -> A) - -> Driver { + -> SharedSequence { let source = self.asObservable() .scan(seed, accumulator: accumulator) - return Driver(source) + return SharedSequence(source) } } // MARK: concat -extension Sequence where Iterator.Element : DriverConvertibleType { +extension SharedSequence { /** - Concatenates all observable sequences in the given sequence, as long as the previous observable sequence terminated successfully. + Concatenates all observable sequences in the given sequence, as long as the previous observable sequence terminated successfully. - - returns: An observable sequence that contains the elements of each given sequence, in sequential order. - */ - // @warn_unused_result(message:"http://git.io/rxs.uo") - public func concat() - -> Driver { - let source = self.lazy.map { $0.asDriver().asObservable() }.concat() - return Driver(source) + - returns: An observable sequence that contains the elements of each given sequence, in sequential order. + */ + public static func concat(_ sequence: S) -> SharedSequence + where S.Iterator.Element == SharedSequence { + let source = Observable.concat(sequence.lazy.map { $0.asObservable() }) + return SharedSequence(source) } -} - -extension Collection where Iterator.Element : DriverConvertibleType { /** Concatenates all observable sequences in the given sequence, as long as the previous observable sequence terminated successfully. - returns: An observable sequence that contains the elements of each given sequence, in sequential order. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") - public func concat() - -> Driver { - let source = self.map { $0.asDriver().asObservable() }.concat() - return Driver(source) + public static func concat(_ collection: C) -> SharedSequence + where C.Iterator.Element == SharedSequence { + let source = Observable.concat(collection.map { $0.asObservable() }) + return SharedSequence(source) } } // MARK: zip -extension Collection where Iterator.Element : DriverConvertibleType { +extension SharedSequence { /** - Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index. + Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index. - - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources. - - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function. - */ - // @warn_unused_result(message:"http://git.io/rxs.uo") - public func zip(_ resultSelector: @escaping ([Generator.Element.E]) throws -> R) -> Driver { - let source = self.map { $0.asDriver().asObservable() }.zip(resultSelector) - return Driver(source) + - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources. + - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function. + */ + public static func zip(_ collection: C, _ resultSelector: @escaping ([Element]) throws -> R) -> SharedSequence + where C.Iterator.Element == SharedSequence { + let source = Observable.zip(collection.map { $0.asSharedSequence().asObservable() }, resultSelector) + return SharedSequence(source) } } // MARK: combineLatest -extension Collection where Iterator.Element : DriverConvertibleType { +extension SharedSequence { /** - Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element. + Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element. - - parameter resultSelector: Function to invoke whenever any of the sources produces an element. - - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function. - */ - // @warn_unused_result(message:"http://git.io/rxs.uo") - public func combineLatest(_ resultSelector: @escaping ([Generator.Element.E]) throws -> R) -> Driver { - let source = self.map { $0.asDriver().asObservable() }.combineLatest(resultSelector) - return Driver(source) + - parameter resultSelector: Function to invoke whenever any of the sources produces an element. + - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function. + */ + public static func combineLatest(_ collection: C, _ resultSelector: @escaping ([Element]) throws -> R) -> SharedSequence + where C.Iterator.Element == SharedSequence { + let source = Observable.combineLatest(collection.map { $0.asObservable() }, resultSelector) + return SharedSequence(source) } } // MARK: withLatestFrom -extension DriverConvertibleType { +extension SharedSequenceConvertibleType { /** Merges two observable sequences into one observable sequence by combining each element from self with the latest element from the second source, if any. @@ -453,11 +370,11 @@ extension DriverConvertibleType { - parameter resultSelector: Function to invoke for each element from the self combined with the latest element from the second source, if any. - returns: An observable sequence containing the result of combining each element of the self with the latest element from the second source, if any, using the specified result selector function. */ - public func withLatestFrom(_ second: SecondO, resultSelector: @escaping (E, SecondO.E) -> ResultType) -> Driver { + public func withLatestFrom(_ second: SecondO, resultSelector: @escaping (E, SecondO.E) -> ResultType) -> SharedSequence where SecondO.SharingStrategy == SecondO.SharingStrategy { let source = self.asObservable() - .withLatestFrom(second.asDriver(), resultSelector: resultSelector) + .withLatestFrom(second.asSharedSequence(), resultSelector: resultSelector) - return Driver(source) + return SharedSequence(source) } /** @@ -466,16 +383,16 @@ extension DriverConvertibleType { - parameter second: Second observable source. - returns: An observable sequence containing the result of combining each element of the self with the latest element from the second source, if any, using the specified result selector function. */ - public func withLatestFrom(_ second: SecondO) -> Driver { + public func withLatestFrom(_ second: SecondO) -> SharedSequence { let source = self.asObservable() - .withLatestFrom(second.asDriver()) + .withLatestFrom(second.asSharedSequence()) - return Driver(source) + return SharedSequence(source) } } // MARK: skip -extension DriverConvertibleType { +extension SharedSequenceConvertibleType { /** Bypasses a specified number of elements in an observable sequence and then returns the remaining elements. @@ -485,17 +402,16 @@ extension DriverConvertibleType { - parameter count: The number of elements to skip before returning the remaining elements. - returns: An observable sequence that contains the elements that occur after the specified index in the input sequence. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public func skip(_ count: Int) - -> Driver { + -> SharedSequence { let source = self.asObservable() .skip(count) - return Driver(source) + return SharedSequence(source) } } // MARK: startWith -extension DriverConvertibleType { +extension SharedSequenceConvertibleType { /** Prepends a value to an observable sequence. @@ -505,12 +421,11 @@ extension DriverConvertibleType { - parameter element: Element to prepend to the specified sequence. - returns: The source sequence prepended with the specified values. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public func startWith(_ element: E) - -> Driver { + -> SharedSequence { let source = self.asObservable() .startWith(element) - return Driver(source) + return SharedSequence(source) } } diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/CocoaUnits/SharedSequence/SharedSequence.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/CocoaUnits/SharedSequence/SharedSequence.swift new file mode 100644 index 00000000..a0a41621 --- /dev/null +++ b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/CocoaUnits/SharedSequence/SharedSequence.swift @@ -0,0 +1,191 @@ +// +// SharedSequence.swift +// RxCocoa +// +// Created by Krunoslav Zaher on 8/27/15. +// Copyright © 2015 Krunoslav Zaher. All rights reserved. +// + +import Foundation +#if !RX_NO_MODULE + import RxSwift +#endif + +/** + Unit that represents observable sequence that shares computation resources with following properties: + + - it never fails + - it delivers events on `SharingStrategy.scheduler` + - sharing strategy is customizable using `SharingStrategy.share` behavior + + `SharedSequence` can be considered a builder pattern for observable sequences that share computation resources. + + To find out more about units and how to use them, please visit `Documentation/Units.md`. +*/ +public struct SharedSequence : SharedSequenceConvertibleType { + public typealias E = Element + public typealias SharingStrategy = S + + let _source: Observable + + init(_ source: Observable) { + self._source = S.share(source) + } + + init(raw: Observable) { + self._source = raw + } + + #if EXPANDABLE_SHARED_SEQUENCE + /** + This method is extension hook in case this unit needs to extended from outside the library. + + By defining `EXPANDABLE_SHARED_SEQUENCE` one agrees that it's up to him to ensure shared sequence + properties are preserved after extension. + */ + public static func createUnsafe(source: O) -> SharedSequence { + return SharedSequence(raw: source.asObservable()) + } + #endif + + /** + - returns: Built observable sequence. + */ + public func asObservable() -> Observable { + return _source + } + + /** + - returns: `self` + */ + public func asSharedSequence() -> SharedSequence { + return self + } +} + +/** + Different `SharedSequence` sharing strategies must conform to this protocol. + */ +public protocol SharingStrategyProtocol { + /** + Scheduled on which all sequence events will be delivered. + */ + static var scheduler: SchedulerType { get } + + /** + Computation resources sharing strategy for multiple sequence observers. + + E.g. One can choose `shareReplayWhenConnected`, `shareReplay` or `share` + as sequence event sharing strategies, but also do something more exotic, like + implementing promises or lazy loading chains. + */ + static func share(_ source: Observable) -> Observable +} + +/** +A type that can be converted to `SharedSequence`. +*/ +public protocol SharedSequenceConvertibleType : ObservableConvertibleType { + associatedtype SharingStrategy: SharingStrategyProtocol + + /** + Converts self to `SharedSequence`. + */ + func asSharedSequence() -> SharedSequence +} + +extension SharedSequenceConvertibleType { + public func asObservable() -> Observable { + return asSharedSequence().asObservable() + } +} + + +extension SharedSequence { + + /** + Returns an empty observable sequence, using the specified scheduler to send out the single `Completed` message. + + - returns: An observable sequence with no elements. + */ + public static func empty() -> SharedSequence { + return SharedSequence(Observable.empty().subscribeOn(S.scheduler)) + } + + /** + Returns a non-terminating observable sequence, which can be used to denote an infinite duration. + + - returns: An observable sequence whose observers will never get called. + */ + public static func never() -> SharedSequence { + return SharedSequence(Observable.never()) + } + + /** + Returns an observable sequence that contains a single element. + + - parameter element: Single element in the resulting observable sequence. + - returns: An observable sequence containing the single specified element. + */ + public static func just(_ element: E) -> SharedSequence { + return SharedSequence(Observable.just(element).subscribeOn(S.scheduler)) + } + + /** + Returns an observable sequence that invokes the specified factory function whenever a new observer subscribes. + + - parameter observableFactory: Observable factory function to invoke for each observer that subscribes to the resulting sequence. + - returns: An observable sequence whose observers trigger an invocation of the given observable factory function. + */ + public static func deferred(_ observableFactory: @escaping () -> SharedSequence) + -> SharedSequence { + return SharedSequence(Observable.deferred { observableFactory().asObservable() }) + } + + /** + This method creates a new Observable instance with a variable number of elements. + + - seealso: [from operator on reactivex.io](http://reactivex.io/documentation/operators/from.html) + + - parameter elements: Elements to generate. + - returns: The observable sequence whose elements are pulled from the given arguments. + */ + public static func of(_ elements: E ...) -> SharedSequence { + let source = Observable.from(elements, scheduler: S.scheduler) + return SharedSequence(raw: source) + } +} + +extension SharedSequence where Element : SignedInteger { + /** + Returns an observable sequence that produces a value after each period, using the specified scheduler to run timers and to send out observer messages. + + - seealso: [interval operator on reactivex.io](http://reactivex.io/documentation/operators/interval.html) + + - parameter period: Period for producing the values in the resulting sequence. + - returns: An observable sequence that produces a value after each period. + */ + public static func interval(_ period: RxTimeInterval) + -> SharedSequence { + return SharedSequence(Observable.interval(period, scheduler: S.scheduler)) + } +} + +// MARK: timer + +extension SharedSequence where Element: SignedInteger { + /** + Returns an observable sequence that periodically produces a value after the specified initial relative due time has elapsed, using the specified scheduler to run timers. + + - seealso: [timer operator on reactivex.io](http://reactivex.io/documentation/operators/timer.html) + + - parameter dueTime: Relative time at which to produce the first value. + - parameter period: Period to produce subsequent values. + - returns: An observable sequence that produces a value after due time has elapsed and then each period. + */ + public static func timer(_ dueTime: RxTimeInterval, period: RxTimeInterval) + -> SharedSequence { + return SharedSequence(Observable.timer(dueTime, period: period, scheduler: S.scheduler)) + } +} + diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/CocoaUnits/SharedSequence/Variable+SharedSequence.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/CocoaUnits/SharedSequence/Variable+SharedSequence.swift new file mode 100644 index 00000000..904f5f73 --- /dev/null +++ b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/CocoaUnits/SharedSequence/Variable+SharedSequence.swift @@ -0,0 +1,23 @@ +// +// Variable+SharedSequence.swift +// RxCocoa +// +// Created by Krunoslav Zaher on 12/28/15. +// Copyright © 2015 Krunoslav Zaher. All rights reserved. +// + +import Foundation +#if !RX_NO_MODULE + import RxSwift +#endif + +extension Variable { + /// Converts `Variable` to `SharedSequence` unit. + /// + /// - returns: Observable sequence. + public func asSharedSequence(strategy: SharingStrategy.Type = SharingStrategy.self) -> SharedSequence { + let source = self.asObservable() + .observeOn(SharingStrategy.scheduler) + return SharedSequence(source) + } +} diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/CocoaUnits/UIBindingObserver.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/CocoaUnits/UIBindingObserver.swift similarity index 86% rename from Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/CocoaUnits/UIBindingObserver.swift rename to Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/CocoaUnits/UIBindingObserver.swift index 634a5d18..0066e47d 100644 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/CocoaUnits/UIBindingObserver.swift +++ b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/CocoaUnits/UIBindingObserver.swift @@ -1,6 +1,6 @@ // // UIBindingObserver.swift -// Rx +// RxCocoa // // Created by Krunoslav Zaher on 2/7/16. // Copyright © 2016 Krunoslav Zaher. All rights reserved. @@ -25,17 +25,13 @@ public class UIBindingObserver : ObserverType where UIElem let binding: (UIElementType, Value) -> Void - /** - Initializes `ViewBindingObserver` using - */ + /// Initializes `ViewBindingObserver` using public init(UIElement: UIElementType, binding: @escaping (UIElementType, Value) -> Void) { self.UIElement = UIElement self.binding = binding } - /** - Binds next element to owner view as described in `binding`. - */ + /// Binds next element to owner view as described in `binding`. public func on(_ event: Event) { MainScheduler.ensureExecutingOnScheduler(errorMessage: "Element can be bound to user interface only on MainThread.") @@ -51,11 +47,9 @@ public class UIBindingObserver : ObserverType where UIElem } } - /** - Erases type of observer. - - - returns: type erased observer. - */ + /// Erases type of observer. + /// + /// - returns: type erased observer. public func asObserver() -> AnyObserver { return AnyObserver(eventHandler: on) } diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/CocoaUnits/Driver/Driver+Operators+arity.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/CocoaUnits/Driver/Driver+Operators+arity.swift deleted file mode 100644 index c1b3731b..00000000 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/CocoaUnits/Driver/Driver+Operators+arity.swift +++ /dev/null @@ -1,323 +0,0 @@ -// This file is autogenerated. Take a look at `Preprocessor` target in RxSwift project -// -// Driver+Operators+arity.swift -// Rx -// -// Created by Krunoslav Zaher on 10/14/15. -// Copyright © 2015 Krunoslav Zaher. All rights reserved. -// - -import Foundation -#if !RX_NO_MODULE -import RxSwift -#endif - - - -// 2 - -extension Driver { - /** - Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index. - - - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources. - - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function. - */ - // @warn_unused_result(message:"http://git.io/rxs.uo") - public static func zip - (_ source1: O1, _ source2: O2, resultSelector: @escaping (O1.E, O2.E) throws -> E) - -> Driver { - let source = Observable.zip( - source1.asDriver().asObservable(), source2.asDriver().asObservable(), - resultSelector: resultSelector - ) - - return Driver(source) - } -} - -extension Driver { - /** - Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element. - - - parameter resultSelector: Function to invoke whenever any of the sources produces an element. - - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function. - */ - // @warn_unused_result(message:"http://git.io/rxs.uo") - public static func combineLatest - (_ source1: O1, _ source2: O2, resultSelector: @escaping (O1.E, O2.E) throws -> E) - -> Driver { - let source = Observable.combineLatest( - source1.asDriver().asObservable(), source2.asDriver().asObservable(), - resultSelector: resultSelector - ) - - return Driver(source) - } -} - - - -// 3 - -extension Driver { - /** - Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index. - - - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources. - - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function. - */ - // @warn_unused_result(message:"http://git.io/rxs.uo") - public static func zip - (_ source1: O1, _ source2: O2, _ source3: O3, resultSelector: @escaping (O1.E, O2.E, O3.E) throws -> E) - -> Driver { - let source = Observable.zip( - source1.asDriver().asObservable(), source2.asDriver().asObservable(), source3.asDriver().asObservable(), - resultSelector: resultSelector - ) - - return Driver(source) - } -} - -extension Driver { - /** - Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element. - - - parameter resultSelector: Function to invoke whenever any of the sources produces an element. - - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function. - */ - // @warn_unused_result(message:"http://git.io/rxs.uo") - public static func combineLatest - (_ source1: O1, _ source2: O2, _ source3: O3, resultSelector: @escaping (O1.E, O2.E, O3.E) throws -> E) - -> Driver { - let source = Observable.combineLatest( - source1.asDriver().asObservable(), source2.asDriver().asObservable(), source3.asDriver().asObservable(), - resultSelector: resultSelector - ) - - return Driver(source) - } -} - - - -// 4 - -extension Driver { - /** - Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index. - - - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources. - - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function. - */ - // @warn_unused_result(message:"http://git.io/rxs.uo") - public static func zip - (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, resultSelector: @escaping (O1.E, O2.E, O3.E, O4.E) throws -> E) - -> Driver { - let source = Observable.zip( - source1.asDriver().asObservable(), source2.asDriver().asObservable(), source3.asDriver().asObservable(), source4.asDriver().asObservable(), - resultSelector: resultSelector - ) - - return Driver(source) - } -} - -extension Driver { - /** - Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element. - - - parameter resultSelector: Function to invoke whenever any of the sources produces an element. - - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function. - */ - // @warn_unused_result(message:"http://git.io/rxs.uo") - public static func combineLatest - (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, resultSelector: @escaping (O1.E, O2.E, O3.E, O4.E) throws -> E) - -> Driver { - let source = Observable.combineLatest( - source1.asDriver().asObservable(), source2.asDriver().asObservable(), source3.asDriver().asObservable(), source4.asDriver().asObservable(), - resultSelector: resultSelector - ) - - return Driver(source) - } -} - - - -// 5 - -extension Driver { - /** - Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index. - - - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources. - - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function. - */ - // @warn_unused_result(message:"http://git.io/rxs.uo") - public static func zip - (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, resultSelector: @escaping (O1.E, O2.E, O3.E, O4.E, O5.E) throws -> E) - -> Driver { - let source = Observable.zip( - source1.asDriver().asObservable(), source2.asDriver().asObservable(), source3.asDriver().asObservable(), source4.asDriver().asObservable(), source5.asDriver().asObservable(), - resultSelector: resultSelector - ) - - return Driver(source) - } -} - -extension Driver { - /** - Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element. - - - parameter resultSelector: Function to invoke whenever any of the sources produces an element. - - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function. - */ - // @warn_unused_result(message:"http://git.io/rxs.uo") - public static func combineLatest - (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, resultSelector: @escaping (O1.E, O2.E, O3.E, O4.E, O5.E) throws -> E) - -> Driver { - let source = Observable.combineLatest( - source1.asDriver().asObservable(), source2.asDriver().asObservable(), source3.asDriver().asObservable(), source4.asDriver().asObservable(), source5.asDriver().asObservable(), - resultSelector: resultSelector - ) - - return Driver(source) - } -} - - - -// 6 - -extension Driver { - /** - Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index. - - - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources. - - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function. - */ - // @warn_unused_result(message:"http://git.io/rxs.uo") - public static func zip - (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, resultSelector: @escaping (O1.E, O2.E, O3.E, O4.E, O5.E, O6.E) throws -> E) - -> Driver { - let source = Observable.zip( - source1.asDriver().asObservable(), source2.asDriver().asObservable(), source3.asDriver().asObservable(), source4.asDriver().asObservable(), source5.asDriver().asObservable(), source6.asDriver().asObservable(), - resultSelector: resultSelector - ) - - return Driver(source) - } -} - -extension Driver { - /** - Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element. - - - parameter resultSelector: Function to invoke whenever any of the sources produces an element. - - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function. - */ - // @warn_unused_result(message:"http://git.io/rxs.uo") - public static func combineLatest - (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, resultSelector: @escaping (O1.E, O2.E, O3.E, O4.E, O5.E, O6.E) throws -> E) - -> Driver { - let source = Observable.combineLatest( - source1.asDriver().asObservable(), source2.asDriver().asObservable(), source3.asDriver().asObservable(), source4.asDriver().asObservable(), source5.asDriver().asObservable(), source6.asDriver().asObservable(), - resultSelector: resultSelector - ) - - return Driver(source) - } -} - - - -// 7 - -extension Driver { - /** - Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index. - - - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources. - - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function. - */ - // @warn_unused_result(message:"http://git.io/rxs.uo") - public static func zip - (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, _ source7: O7, resultSelector: @escaping (O1.E, O2.E, O3.E, O4.E, O5.E, O6.E, O7.E) throws -> E) - -> Driver { - let source = Observable.zip( - source1.asDriver().asObservable(), source2.asDriver().asObservable(), source3.asDriver().asObservable(), source4.asDriver().asObservable(), source5.asDriver().asObservable(), source6.asDriver().asObservable(), source7.asDriver().asObservable(), - resultSelector: resultSelector - ) - - return Driver(source) - } -} - -extension Driver { - /** - Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element. - - - parameter resultSelector: Function to invoke whenever any of the sources produces an element. - - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function. - */ - // @warn_unused_result(message:"http://git.io/rxs.uo") - public static func combineLatest - (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, _ source7: O7, resultSelector: @escaping (O1.E, O2.E, O3.E, O4.E, O5.E, O6.E, O7.E) throws -> E) - -> Driver { - let source = Observable.combineLatest( - source1.asDriver().asObservable(), source2.asDriver().asObservable(), source3.asDriver().asObservable(), source4.asDriver().asObservable(), source5.asDriver().asObservable(), source6.asDriver().asObservable(), source7.asDriver().asObservable(), - resultSelector: resultSelector - ) - - return Driver(source) - } -} - - - -// 8 - -extension Driver { - /** - Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index. - - - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources. - - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function. - */ - // @warn_unused_result(message:"http://git.io/rxs.uo") - public static func zip - (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, _ source7: O7, _ source8: O8, resultSelector: @escaping (O1.E, O2.E, O3.E, O4.E, O5.E, O6.E, O7.E, O8.E) throws -> E) - -> Driver { - let source = Observable.zip( - source1.asDriver().asObservable(), source2.asDriver().asObservable(), source3.asDriver().asObservable(), source4.asDriver().asObservable(), source5.asDriver().asObservable(), source6.asDriver().asObservable(), source7.asDriver().asObservable(), source8.asDriver().asObservable(), - resultSelector: resultSelector - ) - - return Driver(source) - } -} - -extension Driver { - /** - Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element. - - - parameter resultSelector: Function to invoke whenever any of the sources produces an element. - - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function. - */ - // @warn_unused_result(message:"http://git.io/rxs.uo") - public static func combineLatest - (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, _ source7: O7, _ source8: O8, resultSelector: @escaping (O1.E, O2.E, O3.E, O4.E, O5.E, O6.E, O7.E, O8.E) throws -> E) - -> Driver { - let source = Observable.combineLatest( - source1.asDriver().asObservable(), source2.asDriver().asObservable(), source3.asDriver().asObservable(), source4.asDriver().asObservable(), source5.asDriver().asObservable(), source6.asDriver().asObservable(), source7.asDriver().asObservable(), source8.asDriver().asObservable(), - resultSelector: resultSelector - ) - - return Driver(source) - } -} - - diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/CocoaUnits/Driver/Driver.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/CocoaUnits/Driver/Driver.swift deleted file mode 100644 index 2c2ae098..00000000 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/CocoaUnits/Driver/Driver.swift +++ /dev/null @@ -1,221 +0,0 @@ -// -// Driver.swift -// Rx -// -// Created by Krunoslav Zaher on 8/27/15. -// Copyright © 2015 Krunoslav Zaher. All rights reserved. -// - -import Foundation -#if !RX_NO_MODULE -import RxSwift -#endif - -/** -A type that can be converted to `Driver`. -*/ -public protocol DriverConvertibleType : ObservableConvertibleType { - - /** - Converts self to `Driver`. - */ - // @warn_unused_result(message:"http://git.io/rxs.uo") - func asDriver() -> Driver -} - -extension DriverConvertibleType { - // @warn_unused_result(message:"http://git.io/rxs.uo") - public func asObservable() -> Observable { - return asDriver().asObservable() - } -} - -/** - Unit that represents observable sequence with following properties: - - - it never fails - - it delivers events on `MainScheduler.instance` - - `shareReplayLatestWhileConnected()` behavior - - all observers share sequence computation resources - - it's stateful, upon subscription (calling subscribe) last element is immediatelly replayed if it was produced - - computation of elements is reference counted with respect to the number of observers - - if there are no subscribers, it will release sequence computation resources - - `Driver` can be considered a builder pattern for observable sequences that drive the application. - - If observable sequence has produced at least one element, after new subscription is made last produced element will be - immediately replayed on the same thread on which the subscription was made. - - When using `drive*`, `subscribe*` and `bind*` family of methods, they should always be called from main thread. - - If `drive*`, `subscribe*` and `bind*` are called from background thread, it is possible that initial replay - will happen on background thread, and subsequent events will arrive on main thread. - - To find out more about units and how to use them, please visit `Documentation/Units.md`. -*/ -public struct Driver : DriverConvertibleType { - public typealias E = Element - - let _source: Observable - - init(_ source: Observable) { - self._source = source.shareReplayLatestWhileConnected() - } - - init(raw: Observable) { - self._source = raw - } - - #if EXPANDABLE_DRIVER - public static func createUnsafe(source: O) -> Driver { - return Driver(raw: source.asObservable()) - } - #endif - - /** - - returns: Built observable sequence. - */ - // @warn_unused_result(message:"http://git.io/rxs.uo") - public func asObservable() -> Observable { - return _source - } - - /** - - returns: `self` - */ - // @warn_unused_result(message:"http://git.io/rxs.uo") - public func asDriver() -> Driver { - return self - } -} - - -extension Driver { - - /** - Returns an empty observable sequence, using the specified scheduler to send out the single `Completed` message. - - - returns: An observable sequence with no elements. - */ - // @warn_unused_result(message:"http://git.io/rxs.uo") - public static func empty() -> Driver { - return Driver(Observable.empty().subscribeOn(driverSubscribeOnScheduler)) - } - - /** - Returns a non-terminating observable sequence, which can be used to denote an infinite duration. - - - returns: An observable sequence whose observers will never get called. - */ - // @warn_unused_result(message:"http://git.io/rxs.uo") - public static func never() -> Driver { - return Driver(Observable.never().subscribeOn(driverSubscribeOnScheduler)) - } - - /** - Returns an observable sequence that contains a single element. - - - parameter element: Single element in the resulting observable sequence. - - returns: An observable sequence containing the single specified element. - */ - // @warn_unused_result(message:"http://git.io/rxs.uo") - public static func just(_ element: E) -> Driver { - return Driver(Observable.just(element).subscribeOn(driverSubscribeOnScheduler)) - } - - /** - Returns an observable sequence that invokes the specified factory function whenever a new observer subscribes. - - - parameter observableFactory: Observable factory function to invoke for each observer that subscribes to the resulting sequence. - - returns: An observable sequence whose observers trigger an invocation of the given observable factory function. - */ - // @warn_unused_result(message:"http://git.io/rxs.uo") - public static func deferred(_ observableFactory: @escaping () -> Driver) - -> Driver { - return Driver(Observable.deferred { observableFactory().asObservable() }) - } - - /** - This method creates a new Observable instance with a variable number of elements. - - - seealso: [from operator on reactivex.io](http://reactivex.io/documentation/operators/from.html) - - - parameter elements: Elements to generate. - - returns: The observable sequence whose elements are pulled from the given arguments. - */ - // @warn_unused_result(message:"http://git.io/rxs.uo") - public static func of(_ elements: E ...) -> Driver { - let source = Observable.from(elements, scheduler: driverSubscribeOnScheduler) - return Driver(raw: source) - } -} - -extension Driver where Element : SignedInteger { - /** - Returns an observable sequence that produces a value after each period, using the specified scheduler to run timers and to send out observer messages. - - - seealso: [interval operator on reactivex.io](http://reactivex.io/documentation/operators/interval.html) - - - parameter period: Period for producing the values in the resulting sequence. - - returns: An observable sequence that produces a value after each period. - */ - // @warn_unused_result(message:"http://git.io/rxs.uo") - public static func interval(_ period: RxTimeInterval) - -> Driver { - return Driver(Observable.interval(period, scheduler: driverObserveOnScheduler)) - } -} - -// MARK: timer - -extension Driver where Element: SignedInteger { - /** - Returns an observable sequence that periodically produces a value after the specified initial relative due time has elapsed, using the specified scheduler to run timers. - - - seealso: [timer operator on reactivex.io](http://reactivex.io/documentation/operators/timer.html) - - - parameter dueTime: Relative time at which to produce the first value. - - parameter period: Period to produce subsequent values. - - returns: An observable sequence that produces a value after due time has elapsed and then each period. - */ - // @warn_unused_result(message:"http://git.io/rxs.uo") - public static func timer(_ dueTime: RxTimeInterval, period: RxTimeInterval) - -> Driver { - return Driver(Observable.timer(dueTime, period: period, scheduler: driverObserveOnScheduler)) - } -} - -/** - This method can be used in unit tests to ensure that driver is using mock schedulers instead of - main schedulers. - - **This shouldn't be used in normal release builds.** -*/ -public func driveOnScheduler(_ scheduler: SchedulerType, action: () -> ()) { - let originalObserveOnScheduler = driverObserveOnScheduler - let originalSubscribeOnScheduler = driverSubscribeOnScheduler - - driverObserveOnScheduler = scheduler - driverSubscribeOnScheduler = scheduler - - action() - - // If you remove this line , compiler buggy optimizations will change behavior of this code - _forceCompilerToStopDoingInsaneOptimizationsThatBreakCode(driverObserveOnScheduler) - _forceCompilerToStopDoingInsaneOptimizationsThatBreakCode(driverSubscribeOnScheduler) - // Scary, I know - - driverObserveOnScheduler = originalObserveOnScheduler - driverSubscribeOnScheduler = originalSubscribeOnScheduler -} - -func _forceCompilerToStopDoingInsaneOptimizationsThatBreakCode(_ scheduler: SchedulerType) { - let a: Int32 = 1 - let b = 314 + Int32(arc4random() & 1) - if a == b { - print(scheduler) - } -} - -var driverObserveOnScheduler: SchedulerType = MainScheduler.instance -var driverSubscribeOnScheduler: SchedulerType = ConcurrentMainScheduler.instance diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/Observables/Implementations/ControlTarget.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/ControlTarget.swift similarity index 95% rename from Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/Observables/Implementations/ControlTarget.swift rename to Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/ControlTarget.swift index 859c1974..42b7db9f 100644 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/Observables/Implementations/ControlTarget.swift +++ b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/ControlTarget.swift @@ -6,7 +6,7 @@ // Copyright © 2015 Krunoslav Zaher. All rights reserved. // -#if os(iOS) || os(tvOS) || os(OSX) +#if os(iOS) || os(tvOS) || os(macOS) import Foundation #if !RX_NO_MODULE @@ -18,7 +18,7 @@ import RxSwift typealias Control = UIKit.UIControl typealias ControlEvents = UIKit.UIControlEvents -#elseif os(OSX) +#elseif os(macOS) import Cocoa typealias Control = Cocoa.NSControl @@ -52,7 +52,7 @@ class ControlTarget: RxTarget { rxFatalError("Can't find method") } } -#elseif os(OSX) +#elseif os(macOS) init(control: Control, callback: @escaping Callback) { MainScheduler.ensureExecutingOnScheduler() @@ -81,7 +81,7 @@ class ControlTarget: RxTarget { super.dispose() #if os(iOS) || os(tvOS) self.control?.removeTarget(self, action: self.selector, for: self.controlEvents) -#elseif os(OSX) +#elseif os(macOS) self.control?.target = nil self.control?.action = nil #endif diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/DelegateProxy.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/DelegateProxy.swift index dc888bbd..3634ffc6 100644 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/DelegateProxy.swift +++ b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/DelegateProxy.swift @@ -6,45 +6,45 @@ // Copyright © 2015 Krunoslav Zaher. All rights reserved. // +#if !os(Linux) + import Foundation #if !RX_NO_MODULE -import RxSwift + import RxSwift + #if SWIFT_PACKAGE && !os(Linux) + import RxCocoaRuntime + #endif #endif var delegateAssociatedTag: UInt8 = 0 var dataSourceAssociatedTag: UInt8 = 0 -/** -Base class for `DelegateProxyType` protocol. - -This implementation is not thread safe and can be used only from one thread (Main thread). -*/ +/// Base class for `DelegateProxyType` protocol. +/// +/// This implementation is not thread safe and can be used only from one thread (Main thread). open class DelegateProxy : _RXDelegateProxy { - - private var subjectsForSelector = [Selector: PublishSubject<[AnyObject]>]() - /** - Parent object associated with delegate proxy. - */ + private var sentMessageForSelector = [Selector: PublishSubject<[Any]>]() + private var methodInvokedForSelector = [Selector: PublishSubject<[Any]>]() + + /// Parent object associated with delegate proxy. weak private(set) var parentObject: AnyObject? - /** - Initializes new instance. - - - parameter parentObject: Optional parent object that owns `DelegateProxy` as associated object. - */ + /// Initializes new instance. + /// + /// - parameter parentObject: Optional parent object that owns `DelegateProxy` as associated object. public required init(parentObject: AnyObject) { self.parentObject = parentObject MainScheduler.ensureExecutingOnScheduler() #if TRACE_RESOURCES - OSAtomicIncrement32(&resourceCount) + _ = Resources.incrementTotal() #endif super.init() } - + /** - Returns observable sequence of invocations of delegate methods. + Returns observable sequence of invocations of delegate methods. Elements are sent *before method is invoked*. Only methods that have `void` return value can be observed using this method because those methods are used as a notification mechanism. It doesn't matter if they are optional @@ -85,101 +85,165 @@ open class DelegateProxy : _RXDelegateProxy { - parameter selector: Selector used to filter observed invocations of delegate methods. - returns: Observable sequence of arguments passed to `selector` method. */ - public func observe(_ selector: Selector) -> Observable<[AnyObject]> { - if hasWiredImplementation(for: selector) { - print("Delegate proxy is already implementing `\(selector)`, a more performant way of registering might exist.") - } + open func sentMessage(_ selector: Selector) -> Observable<[Any]> { + checkSelectorIsObservable(selector) - if !self.responds(to: selector) { - rxFatalError("This class doesn't respond to selector \(selector)") - } - - let subject = subjectsForSelector[selector] + let subject = sentMessageForSelector[selector] if let subject = subject { return subject } else { - let subject = PublishSubject<[AnyObject]>() - subjectsForSelector[selector] = subject + let subject = PublishSubject<[Any]>() + sentMessageForSelector[selector] = subject return subject } } - + + /** + Returns observable sequence of invoked delegate methods. Elements are sent *after method is invoked*. + + Only methods that have `void` return value can be observed using this method because + those methods are used as a notification mechanism. It doesn't matter if they are optional + or not. Observing is performed by installing a hidden associated `PublishSubject` that is + used to dispatch messages to observers. + + Delegate methods that have non `void` return value can't be observed directly using this method + because: + * those methods are not intended to be used as a notification mechanism, but as a behavior customization mechanism + * there is no sensible automatic way to determine a default return value + + In case observing of delegate methods that have return type is required, it can be done by + manually installing a `PublishSubject` or `BehaviorSubject` and implementing delegate method. + + e.g. + + // delegate proxy part (RxScrollViewDelegateProxy) + + let internalSubject = PublishSubject + + public func requiredDelegateMethod(scrollView: UIScrollView, arg1: CGPoint) -> Bool { + internalSubject.on(.next(arg1)) + return self._forwardToDelegate?.requiredDelegateMethod?(scrollView, arg1: arg1) ?? defaultReturnValue + } + + .... + + // reactive property implementation in a real class (`UIScrollView`) + public var property: Observable { + let proxy = RxScrollViewDelegateProxy.proxyForObject(base) + return proxy.internalSubject.asObservable() + } + + **In case calling this method prints "Delegate proxy is already implementing `\(selector)`, + a more performant way of registering might exist.", that means that manual observing method + is required analog to the example above because delegate method has already been implemented.** + + - parameter selector: Selector used to filter observed invocations of delegate methods. + - returns: Observable sequence of arguments passed to `selector` method. + */ + open func methodInvoked(_ selector: Selector) -> Observable<[Any]> { + checkSelectorIsObservable(selector) + + let subject = methodInvokedForSelector[selector] + + if let subject = subject { + return subject + } + else { + let subject = PublishSubject<[Any]>() + methodInvokedForSelector[selector] = subject + return subject + } + } + + private func checkSelectorIsObservable(_ selector: Selector) { + MainScheduler.ensureExecutingOnScheduler() + + if hasWiredImplementation(for: selector) { + print("Delegate proxy is already implementing `\(selector)`, a more performant way of registering might exist.") + } + + // It's important to see if super class reponds to selector and not self, + // because super class (_RxDelegateProxy) returns all methods delegate proxy + // can respond to. + // Because of https://github.com/ReactiveX/RxSwift/issues/907 , and possibly + // some other reasons, subclasses could overrride `responds(to:)`, but it shouldn't matter + // for this case. + if !super.responds(to: selector) { + rxFatalError("This class doesn't respond to selector \(selector)") + } + } + // proxy - - open override func interceptedSelector(_ selector: Selector, withArguments arguments: [Any]) { - subjectsForSelector[selector]?.on(.next(arguments as [AnyObject])) + + open override func _sentMessage(_ selector: Selector, withArguments arguments: [Any]) { + sentMessageForSelector[selector]?.on(.next(arguments)) } - - /** - Returns tag used to identify associated object. - - - returns: Associated object tag. - */ - public class func delegateAssociatedObjectTag() -> UnsafeRawPointer { + + open override func _methodInvoked(_ selector: Selector, withArguments arguments: [Any]) { + methodInvokedForSelector[selector]?.on(.next(arguments)) + } + + /// Returns tag used to identify associated object. + /// + /// - returns: Associated object tag. + open class func delegateAssociatedObjectTag() -> UnsafeRawPointer { return _pointer(&delegateAssociatedTag) } - /** - Initializes new instance of delegate proxy. - - - returns: Initialized instance of `self`. - */ - public class func createProxyForObject(_ object: AnyObject) -> AnyObject { + /// Initializes new instance of delegate proxy. + /// + /// - returns: Initialized instance of `self`. + open class func createProxyForObject(_ object: AnyObject) -> AnyObject { return self.init(parentObject: object) } - /** - Returns assigned proxy for object. - - - parameter object: Object that can have assigned delegate proxy. - - returns: Assigned delegate proxy or `nil` if no delegate proxy is assigned. - */ - public class func assignedProxyFor(_ object: AnyObject) -> AnyObject? { + /// Returns assigned proxy for object. + /// + /// - parameter object: Object that can have assigned delegate proxy. + /// - returns: Assigned delegate proxy or `nil` if no delegate proxy is assigned. + open class func assignedProxyFor(_ object: AnyObject) -> AnyObject? { let maybeDelegate = objc_getAssociatedObject(object, self.delegateAssociatedObjectTag()) return castOptionalOrFatalError(maybeDelegate.map { $0 as AnyObject }) } - /** - Assigns proxy to object. - - - parameter object: Object that can have assigned delegate proxy. - - parameter proxy: Delegate proxy object to assign to `object`. - */ - public class func assignProxy(_ proxy: AnyObject, toObject object: AnyObject) { + /// Assigns proxy to object. + /// + /// - parameter object: Object that can have assigned delegate proxy. + /// - parameter proxy: Delegate proxy object to assign to `object`. + open class func assignProxy(_ proxy: AnyObject, toObject object: AnyObject) { precondition(proxy.isKind(of: self.classForCoder())) objc_setAssociatedObject(object, self.delegateAssociatedObjectTag(), proxy, .OBJC_ASSOCIATION_RETAIN) } - /** - Sets reference of normal delegate that receives all forwarded messages - through `self`. - - - parameter forwardToDelegate: Reference of delegate that receives all messages through `self`. - - parameter retainDelegate: Should `self` retain `forwardToDelegate`. - */ - public func setForwardToDelegate(_ delegate: AnyObject?, retainDelegate: Bool) { + /// Sets reference of normal delegate that receives all forwarded messages + /// through `self`. + /// + /// - parameter forwardToDelegate: Reference of delegate that receives all messages through `self`. + /// - parameter retainDelegate: Should `self` retain `forwardToDelegate`. + open func setForwardToDelegate(_ delegate: AnyObject?, retainDelegate: Bool) { self._setForward(toDelegate: delegate, retainDelegate: retainDelegate) } - /** - Returns reference of normal delegate that receives all forwarded messages - through `self`. - - - returns: Value of reference if set or nil. - */ - public func forwardToDelegate() -> AnyObject? { + /// Returns reference of normal delegate that receives all forwarded messages + /// through `self`. + /// + /// - returns: Value of reference if set or nil. + open func forwardToDelegate() -> AnyObject? { return self._forwardToDelegate } deinit { - for v in subjectsForSelector.values { + for v in sentMessageForSelector.values { + v.on(.completed) + } + for v in methodInvokedForSelector.values { v.on(.completed) } #if TRACE_RESOURCES - OSAtomicDecrement32(&resourceCount) + _ = Resources.decrementTotal() #endif } @@ -189,3 +253,6 @@ open class DelegateProxy : _RXDelegateProxy { return p } } + +#endif + diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/DelegateProxyType.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/DelegateProxyType.swift index 7d48dcf8..57adbcd3 100644 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/DelegateProxyType.swift +++ b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/DelegateProxyType.swift @@ -6,6 +6,8 @@ // Copyright © 2015 Krunoslav Zaher. All rights reserved. // +#if !os(Linux) + import Foundation #if !RX_NO_MODULE import RxSwift @@ -84,94 +86,73 @@ and override in UITableView */ public protocol DelegateProxyType : AnyObject { - /** - Creates new proxy for target object. - */ + /// Creates new proxy for target object. static func createProxyForObject(_ object: AnyObject) -> AnyObject - - /** - Returns assigned proxy for object. - - - parameter object: Object that can have assigned delegate proxy. - - returns: Assigned delegate proxy or `nil` if no delegate proxy is assigned. - */ + + /// Returns assigned proxy for object. + /// + /// - parameter object: Object that can have assigned delegate proxy. + /// - returns: Assigned delegate proxy or `nil` if no delegate proxy is assigned. static func assignedProxyFor(_ object: AnyObject) -> AnyObject? - /** - Assigns proxy to object. - - - parameter object: Object that can have assigned delegate proxy. - - parameter proxy: Delegate proxy object to assign to `object`. - */ + /// Assigns proxy to object. + /// + /// - parameter object: Object that can have assigned delegate proxy. + /// - parameter proxy: Delegate proxy object to assign to `object`. static func assignProxy(_ proxy: AnyObject, toObject object: AnyObject) - /** - Returns designated delegate property for object. - - Objects can have multiple delegate properties. - - Each delegate property needs to have it's own type implementing `DelegateProxyType`. - - - parameter object: Object that has delegate property. - - returns: Value of delegate property. - */ + /// Returns designated delegate property for object. + /// + /// Objects can have multiple delegate properties. + /// + /// Each delegate property needs to have it's own type implementing `DelegateProxyType`. + /// + /// - parameter object: Object that has delegate property. + /// - returns: Value of delegate property. static func currentDelegateFor(_ object: AnyObject) -> AnyObject? - /** - Sets designated delegate property for object. - - Objects can have multiple delegate properties. - - Each delegate property needs to have it's own type implementing `DelegateProxyType`. - - - parameter toObject: Object that has delegate property. - - parameter delegate: Delegate value. - */ + /// Sets designated delegate property for object. + /// + /// Objects can have multiple delegate properties. + /// + /// Each delegate property needs to have it's own type implementing `DelegateProxyType`. + /// + /// - parameter toObject: Object that has delegate property. + /// - parameter delegate: Delegate value. static func setCurrentDelegate(_ delegate: AnyObject?, toObject object: AnyObject) - /** - Returns reference of normal delegate that receives all forwarded messages - through `self`. - - - returns: Value of reference if set or nil. - */ + /// Returns reference of normal delegate that receives all forwarded messages + /// through `self`. + /// + /// - returns: Value of reference if set or nil. func forwardToDelegate() -> AnyObject? - /** - Sets reference of normal delegate that receives all forwarded messages - through `self`. - - - parameter forwardToDelegate: Reference of delegate that receives all messages through `self`. - - parameter retainDelegate: Should `self` retain `forwardToDelegate`. - */ + /// Sets reference of normal delegate that receives all forwarded messages + /// through `self`. + /// + /// - parameter forwardToDelegate: Reference of delegate that receives all messages through `self`. + /// - parameter retainDelegate: Should `self` retain `forwardToDelegate`. func setForwardToDelegate(_ forwardToDelegate: AnyObject?, retainDelegate: Bool) } -@available(*, deprecated:2.5, renamed:"DelegateProxyType.proxyForObject", message:"You can just use normal static protocol extension. E.g. `RxScrollViewDelegateProxy.proxyForObject`") -public func proxyForObject(_ type: P.Type, _ object: AnyObject) -> P { - return P.proxyForObject(object) -} - extension DelegateProxyType { - /** - Returns existing proxy for object or installs new instance of delegate proxy. - - - parameter object: Target object on which to install delegate proxy. - - returns: Installed instance of delegate proxy. - - - extension Reactive where Base: UISearchBar { - - public var delegate: DelegateProxy { - return RxSearchBarDelegateProxy.proxyForObject(base) - } - - public var text: ControlProperty { - let source: Observable = self.delegate.observe(#selector(UISearchBarDelegate.searchBar(_:textDidChange:))) - ... - } - } - */ + /// Returns existing proxy for object or installs new instance of delegate proxy. + /// + /// - parameter object: Target object on which to install delegate proxy. + /// - returns: Installed instance of delegate proxy. + /// + /// + /// extension Reactive where Base: UISearchBar { + /// + /// public var delegate: DelegateProxy { + /// return RxSearchBarDelegateProxy.proxyForObject(base) + /// } + /// + /// public var text: ControlProperty { + /// let source: Observable = self.delegate.observe(#selector(UISearchBarDelegate.searchBar(_:textDidChange:))) + /// ... + /// } + /// } public static func proxyForObject(_ object: AnyObject) -> Self { MainScheduler.ensureExecutingOnScheduler() @@ -200,15 +181,13 @@ extension DelegateProxyType { return proxy } - /** - Sets forward delegate for `DelegateProxyType` associated with a specific object and return disposable that can be used to unset the forward to delegate. - Using this method will also make sure that potential original object cached selectors are cleared and will report any accidental forward delegate mutations. - - - parameter forwardDelegate: Delegate object to set. - - parameter retainDelegate: Retain `forwardDelegate` while it's being set. - - parameter onProxyForObject: Object that has `delegate` property. - - returns: Disposable object that can be used to clear forward delegate. - */ + /// Sets forward delegate for `DelegateProxyType` associated with a specific object and return disposable that can be used to unset the forward to delegate. + /// Using this method will also make sure that potential original object cached selectors are cleared and will report any accidental forward delegate mutations. + /// + /// - parameter forwardDelegate: Delegate object to set. + /// - parameter retainDelegate: Retain `forwardDelegate` while it's being set. + /// - parameter onProxyForObject: Object that has `delegate` property. + /// - returns: Disposable object that can be used to clear forward delegate. public static func installForwardDelegate(_ forwardDelegate: AnyObject, retainDelegate: Bool, onProxyForObject object: AnyObject) -> Disposable { weak var weakForwardDelegate: AnyObject? = forwardDelegate @@ -254,6 +233,7 @@ extension ObservableType { } // source can never end, otherwise it would release the subscriber, and deallocate the data source .concat(Observable.never()) + .takeUntil((object as! NSObject).rx.deallocated) .subscribe { [weak object] (event: Event) in MainScheduler.ensureExecutingOnScheduler() @@ -277,3 +257,5 @@ extension ObservableType { return Disposables.create(subscription, disposable) } } + +#endif diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/NSLayoutConstraint+Rx.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/NSLayoutConstraint+Rx.swift index 94fda3e7..96db728e 100644 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/NSLayoutConstraint+Rx.swift +++ b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/NSLayoutConstraint+Rx.swift @@ -1,14 +1,16 @@ // // NSLayoutConstraint+Rx.swift -// Rx +// RxCocoa // // Created by Krunoslav Zaher on 12/6/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. // +#if !os(Linux) + import Foundation -#if os(OSX) +#if os(macOS) import Cocoa #else import UIKit @@ -18,26 +20,24 @@ import UIKit import RxSwift #endif -#if os(iOS) || os(OSX) || os(tvOS) +#if os(iOS) || os(macOS) || os(tvOS) extension Reactive where Base: NSLayoutConstraint { - /** - Bindable sink for `constant` property. - */ - public var constant: AnyObserver { + /// Bindable sink for `constant` property. + public var constant: UIBindingObserver { return UIBindingObserver(UIElement: self.base) { constraint, constant in constraint.constant = constant - }.asObserver() + } } - /** - Bindable sink for `active` property. - */ + /// Bindable sink for `active` property. @available(iOS 8, OSX 10.10, *) - public var active: AnyObserver { + public var active: UIBindingObserver { return UIBindingObserver(UIElement: self.base) { constraint, value in constraint.isActive = value - }.asObserver() + } } } #endif + +#endif diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/Observable+Bind.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/Observable+Bind.swift index d43594e1..e41a40aa 100644 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/Observable+Bind.swift +++ b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/Observable+Bind.swift @@ -1,6 +1,6 @@ // // Observable+Bind.swift -// Rx +// RxCocoa // // Created by Krunoslav Zaher on 8/29/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -22,11 +22,23 @@ extension ObservableType { - parameter observer: Observer that receives events. - returns: Disposable object that can be used to unsubscribe the observer. */ - // @warn_unused_result(message: "http://git.io/rxs.ud") public func bindTo(_ observer: O) -> Disposable where O.E == E { return self.subscribe(observer) } + /** + Creates new subscription and sends elements to observer. + + In this form it's equivalent to `subscribe` method, but it communicates intent better, and enables + writing more consistent binding code. + + - parameter observer: Observer that receives events. + - returns: Disposable object that can be used to unsubscribe the observer. + */ + public func bindTo(_ observer: O) -> Disposable where O.E == E? { + return self.map { $0 }.subscribe(observer) + } + /** Creates new subscription and sends elements to variable. @@ -36,7 +48,6 @@ extension ObservableType { - parameter variable: Target variable for sequence elements. - returns: Disposable object that can be used to unsubscribe the observer. */ - // @warn_unused_result(message: "http://git.io/rxs.ud") public func bindTo(_ variable: Variable) -> Disposable { return subscribe { e in switch e { @@ -54,6 +65,19 @@ extension ObservableType { } } } + + /** + Creates new subscription and sends elements to variable. + + In case error occurs in debug mode, `fatalError` will be raised. + In case error occurs in release mode, `error` will be logged. + + - parameter variable: Target variable for sequence elements. + - returns: Disposable object that can be used to unsubscribe the observer. + */ + public func bindTo(_ variable: Variable) -> Disposable { + return self.map { $0 as E? }.bindTo(variable) + } /** Subscribes to observable sequence using custom binder function. @@ -61,7 +85,6 @@ extension ObservableType { - parameter binder: Function used to bind elements from `self`. - returns: Object representing subscription. */ - // @warn_unused_result(message: "http://git.io/rxs.ud") public func bindTo(_ binder: (Self) -> R) -> R { return binder(self) } @@ -78,7 +101,6 @@ extension ObservableType { - parameter curriedArgument: Final argument passed to `binder` to finish binding process. - returns: Object representing subscription. */ - // @warn_unused_result(message: "http://git.io/rxs.ud") public func bindTo(_ binder: (Self) -> (R1) -> R2, curriedArgument: R1) -> R2 { return binder(self)(curriedArgument) } @@ -93,7 +115,6 @@ extension ObservableType { - parameter onNext: Action to invoke for each element in the observable sequence. - returns: Subscription object used to unsubscribe from the observable sequence. */ - // @warn_unused_result(message: "http://git.io/rxs.ud") public func bindNext(_ onNext: @escaping (E) -> Void) -> Disposable { return subscribe(onNext: onNext, onError: { error in let error = "Binding error: \(error)" diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/Observables/Implementations/DeallocObservable.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/Observables/Implementations/DeallocObservable.swift deleted file mode 100644 index e51ae3a2..00000000 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/Observables/Implementations/DeallocObservable.swift +++ /dev/null @@ -1,24 +0,0 @@ -// -// DeallocObservable.swift -// Rx -// -// Created by Krunoslav Zaher on 12/19/15. -// Copyright © 2015 Krunoslav Zaher. All rights reserved. -// - -import Foundation -#if !RX_NO_MODULE -import RxSwift -#endif - -class DeallocObservable { - let _subject = ReplaySubject.create(bufferSize:1) - - init() { - } - - deinit { - _subject.on(.next(())) - _subject.on(.completed) - } -} diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/Observables/Implementations/KVOObservable.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/Observables/Implementations/KVOObservable.swift deleted file mode 100644 index 0d4b305d..00000000 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/Observables/Implementations/KVOObservable.swift +++ /dev/null @@ -1,144 +0,0 @@ -// -// KVOObservable.swift -// RxCocoa -// -// Created by Krunoslav Zaher on 7/5/15. -// Copyright © 2015 Krunoslav Zaher. All rights reserved. -// - -import Foundation -#if !RX_NO_MODULE -import RxSwift -#endif - -class KVOObservable - : ObservableType - , KVOObservableProtocol { - typealias E = Element? - - unowned var target: AnyObject - var strongTarget: AnyObject? - - var keyPath: String - var options: NSKeyValueObservingOptions - var retainTarget: Bool - - init(object: AnyObject, keyPath: String, options: NSKeyValueObservingOptions, retainTarget: Bool) { - self.target = object - self.keyPath = keyPath - self.options = options - self.retainTarget = retainTarget - if retainTarget { - self.strongTarget = object - } - } - - func subscribe(_ observer: O) -> Disposable where O.E == Element? { - let observer = KVOObserver(parent: self) { (value) in - if value as? NSNull != nil { - observer.on(.next(nil)) - return - } - observer.on(.next(value as? Element)) - } - - return Disposables.create(with: observer.dispose) - } - -} - -#if !DISABLE_SWIZZLING - -func observeWeaklyKeyPathFor(_ target: NSObject, keyPath: String, options: NSKeyValueObservingOptions) -> Observable { - let components = keyPath.components(separatedBy: ".").filter { $0 != "self" } - - let observable = observeWeaklyKeyPathFor(target, keyPathSections: components, options: options) - .finishWithNilWhenDealloc(target) - - if !options.intersection(.initial).isEmpty { - return observable - } - else { - return observable - .skip(1) - } -} - -// This should work correctly -// Identifiers can't contain `,`, so the only place where `,` can appear -// is as a delimiter. -// This means there is `W` as element in an array of property attributes. -func isWeakProperty(_ properyRuntimeInfo: String) -> Bool { - return properyRuntimeInfo.range(of: ",W,") != nil -} - -extension ObservableType where E == AnyObject? { - func finishWithNilWhenDealloc(_ target: NSObject) - -> Observable { - let deallocating = target.rx.deallocating - - return deallocating - .map { _ in - return Observable.just(nil) - } - .startWith(self.asObservable()) - .switchLatest() - } -} - -func observeWeaklyKeyPathFor( - _ target: NSObject, - keyPathSections: [String], - options: NSKeyValueObservingOptions - ) -> Observable { - - weak var weakTarget: AnyObject? = target - - let propertyName = keyPathSections[0] - let remainingPaths = Array(keyPathSections[1.. - - // KVO recursion for value changes - return propertyObservable - .flatMapLatest { (nextTarget: AnyObject?) -> Observable in - if nextTarget == nil { - return Observable.just(nil) - } - let nextObject = nextTarget! as? NSObject - - let strongTarget: AnyObject? = weakTarget - - if nextObject == nil { - return Observable.error(RxCocoaError.invalidObjectOnKeyPath(object: nextTarget!, sourceObject: strongTarget ?? NSNull(), propertyName: propertyName)) - } - - // if target is alive, then send change - // if it's deallocated, don't send anything - if strongTarget == nil { - return Observable.empty() - } - - let nextElementsObservable = keyPathSections.count == 1 - ? Observable.just(nextTarget) - : observeWeaklyKeyPathFor(nextObject!, keyPathSections: remainingPaths, options: options) - - if isWeak { - return nextElementsObservable - .finishWithNilWhenDealloc(nextObject!) - } - else { - return nextElementsObservable - } - } -} -#endif - diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/Observables/Implementations/KVOObserver.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/Observables/Implementations/KVOObserver.swift deleted file mode 100644 index ee3f3bc7..00000000 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/Observables/Implementations/KVOObserver.swift +++ /dev/null @@ -1,46 +0,0 @@ -// -// KVOObserver.swift -// RxCocoa -// -// Created by Krunoslav Zaher on 7/12/15. -// Copyright © 2015 Krunoslav Zaher. All rights reserved. -// - -import Foundation -#if !RX_NO_MODULE -import RxSwift -#endif - -protocol KVOObservableProtocol { - var target: AnyObject { get } - var keyPath: String { get } - var retainTarget: Bool { get } - var options: NSKeyValueObservingOptions { get } -} - -class KVOObserver : _RXKVOObserver - , Disposable { - typealias Callback = (Any?) -> Void - - var retainSelf: KVOObserver? = nil - - init(parent: KVOObservableProtocol, callback: @escaping Callback) { - #if TRACE_RESOURCES - OSAtomicIncrement32(&resourceCount) - #endif - - super.init(target: parent.target, retainTarget: parent.retainTarget, keyPath: parent.keyPath, options: parent.options, callback: callback) - self.retainSelf = self - } - - override func dispose() { - super.dispose() - self.retainSelf = nil - } - - deinit { - #if TRACE_RESOURCES - OSAtomicDecrement32(&resourceCount) - #endif - } -} diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/Observables/Implementations/MessageSentObserver.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/Observables/Implementations/MessageSentObserver.swift deleted file mode 100644 index 325bf610..00000000 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/Observables/Implementations/MessageSentObserver.swift +++ /dev/null @@ -1,74 +0,0 @@ -// -// MessageSentObserver.swift -// RxCocoa -// -// Created by Krunoslav Zaher on 7/12/15. -// Copyright © 2015 Krunoslav Zaher. All rights reserved. -// - -import Foundation -#if !RX_NO_MODULE - import RxSwift -#endif - -#if !DISABLE_SWIZZLING - - class DeallocatingObservable - : ObservableConvertibleType - , RXMessageSentObserver { - typealias E = () - - private let _subject = ReplaySubject<()>.create(bufferSize: 1) - - @objc var targetImplementation: IMP = RX_default_target_implementation() - - var isActive: Bool { - return targetImplementation != RX_default_target_implementation() - } - - init() { - } - - @objc func messageSent(withParameters parameters: [Any]) -> Void { - _subject.on(.next()) - } - - func asObservable() -> Observable<()> { - return _subject - } - - deinit { - _subject.on(.completed) - } - } - - class MessageSentObservable - : ObservableConvertibleType - , RXMessageSentObserver { - typealias E = [AnyObject] - - private let _subject = PublishSubject<[AnyObject]>() - - @objc var targetImplementation: IMP = RX_default_target_implementation() - - var isActive: Bool { - return targetImplementation != RX_default_target_implementation() - } - - init() { - } - - @objc func messageSent(withParameters parameters: [Any]) -> Void { - _subject.on(.next(parameters as [AnyObject])) - } - - func asObservable() -> Observable<[AnyObject]> { - return _subject - } - - deinit { - _subject.on(.completed) - } - } - -#endif diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/Observables/NSObject+Rx.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/Observables/NSObject+Rx.swift deleted file mode 100644 index f50dfe68..00000000 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/Observables/NSObject+Rx.swift +++ /dev/null @@ -1,239 +0,0 @@ -// -// NSObject+Rx.swift -// RxCocoa -// -// Created by Krunoslav Zaher on 2/21/15. -// Copyright © 2015 Krunoslav Zaher. All rights reserved. -// - -import Foundation -#if !RX_NO_MODULE -import RxSwift -#endif - -#if !DISABLE_SWIZZLING -var deallocatingSubjectTriggerContext: UInt8 = 0 -var deallocatingSubjectContext: UInt8 = 0 -#endif -var deallocatedSubjectTriggerContext: UInt8 = 0 -var deallocatedSubjectContext: UInt8 = 0 - -/** -KVO is a tricky mechanism. - -When observing child in a ownership hierarchy, usually retaining observing target is wanted behavior. -When observing parent in a ownership hierarchy, usually retaining target isn't wanter behavior. - -KVO with weak references is especially tricky. For it to work, some kind of swizzling is required. -That can be done by - * replacing object class dynamically (like KVO does) - * by swizzling `dealloc` method on all instances for a class. - * some third method ... - -Both approaches can fail in certain scenarios: - * problems arise when swizzlers return original object class (like KVO does when nobody is observing) - * Problems can arise because replacing dealloc method isn't atomic operation (get implementation, - set implementation). - -Second approach is chosen. It can fail in case there are multiple libraries dynamically trying -to replace dealloc method. In case that isn't the case, it should be ok. -*/ -extension Reactive where Base: NSObject { - - - /** - Observes values on `keyPath` starting from `self` with `options` and retains `self` if `retainSelf` is set. - - `observe` is just a simple and performant wrapper around KVO mechanism. - - * it can be used to observe paths starting from `self` or from ancestors in ownership graph (`retainSelf = false`) - * it can be used to observe paths starting from descendants in ownership graph (`retainSelf = true`) - * the paths have to consist only of `strong` properties, otherwise you are risking crashing the system by not unregistering KVO observer before dealloc. - - If support for weak properties is needed or observing arbitrary or unknown relationships in the - ownership tree, `observeWeakly` is the preferred option. - - - parameter keyPath: Key path of property names to observe. - - parameter options: KVO mechanism notification options. - - parameter retainSelf: Retains self during observation if set `true`. - - returns: Observable sequence of objects on `keyPath`. - */ - // @warn_unused_result(message:"http://git.io/rxs.uo") - public func observe(_ type: E.Type, _ keyPath: String, options: NSKeyValueObservingOptions = [.new, .initial], retainSelf: Bool = true) -> Observable { - return KVOObservable(object: base, keyPath: keyPath, options: options, retainTarget: retainSelf).asObservable() - } -} - -#if !DISABLE_SWIZZLING -// KVO -extension Reactive where Base: NSObject { - /** - Observes values on `keyPath` starting from `self` with `options` and doesn't retain `self`. - - It can be used in all cases where `observe` can be used and additionally - - * because it won't retain observed target, it can be used to observe arbitrary object graph whose ownership relation is unknown - * it can be used to observe `weak` properties - - **Since it needs to intercept object deallocation process it needs to perform swizzling of `dealloc` method on observed object.** - - - parameter keyPath: Key path of property names to observe. - - parameter options: KVO mechanism notification options. - - returns: Observable sequence of objects on `keyPath`. - */ - // @warn_unused_result(message:"http://git.io/rxs.uo") - public func observeWeakly(_ type: E.Type, _ keyPath: String, options: NSKeyValueObservingOptions = [.new, .initial]) -> Observable { - return observeWeaklyKeyPathFor(base, keyPath: keyPath, options: options) - .map { n in - return n as? E - } - } -} -#endif - -// Dealloc -extension Reactive where Base: AnyObject { - - /** - Observable sequence of object deallocated events. - - After object is deallocated one `()` element will be produced and sequence will immediately complete. - - - returns: Observable sequence of object deallocated events. - */ - public var deallocated: Observable { - return synchronized { - if let deallocObservable = objc_getAssociatedObject(base, &deallocatedSubjectContext) as? DeallocObservable { - return deallocObservable._subject - } - - let deallocObservable = DeallocObservable() - - objc_setAssociatedObject(base, &deallocatedSubjectContext, deallocObservable, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) - return deallocObservable._subject - } - } - -#if !DISABLE_SWIZZLING - - /** - Observable sequence of message arguments that completes when object is deallocated. - - In case an error occurs sequence will fail with `RxCocoaObjCRuntimeError`. - - In case some argument is `nil`, instance of `NSNull()` will be sent. - - - returns: Observable sequence of object deallocating events. - */ - public func sentMessage(_ selector: Selector) -> Observable<[AnyObject]> { - return synchronized { - // in case of dealloc selector replay subject behavior needs to be used - if selector == deallocSelector { - return deallocating.map { _ in [] } - } - - let rxSelector = RX_selector(selector) - let selectorReference = RX_reference_from_selector(rxSelector) - - let subject: MessageSentObservable - if let existingSubject = objc_getAssociatedObject(base, selectorReference) as? MessageSentObservable { - subject = existingSubject - } - else { - subject = MessageSentObservable() - objc_setAssociatedObject( - base, - selectorReference, - subject, - .OBJC_ASSOCIATION_RETAIN_NONATOMIC - ) - } - - if subject.isActive { - return subject.asObservable().map { $0 } - } - - var error: NSError? - guard let targetImplementation = RX_ensure_observing(base, selector, &error) else { - return Observable.error(error?.rxCocoaErrorForTarget(base) ?? RxCocoaError.unknown) - } - - subject.targetImplementation = targetImplementation - return subject.asObservable().map { $0 } - } - } - - /** - Observable sequence of object deallocating events. - - When `dealloc` message is sent to `self` one `()` element will be produced and after object is deallocated sequence - will immediately complete. - - In case an error occurs sequence will fail with `RxCocoaObjCRuntimeError`. - - - returns: Observable sequence of object deallocating events. - */ - public var deallocating: Observable<()> { - return synchronized { - - let subject: DeallocatingObservable - if let existingSubject = objc_getAssociatedObject(base, rxDeallocatingSelectorReference) as? DeallocatingObservable { - subject = existingSubject - } - else { - subject = DeallocatingObservable() - objc_setAssociatedObject( - base, - rxDeallocatingSelectorReference, - subject, - .OBJC_ASSOCIATION_RETAIN_NONATOMIC - ) - } - - if subject.isActive { - return subject.asObservable() - } - - var error: NSError? - let targetImplementation = RX_ensure_observing(base, deallocSelector, &error) - if targetImplementation == nil { - return Observable.error(error?.rxCocoaErrorForTarget(base) ?? RxCocoaError.unknown) - } - - subject.targetImplementation = targetImplementation! - return subject.asObservable() - } - } -#endif -} - -let deallocSelector = NSSelectorFromString("dealloc") -let rxDeallocatingSelector = RX_selector(deallocSelector) -let rxDeallocatingSelectorReference = RX_reference_from_selector(rxDeallocatingSelector) - -extension Reactive where Base: AnyObject { - func synchronized( _ action: () -> T) -> T { - objc_sync_enter(self.base) - let result = action() - objc_sync_exit(self.base) - return result - } -} - -extension Reactive where Base: AnyObject { - /** - Helper to make sure that `Observable` returned from `createCachedObservable` is only created once. - This is important because there is only one `target` and `action` properties on `NSControl` or `UIBarButtonItem`. - */ - func lazyInstanceObservable(_ key: UnsafeRawPointer, createCachedObservable: () -> T) -> T { - if let value = objc_getAssociatedObject(base, key) { - return value as! T - } - - let observable = createCachedObservable() - - objc_setAssociatedObject(base, key, observable, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) - - return observable - } -} diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/Reactive.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/Reactive.swift deleted file mode 100644 index ea65d7b1..00000000 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/Reactive.swift +++ /dev/null @@ -1,58 +0,0 @@ -// -// Reactive.swift -// Rx -// -// Created by Yury Korolev on 5/2/16. -// Copyright © 2016 Krunoslav Zaher. All rights reserved. -// - -/** - Use `Reactive` proxy as customization point for constrained protocol extensions. - - General pattern would be: - - // 1. Extend Reactive protocol with constrain on Self - // Read as: Reactive Extension where Self is a SomeType - extension Reactive where Self: SomeType { - // 2. Put any specific reactive extension for SomeType here - } - - With this approach we can have more specialized methods and properties using - `Self` and not just specialized on common base type. - - */ - -public struct Reactive { - /** - Base object to extend. - */ - public let base: Base - - /** - Creates extensions with base object. - - - parameter base: Base object. - */ - public init(_ base: Base) { - self.base = base - } -} - -/** - A type that has reactive extensions. - */ -public protocol ReactiveCompatible { - associatedtype CompatibleType - var rx: Reactive { get } -} - -public extension ReactiveCompatible { - public var rx: Reactive { - return Reactive(self) - } -} - -/** - Extend NSObject with `rx` proxy. -*/ -extension NSObject: ReactiveCompatible { } diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/RxCocoa.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/RxCocoa.swift deleted file mode 100644 index 62ee7ad8..00000000 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/RxCocoa.swift +++ /dev/null @@ -1,345 +0,0 @@ -// -// RxCocoa.swift -// RxCocoa -// -// Created by Krunoslav Zaher on 2/21/15. -// Copyright © 2015 Krunoslav Zaher. All rights reserved. -// - -import Foundation -#if !RX_NO_MODULE -import RxSwift -#endif -#if os(iOS) - import UIKit -#endif - -/** -RxCocoa errors. -*/ -public enum RxCocoaError - : Swift.Error - , CustomDebugStringConvertible { - /** - Unknown error has occurred. - */ - case unknown - /** - Invalid operation was attempted. - */ - case invalidOperation(object: AnyObject) - /** - Items are not yet bound to user interface but have been requested. - */ - case itemsNotYetBound(object: AnyObject) - /** - Invalid KVO Path. - */ - case invalidPropertyName(object: AnyObject, propertyName: String) - /** - Invalid object on key path. - */ - case invalidObjectOnKeyPath(object: AnyObject, sourceObject: AnyObject, propertyName: String) - /** - Error during swizzling. - */ - case errorDuringSwizzling - /* - Casting error. - */ - case castingError(object: AnyObject, targetType: Any.Type) -} - -#if !DISABLE_SWIZZLING -/** -RxCocoa ObjC runtime interception mechanism. - */ -public enum RxCocoaInterceptionMechanism { - /** - Unknown message interception mechanism. - */ - case unknown - /** - Key value observing interception mechanism. - */ - case kvo -} - -/** -RxCocoa ObjC runtime modification errors. - */ -public enum RxCocoaObjCRuntimeError - : Swift.Error - , CustomDebugStringConvertible { - /** - Unknown error has occurred. - */ - case unknown(target: AnyObject) - - /** - If the object is reporting a different class then it's real class, that means that there is probably - already some interception mechanism in place or something weird is happening. - - The most common case when this would happen is when using a combination of KVO (`observe`) and `sentMessage`. - - This error is easily resolved by just using `sentMessage` observing before `observe`. - - The reason why the other way around could create issues is because KVO will unregister it's interceptor - class and restore original class. Unfortunately that will happen no matter was there another interceptor - subclass registered in hierarchy or not. - - Failure scenario: - * KVO sets class to be `__KVO__OriginalClass` (subclass of `OriginalClass`) - * `sentMessage` sets object class to be `_RX_namespace___KVO__OriginalClass` (subclass of `__KVO__OriginalClass`) - * then unobserving with KVO will restore class to be `OriginalClass` -> failure point (possibly a bug in KVO) - - The reason why changing order of observing works is because any interception method on unregistration - should return object's original real class (if that doesn't happen then it's really easy to argue that's a bug - in that interception mechanism). - - This library won't remove registered interceptor even if there aren't any observers left because - it's highly unlikely it would have any benefit in real world use cases, and it's even more - dangerous. - */ - case objectMessagesAlreadyBeingIntercepted(target: AnyObject, interceptionMechanism: RxCocoaInterceptionMechanism) - - /** - Trying to observe messages for selector that isn't implemented. - */ - case selectorNotImplemented(target: AnyObject) - - /** - Core Foundation classes are usually toll free bridged. Those classes crash the program in case - `object_setClass` is performed on them. - - There is a possibility to just swizzle methods on original object, but since those won't be usual use - cases for this library, then an error will just be reported for now. - */ - case cantInterceptCoreFoundationTollFreeBridgedObjects(target: AnyObject) - - /** - Two libraries have simultaneously tried to modify ObjC runtime and that was detected. This can only - happen in scenarios where multiple interception libraries are used. - - To synchronize other libraries intercepting messages for an object, use `synchronized` on target object and - it's meta-class. - */ - case threadingCollisionWithOtherInterceptionMechanism(target: AnyObject) - - /** - For some reason saving original method implementation under RX namespace failed. - */ - case savingOriginalForwardingMethodFailed(target: AnyObject) - - /** - Intercepting a sent message by replacing a method implementation with `_objc_msgForward` failed for some reason. - */ - case replacingMethodWithForwardingImplementation(target: AnyObject) - - /** - Attempt to intercept one of the performance sensitive methods: - * class - * respondsToSelector: - * methodSignatureForSelector: - * forwardingTargetForSelector: - */ - case observingPerformanceSensitiveMessages(target: AnyObject) - - /** - Message implementation has unsupported return type (for example large struct). The reason why this is a error - is because in some cases intercepting sent messages requires replacing implementation with `_objc_msgForward_stret` - instead of `_objc_msgForward`. - - The unsupported cases should be fairly uncommon. - */ - case observingMessagesWithUnsupportedReturnType(target: AnyObject) -} - -#endif - -// MARK: Debug descriptions - -public extension RxCocoaError { - /** - A textual representation of `self`, suitable for debugging. - */ - public var debugDescription: String { - switch self { - case .unknown: - return "Unknown error occurred." - case let .invalidOperation(object): - return "Invalid operation was attempted on `\(object)`." - case let .itemsNotYetBound(object): - return "Data source is set, but items are not yet bound to user interface for `\(object)`." - case let .invalidPropertyName(object, propertyName): - return "Object `\(object)` dosn't have a property named `\(propertyName)`." - case let .invalidObjectOnKeyPath(object, sourceObject, propertyName): - return "Unobservable object `\(object)` was observed as `\(propertyName)` of `\(sourceObject)`." - case .errorDuringSwizzling: - return "Error during swizzling." - case .castingError(let object, let targetType): - return "Error casting `\(object)` to `\(targetType)`" - } - } -} - -#if !DISABLE_SWIZZLING - -public extension RxCocoaObjCRuntimeError { - /** - A textual representation of `self`, suitable for debugging. - */ - public var debugDescription: String { - switch self { - case let .unknown(target): - return "Unknown error occurred.\nTarget: `\(target)`" - case let .objectMessagesAlreadyBeingIntercepted(target, interceptionMechanism): - let interceptionMechanismDescription = interceptionMechanism == .kvo ? "KVO" : "other interception mechanism" - return "Collision between RxCocoa interception mechanism and \(interceptionMechanismDescription)." - + " To resolve this conflict please use this interception mechanism first.\nTarget: \(target)" - case let .selectorNotImplemented(target): - return "Trying to observe messages for selector that isn't implemented.\nTarget: \(target)" - case let .cantInterceptCoreFoundationTollFreeBridgedObjects(target): - return "Interception of messages sent to Core Foundation isn't supported.\nTarget: \(target)" - case let .threadingCollisionWithOtherInterceptionMechanism(target): - return "Detected a conflict while modifying ObjC runtime.\nTarget: \(target)" - case let .savingOriginalForwardingMethodFailed(target): - return "Saving original method implementation failed.\nTarget: \(target)" - case let .replacingMethodWithForwardingImplementation(target): - return "Intercepting a sent message by replacing a method implementation with `_objc_msgForward` failed for some reason.\nTarget: \(target)" - case let .observingPerformanceSensitiveMessages(target): - return "Attempt to intercept one of the performance sensitive methods. \nTarget: \(target)" - case let .observingMessagesWithUnsupportedReturnType(target): - return "Attempt to intercept a method with unsupported return type. \nTarget: \(target)" - } - } -} - -#endif - -// MARK: Error binding policies - -func bindingErrorToInterface(_ error: Swift.Error) { - let error = "Binding error to UI: \(error)" -#if DEBUG - rxFatalError(error) -#else - print(error) -#endif -} - -// MARK: Abstract methods - -func rxAbstractMethodWithMessage(_ message: String) -> Swift.Never { - rxFatalError(message) -} - -func rxAbstractMethod() -> Swift.Never { - rxFatalError("Abstract method") -} - -// MARK: casts or fatal error - -// workaround for Swift compiler bug, cheers compiler team :) -func castOptionalOrFatalError(_ value: AnyObject?) -> T? { - if value == nil { - return nil - } - let v: T = castOrFatalError(value) - return v -} - -func castOrThrow(_ resultType: T.Type, _ object: AnyObject) throws -> T { - guard let returnValue = object as? T else { - throw RxCocoaError.castingError(object: object, targetType: resultType) - } - - return returnValue -} - -func castOptionalOrThrow(_ resultType: T.Type, _ object: AnyObject) throws -> T? { - if NSNull().isEqual(object) { - return nil - } - - guard let returnValue = object as? T else { - throw RxCocoaError.castingError(object: object, targetType: resultType) - } - - return returnValue -} - -func castOrFatalError(_ value: AnyObject!, message: String) -> T { - let maybeResult: T? = value as? T - guard let result = maybeResult else { - rxFatalError(message) - } - - return result -} - -func castOrFatalError(_ value: Any!) -> T { - let maybeResult: T? = value as? T - guard let result = maybeResult else { - rxFatalError("Failure converting from \(value) to \(T.self)") - } - - return result -} - -// MARK: Error messages - -let dataSourceNotSet = "DataSource not set" -let delegateNotSet = "Delegate not set" - -#if !DISABLE_SWIZZLING - -// MARK: Conversions `NSError` > `RxCocoaObjCRuntimeError` - -extension Error { - func rxCocoaErrorForTarget(_ target: AnyObject) -> RxCocoaObjCRuntimeError { - let error = self as NSError - - if error.domain == RXObjCRuntimeErrorDomain { - let errorCode = RXObjCRuntimeError(rawValue: error.code) ?? .unknown - - switch errorCode { - case .unknown: - return .unknown(target: target) - case .objectMessagesAlreadyBeingIntercepted: - let isKVO = (error.userInfo[RXObjCRuntimeErrorIsKVOKey] as? NSNumber)?.boolValue ?? false - return .objectMessagesAlreadyBeingIntercepted(target: target, interceptionMechanism: isKVO ? .kvo : .unknown) - case .selectorNotImplemented: - return .selectorNotImplemented(target: target) - case .cantInterceptCoreFoundationTollFreeBridgedObjects: - return .cantInterceptCoreFoundationTollFreeBridgedObjects(target: target) - case .threadingCollisionWithOtherInterceptionMechanism: - return .threadingCollisionWithOtherInterceptionMechanism(target: target) - case .savingOriginalForwardingMethodFailed: - return .savingOriginalForwardingMethodFailed(target: target) - case .replacingMethodWithForwardingImplementation: - return .replacingMethodWithForwardingImplementation(target: target) - case .observingPerformanceSensitiveMessages: - return .observingPerformanceSensitiveMessages(target: target) - case .observingMessagesWithUnsupportedReturnType: - return .observingMessagesWithUnsupportedReturnType(target: target) - } - } - - return RxCocoaObjCRuntimeError.unknown(target: target) - } -} - -#endif - - -// MARK: Shared with RxSwift - -#if !RX_NO_MODULE - -func rxFatalError(_ lastMessage: String) -> Never { - // The temptation to comment this line is great, but please don't, it's for your own good. The choice is yours. - fatalError(lastMessage) -} - -#endif diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/RxCocoaObjCRuntimeError+Extensions.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/RxCocoaObjCRuntimeError+Extensions.swift new file mode 100644 index 00000000..e368b03e --- /dev/null +++ b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/RxCocoaObjCRuntimeError+Extensions.swift @@ -0,0 +1,162 @@ +// +// RxCocoaObjCRuntimeError+Extensions.swift +// RxCocoa +// +// Created by Krunoslav Zaher on 10/9/16. +// Copyright © 2016 Krunoslav Zaher. All rights reserved. +// + +import Foundation +#if !RX_NO_MODULE + #if SWIFT_PACKAGE && !DISABLE_SWIZZLING && !os(Linux) + import RxCocoaRuntime + #endif +#endif + +#if !DISABLE_SWIZZLING && !os(Linux) + /// RxCocoa ObjC runtime interception mechanism. + public enum RxCocoaInterceptionMechanism { + /// Unknown message interception mechanism. + case unknown + /// Key value observing interception mechanism. + case kvo + } + + /// RxCocoa ObjC runtime modification errors. + public enum RxCocoaObjCRuntimeError + : Swift.Error + , CustomDebugStringConvertible { + /// Unknown error has occurred. + case unknown(target: AnyObject) + + /** + If the object is reporting a different class then it's real class, that means that there is probably + already some interception mechanism in place or something weird is happening. + + The most common case when this would happen is when using a combination of KVO (`observe`) and `sentMessage`. + + This error is easily resolved by just using `sentMessage` observing before `observe`. + + The reason why the other way around could create issues is because KVO will unregister it's interceptor + class and restore original class. Unfortunately that will happen no matter was there another interceptor + subclass registered in hierarchy or not. + + Failure scenario: + * KVO sets class to be `__KVO__OriginalClass` (subclass of `OriginalClass`) + * `sentMessage` sets object class to be `_RX_namespace___KVO__OriginalClass` (subclass of `__KVO__OriginalClass`) + * then unobserving with KVO will restore class to be `OriginalClass` -> failure point (possibly a bug in KVO) + + The reason why changing order of observing works is because any interception method on unregistration + should return object's original real class (if that doesn't happen then it's really easy to argue that's a bug + in that interception mechanism). + + This library won't remove registered interceptor even if there aren't any observers left because + it's highly unlikely it would have any benefit in real world use cases, and it's even more + dangerous. + */ + case objectMessagesAlreadyBeingIntercepted(target: AnyObject, interceptionMechanism: RxCocoaInterceptionMechanism) + + /// Trying to observe messages for selector that isn't implemented. + case selectorNotImplemented(target: AnyObject) + + /// Core Foundation classes are usually toll free bridged. Those classes crash the program in case + /// `object_setClass` is performed on them. + /// + /// There is a possibility to just swizzle methods on original object, but since those won't be usual use + /// cases for this library, then an error will just be reported for now. + case cantInterceptCoreFoundationTollFreeBridgedObjects(target: AnyObject) + + /// Two libraries have simultaneously tried to modify ObjC runtime and that was detected. This can only + /// happen in scenarios where multiple interception libraries are used. + /// + /// To synchronize other libraries intercepting messages for an object, use `synchronized` on target object and + /// it's meta-class. + case threadingCollisionWithOtherInterceptionMechanism(target: AnyObject) + + /// For some reason saving original method implementation under RX namespace failed. + case savingOriginalForwardingMethodFailed(target: AnyObject) + + /// Intercepting a sent message by replacing a method implementation with `_objc_msgForward` failed for some reason. + case replacingMethodWithForwardingImplementation(target: AnyObject) + + /// Attempt to intercept one of the performance sensitive methods: + /// * class + /// * respondsToSelector: + /// * methodSignatureForSelector: + /// * forwardingTargetForSelector: + case observingPerformanceSensitiveMessages(target: AnyObject) + + /// Message implementation has unsupported return type (for example large struct). The reason why this is a error + /// is because in some cases intercepting sent messages requires replacing implementation with `_objc_msgForward_stret` + /// instead of `_objc_msgForward`. + /// + /// The unsupported cases should be fairly uncommon. + case observingMessagesWithUnsupportedReturnType(target: AnyObject) + } + + extension RxCocoaObjCRuntimeError { + /// A textual representation of `self`, suitable for debugging. + public var debugDescription: String { + switch self { + case let .unknown(target): + return "Unknown error occurred.\nTarget: `\(target)`" + case let .objectMessagesAlreadyBeingIntercepted(target, interceptionMechanism): + let interceptionMechanismDescription = interceptionMechanism == .kvo ? "KVO" : "other interception mechanism" + return "Collision between RxCocoa interception mechanism and \(interceptionMechanismDescription)." + + " To resolve this conflict please use this interception mechanism first.\nTarget: \(target)" + case let .selectorNotImplemented(target): + return "Trying to observe messages for selector that isn't implemented.\nTarget: \(target)" + case let .cantInterceptCoreFoundationTollFreeBridgedObjects(target): + return "Interception of messages sent to Core Foundation isn't supported.\nTarget: \(target)" + case let .threadingCollisionWithOtherInterceptionMechanism(target): + return "Detected a conflict while modifying ObjC runtime.\nTarget: \(target)" + case let .savingOriginalForwardingMethodFailed(target): + return "Saving original method implementation failed.\nTarget: \(target)" + case let .replacingMethodWithForwardingImplementation(target): + return "Intercepting a sent message by replacing a method implementation with `_objc_msgForward` failed for some reason.\nTarget: \(target)" + case let .observingPerformanceSensitiveMessages(target): + return "Attempt to intercept one of the performance sensitive methods. \nTarget: \(target)" + case let .observingMessagesWithUnsupportedReturnType(target): + return "Attempt to intercept a method with unsupported return type. \nTarget: \(target)" + } + } + } + + // MARK: Conversions `NSError` > `RxCocoaObjCRuntimeError` + + extension Error { + func rxCocoaErrorForTarget(_ target: AnyObject) -> RxCocoaObjCRuntimeError { + let error = self as NSError + + if error.domain == RXObjCRuntimeErrorDomain { + let errorCode = RXObjCRuntimeError(rawValue: error.code) ?? .unknown + + switch errorCode { + case .unknown: + return .unknown(target: target) + case .objectMessagesAlreadyBeingIntercepted: + let isKVO = (error.userInfo[RXObjCRuntimeErrorIsKVOKey] as? NSNumber)?.boolValue ?? false + return .objectMessagesAlreadyBeingIntercepted(target: target, interceptionMechanism: isKVO ? .kvo : .unknown) + case .selectorNotImplemented: + return .selectorNotImplemented(target: target) + case .cantInterceptCoreFoundationTollFreeBridgedObjects: + return .cantInterceptCoreFoundationTollFreeBridgedObjects(target: target) + case .threadingCollisionWithOtherInterceptionMechanism: + return .threadingCollisionWithOtherInterceptionMechanism(target: target) + case .savingOriginalForwardingMethodFailed: + return .savingOriginalForwardingMethodFailed(target: target) + case .replacingMethodWithForwardingImplementation: + return .replacingMethodWithForwardingImplementation(target: target) + case .observingPerformanceSensitiveMessages: + return .observingPerformanceSensitiveMessages(target: target) + case .observingMessagesWithUnsupportedReturnType: + return .observingMessagesWithUnsupportedReturnType(target: target) + } + } + + return RxCocoaObjCRuntimeError.unknown(target: target) + } + } + +#endif + diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/RxTarget.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/RxTarget.swift index 62ce0691..804bd915 100644 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/RxTarget.swift +++ b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/RxTarget.swift @@ -21,7 +21,7 @@ class RxTarget : NSObject self.retainSelf = self #if TRACE_RESOURCES - OSAtomicIncrement32(&resourceCount) + _ = Resources.incrementTotal() #endif #if DEBUG @@ -38,7 +38,7 @@ class RxTarget : NSObject #if TRACE_RESOURCES deinit { - OSAtomicDecrement32(&resourceCount) + _ = Resources.decrementTotal() } #endif } diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/SectionedViewDataSourceType.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/SectionedViewDataSourceType.swift index 200fd9c3..5c3cf3ca 100644 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/SectionedViewDataSourceType.swift +++ b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/SectionedViewDataSourceType.swift @@ -1,6 +1,6 @@ // // SectionedViewDataSourceType.swift -// Rx +// RxCocoa // // Created by Krunoslav Zaher on 1/10/16. // Copyright © 2016 Krunoslav Zaher. All rights reserved. @@ -8,32 +8,13 @@ import Foundation -/** -Data source with access to underlying sectioned model. -*/ +/// Data source with access to underlying sectioned model. public protocol SectionedViewDataSourceType { - /** - Returns model at index path. - - In case data source doesn't contain any sections when this method is being called, `RxCocoaError.ItemsNotYetBound(object: self)` is thrown. + /// Returns model at index path. + /// + /// In case data source doesn't contain any sections when this method is being called, `RxCocoaError.ItemsNotYetBound(object: self)` is thrown. - - parameter indexPath: Model index path - - returns: Model at index path. - */ - func model(_ indexPath: IndexPath) throws -> Any -} - -extension SectionedViewDataSourceType { - /** - Returns model at index path. - - In case data source doesn't contain any sections when this method is being called, `RxCocoaError.ItemsNotYetBound(object: self)` is thrown. - - - parameter indexPath: Model index path - - returns: Model at index path. - */ - @available(*, deprecated, renamed: "model(_:)") - func modelAtIndexPath(_ indexPath: IndexPath) throws -> Any { - return try self.model(indexPath) - } + /// - parameter indexPath: Model index path + /// - returns: Model at index path. + func model(at indexPath: IndexPath) throws -> Any } diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/TextInput.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/TextInput.swift index 787a309a..5f139ea8 100644 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/TextInput.swift +++ b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/TextInput.swift @@ -1,6 +1,6 @@ // // TextInput.swift -// Rx +// RxCocoa // // Created by Krunoslav Zaher on 5/12/16. // Copyright © 2016 Krunoslav Zaher. All rights reserved. @@ -8,141 +8,75 @@ import Foundation +#if !RX_NO_MODULE + import RxSwift +#endif + #if os(iOS) || os(tvOS) import UIKit - /** - Represents text input with reactive extensions. - */ + /// Represents text input with reactive extensions. public struct TextInput { - /** - Base text input to extend. - */ + /// Base text input to extend. public let base: Base - /** - Reactive wrapper for `text` property. - */ - public let text: ControlProperty - - /** - Initializes new text input. - - - parameter base: Base object. - - parameter text: Textual control property. - */ - public init(base: Base, text: ControlProperty) { + /// Reactive wrapper for `text` property. + public let text: ControlProperty + + /// Initializes new text input. + /// + /// - parameter base: Base object. + /// - parameter text: Textual control property. + public init(base: Base, text: ControlProperty) { self.base = base self.text = text } } extension Reactive where Base: UITextField { - /** - Reactive text input. - */ - public var textInput: TextInput { + /// Reactive text input. + public var textInput: TextInput { return TextInput(base: base, text: self.text) } } extension Reactive where Base: UITextView { - /** - Reactive text input. - */ - public var textInput: TextInput { + /// Reactive text input. + public var textInput: TextInput { return TextInput(base: base, text: self.text) } } - /** - Represents text input with reactive extensions. - */ - @available(*, deprecated, renamed: "TextInput") - public protocol RxTextInput : UITextInput { - @available(*, deprecated, renamed: "rx.textInput.text") - var rx_text: ControlProperty { get } - } - - extension UITextField : RxTextInput { - @available(*, deprecated, renamed: "rx.textInput.text") - public var rx_text: ControlProperty { - return self.rx.text - } - } - - extension UITextView : RxTextInput { - @available(*, deprecated, renamed: "rx.textInput.text") - public var rx_text: ControlProperty { - return self.rx.text - } - } - - #endif -#if os(OSX) +#if os(macOS) import Cocoa - /** - Represents text input with reactive extensions. - */ - public struct TextInput { - /** - Base text input to extend. - */ + /// Represents text input with reactive extensions. + public struct TextInput { + /// Base text input to extend. public let base: Base - /** - Reactive wrapper for `text` property. - */ - public let text: ControlProperty + /// Reactive wrapper for `text` property. + public let text: ControlProperty - /** - Initializes new text input. - - - parameter base: Base object. - - parameter text: Textual control property. - */ - public init(base: Base, text: ControlProperty) { + /// Initializes new text input. + /// + /// - parameter base: Base object. + /// - parameter text: Textual control property. + public init(base: Base, text: ControlProperty) { self.base = base self.text = text } } - extension Reactive where Base: NSTextField { - /** - Reactive text input. - */ - public var textInput: TextInput { + extension Reactive where Base: NSTextField, Base: NSTextInputClient { + /// Reactive text input. + public var textInput: TextInput { return TextInput(base: base, text: self.text) } } - /** - Represents text input with reactive extensions. - */ - @available(*, deprecated, renamed: "TextInput") - public protocol RxTextInput : NSTextInput { - - /** - Reactive wrapper for `text` property. - */ - @available(*, deprecated, renamed: "rx.textInput.text") - var rx_text: ControlProperty { get } - } - - @available(*, deprecated) - extension NSTextField : RxTextInput { - /** - Reactive wrapper for `text` property. - */ - @available(*, deprecated, renamed: "rx.textInput.text") - public var rx_text: ControlProperty { - return self.rx.text - } - } - #endif diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/KVORepresentable+CoreGraphics.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Foundation/KVORepresentable+CoreGraphics.swift similarity index 90% rename from Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/KVORepresentable+CoreGraphics.swift rename to Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Foundation/KVORepresentable+CoreGraphics.swift index 19abf65b..61ef1dbc 100644 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/KVORepresentable+CoreGraphics.swift +++ b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Foundation/KVORepresentable+CoreGraphics.swift @@ -1,11 +1,13 @@ // // KVORepresentable+CoreGraphics.swift -// Rx +// RxCocoa // // Created by Krunoslav Zaher on 11/14/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. // +#if !os(Linux) + import Foundation #if !RX_NO_MODULE import RxSwift @@ -25,9 +27,7 @@ let CGPointType = "{CGPoint=ff}" extension CGRect : KVORepresentable { public typealias KVOType = NSValue - /** - Constructs self from `NSValue`. - */ + /// Constructs self from `NSValue`. public init?(KVOValue: KVOType) { if strcmp(KVOValue.objCType, CGRectType) != 0 { return nil @@ -41,9 +41,7 @@ extension CGRect : KVORepresentable { extension CGPoint : KVORepresentable { public typealias KVOType = NSValue - /** - Constructs self from `NSValue`. - */ + /// Constructs self from `NSValue`. public init?(KVOValue: KVOType) { if strcmp(KVOValue.objCType, CGPointType) != 0 { return nil @@ -57,9 +55,7 @@ extension CGPoint : KVORepresentable { extension CGSize : KVORepresentable { public typealias KVOType = NSValue - /** - Constructs self from `NSValue`. - */ + /// Constructs self from `NSValue`. public init?(KVOValue: KVOType) { if strcmp(KVOValue.objCType, CGSizeType) != 0 { return nil @@ -68,4 +64,6 @@ extension CGSize : KVORepresentable { KVOValue.getValue(&typedValue) self = typedValue } -} \ No newline at end of file +} + +#endif diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/KVORepresentable+Swift.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Foundation/KVORepresentable+Swift.swift similarity index 78% rename from Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/KVORepresentable+Swift.swift rename to Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Foundation/KVORepresentable+Swift.swift index a0378a4a..00d53dd0 100644 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/KVORepresentable+Swift.swift +++ b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Foundation/KVORepresentable+Swift.swift @@ -1,6 +1,6 @@ // // KVORepresentable+Swift.swift -// Rx +// RxCocoa // // Created by Krunoslav Zaher on 11/14/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -11,9 +11,7 @@ import Foundation extension Int : KVORepresentable { public typealias KVOType = NSNumber - /** - Constructs `Self` using KVO value. - */ + /// Constructs `Self` using KVO value. public init?(KVOValue: KVOType) { self.init(KVOValue.int32Value) } @@ -22,9 +20,7 @@ extension Int : KVORepresentable { extension Int32 : KVORepresentable { public typealias KVOType = NSNumber - /** - Constructs `Self` using KVO value. - */ + /// Constructs `Self` using KVO value. public init?(KVOValue: KVOType) { self.init(KVOValue.int32Value) } @@ -33,9 +29,7 @@ extension Int32 : KVORepresentable { extension Int64 : KVORepresentable { public typealias KVOType = NSNumber - /** - Constructs `Self` using KVO value. - */ + /// Constructs `Self` using KVO value. public init?(KVOValue: KVOType) { self.init(KVOValue.int64Value) } @@ -44,9 +38,7 @@ extension Int64 : KVORepresentable { extension UInt : KVORepresentable { public typealias KVOType = NSNumber - /** - Constructs `Self` using KVO value. - */ + /// Constructs `Self` using KVO value. public init?(KVOValue: KVOType) { self.init(KVOValue.uintValue) } @@ -55,9 +47,7 @@ extension UInt : KVORepresentable { extension UInt32 : KVORepresentable { public typealias KVOType = NSNumber - /** - Constructs `Self` using KVO value. - */ + /// Constructs `Self` using KVO value. public init?(KVOValue: KVOType) { self.init(KVOValue.uint32Value) } @@ -66,9 +56,7 @@ extension UInt32 : KVORepresentable { extension UInt64 : KVORepresentable { public typealias KVOType = NSNumber - /** - Constructs `Self` using KVO value. - */ + /// Constructs `Self` using KVO value. public init?(KVOValue: KVOType) { self.init(KVOValue.uint64Value) } @@ -77,9 +65,7 @@ extension UInt64 : KVORepresentable { extension Bool : KVORepresentable { public typealias KVOType = NSNumber - /** - Constructs `Self` using KVO value. - */ + /// Constructs `Self` using KVO value. public init?(KVOValue: KVOType) { self.init(KVOValue.boolValue) } @@ -87,9 +73,7 @@ extension Bool : KVORepresentable { extension RawRepresentable where RawValue: KVORepresentable { - /** - Constructs `Self` using optional KVO value. - */ + /// Constructs `Self` using optional KVO value. init?(KVOValue: RawValue.KVOType?) { guard let KVOValue = KVOValue else { return nil diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/KVORepresentable.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Foundation/KVORepresentable.swift similarity index 63% rename from Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/KVORepresentable.swift rename to Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Foundation/KVORepresentable.swift index c51774b3..ad59682b 100644 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/KVORepresentable.swift +++ b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Foundation/KVORepresentable.swift @@ -1,6 +1,6 @@ // // KVORepresentable.swift -// Rx +// RxCocoa // // Created by Krunoslav Zaher on 11/14/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -8,25 +8,17 @@ import Foundation -/** -Type that is KVO representable (KVO mechanism can be used to observe it). -*/ +/// Type that is KVO representable (KVO mechanism can be used to observe it). public protocol KVORepresentable { - /** - Associated KVO type. - */ + /// Associated KVO type. associatedtype KVOType - /** - Constructs `Self` using KVO value. - */ + /// Constructs `Self` using KVO value. init?(KVOValue: KVOType) } extension KVORepresentable { - /** - Initializes `KVORepresentable` with optional value. - */ + /// Initializes `KVORepresentable` with optional value. init?(KVOValue: KVOType?) { guard let KVOValue = KVOValue else { return nil diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/Logging.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Foundation/Logging.swift similarity index 76% rename from Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/Logging.swift rename to Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Foundation/Logging.swift index c937310f..8b821ca5 100644 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/Logging.swift +++ b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Foundation/Logging.swift @@ -8,15 +8,11 @@ import Foundation -/** -Simple logging settings for RxCocoa library. -*/ +/// Simple logging settings for RxCocoa library. public struct Logging { public typealias LogURLRequest = (URLRequest) -> Bool - /** - Log URL requests to standard output in curl format. - */ + /// Log URL requests to standard output in curl format. public static var URLRequests: LogURLRequest = { _ in #if DEBUG return true diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/Observables/NSNotificationCenter+Rx.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Foundation/NSNotificationCenter+Rx.swift similarity index 80% rename from Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/Observables/NSNotificationCenter+Rx.swift rename to Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Foundation/NSNotificationCenter+Rx.swift index 23f1f533..66703d61 100644 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/Observables/NSNotificationCenter+Rx.swift +++ b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Foundation/NSNotificationCenter+Rx.swift @@ -15,12 +15,11 @@ extension Reactive where Base: NotificationCenter { /** Transforms notifications posted to notification center to observable sequence of notifications. - - parameter name: Filter notifications by name. + - parameter name: Optional name used to filter notifications. - parameter object: Optional object used to filter notifications. - returns: Observable sequence of posted notifications. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") - public func notification(_ name: Notification.Name, object: AnyObject? = nil) -> Observable { + public func notification(_ name: Notification.Name?, object: AnyObject? = nil) -> Observable { return Observable.create { [weak object] observer in let nsObserver = self.base.addObserver(forName: name, object: object, queue: nil) { notification in observer.on(.next(notification)) diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/Observables/NSObject+Rx+KVORepresentable.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Foundation/NSObject+Rx+KVORepresentable.swift similarity index 90% rename from Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/Observables/NSObject+Rx+KVORepresentable.swift rename to Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Foundation/NSObject+Rx+KVORepresentable.swift index 9b8858c6..cb2573ca 100644 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/Observables/NSObject+Rx+KVORepresentable.swift +++ b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Foundation/NSObject+Rx+KVORepresentable.swift @@ -1,11 +1,13 @@ // // NSObject+Rx+KVORepresentable.swift -// Rx +// RxCocoa // // Created by Krunoslav Zaher on 11/14/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. // +#if !os(Linux) + import Foundation #if !RX_NO_MODULE import RxSwift @@ -21,14 +23,13 @@ extension Reactive where Base: NSObject { For more information take a look at `observe` method. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public func observe(_ type: E.Type, _ keyPath: String, options: NSKeyValueObservingOptions = [.new, .initial], retainSelf: Bool = true) -> Observable { return observe(E.KVOType.self, keyPath, options: options, retainSelf: retainSelf) .map(E.init) } } -#if !DISABLE_SWIZZLING +#if !DISABLE_SWIZZLING && !os(Linux) // KVO extension Reactive where Base: NSObject { /** @@ -36,10 +37,11 @@ extension Reactive where Base: NSObject { For more information take a look at `observeWeakly` method. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public func observeWeakly(_ type: E.Type, _ keyPath: String, options: NSKeyValueObservingOptions = [.new, .initial]) -> Observable { return observeWeakly(E.KVOType.self, keyPath, options: options) .map(E.init) } } #endif + +#endif diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/Observables/NSObject+Rx+RawRepresentable.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Foundation/NSObject+Rx+RawRepresentable.swift similarity index 92% rename from Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/Observables/NSObject+Rx+RawRepresentable.swift rename to Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Foundation/NSObject+Rx+RawRepresentable.swift index 50f9cacc..897cdb3c 100644 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/Observables/NSObject+Rx+RawRepresentable.swift +++ b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Foundation/NSObject+Rx+RawRepresentable.swift @@ -1,11 +1,13 @@ // // NSObject+Rx+RawRepresentable.swift -// Rx +// RxCocoa // // Created by Krunoslav Zaher on 11/9/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. // +#if !os(Linux) + import Foundation #if !RX_NO_MODULE import RxSwift @@ -21,7 +23,6 @@ extension Reactive where Base: NSObject { For more information take a look at `observe` method. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public func observe(_ type: E.Type, _ keyPath: String, options: NSKeyValueObservingOptions = [.new, .initial], retainSelf: Bool = true) -> Observable where E.RawValue: KVORepresentable { return observe(E.RawValue.KVOType.self, keyPath, options: options, retainSelf: retainSelf) .map(E.init) @@ -42,10 +43,11 @@ extension Reactive where Base: NSObject { For more information take a look at `observeWeakly` method. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public func observeWeakly(_ type: E.Type, _ keyPath: String, options: NSKeyValueObservingOptions = [.new, .initial]) -> Observable where E.RawValue: KVORepresentable { return observeWeakly(E.RawValue.KVOType.self, keyPath, options: options) .map(E.init) } } #endif + +#endif diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Foundation/NSObject+Rx.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Foundation/NSObject+Rx.swift new file mode 100644 index 00000000..270d16c5 --- /dev/null +++ b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Foundation/NSObject+Rx.swift @@ -0,0 +1,532 @@ +// +// NSObject+Rx.swift +// RxCocoa +// +// Created by Krunoslav Zaher on 2/21/15. +// Copyright © 2015 Krunoslav Zaher. All rights reserved. +// + +#if !os(Linux) + +import Foundation +#if !RX_NO_MODULE + import RxSwift + #if SWIFT_PACKAGE && !DISABLE_SWIZZLING && !os(Linux) + import RxCocoaRuntime + #endif +#endif + +#if !DISABLE_SWIZZLING && !os(Linux) +fileprivate var deallocatingSubjectTriggerContext: UInt8 = 0 +fileprivate var deallocatingSubjectContext: UInt8 = 0 +#endif +fileprivate var deallocatedSubjectTriggerContext: UInt8 = 0 +fileprivate var deallocatedSubjectContext: UInt8 = 0 + +#if !os(Linux) + +/** +KVO is a tricky mechanism. + +When observing child in a ownership hierarchy, usually retaining observing target is wanted behavior. +When observing parent in a ownership hierarchy, usually retaining target isn't wanter behavior. + +KVO with weak references is especially tricky. For it to work, some kind of swizzling is required. +That can be done by + * replacing object class dynamically (like KVO does) + * by swizzling `dealloc` method on all instances for a class. + * some third method ... + +Both approaches can fail in certain scenarios: + * problems arise when swizzlers return original object class (like KVO does when nobody is observing) + * Problems can arise because replacing dealloc method isn't atomic operation (get implementation, + set implementation). + +Second approach is chosen. It can fail in case there are multiple libraries dynamically trying +to replace dealloc method. In case that isn't the case, it should be ok. +*/ +extension Reactive where Base: NSObject { + + + /** + Observes values on `keyPath` starting from `self` with `options` and retains `self` if `retainSelf` is set. + + `observe` is just a simple and performant wrapper around KVO mechanism. + + * it can be used to observe paths starting from `self` or from ancestors in ownership graph (`retainSelf = false`) + * it can be used to observe paths starting from descendants in ownership graph (`retainSelf = true`) + * the paths have to consist only of `strong` properties, otherwise you are risking crashing the system by not unregistering KVO observer before dealloc. + + If support for weak properties is needed or observing arbitrary or unknown relationships in the + ownership tree, `observeWeakly` is the preferred option. + + - parameter keyPath: Key path of property names to observe. + - parameter options: KVO mechanism notification options. + - parameter retainSelf: Retains self during observation if set `true`. + - returns: Observable sequence of objects on `keyPath`. + */ + public func observe(_ type: E.Type, _ keyPath: String, options: NSKeyValueObservingOptions = [.new, .initial], retainSelf: Bool = true) -> Observable { + return KVOObservable(object: base, keyPath: keyPath, options: options, retainTarget: retainSelf).asObservable() + } +} + +#endif + +#if !DISABLE_SWIZZLING && !os(Linux) +// KVO +extension Reactive where Base: NSObject { + /** + Observes values on `keyPath` starting from `self` with `options` and doesn't retain `self`. + + It can be used in all cases where `observe` can be used and additionally + + * because it won't retain observed target, it can be used to observe arbitrary object graph whose ownership relation is unknown + * it can be used to observe `weak` properties + + **Since it needs to intercept object deallocation process it needs to perform swizzling of `dealloc` method on observed object.** + + - parameter keyPath: Key path of property names to observe. + - parameter options: KVO mechanism notification options. + - returns: Observable sequence of objects on `keyPath`. + */ + public func observeWeakly(_ type: E.Type, _ keyPath: String, options: NSKeyValueObservingOptions = [.new, .initial]) -> Observable { + return observeWeaklyKeyPathFor(base, keyPath: keyPath, options: options) + .map { n in + return n as? E + } + } +} +#endif + +// Dealloc +extension Reactive where Base: AnyObject { + + /** + Observable sequence of object deallocated events. + + After object is deallocated one `()` element will be produced and sequence will immediately complete. + + - returns: Observable sequence of object deallocated events. + */ + public var deallocated: Observable { + return synchronized { + if let deallocObservable = objc_getAssociatedObject(base, &deallocatedSubjectContext) as? DeallocObservable { + return deallocObservable._subject + } + + let deallocObservable = DeallocObservable() + + objc_setAssociatedObject(base, &deallocatedSubjectContext, deallocObservable, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) + return deallocObservable._subject + } + } + +#if !DISABLE_SWIZZLING && !os(Linux) + + /** + Observable sequence of message arguments that completes when object is deallocated. + + Each element is produced before message is invoked on target object. `methodInvoked` + exists in case observing of invoked messages is needed. + + In case an error occurs sequence will fail with `RxCocoaObjCRuntimeError`. + + In case some argument is `nil`, instance of `NSNull()` will be sent. + + - returns: Observable sequence of object deallocating events. + */ + public func sentMessage(_ selector: Selector) -> Observable<[Any]> { + return synchronized { + // in case of dealloc selector replay subject behavior needs to be used + if selector == deallocSelector { + return deallocating.map { _ in [] } + } + + do { + let proxy: MessageSentProxy = try registerMessageInterceptor(selector) + return proxy.messageSent.asObservable() + } + catch let e { + return Observable.error(e) + } + } + } + + /** + Observable sequence of message arguments that completes when object is deallocated. + + Each element is produced after message is invoked on target object. `sentMessage` + exists in case interception of sent messages before they were invoked is needed. + + In case an error occurs sequence will fail with `RxCocoaObjCRuntimeError`. + + In case some argument is `nil`, instance of `NSNull()` will be sent. + + - returns: Observable sequence of object deallocating events. + */ + public func methodInvoked(_ selector: Selector) -> Observable<[Any]> { + return synchronized { + // in case of dealloc selector replay subject behavior needs to be used + if selector == deallocSelector { + return deallocated.map { _ in [] } + } + + + do { + let proxy: MessageSentProxy = try registerMessageInterceptor(selector) + return proxy.methodInvoked.asObservable() + } + catch let e { + return Observable.error(e) + } + } + } + + /** + Observable sequence of object deallocating events. + + When `dealloc` message is sent to `self` one `()` element will be produced and after object is deallocated sequence + will immediately complete. + + In case an error occurs sequence will fail with `RxCocoaObjCRuntimeError`. + + - returns: Observable sequence of object deallocating events. + */ + public var deallocating: Observable<()> { + return synchronized { + do { + let proxy: DeallocatingProxy = try registerMessageInterceptor(deallocSelector) + return proxy.messageSent.asObservable() + } + catch let e { + return Observable.error(e) + } + } + } + + fileprivate func registerMessageInterceptor(_ selector: Selector) throws -> T { + let rxSelector = RX_selector(selector) + let selectorReference = RX_reference_from_selector(rxSelector) + + let subject: T + if let existingSubject = objc_getAssociatedObject(base, selectorReference) as? T { + subject = existingSubject + } + else { + subject = T() + objc_setAssociatedObject( + base, + selectorReference, + subject, + .OBJC_ASSOCIATION_RETAIN_NONATOMIC + ) + } + + if subject.isActive { + return subject + } + + var error: NSError? + let targetImplementation = RX_ensure_observing(base, selector, &error) + if targetImplementation == nil { + throw error?.rxCocoaErrorForTarget(base) ?? RxCocoaError.unknown + } + + subject.targetImplementation = targetImplementation! + + return subject + } +#endif +} + +// MARK: Message interceptors + +#if !DISABLE_SWIZZLING && !os(Linux) + + fileprivate protocol MessageInterceptorSubject: class { + init() + + var isActive: Bool { + get + } + + var targetImplementation: IMP { get set } + } + + fileprivate final class DeallocatingProxy + : MessageInterceptorSubject + , RXDeallocatingObserver { + typealias E = () + + let messageSent = ReplaySubject<()>.create(bufferSize: 1) + + @objc var targetImplementation: IMP = RX_default_target_implementation() + + var isActive: Bool { + return targetImplementation != RX_default_target_implementation() + } + + init() { + } + + @objc func deallocating() -> Void { + messageSent.on(.next()) + } + + deinit { + messageSent.on(.completed) + } + } + + fileprivate final class MessageSentProxy + : MessageInterceptorSubject + , RXMessageSentObserver { + typealias E = [AnyObject] + + let messageSent = PublishSubject<[Any]>() + let methodInvoked = PublishSubject<[Any]>() + + @objc var targetImplementation: IMP = RX_default_target_implementation() + + var isActive: Bool { + return targetImplementation != RX_default_target_implementation() + } + + init() { + } + + @objc func messageSent(withArguments arguments: [Any]) -> Void { + messageSent.on(.next(arguments)) + } + + @objc func methodInvoked(withArguments arguments: [Any]) -> Void { + methodInvoked.on(.next(arguments)) + } + + deinit { + messageSent.on(.completed) + methodInvoked.on(.completed) + } + } + +#endif + + +fileprivate class DeallocObservable { + let _subject = ReplaySubject.create(bufferSize:1) + + init() { + } + + deinit { + _subject.on(.next(())) + _subject.on(.completed) + } +} + +// MARK: KVO + +#if !os(Linux) + +fileprivate protocol KVOObservableProtocol { + var target: AnyObject { get } + var keyPath: String { get } + var retainTarget: Bool { get } + var options: NSKeyValueObservingOptions { get } +} + +fileprivate class KVOObserver + : _RXKVOObserver + , Disposable { + typealias Callback = (Any?) -> Void + + var retainSelf: KVOObserver? = nil + + init(parent: KVOObservableProtocol, callback: @escaping Callback) { + #if TRACE_RESOURCES + _ = Resources.incrementTotal() + #endif + + super.init(target: parent.target, retainTarget: parent.retainTarget, keyPath: parent.keyPath, options: parent.options, callback: callback) + self.retainSelf = self + } + + override func dispose() { + super.dispose() + self.retainSelf = nil + } + + deinit { + #if TRACE_RESOURCES + _ = Resources.decrementTotal() + #endif + } +} + +fileprivate class KVOObservable + : ObservableType + , KVOObservableProtocol { + typealias E = Element? + + unowned var target: AnyObject + var strongTarget: AnyObject? + + var keyPath: String + var options: NSKeyValueObservingOptions + var retainTarget: Bool + + init(object: AnyObject, keyPath: String, options: NSKeyValueObservingOptions, retainTarget: Bool) { + self.target = object + self.keyPath = keyPath + self.options = options + self.retainTarget = retainTarget + if retainTarget { + self.strongTarget = object + } + } + + func subscribe(_ observer: O) -> Disposable where O.E == Element? { + let observer = KVOObserver(parent: self) { (value) in + if value as? NSNull != nil { + observer.on(.next(nil)) + return + } + observer.on(.next(value as? Element)) + } + + return Disposables.create(with: observer.dispose) + } + +} + +#endif + +#if !DISABLE_SWIZZLING && !os(Linux) + + fileprivate func observeWeaklyKeyPathFor(_ target: NSObject, keyPath: String, options: NSKeyValueObservingOptions) -> Observable { + let components = keyPath.components(separatedBy: ".").filter { $0 != "self" } + + let observable = observeWeaklyKeyPathFor(target, keyPathSections: components, options: options) + .finishWithNilWhenDealloc(target) + + if !options.intersection(.initial).isEmpty { + return observable + } + else { + return observable + .skip(1) + } + } + + // This should work correctly + // Identifiers can't contain `,`, so the only place where `,` can appear + // is as a delimiter. + // This means there is `W` as element in an array of property attributes. + fileprivate func isWeakProperty(_ properyRuntimeInfo: String) -> Bool { + return properyRuntimeInfo.range(of: ",W,") != nil + } + + fileprivate extension ObservableType where E == AnyObject? { + func finishWithNilWhenDealloc(_ target: NSObject) + -> Observable { + let deallocating = target.rx.deallocating + + return deallocating + .map { _ in + return Observable.just(nil) + } + .startWith(self.asObservable()) + .switchLatest() + } + } + + fileprivate func observeWeaklyKeyPathFor( + _ target: NSObject, + keyPathSections: [String], + options: NSKeyValueObservingOptions + ) -> Observable { + + weak var weakTarget: AnyObject? = target + + let propertyName = keyPathSections[0] + let remainingPaths = Array(keyPathSections[1.. + + // KVO recursion for value changes + return propertyObservable + .flatMapLatest { (nextTarget: AnyObject?) -> Observable in + if nextTarget == nil { + return Observable.just(nil) + } + let nextObject = nextTarget! as? NSObject + + let strongTarget: AnyObject? = weakTarget + + if nextObject == nil { + return Observable.error(RxCocoaError.invalidObjectOnKeyPath(object: nextTarget!, sourceObject: strongTarget ?? NSNull(), propertyName: propertyName)) + } + + // if target is alive, then send change + // if it's deallocated, don't send anything + if strongTarget == nil { + return Observable.empty() + } + + let nextElementsObservable = keyPathSections.count == 1 + ? Observable.just(nextTarget) + : observeWeaklyKeyPathFor(nextObject!, keyPathSections: remainingPaths, options: options) + + if isWeak { + return nextElementsObservable + .finishWithNilWhenDealloc(nextObject!) + } + else { + return nextElementsObservable + } + } + } +#endif + +// MARK Constants + +fileprivate let deallocSelector = NSSelectorFromString("dealloc") + +// MARK: AnyObject + Reactive + +extension Reactive where Base: AnyObject { + func synchronized( _ action: () -> T) -> T { + objc_sync_enter(self.base) + let result = action() + objc_sync_exit(self.base) + return result + } +} + +extension Reactive where Base: AnyObject { + /** + Helper to make sure that `Observable` returned from `createCachedObservable` is only created once. + This is important because there is only one `target` and `action` properties on `NSControl` or `UIBarButtonItem`. + */ + func lazyInstanceObservable(_ key: UnsafeRawPointer, createCachedObservable: () -> T) -> T { + if let value = objc_getAssociatedObject(base, key) { + return value as! T + } + + let observable = createCachedObservable() + + objc_setAssociatedObject(base, key, observable, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) + + return observable + } +} + +#endif diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/Observables/NSURLSession+Rx.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Foundation/URLSession+Rx.swift similarity index 78% rename from Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/Observables/NSURLSession+Rx.swift rename to Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Foundation/URLSession+Rx.swift index 8e23f8f6..a83292aa 100644 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/Observables/NSURLSession+Rx.swift +++ b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Foundation/URLSession+Rx.swift @@ -1,5 +1,5 @@ // -// NSURLSession+Rx.swift +// URLSession+Rx.swift // RxCocoa // // Created by Krunoslav Zaher on 3/23/15. @@ -11,34 +11,22 @@ import Foundation import RxSwift #endif -/** -RxCocoa URL errors. -*/ +/// RxCocoa URL errors. public enum RxCocoaURLError - : Swift.Error - , CustomDebugStringConvertible { - /** - Unknown error occurred. - */ + : Swift.Error { + /// Unknown error occurred. case unknown - /** - Response is not NSHTTPURLResponse - */ + /// Response is not NSHTTPURLResponse case nonHTTPResponse(response: URLResponse) - /** - Response is not successful. (not in `200 ..< 300` range) - */ + /// Response is not successful. (not in `200 ..< 300` range) case httpRequestFailed(response: HTTPURLResponse, data: Data?) - /** - Deserialization error. - */ + /// Deserialization error. case deserializationError(error: Swift.Error) } -public extension RxCocoaURLError { - /** - A textual representation of `self`, suitable for debugging. - */ +extension RxCocoaURLError + : CustomDebugStringConvertible { + /// A textual representation of `self`, suitable for debugging. public var debugDescription: String { switch self { case .unknown: @@ -53,16 +41,16 @@ public extension RxCocoaURLError { } } -func escapeTerminalString(_ value: String) -> String { +fileprivate func escapeTerminalString(_ value: String) -> String { return value.replacingOccurrences(of: "\"", with: "\\\"", options:[], range: nil) } -func convertURLRequestToCurlCommand(_ request: URLRequest) -> String { +fileprivate func convertURLRequestToCurlCommand(_ request: URLRequest) -> String { let method = request.httpMethod ?? "GET" var returnValue = "curl -X \(method) " - if request.httpMethod == "POST" && request.httpBody != nil { - let maybeBody = NSString(data: request.httpBody!, encoding: String.Encoding.utf8.rawValue) as? String + if let httpBody = request.httpBody, request.httpMethod == "POST" { + let maybeBody = String(data: httpBody, encoding: String.Encoding.utf8) if let body = maybeBody { returnValue += "-d \"\(escapeTerminalString(body))\" " } @@ -83,7 +71,7 @@ func convertURLRequestToCurlCommand(_ request: URLRequest) -> String { return returnValue } -func convertResponseToString(_ data: Data!, _ response: URLResponse!, _ error: NSError!, _ interval: TimeInterval) -> String { +fileprivate func convertResponseToString(_ data: Data!, _ response: URLResponse!, _ error: NSError!, _ interval: TimeInterval) -> String { let ms = Int(interval * 1000) if let response = response as? HTTPURLResponse { @@ -118,16 +106,18 @@ extension Reactive where Base: URLSession { - parameter request: URL request. - returns: Observable sequence of URL responses. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") - public func response(_ request: URLRequest) -> Observable<(Data, HTTPURLResponse)> { + public func response(request: URLRequest) -> Observable<(HTTPURLResponse, Data)> { return Observable.create { observer in // smart compiler should be able to optimize this out - var d: Date? + let d: Date? if Logging.URLRequests(request) { d = Date() } + else { + d = nil + } let task = self.base.dataTask(with: request) { (data, response, error) in @@ -147,7 +137,7 @@ extension Reactive where Base: URLSession { return } - observer.on(.next(data, httpResponse)) + observer.on(.next(httpResponse, data)) observer.on(.completed) } @@ -174,9 +164,8 @@ extension Reactive where Base: URLSession { - parameter request: URL request. - returns: Observable sequence of response data. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") - public func data(_ request: URLRequest) -> Observable { - return response(request).map { (data, response) -> Data in + public func data(request: URLRequest) -> Observable { + return response(request: request).map { (response, data) -> Data in if 200 ..< 300 ~= response.statusCode { return data } @@ -203,11 +192,10 @@ extension Reactive where Base: URLSession { - parameter request: URL request. - returns: Observable sequence of response JSON. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") - public func JSON(_ request: URLRequest) -> Observable { - return data(request).map { (data) -> AnyObject in + public func json(request: URLRequest) -> Observable { + return data(request: request).map { (data) -> Any in do { - return try JSONSerialization.jsonObject(with: data, options: []) as AnyObject + return try JSONSerialization.jsonObject(with: data, options: []) } catch let error { throw RxCocoaURLError.deserializationError(error: error) } @@ -216,7 +204,7 @@ extension Reactive where Base: URLSession { /** Observable sequence of response JSON for GET request with `URL`. - + Performing of request starts after observer is subscribed and not after invoking this method. **URL requests will be performed per subscribed observer.** @@ -228,11 +216,11 @@ extension Reactive where Base: URLSession { If there is an error during JSON deserialization observable sequence will fail with that error. - - parameter URL: URL of `NSURLRequest` request. + - parameter url: URL of `NSURLRequest` request. - returns: Observable sequence of response JSON. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") - public func JSON(_ URL: Foundation.URL) -> Observable { - return JSON(URLRequest(url: URL)) + public func json(url: Foundation.URL) -> Observable { + return json(request: URLRequest(url: url)) } } + diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/_RX.m b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Runtime/_RX.m similarity index 85% rename from Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/_RX.m rename to Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Runtime/_RX.m index 4c5ffe7e..cffbfbcc 100644 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/_RX.m +++ b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Runtime/_RX.m @@ -6,5 +6,5 @@ // Copyright © 2015 Krunoslav Zaher. All rights reserved. // -#import "_RX.h" +#import "include/_RX.h" diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/_RXDelegateProxy.m b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Runtime/_RXDelegateProxy.m similarity index 86% rename from Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/_RXDelegateProxy.m rename to Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Runtime/_RXDelegateProxy.m index 2cbffa5a..d0333a05 100644 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/_RXDelegateProxy.m +++ b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Runtime/_RXDelegateProxy.m @@ -6,9 +6,9 @@ // Copyright © 2015 Krunoslav Zaher. All rights reserved. // -#import "_RXDelegateProxy.h" -#import "_RX.h" -#import "_RXObjCRuntime.h" +#import "include/_RXDelegateProxy.h" +#import "include/_RX.h" +#import "include/_RXObjCRuntime.h" @interface _RXDelegateProxy () { id __weak __forwardToDelegate; @@ -88,10 +88,6 @@ +(void)initialize { } } --(void)interceptedSelector:(SEL)selector withArguments:(NSArray *)arguments { - -} - -(id)_forwardToDelegate { return __forwardToDelegate; } @@ -125,14 +121,30 @@ -(BOOL)respondsToSelector:(SEL)aSelector { } -(void)forwardInvocation:(NSInvocation *)anInvocation { - if (RX_is_method_signature_void(anInvocation.methodSignature)) { - NSArray *arguments = RX_extract_arguments(anInvocation); - [self interceptedSelector:anInvocation.selector withArguments:arguments]; + BOOL isVoid = RX_is_method_signature_void(anInvocation.methodSignature); + NSArray *arguments = nil; + if (isVoid) { + arguments = RX_extract_arguments(anInvocation); + [self _sentMessage:anInvocation.selector withArguments:arguments]; } if (self._forwardToDelegate && [self._forwardToDelegate respondsToSelector:anInvocation.selector]) { [anInvocation invokeWithTarget:self._forwardToDelegate]; } + + if (isVoid) { + [self _methodInvoked:anInvocation.selector withArguments:arguments]; + } +} + +// abstract method +-(void)_sentMessage:(SEL)selector withArguments:(NSArray *)arguments { + +} + +// abstract method +-(void)_methodInvoked:(SEL)selector withArguments:(NSArray *)arguments { + } -(void)dealloc { diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/_RXKVOObserver.m b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Runtime/_RXKVOObserver.m similarity index 97% rename from Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/_RXKVOObserver.m rename to Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Runtime/_RXKVOObserver.m index 4b60e4b5..fc8fb75c 100644 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/_RXKVOObserver.m +++ b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Runtime/_RXKVOObserver.m @@ -6,7 +6,7 @@ // Copyright © 2015 Krunoslav Zaher. All rights reserved. // -#import "_RXKVOObserver.h" +#import "include/_RXKVOObserver.h" @interface _RXKVOObserver () diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/_RXObjCRuntime.m b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Runtime/_RXObjCRuntime.m similarity index 88% rename from Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/_RXObjCRuntime.m rename to Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Runtime/_RXObjCRuntime.m index 50d54d04..669fab45 100644 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/_RXObjCRuntime.m +++ b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Runtime/_RXObjCRuntime.m @@ -12,8 +12,8 @@ #import #import -#import "_RX.h" -#import "_RXObjcRuntime.h" +#import "include/_RX.h" +#import "include/_RXObjCRuntime.h" #if !DISABLE_SWIZZLING @@ -212,12 +212,18 @@ static BOOL RX_forward_invocation(id __nonnull __unsafe_unretained self, NSInvoc if (messageSentObserver != nil) { NSArray *arguments = RX_extract_arguments(invocation); - [messageSentObserver messageSentWithParameters:arguments]; + [messageSentObserver messageSentWithArguments:arguments]; } if ([self respondsToSelector:originalSelector]) { invocation.selector = originalSelector; [invocation invokeWithTarget:self]; + + if (messageSentObserver != nil) { + NSArray *arguments = RX_extract_arguments(invocation); + [messageSentObserver methodInvokedWithArguments:arguments]; + } + return YES; } @@ -289,7 +295,7 @@ +(void)registerOptimizedObserver:(RXInterceptWithOptimizedObserver)registration that every action is properly locked. */ IMP __nullable RX_ensure_observing(id __nonnull target, SEL __nonnull selector, NSError ** __nonnull error) { - __block IMP __nonnull targetImplementation = nil; + __block IMP targetImplementation = nil; // Target is the second object that needs to be synchronized to TRY to make sure other swizzling framework // won't do something in parallel. // Even though this is too fine grained locking and more coarse grained locks should exist, this is just in case @@ -331,18 +337,24 @@ IMP __nonnull RX_default_target_implementation() { return methodSignature; \ } -#define DEALLOCATING_BODY(...) \ - id observer = objc_getAssociatedObject(self, rxSelector); \ - if (observer != nil && observer.targetImplementation == thisIMP) { \ - [observer messageSentWithParameters:@[]]; \ +#define DEALLOCATING_BODY(...) \ + id observer = objc_getAssociatedObject(self, rxSelector); \ + if (observer != nil && observer.targetImplementation == thisIMP) { \ + [observer deallocating]; \ } -#define OBSERVE_BODY(...) \ - id observer = objc_getAssociatedObject(self, rxSelector); \ - \ - if (observer != nil && observer.targetImplementation == thisIMP) { \ - [observer messageSentWithParameters:@[COMMA_DELIMITED_ARGUMENTS(__VA_ARGS__)]]; \ - } \ +#define OBSERVE_BODY(...) \ + id observer = objc_getAssociatedObject(self, rxSelector); \ + \ + if (observer != nil && observer.targetImplementation == thisIMP) { \ + [observer messageSentWithArguments:@[COMMA_DELIMITED_ARGUMENTS(__VA_ARGS__)]]; \ + } \ + + +#define OBSERVE_INVOKED_BODY(...) \ + if (observer != nil && observer.targetImplementation == thisIMP) { \ + [observer methodInvokedWithArguments:@[COMMA_DELIMITED_ARGUMENTS(__VA_ARGS__)]]; \ + } \ #define BUILD_ARG_WRAPPER(type) RX_ARG_ ## type //RX_ARG_ ## type @@ -379,35 +391,37 @@ +(return_value)RX_CAT2(RX_CAT2(example_, return_value), RX_FOR(_, SEPARATE_BY_SP #define BUILD_EXAMPLE_METHOD_SELECTOR(return_value, ...) \ RX_CAT2(RX_CAT2(example_, return_value), RX_FOR(_, SEPARATE_BY_SPACE, SELECTOR_PART, ## __VA_ARGS__)) -#define SWIZZLE_OBSERVE_METHOD(return_value, ...) \ - @interface RXObjCRuntime (GENERATE_METHOD_IDENTIFIER(return_value, ## __VA_ARGS__)) \ - @end \ - \ - @implementation RXObjCRuntime(GENERATE_METHOD_IDENTIFIER(return_value, ## __VA_ARGS__)) \ - BUILD_EXAMPLE_METHOD(return_value, ## __VA_ARGS__) \ - SWIZZLE_METHOD(return_value, GENERATE_OBSERVE_METHOD_DECLARATION(return_value, ## __VA_ARGS__), OBSERVE_BODY, ## __VA_ARGS__) \ - \ - +(void)load { \ - __unused SEL exampleSelector = @selector(BUILD_EXAMPLE_METHOD_SELECTOR(return_value, ## __VA_ARGS__)); \ - [self registerOptimizedObserver:^BOOL(RXObjCRuntime * __nonnull self, Class __nonnull class, \ - SEL __nonnull selector, NSError **__nonnull error) { \ - return [self GENERATE_METHOD_IDENTIFIER(return_value, ## __VA_ARGS__):class selector:selector error:error]; \ - } encodedAs:exampleSelector]; \ - } \ - \ - @end \ +#define SWIZZLE_OBSERVE_METHOD(return_value, ...) \ + @interface RXObjCRuntime (GENERATE_METHOD_IDENTIFIER(return_value, ## __VA_ARGS__)) \ + @end \ + \ + @implementation RXObjCRuntime(GENERATE_METHOD_IDENTIFIER(return_value, ## __VA_ARGS__)) \ + BUILD_EXAMPLE_METHOD(return_value, ## __VA_ARGS__) \ + SWIZZLE_METHOD(return_value, GENERATE_OBSERVE_METHOD_DECLARATION(return_value, ## __VA_ARGS__), OBSERVE_BODY, OBSERVE_INVOKED_BODY, ## __VA_ARGS__) \ + \ + +(void)load { \ + __unused SEL exampleSelector = @selector(BUILD_EXAMPLE_METHOD_SELECTOR(return_value, ## __VA_ARGS__)); \ + [self registerOptimizedObserver:^BOOL(RXObjCRuntime * __nonnull self, Class __nonnull class, \ + SEL __nonnull selector, NSError **__nonnull error) { \ + return [self GENERATE_METHOD_IDENTIFIER(return_value, ## __VA_ARGS__):class selector:selector error:error]; \ + } encodedAs:exampleSelector]; \ + } \ + \ + @end \ // infrastructure method +#define NO_BODY(...) + #define SWIZZLE_INFRASTRUCTURE_METHOD(return_value, method_name, parameters, method_selector, body, ...) \ SWIZZLE_METHOD(return_value, -(BOOL)method_name:(Class __nonnull)class parameters error:(NSError **__nonnull)error \ { \ - SEL selector = method_selector; , body, __VA_ARGS__) \ + SEL selector = method_selector; , body, NO_BODY, __VA_ARGS__) \ // common base -#define SWIZZLE_METHOD(return_value, method_prototype, body, ...) \ +#define SWIZZLE_METHOD(return_value, method_prototype, body, invoked_body, ...) \ method_prototype \ __unused SEL rxSelector = RX_selector(selector); \ IMP (^newImplementationGenerator)() = ^() { \ @@ -422,7 +436,10 @@ +(void)load { \ return_value (*msgSend)(struct objc_super *, SEL DECLARE_ARGUMENTS(__VA_ARGS__)) \ = (__typeof__(msgSend))objc_msgSendSuper; \ - return msgSend(&superInfo, selector ARGUMENTS(__VA_ARGS__)); \ + @try { \ + return msgSend(&superInfo, selector ARGUMENTS(__VA_ARGS__)); \ + } \ + @finally { invoked_body(__VA_ARGS__) } \ }; \ \ thisIMP = imp_implementationWithBlock(newImplementation); \ @@ -436,8 +453,10 @@ __block return_value (*originalImplementationTyped)(__unsafe_unretained id, SEL __block IMP thisIMP = nil; \ id implementationReplacement = ^return_value(__unsafe_unretained id self DECLARE_ARGUMENTS(__VA_ARGS__) ) { \ body(__VA_ARGS__) \ - \ - return originalImplementationTyped(self, selector ARGUMENTS(__VA_ARGS__)); \ + @try { \ + return originalImplementationTyped(self, selector ARGUMENTS(__VA_ARGS__)); \ + } \ + @finally { invoked_body(__VA_ARGS__) } \ }; \ \ thisIMP = imp_implementationWithBlock(implementationReplacement); \ @@ -596,20 +615,18 @@ +(void)registerOptimizedObserver:(RXInterceptWithOptimizedObserver)registration -(IMP __nullable)ensurePrepared:(id __nonnull)target forObserving:(SEL __nonnull)selector error:(NSError** __nonnull)error { Method instanceMethod = class_getInstanceMethod([target class], selector); if (instanceMethod == nil) { - RX_SAFE_ERROR([NSError errorWithDomain:RXObjCRuntimeErrorDomain - code:RXObjCRuntimeErrorSelectorNotImplemented - userInfo:nil]); - return nil; + RX_THROW_ERROR([NSError errorWithDomain:RXObjCRuntimeErrorDomain + code:RXObjCRuntimeErrorSelectorNotImplemented + userInfo:nil], nil); } if (selector == @selector(class) || selector == @selector(forwardingTargetForSelector:) || selector == @selector(methodSignatureForSelector:) || selector == @selector(respondsToSelector:)) { - RX_SAFE_ERROR([NSError errorWithDomain:RXObjCRuntimeErrorDomain - code:RXObjCRuntimeErrorObservingPerformanceSensitiveMessages - userInfo:nil]); - return nil; + RX_THROW_ERROR([NSError errorWithDomain:RXObjCRuntimeErrorDomain + code:RXObjCRuntimeErrorObservingPerformanceSensitiveMessages + userInfo:nil], nil); } // For `dealloc` message, original implementation will be swizzled. @@ -644,11 +661,9 @@ -(IMP __nullable)ensurePrepared:(id __nonnull)target forObserving:(SEL __nonnull RXInterceptWithOptimizedObserver optimizedIntercept = optimizedObserversByMethodEncoding[methodEncoding]; if (!RX_method_has_supported_return_type(instanceMethod)) { - RX_SAFE_ERROR([NSError errorWithDomain:RXObjCRuntimeErrorDomain - code:RXObjCRuntimeErrorObservingMessagesWithUnsupportedReturnType - userInfo:nil]); - - return nil; + RX_THROW_ERROR([NSError errorWithDomain:RXObjCRuntimeErrorDomain + code:RXObjCRuntimeErrorObservingMessagesWithUnsupportedReturnType + userInfo:nil], nil); } // optimized interception method @@ -686,11 +701,9 @@ -(IMP __nullable)ensurePrepared:(id __nonnull)target forObserving:(SEL __nonnull } } - RX_SAFE_ERROR([NSError errorWithDomain:RXObjCRuntimeErrorDomain - code:RXObjCRuntimeErrorUnknown - userInfo:nil]); - - return nil; + RX_THROW_ERROR([NSError errorWithDomain:RXObjCRuntimeErrorDomain + code:RXObjCRuntimeErrorUnknown + userInfo:nil], nil); } -(Class __nullable)prepareTargetClassForObserving:(id __nonnull)target error:(NSError **__nonnull)error { @@ -710,10 +723,9 @@ -(Class __nullable)prepareTargetClassForObserving:(id __nonnull)target error:(NS BOOL isThisTollFreeFoundationClass = CFGetTypeID((CFTypeRef)target) != defaultTypeID; if (isThisTollFreeFoundationClass) { - RX_SAFE_ERROR([NSError errorWithDomain:RXObjCRuntimeErrorDomain - code:RXObjCRuntimeErrorCantInterceptCoreFoundationTollFreeBridgedObjects - userInfo:nil]); - return nil; + RX_THROW_ERROR([NSError errorWithDomain:RXObjCRuntimeErrorDomain + code:RXObjCRuntimeErrorCantInterceptCoreFoundationTollFreeBridgedObjects + userInfo:nil], nil); } /** @@ -744,12 +756,11 @@ Most common case when this would happen is when using KVO (`observe`) and `sentM if ([target class] != object_getClass(target)) { BOOL isKVO = [target respondsToSelector:NSSelectorFromString(@"_isKVOA")]; - RX_SAFE_ERROR([NSError errorWithDomain:RXObjCRuntimeErrorDomain - code:RXObjCRuntimeErrorObjectMessagesAlreadyBeingIntercepted - userInfo:@{ - RXObjCRuntimeErrorIsKVOKey : @(isKVO) - }]); - return nil; + RX_THROW_ERROR([NSError errorWithDomain:RXObjCRuntimeErrorDomain + code:RXObjCRuntimeErrorObjectMessagesAlreadyBeingIntercepted + userInfo:@{ + RXObjCRuntimeErrorIsKVOKey : @(isKVO) + }], nil); } Class __nullable dynamicFakeSubclass = [self ensureHasDynamicFakeSubclass:wannaBeClass error:error]; @@ -760,11 +771,10 @@ Most common case when this would happen is when using KVO (`observe`) and `sentM Class previousClass = object_setClass(target, dynamicFakeSubclass); if (previousClass != wannaBeClass) { - RX_SAFE_ERROR([NSError errorWithDomain:RXObjCRuntimeErrorDomain - code:RXObjCRuntimeErrorThreadingCollisionWithOtherInterceptionMechanism - userInfo:nil]); THREADING_HAZARD(wannaBeClass); - return nil; + RX_THROW_ERROR([NSError errorWithDomain:RXObjCRuntimeErrorDomain + code:RXObjCRuntimeErrorThreadingCollisionWithOtherInterceptionMechanism + userInfo:nil], nil); } objc_setAssociatedObject(target, &RxSwizzlingTargetClassKey, dynamicFakeSubclass, OBJC_ASSOCIATION_RETAIN_NONATOMIC); @@ -800,7 +810,7 @@ -(BOOL)observeByForwardingMessages:(Class __nonnull)swizzlingImplementorClass ALWAYS(![self forwardingSelector:selector forClass:swizzlingImplementorClass], @"Already observing selector for class"); #if TRACE_RESOURCES - OSAtomicIncrement32(&numberOfForwardedMethods); + OSAtomicIncrement32Barrier(&numberOfForwardedMethods); #endif SEL rxSelector = RX_selector(selector); @@ -815,27 +825,23 @@ -(BOOL)observeByForwardingMessages:(Class __nonnull)swizzlingImplementorClass IMP implementation = method_getImplementation(instanceMethod); if (implementation == nil) { - RX_SAFE_ERROR([NSError errorWithDomain:RXObjCRuntimeErrorDomain - code:RXObjCRuntimeErrorSelectorNotImplemented - userInfo:nil]); - - return NO; + RX_THROW_ERROR([NSError errorWithDomain:RXObjCRuntimeErrorDomain + code:RXObjCRuntimeErrorSelectorNotImplemented + userInfo:nil], NO); } if (!class_addMethod(swizzlingImplementorClass, rxSelector, implementation, methodEncoding)) { - RX_SAFE_ERROR([NSError errorWithDomain:RXObjCRuntimeErrorDomain - code:RXObjCRuntimeErrorSavingOriginalForwardingMethodFailed - userInfo:nil]); - return NO; + RX_THROW_ERROR([NSError errorWithDomain:RXObjCRuntimeErrorDomain + code:RXObjCRuntimeErrorSavingOriginalForwardingMethodFailed + userInfo:nil], NO); } if (!class_addMethod(swizzlingImplementorClass, selector, _objc_msgForward, methodEncoding)) { if (implementation != method_setImplementation(instanceMethod, _objc_msgForward)) { - RX_SAFE_ERROR([NSError errorWithDomain:RXObjCRuntimeErrorDomain - code:RXObjCRuntimeErrorReplacingMethodWithForwardingImplementation - userInfo:nil]); THREADING_HAZARD(swizzlingImplementorClass); - return NO; + RX_THROW_ERROR([NSError errorWithDomain:RXObjCRuntimeErrorDomain + code:RXObjCRuntimeErrorReplacingMethodWithForwardingImplementation + userInfo:nil], NO); } } @@ -931,7 +937,7 @@ -(BOOL)ensureSwizzledSelector:(SEL __nonnull)selector } #if TRACE_RESOURCES - OSAtomicIncrement32(&numberOInterceptedMethods); + OSAtomicIncrement32Barrier(&numberOInterceptedMethods); #endif DLOG(@"Rx is swizzling `%@` for `%@`", NSStringFromSelector(selector), class); diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Runtime/include/RxCocoaRuntime.h b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Runtime/include/RxCocoaRuntime.h new file mode 100644 index 00000000..8cf762ec --- /dev/null +++ b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Runtime/include/RxCocoaRuntime.h @@ -0,0 +1,19 @@ +// +// RxCocoaRuntime.h +// RxCocoa +// +// Created by Krunoslav Zaher on 2/21/15. +// Copyright © 2015 Krunoslav Zaher. All rights reserved. +// + +#import +#import "_RX.h" +#import "_RXDelegateProxy.h" +#import "_RXKVOObserver.h" +#import "_RXObjCRuntime.h" + +//! Project version number for RxCocoa. +FOUNDATION_EXPORT double RxCocoaVersionNumber; + +//! Project version string for RxCocoa. +FOUNDATION_EXPORT const unsigned char RxCocoaVersionString[]; diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/_RX.h b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Runtime/include/_RX.h similarity index 96% rename from Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/_RX.h rename to Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Runtime/include/_RX.h index cd61cf1f..aae17770 100644 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/_RX.h +++ b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Runtime/include/_RX.h @@ -36,7 +36,7 @@ Checks that the local `error` instance exists before assigning it's value by reference. This macro exists to work around static analysis warnings — `NSError` is always assumed to be `nullable`, even though we explictly define the method parameter as `nonnull`. See http://www.openradar.me/21766176 for more details. */ -#define RX_SAFE_ERROR(errorValue) if (error != nil) { *error = (errorValue); } +#define RX_THROW_ERROR(errorValue, returnValue) if (error != nil) { *error = (errorValue); } return (returnValue); // Inspired by http://p99.gforge.inria.fr @@ -136,4 +136,4 @@ // rx cat -#define _RX_CAT2(_1, _2) _1 ## _2 \ No newline at end of file +#define _RX_CAT2(_1, _2) _1 ## _2 diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/_RXDelegateProxy.h b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Runtime/include/_RXDelegateProxy.h similarity index 77% rename from Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/_RXDelegateProxy.h rename to Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Runtime/include/_RXDelegateProxy.h index 22a5a402..523e7ae0 100644 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/_RXDelegateProxy.h +++ b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Runtime/include/_RXDelegateProxy.h @@ -18,7 +18,8 @@ NS_ASSUME_NONNULL_BEGIN -(BOOL)hasWiredImplementationForSelector:(SEL)selector; --(void)interceptedSelector:(SEL)selector withArguments:(NSArray*)arguments; +-(void)_sentMessage:(SEL)selector withArguments:(NSArray*)arguments; +-(void)_methodInvoked:(SEL)selector withArguments:(NSArray*)arguments; @end diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/_RXKVOObserver.h b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Runtime/include/_RXKVOObserver.h similarity index 100% rename from Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/_RXKVOObserver.h rename to Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Runtime/include/_RXKVOObserver.h diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/_RXObjCRuntime.h b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Runtime/include/_RXObjCRuntime.h similarity index 69% rename from Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/_RXObjCRuntime.h rename to Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Runtime/include/_RXObjCRuntime.h index 17d8bf07..ca0d0253 100644 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Common/_RXObjCRuntime.h +++ b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/Runtime/include/_RXObjCRuntime.h @@ -37,14 +37,10 @@ */ extern BOOL RXAbortOnThreadingHazard; -/** - Error domain for RXObjCRuntime. - */ +/// Error domain for RXObjCRuntime. extern NSString * __nonnull const RXObjCRuntimeErrorDomain; -/** - `userInfo` key with additional information is interceptor probably KVO. - */ +/// `userInfo` key with additional information is interceptor probably KVO. extern NSString * __nonnull const RXObjCRuntimeErrorIsKVOKey; typedef NS_ENUM(NSInteger, RXObjCRuntimeError) { @@ -59,54 +55,48 @@ typedef NS_ENUM(NSInteger, RXObjCRuntimeError) { RXObjCRuntimeErrorObservingMessagesWithUnsupportedReturnType = 9, }; -/** - Transforms normal selector into a selector with RX prefix. - */ +/// Transforms normal selector into a selector with RX prefix. SEL _Nonnull RX_selector(SEL _Nonnull selector); -/** - Transforms selector into a unique pointer (because of Swift conversion rules) - */ +/// Transforms selector into a unique pointer (because of Swift conversion rules) void * __nonnull RX_reference_from_selector(SEL __nonnull selector); -/** - Protocol that interception observers must implement. - */ +/// Protocol that interception observers must implement. @protocol RXMessageSentObserver -/** - In case the same selector is being intercepted for a pair of base/sub classes, - this property will differentiate between interceptors that need to fire. - */ +/// In case the same selector is being intercepted for a pair of base/sub classes, +/// this property will differentiate between interceptors that need to fire. @property (nonatomic, assign, readonly) IMP __nonnull targetImplementation; --(void)messageSentWithParameters:(NSArray* __nonnull)parameters; +-(void)messageSentWithArguments:(NSArray* __nonnull)arguments; +-(void)methodInvokedWithArguments:(NSArray* __nonnull)arguments; @end -/** - Ensures interceptor is installed on target object. - */ +/// Protocol that deallocating observer must implement. +@protocol RXDeallocatingObserver + +/// In case the same selector is being intercepted for a pair of base/sub classes, +/// this property will differentiate between interceptors that need to fire. +@property (nonatomic, assign, readonly) IMP __nonnull targetImplementation; + +-(void)deallocating; + +@end + +/// Ensures interceptor is installed on target object. IMP __nullable RX_ensure_observing(id __nonnull target, SEL __nonnull selector, NSError *__nullable * __nonnull error); -/** - Extracts arguments for `invocation`. - */ +/// Extracts arguments for `invocation`. NSArray * __nonnull RX_extract_arguments(NSInvocation * __nonnull invocation); -/** - Returns `YES` in case method has `void` return type. - */ +/// Returns `YES` in case method has `void` return type. BOOL RX_is_method_with_description_void(struct objc_method_description method); -/** - Returns `YES` in case methodSignature has `void` return type. - */ +/// Returns `YES` in case methodSignature has `void` return type. BOOL RX_is_method_signature_void(NSMethodSignature * __nonnull methodSignature); -/** - Default value for `RXInterceptionObserver.targetImplementation`. - */ +/// Default value for `RXInterceptionObserver.targetImplementation`. IMP __nonnull RX_default_target_implementation(); -#endif \ No newline at end of file +#endif diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/RxCocoa.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/RxCocoa.swift new file mode 100644 index 00000000..e4a646c5 --- /dev/null +++ b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/RxCocoa.swift @@ -0,0 +1,148 @@ +// +// RxCocoa.swift +// RxCocoa +// +// Created by Krunoslav Zaher on 2/21/15. +// Copyright © 2015 Krunoslav Zaher. All rights reserved. +// + +import Foundation +#if !RX_NO_MODULE +import RxSwift +#endif +#if os(iOS) + import UIKit +#endif + +/// RxCocoa errors. +public enum RxCocoaError + : Swift.Error + , CustomDebugStringConvertible { + /// Unknown error has occurred. + case unknown + /// Invalid operation was attempted. + case invalidOperation(object: Any) + /// Items are not yet bound to user interface but have been requested. + case itemsNotYetBound(object: Any) + /// Invalid KVO Path. + case invalidPropertyName(object: Any, propertyName: String) + /// Invalid object on key path. + case invalidObjectOnKeyPath(object: Any, sourceObject: AnyObject, propertyName: String) + /// Error during swizzling. + case errorDuringSwizzling + /// Casting error. + case castingError(object: Any, targetType: Any.Type) +} + + +// MARK: Debug descriptions + +extension RxCocoaError { + /// A textual representation of `self`, suitable for debugging. + public var debugDescription: String { + switch self { + case .unknown: + return "Unknown error occurred." + case let .invalidOperation(object): + return "Invalid operation was attempted on `\(object)`." + case let .itemsNotYetBound(object): + return "Data source is set, but items are not yet bound to user interface for `\(object)`." + case let .invalidPropertyName(object, propertyName): + return "Object `\(object)` dosn't have a property named `\(propertyName)`." + case let .invalidObjectOnKeyPath(object, sourceObject, propertyName): + return "Unobservable object `\(object)` was observed as `\(propertyName)` of `\(sourceObject)`." + case .errorDuringSwizzling: + return "Error during swizzling." + case .castingError(let object, let targetType): + return "Error casting `\(object)` to `\(targetType)`" + } + } +} + + + +// MARK: Error binding policies + +func bindingErrorToInterface(_ error: Swift.Error) { + let error = "Binding error to UI: \(error)" +#if DEBUG + rxFatalError(error) +#else + print(error) +#endif +} + +// MARK: Abstract methods + +func rxAbstractMethodWithMessage(_ message: String) -> Swift.Never { + rxFatalError(message) +} + +func rxAbstractMethod() -> Swift.Never { + rxFatalError("Abstract method") +} + +// MARK: casts or fatal error + +// workaround for Swift compiler bug, cheers compiler team :) +func castOptionalOrFatalError(_ value: Any?) -> T? { + if value == nil { + return nil + } + let v: T = castOrFatalError(value) + return v +} + +func castOrThrow(_ resultType: T.Type, _ object: Any) throws -> T { + guard let returnValue = object as? T else { + throw RxCocoaError.castingError(object: object, targetType: resultType) + } + + return returnValue +} + +func castOptionalOrThrow(_ resultType: T.Type, _ object: AnyObject) throws -> T? { + if NSNull().isEqual(object) { + return nil + } + + guard let returnValue = object as? T else { + throw RxCocoaError.castingError(object: object, targetType: resultType) + } + + return returnValue +} + +func castOrFatalError(_ value: AnyObject!, message: String) -> T { + let maybeResult: T? = value as? T + guard let result = maybeResult else { + rxFatalError(message) + } + + return result +} + +func castOrFatalError(_ value: Any!) -> T { + let maybeResult: T? = value as? T + guard let result = maybeResult else { + rxFatalError("Failure converting from \(value) to \(T.self)") + } + + return result +} + +// MARK: Error messages + +let dataSourceNotSet = "DataSource not set" +let delegateNotSet = "Delegate not set" + +// MARK: Shared with RxSwift + +#if !RX_NO_MODULE + +func rxFatalError(_ lastMessage: String) -> Never { + // The temptation to comment this line is great, but please don't, it's for your own good. The choice is yours. + fatalError(lastMessage) +} + +#endif diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/DataSources/RxCollectionViewReactiveArrayDataSource.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/DataSources/RxCollectionViewReactiveArrayDataSource.swift index b8f139da..ab834977 100644 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/DataSources/RxCollectionViewReactiveArrayDataSource.swift +++ b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/DataSources/RxCollectionViewReactiveArrayDataSource.swift @@ -72,7 +72,7 @@ class RxCollectionViewReactiveArrayDataSource return itemModels?[index] } - func model(_ indexPath: IndexPath) throws -> Any { + func model(at indexPath: IndexPath) throws -> Any { precondition(indexPath.section == 0) guard let item = itemModels?[indexPath.item] else { throw RxCocoaError.itemsNotYetBound(object: self) diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/DataSources/RxTableViewReactiveArrayDataSource.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/DataSources/RxTableViewReactiveArrayDataSource.swift index db2db942..ec63f41f 100644 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/DataSources/RxTableViewReactiveArrayDataSource.swift +++ b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/DataSources/RxTableViewReactiveArrayDataSource.swift @@ -70,7 +70,7 @@ class RxTableViewReactiveArrayDataSource return itemModels?[index] } - func model(_ indexPath: IndexPath) throws -> Any { + func model(at indexPath: IndexPath) throws -> Any { precondition(indexPath.section == 0) guard let item = itemModels?[indexPath.item] else { throw RxCocoaError.itemsNotYetBound(object: self) diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/Events/ItemEvents.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/Events/ItemEvents.swift index 66f42939..d3776b78 100644 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/Events/ItemEvents.swift +++ b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/Events/ItemEvents.swift @@ -7,9 +7,9 @@ // import Foundation +#if os(iOS) || os(tvOS) import UIKit -#if os(iOS) || os(tvOS) public typealias ItemMovedEvent = (sourceIndex: IndexPath, destinationIndex: IndexPath) public typealias WillDisplayCellEvent = (cell: UITableViewCell, indexPath: IndexPath) public typealias DidEndDisplayingCellEvent = (cell: UITableViewCell, indexPath: IndexPath) diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/NSTextStorage+Rx.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/NSTextStorage+Rx.swift index a0482b3e..8fa1b3a1 100644 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/NSTextStorage+Rx.swift +++ b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/NSTextStorage+Rx.swift @@ -1,6 +1,6 @@ // // NSTextStorage+Rx.swift -// Rx +// RxCocoa // // Created by Segii Shulga on 12/30/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -16,21 +16,17 @@ import Foundation extension Reactive where Base: NSTextStorage { - /** - Reactive wrapper for `delegate`. - - For more information take a look at `DelegateProxyType` protocol documentation. - */ + /// Reactive wrapper for `delegate`. + /// + /// For more information take a look at `DelegateProxyType` protocol documentation. public var delegate:DelegateProxy { return RxTextStorageDelegateProxy.proxyForObject(base) } - /** - Reactive wrapper for `delegate` message. - */ + /// Reactive wrapper for `delegate` message. public var didProcessEditingRangeChangeInLength: Observable<(editedMask:NSTextStorageEditActions, editedRange:NSRange, delta:Int)> { return delegate - .observe(#selector(NSTextStorageDelegate.textStorage(_:didProcessEditing:range:changeInLength:))) + .methodInvoked(#selector(NSTextStorageDelegate.textStorage(_:didProcessEditing:range:changeInLength:))) .map { a in let editedMask = NSTextStorageEditActions(rawValue: try castOrThrow(UInt.self, a[1]) ) let editedRange = try castOrThrow(NSValue.self, a[2]).rangeValue diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/Protocols/RxCollectionViewDataSourceType.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/Protocols/RxCollectionViewDataSourceType.swift index a4edc76b..59312d20 100644 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/Protocols/RxCollectionViewDataSourceType.swift +++ b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/Protocols/RxCollectionViewDataSourceType.swift @@ -14,22 +14,16 @@ import UIKit import RxSwift #endif -/** -Marks data source as `UICollectionView` reactive data source enabling it to be used with one of the `bindTo` methods. -*/ +/// Marks data source as `UICollectionView` reactive data source enabling it to be used with one of the `bindTo` methods. public protocol RxCollectionViewDataSourceType /*: UICollectionViewDataSource*/ { - /** - Type of elements that can be bound to collection view. - */ + /// Type of elements that can be bound to collection view. associatedtype Element - /** - New observable sequence event observed. - - - parameter collectionView: Bound collection view. - - parameter observedEvent: Event - */ + /// New observable sequence event observed. + /// + /// - parameter collectionView: Bound collection view. + /// - parameter observedEvent: Event func collectionView(_ collectionView: UICollectionView, observedEvent: Event) -> Void } diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/Protocols/RxTableViewDataSourceType.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/Protocols/RxTableViewDataSourceType.swift index aeddc9bb..8f1e5a84 100644 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/Protocols/RxTableViewDataSourceType.swift +++ b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/Protocols/RxTableViewDataSourceType.swift @@ -14,22 +14,16 @@ import UIKit import RxSwift #endif -/** -Marks data source as `UITableView` reactive data source enabling it to be used with one of the `bindTo` methods. -*/ +/// Marks data source as `UITableView` reactive data source enabling it to be used with one of the `bindTo` methods. public protocol RxTableViewDataSourceType /*: UITableViewDataSource*/ { - /** - Type of elements that can be bound to table view. - */ + /// Type of elements that can be bound to table view. associatedtype Element - /** - New observable sequence event observed. - - - parameter tableView: Bound table view. - - parameter observedEvent: Event - */ + /// New observable sequence event observed. + /// + /// - parameter tableView: Bound table view. + /// - parameter observedEvent: Event func tableView(_ tableView: UITableView, observedEvent: Event) -> Void } diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/Proxies/RxCollectionViewDataSourceProxy.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/Proxies/RxCollectionViewDataSourceProxy.swift index 5bd59266..629225b1 100644 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/Proxies/RxCollectionViewDataSourceProxy.swift +++ b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/Proxies/RxCollectionViewDataSourceProxy.swift @@ -32,26 +32,20 @@ class CollectionViewDataSourceNotSet } -/** - For more information take a look at `DelegateProxyType`. - */ +/// For more information take a look at `DelegateProxyType`. public class RxCollectionViewDataSourceProxy : DelegateProxy , UICollectionViewDataSource , DelegateProxyType { - /** - Typed parent object. - */ + /// Typed parent object. public weak private(set) var collectionView: UICollectionView? - - private weak var _requiredMethodsDataSource: UICollectionViewDataSource? = collectionViewDataSourceNotSet - /** - Initializes `RxCollectionViewDataSourceProxy` + private weak var _requiredMethodsDataSource: UICollectionViewDataSource? = collectionViewDataSourceNotSet - - parameter parentObject: Parent object for delegate proxy. - */ + /// Initializes `RxCollectionViewDataSourceProxy` + /// + /// - parameter parentObject: Parent object for delegate proxy. public required init(parentObject: AnyObject) { self.collectionView = (parentObject as! UICollectionView) super.init(parentObject: parentObject) @@ -59,57 +53,43 @@ public class RxCollectionViewDataSourceProxy // MARK: delegate - /** - Required delegate method implementation. - */ + /// Required delegate method implementation. public func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return (_requiredMethodsDataSource ?? collectionViewDataSourceNotSet).collectionView(collectionView, numberOfItemsInSection: section) } - /** - Required delegate method implementation. - */ + /// Required delegate method implementation. public func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { return (_requiredMethodsDataSource ?? collectionViewDataSourceNotSet).collectionView(collectionView, cellForItemAt: indexPath) } // MARK: proxy - /** - For more information take a look at `DelegateProxyType`. - */ + /// For more information take a look at `DelegateProxyType`. public override class func createProxyForObject(_ object: AnyObject) -> AnyObject { let collectionView = (object as! UICollectionView) return castOrFatalError(collectionView.createRxDataSourceProxy()) } - /** - For more information take a look at `DelegateProxyType`. - */ + /// For more information take a look at `DelegateProxyType`. public override class func delegateAssociatedObjectTag() -> UnsafeRawPointer { return _pointer(&dataSourceAssociatedTag) } - /** - For more information take a look at `DelegateProxyType`. - */ + /// For more information take a look at `DelegateProxyType`. public class func setCurrentDelegate(_ delegate: AnyObject?, toObject object: AnyObject) { let collectionView: UICollectionView = castOrFatalError(object) collectionView.dataSource = castOptionalOrFatalError(delegate) } - /** - For more information take a look at `DelegateProxyType`. - */ + /// For more information take a look at `DelegateProxyType`. public class func currentDelegateFor(_ object: AnyObject) -> AnyObject? { let collectionView: UICollectionView = castOrFatalError(object) return collectionView.dataSource } - /** - For more information take a look at `DelegateProxyType`. - */ + /// For more information take a look at `DelegateProxyType`. public override func setForwardToDelegate(_ forwardToDelegate: AnyObject?, retainDelegate: Bool) { let requiredMethodsDataSource: UICollectionViewDataSource? = castOptionalOrFatalError(forwardToDelegate) _requiredMethodsDataSource = requiredMethodsDataSource ?? collectionViewDataSourceNotSet diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/Proxies/RxCollectionViewDelegateProxy.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/Proxies/RxCollectionViewDelegateProxy.swift index b2c5933b..1087965b 100644 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/Proxies/RxCollectionViewDelegateProxy.swift +++ b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/Proxies/RxCollectionViewDelegateProxy.swift @@ -14,24 +14,18 @@ import UIKit import RxSwift #endif -/** - For more information take a look at `DelegateProxyType`. - */ +/// For more information take a look at `DelegateProxyType`. public class RxCollectionViewDelegateProxy : RxScrollViewDelegateProxy , UICollectionViewDelegate , UICollectionViewDelegateFlowLayout { - /** - Typed parent object. - */ + /// Typed parent object. public weak private(set) var collectionView: UICollectionView? - /** - Initializes `RxCollectionViewDelegateProxy` - - - parameter parentObject: Parent object for delegate proxy. - */ + /// Initializes `RxCollectionViewDelegateProxy` + /// + /// - parameter parentObject: Parent object for delegate proxy. public required init(parentObject: AnyObject) { self.collectionView = (parentObject as! UICollectionView) super.init(parentObject: parentObject) diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/Proxies/RxImagePickerDelegateProxy.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/Proxies/RxImagePickerDelegateProxy.swift deleted file mode 100644 index 91f0aaea..00000000 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/Proxies/RxImagePickerDelegateProxy.swift +++ /dev/null @@ -1,41 +0,0 @@ -// -// RxImagePickerDelegateProxy.swift -// Rx -// -// Created by Segii Shulga on 1/4/16. -// Copyright © 2016 Krunoslav Zaher. All rights reserved. -// - -#if os(iOS) - - import Foundation -#if !RX_NO_MODULE - import RxSwift -#endif - import UIKit - -public class RxImagePickerDelegateProxy - : DelegateProxy - , DelegateProxyType - , UIImagePickerControllerDelegate - , UINavigationControllerDelegate { - - /** - For more information take a look at `DelegateProxyType`. - */ - public class func setCurrentDelegate(_ delegate: AnyObject?, toObject object: AnyObject) { - let imagePickerController: UIImagePickerController = castOrFatalError(object) - imagePickerController.delegate = castOptionalOrFatalError(delegate) - } - - /** - For more information take a look at `DelegateProxyType`. - */ - public class func currentDelegateFor(_ object: AnyObject) -> AnyObject? { - let imagePickerController: UIImagePickerController = castOrFatalError(object) - return imagePickerController.delegate - } - -} - -#endif diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/Proxies/RxPickerViewDelegateProxy.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/Proxies/RxPickerViewDelegateProxy.swift index 29ed3978..0ac5161f 100644 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/Proxies/RxPickerViewDelegateProxy.swift +++ b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/Proxies/RxPickerViewDelegateProxy.swift @@ -1,6 +1,6 @@ // // RxPickerViewDelegateProxy.swift -// Rx +// RxCocoa // // Created by Segii Shulga on 5/12/16. // Copyright © 2016 Krunoslav Zaher. All rights reserved. @@ -19,17 +19,13 @@ public class RxPickerViewDelegateProxy , DelegateProxyType , UIPickerViewDelegate { - /** - For more information take a look at `DelegateProxyType`. - */ + /// For more information take a look at `DelegateProxyType`. public class func setCurrentDelegate(_ delegate: AnyObject?, toObject object: AnyObject) { let pickerView: UIPickerView = castOrFatalError(object) pickerView.delegate = castOptionalOrFatalError(delegate) } - /** - For more information take a look at `DelegateProxyType`. - */ + /// For more information take a look at `DelegateProxyType`. public class func currentDelegateFor(_ object: AnyObject) -> AnyObject? { let pickerView: UIPickerView = castOrFatalError(object) return pickerView.delegate diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/Proxies/RxScrollViewDelegateProxy.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/Proxies/RxScrollViewDelegateProxy.swift index 3d2bf2e1..775b2769 100644 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/Proxies/RxScrollViewDelegateProxy.swift +++ b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/Proxies/RxScrollViewDelegateProxy.swift @@ -14,9 +14,7 @@ import RxSwift #endif import UIKit -/** - For more information take a look at `DelegateProxyType`. -*/ +/// For more information take a look at `DelegateProxyType`. public class RxScrollViewDelegateProxy : DelegateProxy , UIScrollViewDelegate @@ -24,14 +22,10 @@ public class RxScrollViewDelegateProxy fileprivate var _contentOffsetSubject: ReplaySubject? - /** - Typed parent object. - */ + /// Typed parent object. public weak fileprivate(set) var scrollView: UIScrollView? - /** - Optimized version used for observing content offset changes. - */ + /// Optimized version used for observing content offset changes. internal var contentOffsetSubject: Observable { if _contentOffsetSubject == nil { let replaySubject = ReplaySubject.create(bufferSize:1) @@ -42,11 +36,9 @@ public class RxScrollViewDelegateProxy return _contentOffsetSubject! } - /** - Initializes `RxScrollViewDelegateProxy` - - - parameter parentObject: Parent object for delegate proxy. - */ + /// Initializes `RxScrollViewDelegateProxy` + /// + /// - parameter parentObject: Parent object for delegate proxy. public required init(parentObject: AnyObject) { self.scrollView = (parentObject as! UIScrollView) super.init(parentObject: parentObject) @@ -54,9 +46,7 @@ public class RxScrollViewDelegateProxy // MARK: delegate methods - /** - For more information take a look at `DelegateProxyType`. - */ + /// For more information take a look at `DelegateProxyType`. public func scrollViewDidScroll(_ scrollView: UIScrollView) { if let contentOffset = _contentOffsetSubject { contentOffset.on(.next(scrollView.contentOffset)) @@ -66,26 +56,20 @@ public class RxScrollViewDelegateProxy // MARK: delegate proxy - /** - For more information take a look at `DelegateProxyType`. - */ + /// For more information take a look at `DelegateProxyType`. public override class func createProxyForObject(_ object: AnyObject) -> AnyObject { let scrollView = (object as! UIScrollView) return castOrFatalError(scrollView.createRxDelegateProxy()) } - /** - For more information take a look at `DelegateProxyType`. - */ + /// For more information take a look at `DelegateProxyType`. public class func setCurrentDelegate(_ delegate: AnyObject?, toObject object: AnyObject) { let scrollView: UIScrollView = castOrFatalError(object) scrollView.delegate = castOptionalOrFatalError(delegate) } - /** - For more information take a look at `DelegateProxyType`. - */ + /// For more information take a look at `DelegateProxyType`. public class func currentDelegateFor(_ object: AnyObject) -> AnyObject? { let scrollView: UIScrollView = castOrFatalError(object) return scrollView.delegate diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/Proxies/RxSearchBarDelegateProxy.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/Proxies/RxSearchBarDelegateProxy.swift index aea343ce..9f5b063d 100644 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/Proxies/RxSearchBarDelegateProxy.swift +++ b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/Proxies/RxSearchBarDelegateProxy.swift @@ -14,25 +14,19 @@ import UIKit import RxSwift #endif -/** - For more information take a look at `DelegateProxyType`. - */ +/// For more information take a look at `DelegateProxyType`. public class RxSearchBarDelegateProxy : DelegateProxy , UISearchBarDelegate , DelegateProxyType { - /** - For more information take a look at `DelegateProxyType`. - */ + /// For more information take a look at `DelegateProxyType`. public class func currentDelegateFor(_ object: AnyObject) -> AnyObject? { let searchBar: UISearchBar = castOrFatalError(object) return searchBar.delegate } - /** - For more information take a look at `DelegateProxyType`. - */ + /// For more information take a look at `DelegateProxyType`. public class func setCurrentDelegate(_ delegate: AnyObject?, toObject object: AnyObject) { let searchBar: UISearchBar = castOrFatalError(object) searchBar.delegate = castOptionalOrFatalError(delegate) @@ -41,9 +35,7 @@ public class RxSearchBarDelegateProxy // MARK: Delegate proxy methods #if os(iOS) - /** - For more information take a look at `DelegateProxyType`. - */ + /// For more information take a look at `DelegateProxyType`. public override class func createProxyForObject(_ object: AnyObject) -> AnyObject { let searchBar = (object as! UISearchBar) diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/Proxies/RxSearchControllerDelegateProxy.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/Proxies/RxSearchControllerDelegateProxy.swift index 2273fc2e..3a2242db 100644 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/Proxies/RxSearchControllerDelegateProxy.swift +++ b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/Proxies/RxSearchControllerDelegateProxy.swift @@ -1,6 +1,6 @@ // // RxSearchControllerDelegateProxy.swift -// Rx +// RxCocoa // // Created by Segii Shulga on 3/17/16. // Copyright © 2016 Krunoslav Zaher. All rights reserved. @@ -14,26 +14,20 @@ #endif import UIKit -/** - For more information take a look at `DelegateProxyType`. - */ +/// For more information take a look at `DelegateProxyType`. @available(iOS 8.0, *) public class RxSearchControllerDelegateProxy : DelegateProxy , DelegateProxyType , UISearchControllerDelegate { - /** - For more information take a look at `DelegateProxyType`. - */ + /// For more information take a look at `DelegateProxyType`. public class func setCurrentDelegate(_ delegate: AnyObject?, toObject object: AnyObject) { let searchController: UISearchController = castOrFatalError(object) searchController.delegate = castOptionalOrFatalError(delegate) } - /** - For more information take a look at `DelegateProxyType`. - */ + /// For more information take a look at `DelegateProxyType`. public class func currentDelegateFor(_ object: AnyObject) -> AnyObject? { let searchController: UISearchController = castOrFatalError(object) return searchController.delegate diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/Proxies/RxTabBarDelegateProxy.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/Proxies/RxTabBarDelegateProxy.swift index 931695c3..72f5c76b 100644 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/Proxies/RxTabBarDelegateProxy.swift +++ b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/Proxies/RxTabBarDelegateProxy.swift @@ -1,6 +1,6 @@ // // RxTabBarDelegateProxy.swift -// Rx +// RxCocoa // // Created by Jesse Farless on 5/14/16. // Copyright © 2016 Krunoslav Zaher. All rights reserved. @@ -14,33 +14,25 @@ import UIKit import RxSwift #endif -/** - For more information take a look at `DelegateProxyType`. - */ +/// For more information take a look at `DelegateProxyType`. public class RxTabBarDelegateProxy : DelegateProxy , UITabBarDelegate , DelegateProxyType { - /** - For more information take a look at `DelegateProxyType`. - */ + /// For more information take a look at `DelegateProxyType`. public class func currentDelegateFor(_ object: AnyObject) -> AnyObject? { let tabBar: UITabBar = castOrFatalError(object) return tabBar.delegate } - /** - For more information take a look at `DelegateProxyType`. - */ + /// For more information take a look at `DelegateProxyType`. public class func setCurrentDelegate(_ delegate: AnyObject?, toObject object: AnyObject) { let tabBar: UITabBar = castOrFatalError(object) tabBar.delegate = castOptionalOrFatalError(delegate) } - /** - For more information take a look at `DelegateProxyType`. - */ + /// For more information take a look at `DelegateProxyType`. public override class func createProxyForObject(_ object: AnyObject) -> AnyObject { let tabBar = (object as! UITabBar) diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/Proxies/RxTableViewDataSourceProxy.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/Proxies/RxTableViewDataSourceProxy.swift index 34531c44..d5d56fe9 100644 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/Proxies/RxTableViewDataSourceProxy.swift +++ b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/Proxies/RxTableViewDataSourceProxy.swift @@ -29,26 +29,59 @@ class TableViewDataSourceNotSet } } -/** - For more information take a look at `DelegateProxyType`. - */ +/// For more information take a look at `DelegateProxyType`. public class RxTableViewDataSourceProxy : DelegateProxy , UITableViewDataSource , DelegateProxyType { - /** - Typed parent object. - */ + /// Typed parent object. public weak fileprivate(set) var tableView: UITableView? + + // issue https://github.com/ReactiveX/RxSwift/issues/907 + private var _numberOfObservers = 0 + private var _commitForRowAtSequenceSentMessage: CachedCommitForRowAt? = nil + private var _commitForRowAtSequenceMethodInvoked: CachedCommitForRowAt? = nil + + fileprivate class Counter { + var hasObservers: Bool = false + } - fileprivate weak var _requiredMethodsDataSource: UITableViewDataSource? = tableViewDataSourceNotSet + fileprivate class CachedCommitForRowAt { + let sequence: Observable<[Any]> + let counter: Counter + + var hasObservers: Bool { + return counter.hasObservers + } + + init(sequence: Observable<[Any]>, counter: Counter) { + self.sequence = sequence + self.counter = counter + } + + static func createFor(commitForRowAt: Observable<[Any]>, proxy: RxTableViewDataSourceProxy) -> CachedCommitForRowAt { + let counter = Counter() + + let commitForRowAtSequence = commitForRowAt.do(onSubscribe: { [weak proxy] in + counter.hasObservers = true + proxy?.refreshTableViewDataSource() + }, onDispose: { [weak proxy] in + counter.hasObservers = false + proxy?.refreshTableViewDataSource() + }) + .subscribeOn(MainScheduler()) + .share() + + return CachedCommitForRowAt(sequence: commitForRowAtSequence, counter: counter) + } + } - /** - Initializes `RxTableViewDataSourceProxy` + fileprivate weak var _requiredMethodsDataSource: UITableViewDataSource? = tableViewDataSourceNotSet - - parameter parentObject: Parent object for delegate proxy. - */ + /// Initializes `RxTableViewDataSourceProxy` + /// + /// - parameter parentObject: Parent object for delegate proxy. public required init(parentObject: AnyObject) { self.tableView = (parentObject as! UITableView) super.init(parentObject: parentObject) @@ -56,62 +89,110 @@ public class RxTableViewDataSourceProxy // MARK: delegate - /** - Required delegate method implementation. - */ + /// Required delegate method implementation. public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return (_requiredMethodsDataSource ?? tableViewDataSourceNotSet).tableView(tableView, numberOfRowsInSection: section) } - /** - Required delegate method implementation. - */ + /// Required delegate method implementation. public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { return (_requiredMethodsDataSource ?? tableViewDataSourceNotSet).tableView(tableView, cellForRowAt: indexPath) } // MARK: proxy - /** - For more information take a look at `DelegateProxyType`. - */ + /// For more information take a look at `DelegateProxyType`. public override class func createProxyForObject(_ object: AnyObject) -> AnyObject { let tableView = (object as! UITableView) return castOrFatalError(tableView.createRxDataSourceProxy()) } - /** - For more information take a look at `DelegateProxyType`. - */ + /// For more information take a look at `DelegateProxyType`. public override class func delegateAssociatedObjectTag() -> UnsafeRawPointer { return _pointer(&dataSourceAssociatedTag) } - /** - For more information take a look at `DelegateProxyType`. - */ + /// For more information take a look at `DelegateProxyType`. public class func setCurrentDelegate(_ delegate: AnyObject?, toObject object: AnyObject) { let tableView: UITableView = castOrFatalError(object) tableView.dataSource = castOptionalOrFatalError(delegate) } - /** - For more information take a look at `DelegateProxyType`. - */ + /// For more information take a look at `DelegateProxyType`. public class func currentDelegateFor(_ object: AnyObject) -> AnyObject? { let tableView: UITableView = castOrFatalError(object) return tableView.dataSource } - /** - For more information take a look at `DelegateProxyType`. - */ + /// For more information take a look at `DelegateProxyType`. public override func setForwardToDelegate(_ forwardToDelegate: AnyObject?, retainDelegate: Bool) { let requiredMethodsDataSource: UITableViewDataSource? = castOptionalOrFatalError(forwardToDelegate) _requiredMethodsDataSource = requiredMethodsDataSource ?? tableViewDataSourceNotSet super.setForwardToDelegate(forwardToDelegate, retainDelegate: retainDelegate) } + + override open func methodInvoked(_ selector: Selector) -> Observable<[Any]> { + MainScheduler.ensureExecutingOnScheduler() + + // This is special behavior for commit:forRowAt: + // If proxy data source responds to this selector then table view will show + // swipe to delete option even when nobody is observing. + // https://github.com/ReactiveX/RxSwift/issues/907 + if selector == #selector(UITableViewDataSource.tableView(_:commit:forRowAt:)) { + guard let commitForRowAtSequenceMethodInvoked = _commitForRowAtSequenceMethodInvoked else { + let commitForRowAtSequenceMethodInvoked = CachedCommitForRowAt.createFor(commitForRowAt: super.methodInvoked(selector), proxy: self) + _commitForRowAtSequenceMethodInvoked = commitForRowAtSequenceMethodInvoked + return commitForRowAtSequenceMethodInvoked.sequence + } + + return commitForRowAtSequenceMethodInvoked.sequence + } + + return super.methodInvoked(selector) + } + + override open func sentMessage(_ selector: Selector) -> Observable<[Any]> { + MainScheduler.ensureExecutingOnScheduler() + + // This is special behavior for commit:forRowAt: + // If proxy data source responds to this selector then table view will show + // swipe to delete option even when nobody is observing. + // https://github.com/ReactiveX/RxSwift/issues/907 + if selector == #selector(UITableViewDataSource.tableView(_:commit:forRowAt:)) { + guard let commitForRowAtSequenceSentMessage = _commitForRowAtSequenceSentMessage else { + let commitForRowAtSequenceSentMessage = CachedCommitForRowAt.createFor(commitForRowAt: super.sentMessage(selector), proxy: self) + _commitForRowAtSequenceSentMessage = commitForRowAtSequenceSentMessage + return commitForRowAtSequenceSentMessage.sequence + } + + return commitForRowAtSequenceSentMessage.sequence + } + + return super.sentMessage(selector) + } + + // https://github.com/ReactiveX/RxSwift/issues/907 + private func refreshTableViewDataSource() { + if self.tableView?.dataSource === self { + self.tableView?.dataSource = nil + self.tableView?.dataSource = self + } + } + + override open func responds(to aSelector: Selector!) -> Bool { + // https://github.com/ReactiveX/RxSwift/issues/907 + let commitForRowAtSelector = #selector(UITableViewDataSource.tableView(_:commit:forRowAt:)) + if aSelector == commitForRowAtSelector { + // without `as? UITableViewDataSource` `responds(to:)` fails, 🍻 compiler team + let forwardDelegateResponds = (self.forwardToDelegate() as? UITableViewDataSource)?.responds(to: commitForRowAtSelector) + return (_commitForRowAtSequenceSentMessage?.hasObservers ?? false) + || (_commitForRowAtSequenceMethodInvoked?.hasObservers ?? false) + || (forwardDelegateResponds ?? false) + } + + return super.responds(to: aSelector) + } } #endif diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/Proxies/RxTableViewDelegateProxy.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/Proxies/RxTableViewDelegateProxy.swift index 243f5850..658dce5a 100644 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/Proxies/RxTableViewDelegateProxy.swift +++ b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/Proxies/RxTableViewDelegateProxy.swift @@ -14,28 +14,23 @@ import UIKit import RxSwift #endif -/** - For more information take a look at `DelegateProxyType`. -*/ +/// For more information take a look at `DelegateProxyType`. public class RxTableViewDelegateProxy : RxScrollViewDelegateProxy , UITableViewDelegate { - /** - Typed parent object. - */ + /// Typed parent object. public weak private(set) var tableView: UITableView? - /** - Initializes `RxTableViewDelegateProxy` - - - parameter parentObject: Parent object for delegate proxy. - */ + /// Initializes `RxTableViewDelegateProxy` + /// + /// - parameter parentObject: Parent object for delegate proxy. public required init(parentObject: AnyObject) { self.tableView = (parentObject as! UITableView) super.init(parentObject: parentObject) } + } #endif diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/Proxies/RxTextStorageDelegateProxy.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/Proxies/RxTextStorageDelegateProxy.swift index d546d4cf..dd9f46c0 100644 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/Proxies/RxTextStorageDelegateProxy.swift +++ b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/Proxies/RxTextStorageDelegateProxy.swift @@ -1,6 +1,6 @@ // // RxTextStorageDelegateProxy.swift -// Rx +// RxCocoa // // Created by Segii Shulga on 12/30/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -20,17 +20,13 @@ public class RxTextStorageDelegateProxy , NSTextStorageDelegate { - /** - For more information take a look at `DelegateProxyType`. - */ + /// For more information take a look at `DelegateProxyType`. public class func setCurrentDelegate(_ delegate: AnyObject?, toObject object: AnyObject) { let textStorage: NSTextStorage = castOrFatalError(object) textStorage.delegate = castOptionalOrFatalError(delegate) } - /** - For more information take a look at `DelegateProxyType`. - */ + /// For more information take a look at `DelegateProxyType`. public class func currentDelegateFor(_ object: AnyObject) -> AnyObject? { let textStorage: NSTextStorage = castOrFatalError(object) return textStorage.delegate diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/Proxies/RxTextViewDelegateProxy.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/Proxies/RxTextViewDelegateProxy.swift index 3caf7bac..9e2dbe9b 100644 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/Proxies/RxTextViewDelegateProxy.swift +++ b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/Proxies/RxTextViewDelegateProxy.swift @@ -14,23 +14,17 @@ import UIKit import RxSwift #endif -/** - For more information take a look at `DelegateProxyType`. -*/ +/// For more information take a look at `DelegateProxyType`. public class RxTextViewDelegateProxy : RxScrollViewDelegateProxy , UITextViewDelegate { - /** - Typed parent object. - */ + /// Typed parent object. public weak private(set) var textView: UITextView? - /** - Initializes `RxTextViewDelegateProxy` - - - parameter parentObject: Parent object for delegate proxy. - */ + /// Initializes `RxTextViewDelegateProxy` + /// + /// - parameter parentObject: Parent object for delegate proxy. public required init(parentObject: AnyObject) { self.textView = (parentObject as! UITextView) super.init(parentObject: parentObject) @@ -38,9 +32,7 @@ public class RxTextViewDelegateProxy // MARK: delegate methods - /** - For more information take a look at `DelegateProxyType`. - */ + /// For more information take a look at `DelegateProxyType`. @objc public func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool { /** We've had some issues with observing text changes. This is here just in case we need the same hack in future and that diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UIActivityIndicatorView+Rx.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UIActivityIndicatorView+Rx.swift index 7e19a3a8..03f01685 100644 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UIActivityIndicatorView+Rx.swift +++ b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UIActivityIndicatorView+Rx.swift @@ -1,6 +1,6 @@ // // UIActivityIndicatorView+Rx.swift -// Rx +// RxCocoa // // Created by Ivan Persidskiy on 02/12/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -15,17 +15,15 @@ import RxSwift extension Reactive where Base: UIActivityIndicatorView { - /** - Bindable sink for `startAnimating()`, `stopAnimating()` methods. - */ - public var animating: AnyObserver { + /// Bindable sink for `startAnimating()`, `stopAnimating()` methods. + public var isAnimating: UIBindingObserver { return UIBindingObserver(UIElement: self.base) { activityIndicator, active in if active { activityIndicator.startAnimating() } else { activityIndicator.stopAnimating() } - }.asObserver() + } } } diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UIAlertAction+Rx.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UIAlertAction+Rx.swift index 432b3875..2a743014 100644 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UIAlertAction+Rx.swift +++ b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UIAlertAction+Rx.swift @@ -1,6 +1,6 @@ // // UIAlertAction+Rx.swift -// Rx +// RxCocoa // // Created by Andrew Breckenridge on 5/7/16. // Copyright © 2016 Krunoslav Zaher. All rights reserved. @@ -19,13 +19,11 @@ import RxSwift extension Reactive where Base: UIAlertAction { - /** - Bindable sink for `enabled` property. - */ - public var enabled: AnyObserver { + /// Bindable sink for `enabled` property. + public var isEnabled: UIBindingObserver { return UIBindingObserver(UIElement: self.base) { alertAction, value in alertAction.isEnabled = value - }.asObserver() + } } } diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UIApplication+Rx.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UIApplication+Rx.swift index 08aa5526..6ac12a40 100644 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UIApplication+Rx.swift +++ b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UIApplication+Rx.swift @@ -1,6 +1,6 @@ // // UIApplication+Rx.swift -// RxExample +// RxCocoa // // Created by Mads Bøgeskov on 18/01/16. // Copyright © 2016 Krunoslav Zaher. All rights reserved. @@ -17,13 +17,11 @@ import Foundation extension Reactive where Base: UIApplication { - /** - Bindable sink for `networkActivityIndicatorVisible`. - */ - public var networkActivityIndicatorVisible: AnyObserver { + /// Bindable sink for `networkActivityIndicatorVisible`. + public var isNetworkActivityIndicatorVisible: UIBindingObserver { return UIBindingObserver(UIElement: self.base) { application, active in application.isNetworkActivityIndicatorVisible = active - }.asObserver() + } } } #endif diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UIBarButtonItem+Rx.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UIBarButtonItem+Rx.swift index 45979e4e..e25e3e6d 100644 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UIBarButtonItem+Rx.swift +++ b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UIBarButtonItem+Rx.swift @@ -13,22 +13,18 @@ import UIKit import RxSwift #endif -var rx_tap_key: UInt8 = 0 +fileprivate var rx_tap_key: UInt8 = 0 extension Reactive where Base: UIBarButtonItem { - /** - Bindable sink for `enabled` property. - */ - public var enabled: AnyObserver { + /// Bindable sink for `enabled` property. + public var isEnabled: UIBindingObserver { return UIBindingObserver(UIElement: self.base) { UIElement, value in UIElement.isEnabled = value - }.asObserver() + } } - /** - Reactive wrapper for target action pattern on `self`. - */ + /// Reactive wrapper for target action pattern on `self`. public var tap: ControlEvent { let source = lazyInstanceObservable(&rx_tap_key) { () -> Observable in Observable.create { [weak control = self.base] observer in diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UIButton+Rx.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UIButton+Rx.swift index a308075b..76e31666 100644 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UIButton+Rx.swift +++ b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UIButton+Rx.swift @@ -36,9 +36,7 @@ import UIKit extension Reactive where Base: UIButton { - /** - Reactive wrapper for `PrimaryActionTriggered` control event. - */ + /// Reactive wrapper for `PrimaryActionTriggered` control event. public var primaryAction: ControlEvent { return controlEvent(.primaryActionTriggered) } @@ -56,13 +54,13 @@ extension Reactive where Base: UIButton { import UIKit extension Reactive where Base: UIButton { - /** - Reactive wrapper for `setTitle(_:controlState:)` - */ - public func title(controlState: UIControlState = []) -> AnyObserver { - return UIBindingObserver(UIElement: self.base) { (button, title) -> () in + + /// Reactive wrapper for `setTitle(_:controlState:)` + public func title(for controlState: UIControlState = []) -> UIBindingObserver { + return UIBindingObserver(UIElement: self.base) { (button, title) -> () in button.setTitle(title, for: controlState) - }.asObserver() + } } + } #endif diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UICollectionView+Rx.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UICollectionView+Rx.swift index fa85491d..55980e5c 100644 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UICollectionView+Rx.swift +++ b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UICollectionView+Rx.swift @@ -35,8 +35,8 @@ extension Reactive where Base: UICollectionView { items .bindTo(collectionView.rx.items) { (collectionView, row, element) in - let indexPath = IndexPath(forItem: row, inSection: 0) - let cell = collectionView.dequeueReusableCellWithReuseIdentifier("Cell", forIndexPath: indexPath) as! NumberCell + let indexPath = IndexPath(row: row, section: 0) + let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath) as! NumberCell cell.value?.text = "\(element) @ \(row)" return cell } @@ -126,7 +126,7 @@ extension Reactive where Base: UICollectionView { ]) dataSource.configureCell = { (dataSource, cv, indexPath, element) in - let cell = cv.dequeueReusableCellWithReuseIdentifier("Cell", forIndexPath: indexPath) as! NumberCell + let cell = cv.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath) as! NumberCell cell.value?.text = "\(element) @ row \(indexPath.row)" return cell } @@ -146,7 +146,7 @@ extension Reactive where Base: UICollectionView { // This is called for sideeffects only, and to make sure delegate proxy is in place when // data source is being bound. // This is needed because theoretically the data source subscription itself might - // call `self.rx_delegate`. If that happens, it might cause weird side effects since + // call `self.rx.delegate`. If that happens, it might cause weird side effects since // setting data source will set delegate, and UICollectionView might get into a weird state. // Therefore it's better to set delegate proxy first, just to be sure. _ = self.delegate @@ -163,20 +163,16 @@ extension Reactive where Base: UICollectionView { extension UICollectionView { - /** - Factory method that enables subclasses to implement their own `delegate`. - - - returns: Instance of delegate proxy that wraps `delegate`. - */ + /// Factory method that enables subclasses to implement their own `delegate`. + /// + /// - returns: Instance of delegate proxy that wraps `delegate`. public override func createRxDelegateProxy() -> RxScrollViewDelegateProxy { return RxCollectionViewDelegateProxy(parentObject: self) } - /** - Factory method that enables subclasses to implement their own `rx.dataSource`. - - - returns: Instance of delegate proxy that wraps `dataSource`. - */ + /// Factory method that enables subclasses to implement their own `rx.dataSource`. + /// + /// - returns: Instance of delegate proxy that wraps `dataSource`. public func createRxDataSourceProxy() -> RxCollectionViewDataSourceProxy { return RxCollectionViewDataSourceProxy(parentObject: self) } @@ -185,34 +181,28 @@ extension UICollectionView { extension Reactive where Base: UICollectionView { - /** - Reactive wrapper for `dataSource`. - - For more information take a look at `DelegateProxyType` protocol documentation. - */ + /// Reactive wrapper for `dataSource`. + /// + /// For more information take a look at `DelegateProxyType` protocol documentation. public var dataSource: DelegateProxy { return RxCollectionViewDataSourceProxy.proxyForObject(base) } - /** - Installs data source as forwarding delegate on `rx.dataSource`. - Data source won't be retained. - - It enables using normal delegate mechanism with reactive delegate mechanism. - - - parameter dataSource: Data source object. - - returns: Disposable object that can be used to unbind the data source. - */ + /// Installs data source as forwarding delegate on `rx.dataSource`. + /// Data source won't be retained. + /// + /// It enables using normal delegate mechanism with reactive delegate mechanism. + /// + /// - parameter dataSource: Data source object. + /// - returns: Disposable object that can be used to unbind the data source. public func setDataSource(_ dataSource: UICollectionViewDataSource) -> Disposable { return RxCollectionViewDataSourceProxy.installForwardDelegate(dataSource, retainDelegate: false, onProxyForObject: self.base) } - /** - Reactive wrapper for `delegate` message `collectionView:didSelectItemAtIndexPath:`. - */ + /// Reactive wrapper for `delegate` message `collectionView:didSelectItemAtIndexPath:`. public var itemSelected: ControlEvent { - let source = delegate.observe(#selector(UICollectionViewDelegate.collectionView(_:didSelectItemAt:))) + let source = delegate.methodInvoked(#selector(UICollectionViewDelegate.collectionView(_:didSelectItemAt:))) .map { a in return a[1] as! IndexPath } @@ -220,11 +210,9 @@ extension Reactive where Base: UICollectionView { return ControlEvent(events: source) } - /** - Reactive wrapper for `delegate` message `collectionView:didSelectItemAtIndexPath:`. - */ + /// Reactive wrapper for `delegate` message `collectionView:didSelectItemAtIndexPath:`. public var itemDeselected: ControlEvent { - let source = delegate.observe(#selector(UICollectionViewDelegate.collectionView(_:didDeselectItemAt:))) + let source = delegate.methodInvoked(#selector(UICollectionViewDelegate.collectionView(_:didDeselectItemAt:))) .map { a in return a[1] as! IndexPath } @@ -232,59 +220,53 @@ extension Reactive where Base: UICollectionView { return ControlEvent(events: source) } - /** - Reactive wrapper for `delegate` message `collectionView:didSelectItemAtIndexPath:`. - - It can be only used when one of the `rx.itemsWith*` methods is used to bind observable sequence, - or any other data source conforming to `SectionedViewDataSourceType` protocol. - - ``` - collectionView.rx.modelSelected(MyModel.self) - .map { ... - ``` - */ + /// Reactive wrapper for `delegate` message `collectionView:didSelectItemAtIndexPath:`. + /// + /// It can be only used when one of the `rx.itemsWith*` methods is used to bind observable sequence, + /// or any other data source conforming to `SectionedViewDataSourceType` protocol. + /// + /// ``` + /// collectionView.rx.modelSelected(MyModel.self) + /// .map { ... + /// ``` public func modelSelected(_ modelType: T.Type) -> ControlEvent { let source: Observable = itemSelected.flatMap { [weak view = self.base as UICollectionView] indexPath -> Observable in guard let view = view else { return Observable.empty() } - return Observable.just(try view.rx.model(indexPath)) + return Observable.just(try view.rx.model(at: indexPath)) } return ControlEvent(events: source) } - /** - Reactive wrapper for `delegate` message `collectionView:didSelectItemAtIndexPath:`. - - It can be only used when one of the `rx.itemsWith*` methods is used to bind observable sequence, - or any other data source conforming to `SectionedViewDataSourceType` protocol. - - ``` - collectionView.rx.modelDeselected(MyModel.self) - .map { ... - ``` - */ + /// Reactive wrapper for `delegate` message `collectionView:didSelectItemAtIndexPath:`. + /// + /// It can be only used when one of the `rx.itemsWith*` methods is used to bind observable sequence, + /// or any other data source conforming to `SectionedViewDataSourceType` protocol. + /// + /// ``` + /// collectionView.rx.modelDeselected(MyModel.self) + /// .map { ... + /// ``` public func modelDeselected(_ modelType: T.Type) -> ControlEvent { let source: Observable = itemDeselected.flatMap { [weak view = self.base as UICollectionView] indexPath -> Observable in guard let view = view else { return Observable.empty() } - return Observable.just(try view.rx.model(indexPath)) + return Observable.just(try view.rx.model(at: indexPath)) } return ControlEvent(events: source) } - /** - Syncronous helper method for retrieving a model at indexPath through a reactive data source - */ - public func model(_ indexPath: IndexPath) throws -> T { + /// Syncronous helper method for retrieving a model at indexPath through a reactive data source + public func model(at indexPath: IndexPath) throws -> T { let dataSource: SectionedViewDataSourceType = castOrFatalError(self.dataSource.forwardToDelegate(), message: "This method only works in case one of the `rx.itemsWith*` methods was used.") - let element = try dataSource.model(indexPath) + let element = try dataSource.model(at: indexPath) return element as! T } @@ -295,156 +277,17 @@ extension Reactive where Base: UICollectionView { extension Reactive where Base: UICollectionView { - /** - Reactive wrapper for `delegate` message `collectionView:didUpdateFocusInContext:withAnimationCoordinator:`. - */ + /// Reactive wrapper for `delegate` message `collectionView:didUpdateFocusInContext:withAnimationCoordinator:`. public var didUpdateFocusInContextWithAnimationCoordinator: ControlEvent<(context: UIFocusUpdateContext, animationCoordinator: UIFocusAnimationCoordinator)> { - - let source = delegate.observe(#selector(UICollectionViewDelegate.collectionView(_:didUpdateFocusIn:with:))) + + let source = delegate.methodInvoked(#selector(UICollectionViewDelegate.collectionView(_:didUpdateFocusIn:with:))) .map { a -> (context: UIFocusUpdateContext, animationCoordinator: UIFocusAnimationCoordinator) in let context = a[1] as! UIFocusUpdateContext let animationCoordinator = a[2] as! UIFocusAnimationCoordinator return (context: context, animationCoordinator: animationCoordinator) - } - - return ControlEvent(events: source) - } -} -#endif - -#if os(iOS) || os(tvOS) - -extension UICollectionView { - - /** - Binds sequences of elements to collection view items. - - - parameter cellIdentifier: Identifier used to dequeue cells. - - parameter source: Observable sequence of items. - - parameter configureCell: Transform between sequence elements and view cells. - - parameter cellType: Type of table view cell. - - returns: Disposable object that can be used to unbind. - - Example - - let items = Observable.just([ - 1, - 2, - 3 - ]) - - items - .bindTo(collectionView.rx.items(cellIdentifier: "Cell", cellType: NumberCell.self)) { (row, element, cell) in - cell.value?.text = "\(element) @ \(row)" - } - .addDisposableTo(disposeBag) - */ - @available(*, deprecated, renamed: "rx.items(cellIdentifier:cellType:_:_:)") - public func rx_itemsWithCellIdentifier - (_ cellIdentifier: String, cellType: Cell.Type = Cell.self) - -> (_ source: O) - -> (_ configureCell: @escaping (Int, S.Iterator.Element, Cell) -> Void) - -> Disposable where O.E == S { - return { source in - return { configureCell in - return self.rx.items(cellIdentifier: cellIdentifier, cellType: cellType)(source)(configureCell) } - } - } - - /** - Binds sequences of elements to collection view items. - - - parameter source: Observable sequence of items. - - parameter cellFactory: Transform between sequence elements and view cells. - - returns: Disposable object that can be used to unbind. - - Example - - let items = Observable.just([ - 1, - 2, - 3 - ]) - - items - .bindTo(collectionView.rx.items) { (collectionView, row, element) in - let indexPath = IndexPath(forItem: row, inSection: 0) - let cell = collectionView.dequeueReusableCellWithReuseIdentifier("Cell", forIndexPath: indexPath) as! NumberCell - cell.value?.text = "\(element) @ \(row)" - return cell - } - .addDisposableTo(disposeBag) - */ - @available(*, deprecated, renamed: "rx.items(_:_:)") - public func rx_itemsWithCellFactory - (_ source: O) - -> (_ cellFactory: @escaping (UICollectionView, Int, S.Iterator.Element) -> UICollectionViewCell) - -> Disposable where O.E == S { - return { cellFactory in - return self.rx.items(source)(cellFactory) - } - } - - /** - Binds sequences of elements to collection view items using a custom reactive data used to perform the transformation. - - - parameter dataSource: Data source used to transform elements to view cells. - - parameter source: Observable sequence of items. - - returns: Disposable object that can be used to unbind. - - Example - - let dataSource = RxCollectionViewSectionedReloadDataSource>() - - let items = Observable.just([ - SectionModel(model: "First section", items: [ - 1.0, - 2.0, - 3.0 - ]), - SectionModel(model: "Second section", items: [ - 1.0, - 2.0, - 3.0 - ]), - SectionModel(model: "Third section", items: [ - 1.0, - 2.0, - 3.0 - ]) - ]) - - dataSource.configureCell = { (dataSource, cv, indexPath, element) in - let cell = cv.dequeueReusableCellWithReuseIdentifier("Cell", forIndexPath: indexPath) as! NumberCell - cell.value?.text = "\(element) @ row \(indexPath.row)" - return cell - } - - items - .bindTo(collectionView.rx.items(dataSource: dataSource)) - .addDisposableTo(disposeBag) - */ - @available(*, deprecated, renamed: "rx.items(dataSource:_:)") - public func rx_itemsWithDataSource< - DataSource: RxCollectionViewDataSourceType & UICollectionViewDataSource, - O: ObservableType> - (_ dataSource: DataSource) - -> (_ source: O) - -> Disposable where DataSource.Element == O.E - { - return { source in - return self.rx.items(dataSource: dataSource)(source) - } - } - - /** - Syncronous helper method for retrieving a model at indexPath through a reactive data source - */ - @available(*, deprecated, renamed: "rx.model(_:)") - public func model(_ indexPath: IndexPath) throws -> T { - return try self.rx.model(indexPath) + return ControlEvent(events: source) } } #endif diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UIControl+Rx.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UIControl+Rx.swift index 2f9c45ac..551a97a7 100644 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UIControl+Rx.swift +++ b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UIControl+Rx.swift @@ -16,29 +16,23 @@ import UIKit extension Reactive where Base: UIControl { - /** - Bindable sink for `enabled` property. - */ - public var enabled: AnyObserver { + /// Bindable sink for `enabled` property. + public var isEnabled: UIBindingObserver { return UIBindingObserver(UIElement: self.base) { control, value in control.isEnabled = value - }.asObserver() + } } - /** - Bindable sink for `selected` property. - */ - public var selected: AnyObserver { + /// Bindable sink for `selected` property. + public var isSelected: UIBindingObserver { return UIBindingObserver(UIElement: self.base) { control, selected in control.isSelected = selected - }.asObserver() + } } - /** - Reactive wrapper for target action pattern. - - - parameter controlEvents: Filter for observed event types. - */ + /// Reactive wrapper for target action pattern. + /// + /// - parameter controlEvents: Filter for observed event types. public func controlEvent(_ controlEvents: UIControlEvents) -> ControlEvent { let source: Observable = Observable.create { [weak control = self.base] observer in MainScheduler.ensureExecutingOnScheduler() @@ -59,11 +53,9 @@ extension Reactive where Base: UIControl { return ControlEvent(events: source) } - /** - You might be wondering why the ugly `as!` casts etc, well, for some reason if - Swift compiler knows C is UIControl type and optimizations are turned on, it will crash. - */ - static func value(_ control: C, getter: @escaping (C) -> T, setter: @escaping (C, T) -> Void) -> ControlProperty { + /// You might be wondering why the ugly `as!` casts etc, well, for some reason if + /// Swift compiler knows C is UIControl type and optimizations are turned on, it will crash. + static func value(_ control: C, getter: @escaping (C) -> T, setter: @escaping (C, T) -> Void) -> ControlProperty { let source: Observable = Observable.create { [weak weakControl = control] observer in guard let control = weakControl else { observer.on(.completed) diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UIDatePicker+Rx.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UIDatePicker+Rx.swift index 35f1b2ea..e73c8beb 100644 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UIDatePicker+Rx.swift +++ b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UIDatePicker+Rx.swift @@ -16,11 +16,9 @@ import UIKit extension Reactive where Base: UIDatePicker { - /** - Reactive wrapper for `date` property. - */ + /// Reactive wrapper for `date` property. public var date: ControlProperty { - return Reactive.value( + return UIControl.rx.value( self.base, getter: { datePicker in datePicker.date diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UIGestureRecognizer+Rx.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UIGestureRecognizer+Rx.swift index 2493e4e4..076aa652 100644 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UIGestureRecognizer+Rx.swift +++ b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UIGestureRecognizer+Rx.swift @@ -1,6 +1,6 @@ // // UIGestureRecognizer+Rx.swift -// Touches +// RxCocoa // // Created by Carlos García on 10/6/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -53,9 +53,7 @@ class GestureTarget: RxTarget { extension Reactive where Base: UIGestureRecognizer { - /** - Reactive wrapper for gesture recognizer events. - */ + /// Reactive wrapper for gesture recognizer events. public var event: ControlEvent { let source: Observable = Observable.create { [weak control = self.base] observer in MainScheduler.ensureExecutingOnScheduler() diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UIImageView+Rx.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UIImageView+Rx.swift index 495cc25d..7dc7178a 100644 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UIImageView+Rx.swift +++ b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UIImageView+Rx.swift @@ -16,43 +16,15 @@ import UIKit extension Reactive where Base: UIImageView { - /** - Bindable sink for `image` property. - */ - public var image: AnyObserver { + /// Bindable sink for `image` property. + public var image: UIBindingObserver { return image(transitionType: nil) } - /** - Bindable sink for `image` property. - - - parameter transitionType: Optional transition type while setting the image (kCATransitionFade, kCATransitionMoveIn, ...) - */ - @available(*, deprecated, renamed: "image(transitionType:)") - public func imageAnimated(_ transitionType: String?) -> AnyObserver { - return UIBindingObserver(UIElement: base) { imageView, image in - if let transitionType = transitionType { - if image != nil { - let transition = CATransition() - transition.duration = 0.25 - transition.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut) - transition.type = transitionType - imageView.layer.add(transition, forKey: kCATransition) - } - } - else { - imageView.layer.removeAllAnimations() - } - imageView.image = image - }.asObserver() - } - - /** - Bindable sink for `image` property. + /// Bindable sink for `image` property. - - parameter transitionType: Optional transition type while setting the image (kCATransitionFade, kCATransitionMoveIn, ...) - */ - public func image(transitionType: String? = nil) -> AnyObserver { + /// - parameter transitionType: Optional transition type while setting the image (kCATransitionFade, kCATransitionMoveIn, ...) + public func image(transitionType: String? = nil) -> UIBindingObserver { return UIBindingObserver(UIElement: base) { imageView, image in if let transitionType = transitionType { if image != nil { @@ -67,7 +39,7 @@ extension Reactive where Base: UIImageView { imageView.layer.removeAllAnimations() } imageView.image = image - }.asObserver() + } } } diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UILabel+Rx.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UILabel+Rx.swift index 2b8c880e..2bfc2358 100644 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UILabel+Rx.swift +++ b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UILabel+Rx.swift @@ -16,22 +16,18 @@ import UIKit extension Reactive where Base: UILabel { - /** - Bindable sink for `text` property. - */ - public var text: AnyObserver { + /// Bindable sink for `text` property. + public var text: UIBindingObserver { return UIBindingObserver(UIElement: self.base) { label, text in label.text = text - }.asObserver() + } } - /** - Bindable sink for `attributedText` property. - */ - public var attributedText: AnyObserver { + /// Bindable sink for `attributedText` property. + public var attributedText: UIBindingObserver { return UIBindingObserver(UIElement: self.base) { label, text in label.attributedText = text - }.asObserver() + } } } diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UINavigationItem+Rx.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UINavigationItem+Rx.swift index 3552d9f7..ddd97567 100644 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UINavigationItem+Rx.swift +++ b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UINavigationItem+Rx.swift @@ -1,6 +1,6 @@ // // UINavigationItem+Rx.swift -// Rx +// RxCocoa // // Created by kumapo on 2016/05/09. // Copyright © 2016 Krunoslav Zaher. All rights reserved. @@ -15,13 +15,12 @@ import RxSwift #endif extension Reactive where Base: UINavigationItem { - /** - Bindable sink for `title` property. - */ - public var title: AnyObserver { + + /// Bindable sink for `title` property. + public var title: UIBindingObserver { return UIBindingObserver(UIElement: self.base) { navigationItem, text in navigationItem.title = text - }.asObserver() + } } } diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UIPageControl+Rx.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UIPageControl+Rx.swift index 8323994a..b6339458 100644 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UIPageControl+Rx.swift +++ b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UIPageControl+Rx.swift @@ -1,6 +1,6 @@ // // UIPageControl+Rx.swift -// Rx +// RxCocoa // // Created by Francesco Puntillo on 14/04/2016. // Copyright © 2016 Krunoslav Zaher. All rights reserved. @@ -16,13 +16,11 @@ import UIKit extension Reactive where Base: UIPageControl { - /** - Bindable sink for `currentPage` property. - */ - public var currentPage: AnyObserver { + /// Bindable sink for `currentPage` property. + public var currentPage: UIBindingObserver { return UIBindingObserver(UIElement: self.base) { controller, page in controller.currentPage = page - }.asObserver() + } } } diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UIPickerView+Rx.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UIPickerView+Rx.swift index 3022d2b4..b40cdd72 100644 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UIPickerView+Rx.swift +++ b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UIPickerView+Rx.swift @@ -1,6 +1,6 @@ // // UIPickerView+Rx.swift -// Rx +// RxCocoa // // Created by Segii Shulga on 5/12/16. // Copyright © 2016 Krunoslav Zaher. All rights reserved. @@ -15,17 +15,16 @@ import UIKit extension Reactive where Base: UIPickerView { - /** - Reactive wrapper for `delegate`. - For more information take a look at `DelegateProxyType` protocol documentation. - */ + + /// Reactive wrapper for `delegate`. + /// For more information take a look at `DelegateProxyType` protocol documentation. public var delegate: DelegateProxy { return RxPickerViewDelegateProxy.proxyForObject(base) } public var itemSelected: ControlEvent<(Int, Int)> { let source = delegate - .observe(#selector(UIPickerViewDelegate.pickerView(_:didSelectRow:inComponent:))) + .methodInvoked(#selector(UIPickerViewDelegate.pickerView(_:didSelectRow:inComponent:))) .map { return (try castOrThrow(Int.self, $0[1]), try castOrThrow(Int.self, $0[2])) } diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UIProgressView+Rx.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UIProgressView+Rx.swift index 26f70cc8..6573c0d5 100644 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UIProgressView+Rx.swift +++ b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UIProgressView+Rx.swift @@ -1,6 +1,6 @@ // // UIProgressView+Rx.swift -// Rx +// RxCocoa // // Created by Samuel Bae on 2/27/16. // Copyright © 2016 Krunoslav Zaher. All rights reserved. @@ -16,13 +16,11 @@ import UIKit extension Reactive where Base: UIProgressView { - /** - Bindable sink for `progress` property - */ - public var progress: AnyObserver { + /// Bindable sink for `progress` property + public var progress: UIBindingObserver { return UIBindingObserver(UIElement: self.base) { progressView, progress in progressView.progress = progress - }.asObserver() + } } } diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UIRefreshControl+Rx.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UIRefreshControl+Rx.swift index 69b54dc9..1b97e672 100644 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UIRefreshControl+Rx.swift +++ b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UIRefreshControl+Rx.swift @@ -15,17 +15,15 @@ import RxSwift extension Reactive where Base: UIRefreshControl { - /** - Bindable sink for `beginRefreshing()`, `endRefreshing()` methods. - */ - public var refreshing: AnyObserver { + /// Bindable sink for `beginRefreshing()`, `endRefreshing()` methods. + public var refreshing: UIBindingObserver { return UIBindingObserver(UIElement: self.base) { refreshControl, refresh in if refresh { refreshControl.beginRefreshing() } else { refreshControl.endRefreshing() } - }.asObserver() + } } } diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UIScrollView+Rx.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UIScrollView+Rx.swift index a7f798db..99dd57c8 100644 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UIScrollView+Rx.swift +++ b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UIScrollView+Rx.swift @@ -16,11 +16,9 @@ import UIKit extension UIScrollView { - /** - Factory method that enables subclasses to implement their own `delegate`. - - - returns: Instance of delegate proxy that wraps `delegate`. - */ + /// Factory method that enables subclasses to implement their own `delegate`. + /// + /// - returns: Instance of delegate proxy that wraps `delegate`. public func createRxDelegateProxy() -> RxScrollViewDelegateProxy { return RxScrollViewDelegateProxy(parentObject: self) } @@ -29,18 +27,14 @@ extension UIScrollView { extension Reactive where Base: UIScrollView { - /** - Reactive wrapper for `delegate`. - - For more information take a look at `DelegateProxyType` protocol documentation. - */ + /// Reactive wrapper for `delegate`. + /// + /// For more information take a look at `DelegateProxyType` protocol documentation. public var delegate: DelegateProxy { return RxScrollViewDelegateProxy.proxyForObject(base) } - /** - Reactive wrapper for `contentOffset`. - */ + /// Reactive wrapper for `contentOffset`. public var contentOffset: ControlProperty { let proxy = RxScrollViewDelegateProxy.proxyForObject(base) @@ -51,24 +45,20 @@ extension Reactive where Base: UIScrollView { return ControlProperty(values: proxy.contentOffsetSubject, valueSink: bindingObserver) } - /** - Bindable sink for `scrollEnabled` property. - */ - public var scrollEnabled: AnyObserver { + /// Bindable sink for `scrollEnabled` property. + public var isScrollEnabled: UIBindingObserver { return UIBindingObserver(UIElement: self.base) { scrollView, scrollEnabled in scrollView.isScrollEnabled = scrollEnabled - }.asObserver() + } } - /** - Installs delegate as forwarding delegate on `delegate`. - Delegate won't be retained. - - It enables using normal delegate mechanism with reactive delegate mechanism. - - - parameter delegate: Delegate object. - - returns: Disposable object that can be used to unbind the delegate. - */ + /// Installs delegate as forwarding delegate on `delegate`. + /// Delegate won't be retained. + /// + /// It enables using normal delegate mechanism with reactive delegate mechanism. + /// + /// - parameter delegate: Delegate object. + /// - returns: Disposable object that can be used to unbind the delegate. public func setDelegate(_ delegate: UIScrollViewDelegate) -> Disposable { return RxScrollViewDelegateProxy.installForwardDelegate(delegate, retainDelegate: false, onProxyForObject: self.base) diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UISearchBar+Rx.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UISearchBar+Rx.swift index 30e66077..1160f2dc 100644 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UISearchBar+Rx.swift +++ b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UISearchBar+Rx.swift @@ -17,11 +17,9 @@ import UIKit #if os(iOS) extension UISearchBar { - /** - Factory method that enables subclasses to implement their own `delegate`. - - - returns: Instance of delegate proxy that wraps `delegate`. - */ + /// Factory method that enables subclasses to implement their own `delegate`. + /// + /// - returns: Instance of delegate proxy that wraps `delegate`. public func createRxDelegateProxy() -> RxSearchBarDelegateProxy { return RxSearchBarDelegateProxy(parentObject: self) } @@ -31,44 +29,38 @@ import UIKit extension Reactive where Base: UISearchBar { - /** - Reactive wrapper for `delegate`. - - For more information take a look at `DelegateProxyType` protocol documentation. - */ + /// Reactive wrapper for `delegate`. + /// + /// For more information take a look at `DelegateProxyType` protocol documentation. public var delegate: DelegateProxy { return RxSearchBarDelegateProxy.proxyForObject(base) } - /** - Reactive wrapper for `text` property. - */ - public var text: ControlProperty { - let source: Observable = Observable.deferred { [weak searchBar = self.base as UISearchBar] () -> Observable in - let text = searchBar?.text ?? "" + /// Reactive wrapper for `text` property. + public var text: ControlProperty { + let source: Observable = Observable.deferred { [weak searchBar = self.base as UISearchBar] () -> Observable in + let text = searchBar?.text - return (searchBar?.rx.delegate.observe(#selector(UISearchBarDelegate.searchBar(_:textDidChange:))) ?? Observable.empty()) + return (searchBar?.rx.delegate.methodInvoked(#selector(UISearchBarDelegate.searchBar(_:textDidChange:))) ?? Observable.empty()) .map { a in - return a[1] as? String ?? "" + return a[1] as? String } .startWith(text) } - let bindingObserver = UIBindingObserver(UIElement: self.base) { (searchBar, text: String) in + let bindingObserver = UIBindingObserver(UIElement: self.base) { (searchBar, text: String?) in searchBar.text = text } return ControlProperty(values: source, valueSink: bindingObserver) } - /** - Reactive wrapper for `selectedScopeButtonIndex` property. - */ + /// Reactive wrapper for `selectedScopeButtonIndex` property. public var selectedScopeButtonIndex: ControlProperty { let source: Observable = Observable.deferred { [weak source = self.base as UISearchBar] () -> Observable in let index = source?.selectedScopeButtonIndex ?? 0 - return (source?.rx.delegate.observe(#selector(UISearchBarDelegate.searchBar(_:selectedScopeButtonIndexDidChange:))) ?? Observable.empty()) + return (source?.rx.delegate.methodInvoked(#selector(UISearchBarDelegate.searchBar(_:selectedScopeButtonIndexDidChange:))) ?? Observable.empty()) .map { a in return try castOrThrow(Int.self, a[1]) } @@ -83,33 +75,27 @@ extension Reactive where Base: UISearchBar { } #if os(iOS) - /** - Reactive wrapper for delegate method `searchBarCancelButtonClicked`. - */ + /// Reactive wrapper for delegate method `searchBarCancelButtonClicked`. public var cancelButtonClicked: ControlEvent { - let source: Observable = self.delegate.observe(#selector(UISearchBarDelegate.searchBarCancelButtonClicked(_:))) + let source: Observable = self.delegate.methodInvoked(#selector(UISearchBarDelegate.searchBarCancelButtonClicked(_:))) .map { _ in return () } return ControlEvent(events: source) } - /** - Reactive wrapper for delegate method `searchBarBookmarkButtonClicked`. - */ + /// Reactive wrapper for delegate method `searchBarBookmarkButtonClicked`. public var bookmarkButtonClicked: ControlEvent { - let source: Observable = self.delegate.observe(#selector(UISearchBarDelegate.searchBarBookmarkButtonClicked(_:))) + let source: Observable = self.delegate.methodInvoked(#selector(UISearchBarDelegate.searchBarBookmarkButtonClicked(_:))) .map { _ in return () } return ControlEvent(events: source) } - /** - Reactive wrapper for delegate method `searchBarResultsListButtonClicked`. - */ + /// Reactive wrapper for delegate method `searchBarResultsListButtonClicked`. public var resultsListButtonClicked: ControlEvent { - let source: Observable = self.delegate.observe(#selector(UISearchBarDelegate.searchBarResultsListButtonClicked(_:))) + let source: Observable = self.delegate.methodInvoked(#selector(UISearchBarDelegate.searchBarResultsListButtonClicked(_:))) .map { _ in return () } @@ -117,33 +103,27 @@ extension Reactive where Base: UISearchBar { } #endif - /** - Reactive wrapper for delegate method `searchBarSearchButtonClicked`. - */ + /// Reactive wrapper for delegate method `searchBarSearchButtonClicked`. public var searchButtonClicked: ControlEvent { - let source: Observable = self.delegate.observe(#selector(UISearchBarDelegate.searchBarSearchButtonClicked(_:))) + let source: Observable = self.delegate.methodInvoked(#selector(UISearchBarDelegate.searchBarSearchButtonClicked(_:))) .map { _ in return () } return ControlEvent(events: source) } - /** - Reactive wrapper for delegate method `searchBarTextDidBeginEditing`. - */ + /// Reactive wrapper for delegate method `searchBarTextDidBeginEditing`. public var textDidBeginEditing: ControlEvent { - let source: Observable = self.delegate.observe(#selector(UISearchBarDelegate.searchBarTextDidBeginEditing(_:))) + let source: Observable = self.delegate.methodInvoked(#selector(UISearchBarDelegate.searchBarTextDidBeginEditing(_:))) .map { _ in return () } return ControlEvent(events: source) } - /** - Reactive wrapper for delegate method `searchBarTextDidEndEditing`. - */ + /// Reactive wrapper for delegate method `searchBarTextDidEndEditing`. public var textDidEndEditing: ControlEvent { - let source: Observable = self.delegate.observe(#selector(UISearchBarDelegate.searchBarTextDidEndEditing(_:))) + let source: Observable = self.delegate.methodInvoked(#selector(UISearchBarDelegate.searchBarTextDidEndEditing(_:))) .map { _ in return () } diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UISearchController+Rx.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UISearchController+Rx.swift index 2aa01d52..650e75f2 100644 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UISearchController+Rx.swift +++ b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UISearchController+Rx.swift @@ -1,6 +1,6 @@ // // UISearchController+Rx.swift -// Rx +// RxCocoa // // Created by Segii Shulga on 3/17/16. // Copyright © 2016 Krunoslav Zaher. All rights reserved. @@ -18,51 +18,44 @@ import Foundation @available(iOS 8.0, *) extension Reactive where Base: UISearchController { - /** - Reactive wrapper for `delegate`. - For more information take a look at `DelegateProxyType` protocol documentation. - */ + /// Reactive wrapper for `delegate`. + /// For more information take a look at `DelegateProxyType` protocol documentation. public var delegate: DelegateProxy { return RxSearchControllerDelegateProxy.proxyForObject(base) } - /** - Reactive wrapper for `delegate` message. - */ + + /// Reactive wrapper for `delegate` message. public var didDismiss: Observable { return delegate - .observe( #selector(UISearchControllerDelegate.didDismissSearchController(_:))) + .methodInvoked( #selector(UISearchControllerDelegate.didDismissSearchController(_:))) .map {_ in} } - /** - Reactive wrapper for `delegate` message. - */ + + /// Reactive wrapper for `delegate` message. public var didPresent: Observable { return delegate - .observe(#selector(UISearchControllerDelegate.didPresentSearchController(_:))) + .methodInvoked(#selector(UISearchControllerDelegate.didPresentSearchController(_:))) .map {_ in} } - /** - Reactive wrapper for `delegate` message. - */ + + /// Reactive wrapper for `delegate` message. public var present: Observable { return delegate - .observe( #selector(UISearchControllerDelegate.presentSearchController(_:))) + .methodInvoked( #selector(UISearchControllerDelegate.presentSearchController(_:))) .map {_ in} } - /** - Reactive wrapper for `delegate` message. - */ + + /// Reactive wrapper for `delegate` message. public var willDismiss: Observable { return delegate - .observe(#selector(UISearchControllerDelegate.willDismissSearchController(_:))) + .methodInvoked(#selector(UISearchControllerDelegate.willDismissSearchController(_:))) .map {_ in} } - /** - Reactive wrapper for `delegate` message. - */ + + /// Reactive wrapper for `delegate` message. public var willPresent: Observable { return delegate - .observe( #selector(UISearchControllerDelegate.willPresentSearchController(_:))) + .methodInvoked( #selector(UISearchControllerDelegate.willPresentSearchController(_:))) .map {_ in} } diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UISegmentedControl+Rx.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UISegmentedControl+Rx.swift index f4cdf41b..4b783ec2 100644 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UISegmentedControl+Rx.swift +++ b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UISegmentedControl+Rx.swift @@ -16,11 +16,9 @@ import RxSwift extension Reactive where Base: UISegmentedControl { - /** - Reactive wrapper for `selectedSegmentIndex` property. - */ + /// Reactive wrapper for `selectedSegmentIndex` property. public var value: ControlProperty { - return Reactive.value( + return UIControl.rx.value( self.base, getter: { segmentedControl in segmentedControl.selectedSegmentIndex diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UISlider+Rx.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UISlider+Rx.swift index 2081b7e0..c20be964 100644 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UISlider+Rx.swift +++ b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UISlider+Rx.swift @@ -16,11 +16,9 @@ import UIKit extension Reactive where Base: UISlider { - /** - Reactive wrapper for `value` property. - */ + /// Reactive wrapper for `value` property. public var value: ControlProperty { - return Reactive.value( + return UIControl.rx.value( self.base, getter: { slider in slider.value diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UIStepper+Rx.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UIStepper+Rx.swift index 129d3714..4bff4a6f 100644 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UIStepper+Rx.swift +++ b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UIStepper+Rx.swift @@ -16,11 +16,9 @@ import RxSwift extension Reactive where Base: UIStepper { - /** - Reactive wrapper for `value` property. - */ + /// Reactive wrapper for `value` property. public var value: ControlProperty { - return Reactive.value( + return UIControl.rx.value( self.base, getter: { stepper in stepper.value diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UISwitch+Rx.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UISwitch+Rx.swift index a5e4b19f..995b8867 100644 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UISwitch+Rx.swift +++ b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UISwitch+Rx.swift @@ -24,7 +24,7 @@ extension Reactive where Base: UISwitch { to UISwitch.⚠️** */ public var value: ControlProperty { - return Reactive.value( + return UIControl.rx.value( self.base, getter: { uiSwitch in uiSwitch.isOn diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UITabBar+Rx.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UITabBar+Rx.swift index 250c09a6..f5a5e71d 100644 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UITabBar+Rx.swift +++ b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UITabBar+Rx.swift @@ -1,6 +1,6 @@ // // UITabBar+Rx.swift -// Rx +// RxCocoa // // Created by Jesse Farless on 5/13/16. // Copyright © 2016 Krunoslav Zaher. All rights reserved. @@ -20,12 +20,10 @@ import RxSwift #if os(iOS) extension Reactive where Base: UITabBar { - /** - Reactive wrapper for `delegate` message `tabBar:willBeginCustomizingItems:`. - */ + /// Reactive wrapper for `delegate` message `tabBar:willBeginCustomizingItems:`. public var willBeginCustomizing: ControlEvent<[UITabBarItem]> { - let source = delegate.observe(#selector(UITabBarDelegate.tabBar(_:willBeginCustomizing:))) + let source = delegate.methodInvoked(#selector(UITabBarDelegate.tabBar(_:willBeginCustomizing:))) .map { a in return try castOrThrow([UITabBarItem].self, a[1]) } @@ -33,11 +31,9 @@ extension Reactive where Base: UITabBar { return ControlEvent(events: source) } - /** - Reactive wrapper for `delegate` message `tabBar:didBeginCustomizingItems:`. - */ + /// Reactive wrapper for `delegate` message `tabBar:didBeginCustomizingItems:`. public var didBeginCustomizing: ControlEvent<[UITabBarItem]> { - let source = delegate.observe(#selector(UITabBarDelegate.tabBar(_:didBeginCustomizing:))) + let source = delegate.methodInvoked(#selector(UITabBarDelegate.tabBar(_:didBeginCustomizing:))) .map { a in return try castOrThrow([UITabBarItem].self, a[1]) } @@ -45,12 +41,10 @@ extension Reactive where Base: UITabBar { return ControlEvent(events: source) } - /** - Reactive wrapper for `delegate` message `tabBar:willEndCustomizingItems:changed:`. - */ + /// Reactive wrapper for `delegate` message `tabBar:willEndCustomizingItems:changed:`. public var willEndCustomizing: ControlEvent<([UITabBarItem], Bool)> { - let source = delegate.observe(#selector(UITabBarDelegate.tabBar(_:willEndCustomizing:changed:))) - .map { (a: [AnyObject]) -> (([UITabBarItem], Bool)) in + let source = delegate.methodInvoked(#selector(UITabBarDelegate.tabBar(_:willEndCustomizing:changed:))) + .map { (a: [Any]) -> (([UITabBarItem], Bool)) in let items = try castOrThrow([UITabBarItem].self, a[1]) let changed = try castOrThrow(Bool.self, a[2]) return (items, changed) @@ -59,12 +53,10 @@ extension Reactive where Base: UITabBar { return ControlEvent(events: source) } - /** - Reactive wrapper for `delegate` message `tabBar:didEndCustomizingItems:changed:`. - */ + /// Reactive wrapper for `delegate` message `tabBar:didEndCustomizingItems:changed:`. public var didEndCustomizing: ControlEvent<([UITabBarItem], Bool)> { - let source = delegate.observe(#selector(UITabBarDelegate.tabBar(_:didEndCustomizing:changed:))) - .map { (a: [AnyObject]) -> (([UITabBarItem], Bool)) in + let source = delegate.methodInvoked(#selector(UITabBarDelegate.tabBar(_:didEndCustomizing:changed:))) + .map { (a: [Any]) -> (([UITabBarItem], Bool)) in let items = try castOrThrow([UITabBarItem].self, a[1]) let changed = try castOrThrow(Bool.self, a[2]) return (items, changed) @@ -81,11 +73,9 @@ extension Reactive where Base: UITabBar { */ extension UITabBar { - /** - Factory method that enables subclasses to implement their own `delegate`. - - - returns: Instance of delegate proxy that wraps `delegate`. - */ + /// Factory method that enables subclasses to implement their own `delegate`. + /// + /// - returns: Instance of delegate proxy that wraps `delegate`. public func createRxDelegateProxy() -> RxTabBarDelegateProxy { return RxTabBarDelegateProxy(parentObject: self) } @@ -93,20 +83,16 @@ extension UITabBar { } extension Reactive where Base: UITabBar { - /** - Reactive wrapper for `delegate`. - - For more information take a look at `DelegateProxyType` protocol documentation. - */ + /// Reactive wrapper for `delegate`. + /// + /// For more information take a look at `DelegateProxyType` protocol documentation. public var delegate: DelegateProxy { return RxTabBarDelegateProxy.proxyForObject(base) } - /** - Reactive wrapper for `delegate` message `tabBar:didSelectItem:`. - */ + /// Reactive wrapper for `delegate` message `tabBar:didSelectItem:`. public var didSelectItem: ControlEvent { - let source = delegate.observe(#selector(UITabBarDelegate.tabBar(_:didSelect:))) + let source = delegate.methodInvoked(#selector(UITabBarDelegate.tabBar(_:didSelect:))) .map { a in return try castOrThrow(UITabBarItem.self, a[1]) } diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UITabBarItem+Rx.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UITabBarItem+Rx.swift index fc170ada..6c151734 100644 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UITabBarItem+Rx.swift +++ b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UITabBarItem+Rx.swift @@ -1,6 +1,6 @@ // // UITabBarItem+Rx.swift -// Rx +// RxCocoa // // Created by Mateusz Derks on 04/03/16. // Copyright © 2016 Krunoslav Zaher. All rights reserved. @@ -16,13 +16,11 @@ extension Reactive where Base: UITabBarItem { - /** - Bindable sink for `badgeValue` property. - */ - public var badgeValue: AnyObserver { + /// Bindable sink for `badgeValue` property. + public var badgeValue: UIBindingObserver { return UIBindingObserver(UIElement: self.base) { tabBarItem, badgeValue in tabBarItem.badgeValue = badgeValue - }.asObserver() + } } } diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UITableView+Rx.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UITableView+Rx.swift index fa59c82a..69488d19 100644 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UITableView+Rx.swift +++ b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UITableView+Rx.swift @@ -35,7 +35,7 @@ extension Reactive where Base: UITableView { items .bindTo(tableView.rx.items) { (tableView, row, element) in - let cell = tableView.dequeueReusableCellWithIdentifier("Cell")! + let cell = tableView.dequeueReusableCell(withIdentifier: "Cell")! cell.textLabel?.text = "\(element) @ row \(row)" return cell } @@ -130,7 +130,7 @@ extension Reactive where Base: UITableView { ]) dataSource.configureCell = { (dataSource, tv, indexPath, element) in - let cell = tv.dequeueReusableCellWithIdentifier("Cell")! + let cell = tv.dequeueReusableCell(withIdentifier: "Cell")! cell.textLabel?.text = "\(element) @ row \(indexPath.row)" return cell } @@ -150,7 +150,7 @@ extension Reactive where Base: UITableView { // This is called for sideeffects only, and to make sure delegate proxy is in place when // data source is being bound. // This is needed because theoretically the data source subscription itself might - // call `self.rx_delegate`. If that happens, it might cause weird side effects since + // call `self.rx.delegate`. If that happens, it might cause weird side effects since // setting data source will set delegate, and UITableView might get into a weird state. // Therefore it's better to set delegate proxy first, just to be sure. _ = self.delegate @@ -218,7 +218,7 @@ extension Reactive where Base: UITableView { Reactive wrapper for `delegate` message `tableView:didSelectRowAtIndexPath:`. */ public var itemSelected: ControlEvent { - let source = self.delegate.observe(#selector(UITableViewDelegate.tableView(_:didSelectRowAt:))) + let source = self.delegate.methodInvoked(#selector(UITableViewDelegate.tableView(_:didSelectRowAt:))) .map { a in return try castOrThrow(IndexPath.self, a[1]) } @@ -230,7 +230,7 @@ extension Reactive where Base: UITableView { Reactive wrapper for `delegate` message `tableView:didDeselectRowAtIndexPath:`. */ public var itemDeselected: ControlEvent { - let source = self.delegate.observe(#selector(UITableViewDelegate.tableView(_:didDeselectRowAt:))) + let source = self.delegate.methodInvoked(#selector(UITableViewDelegate.tableView(_:didDeselectRowAt:))) .map { a in return try castOrThrow(IndexPath.self, a[1]) } @@ -242,7 +242,7 @@ extension Reactive where Base: UITableView { Reactive wrapper for `delegate` message `tableView:accessoryButtonTappedForRowWithIndexPath:`. */ public var itemAccessoryButtonTapped: ControlEvent { - let source: Observable = self.delegate.observe(#selector(UITableViewDelegate.tableView(_:accessoryButtonTappedForRowWith:))) + let source: Observable = self.delegate.methodInvoked(#selector(UITableViewDelegate.tableView(_:accessoryButtonTappedForRowWith:))) .map { a in return try castOrThrow(IndexPath.self, a[1]) } @@ -254,7 +254,7 @@ extension Reactive where Base: UITableView { Reactive wrapper for `delegate` message `tableView:commitEditingStyle:forRowAtIndexPath:`. */ public var itemInserted: ControlEvent { - let source = self.dataSource.observe(#selector(UITableViewDataSource.tableView(_:commit:forRowAt:))) + let source = self.dataSource.methodInvoked(#selector(UITableViewDataSource.tableView(_:commit:forRowAt:))) .filter { a in return UITableViewCellEditingStyle(rawValue: (try castOrThrow(NSNumber.self, a[1])).intValue) == .insert } @@ -269,7 +269,7 @@ extension Reactive where Base: UITableView { Reactive wrapper for `delegate` message `tableView:commitEditingStyle:forRowAtIndexPath:`. */ public var itemDeleted: ControlEvent { - let source = self.dataSource.observe(#selector(UITableViewDataSource.tableView(_:commit:forRowAt:))) + let source = self.dataSource.methodInvoked(#selector(UITableViewDataSource.tableView(_:commit:forRowAt:))) .filter { a in return UITableViewCellEditingStyle(rawValue: (try castOrThrow(NSNumber.self, a[1])).intValue) == .delete } @@ -284,7 +284,7 @@ extension Reactive where Base: UITableView { Reactive wrapper for `delegate` message `tableView:moveRowAtIndexPath:toIndexPath:`. */ public var itemMoved: ControlEvent { - let source: Observable = self.dataSource.observe(#selector(UITableViewDataSource.tableView(_:moveRowAt:to:))) + let source: Observable = self.dataSource.methodInvoked(#selector(UITableViewDataSource.tableView(_:moveRowAt:to:))) .map { a in return (try castOrThrow(IndexPath.self, a[1]), try castOrThrow(IndexPath.self, a[2])) } @@ -296,7 +296,7 @@ extension Reactive where Base: UITableView { Reactive wrapper for `delegate` message `tableView:willDisplayCell:forRowAtIndexPath:`. */ public var willDisplayCell: ControlEvent { - let source: Observable = self.delegate.observe(#selector(UITableViewDelegate.tableView(_:willDisplay:forRowAt:))) + let source: Observable = self.delegate.methodInvoked(#selector(UITableViewDelegate.tableView(_:willDisplay:forRowAt:))) .map { a in return (try castOrThrow(UITableViewCell.self, a[1]), try castOrThrow(IndexPath.self, a[2])) } @@ -308,7 +308,7 @@ extension Reactive where Base: UITableView { Reactive wrapper for `delegate` message `tableView:didEndDisplayingCell:forRowAtIndexPath:`. */ public var didEndDisplayingCell: ControlEvent { - let source: Observable = self.delegate.observe(#selector(UITableViewDelegate.tableView(_:didEndDisplaying:forRowAt:))) + let source: Observable = self.delegate.methodInvoked(#selector(UITableViewDelegate.tableView(_:didEndDisplaying:forRowAt:))) .map { a in return (try castOrThrow(UITableViewCell.self, a[1]), try castOrThrow(IndexPath.self, a[2])) } @@ -333,7 +333,7 @@ extension Reactive where Base: UITableView { return Observable.empty() } - return Observable.just(try view.rx.model(indexPath)) + return Observable.just(try view.rx.model(at: indexPath)) } return ControlEvent(events: source) @@ -356,7 +356,7 @@ extension Reactive where Base: UITableView { return Observable.empty() } - return Observable.just(try view.rx.model(indexPath)) + return Observable.just(try view.rx.model(at: indexPath)) } return ControlEvent(events: source) @@ -365,10 +365,10 @@ extension Reactive where Base: UITableView { /** Synchronous helper method for retrieving a model at indexPath through a reactive data source. */ - public func model(_ indexPath: IndexPath) throws -> T { + public func model(at indexPath: IndexPath) throws -> T { let dataSource: SectionedViewDataSourceType = castOrFatalError(self.dataSource.forwardToDelegate(), message: "This method only works in case one of the `rx.items*` methods was used.") - let element = try dataSource.model(indexPath) + let element = try dataSource.model(at: indexPath) return castOrFatalError(element) } @@ -385,7 +385,7 @@ extension Reactive where Base: UITableView { */ public var didUpdateFocusInContextWithAnimationCoordinator: ControlEvent<(context: UIFocusUpdateContext, animationCoordinator: UIFocusAnimationCoordinator)> { - let source = delegate.observe(#selector(UITableViewDelegate.tableView(_:didUpdateFocusIn:with:))) + let source = delegate.methodInvoked(#selector(UITableViewDelegate.tableView(_:didUpdateFocusIn:with:))) .map { a -> (context: UIFocusUpdateContext, animationCoordinator: UIFocusAnimationCoordinator) in let context = a[1] as! UIFocusUpdateContext let animationCoordinator = try castOrThrow(UIFocusAnimationCoordinator.self, a[2]) @@ -396,148 +396,3 @@ extension Reactive where Base: UITableView { } } #endif - -#if os(iOS) || os(tvOS) - -// deprecated APIs -extension UITableView { - - /** - Binds sequences of elements to table view rows. - - - parameter source: Observable sequence of items. - - parameter cellFactory: Transform between sequence elements and view cells. - - returns: Disposable object that can be used to unbind. - - Example: - - let items = Observable.just([ - "First Item", - "Second Item", - "Third Item" - ]) - - items - .bindTo(tableView.rx.itemsWithCellFactory) { (tableView, row, element) in - let cell = tableView.dequeueReusableCellWithIdentifier("Cell")! - cell.textLabel?.text = "\(element) @ row \(row)" - return cell - } - .addDisposableTo(disposeBag) - - */ - @available(*, deprecated, renamed: "rx.items(_:_:)") - public func rx_itemsWithCellFactory - (_ source: O) - -> (_ cellFactory: @escaping (UITableView, Int, S.Iterator.Element) -> UITableViewCell) - -> Disposable - where O.E == S { - return { cellFactory in - return self.rx.items(source)(cellFactory) - } - } - - /** - Binds sequences of elements to table view rows. - - - parameter cellIdentifier: Identifier used to dequeue cells. - - parameter source: Observable sequence of items. - - parameter configureCell: Transform between sequence elements and view cells. - - parameter cellType: Type of table view cell. - - returns: Disposable object that can be used to unbind. - - Example: - - let items = Observable.just([ - "First Item", - "Second Item", - "Third Item" - ]) - - items - .bindTo(tableView.rx.items(cellIdentifier: "Cell", cellType: UITableViewCell.self)) { (row, element, cell) in - cell.textLabel?.text = "\(element) @ row \(row)" - } - .addDisposableTo(disposeBag) - */ - @available(*, deprecated, renamed: "rx.items(cellIdentifier:cellType:_:_:)") - public func rx_itemsWithCellIdentifier - (_ cellIdentifier: String, cellType: Cell.Type = Cell.self) - -> (_ source: O) - -> (_ configureCell: @escaping (Int, S.Iterator.Element, Cell) -> Void) - -> Disposable - where O.E == S { - return { source in - return { configureCell in - return self.rx.items(cellIdentifier: cellIdentifier, cellType: cellType)(source)(configureCell) - } - } - } - - /** - Binds sequences of elements to table view rows using a custom reactive data used to perform the transformation. - This method will retain the data source for as long as the subscription isn't disposed (result `Disposable` - being disposed). - In case `source` observable sequence terminates sucessfully, the data source will present latest element - until the subscription isn't disposed. - - - parameter dataSource: Data source used to transform elements to view cells. - - parameter source: Observable sequence of items. - - returns: Disposable object that can be used to unbind. - - Example - - let dataSource = RxTableViewSectionedReloadDataSource>() - - let items = Observable.just([ - SectionModel(model: "First section", items: [ - 1.0, - 2.0, - 3.0 - ]), - SectionModel(model: "Second section", items: [ - 1.0, - 2.0, - 3.0 - ]), - SectionModel(model: "Third section", items: [ - 1.0, - 2.0, - 3.0 - ]) - ]) - - dataSource.configureCell = { (dataSource, tv, indexPath, element) in - let cell = tv.dequeueReusableCellWithIdentifier("Cell")! - cell.textLabel?.text = "\(element) @ row \(indexPath.row)" - return cell - } - - items - .bindTo(tableView.rx.items(dataSoruce: dataSource)) - .addDisposableTo(disposeBag) - */ - @available(*, deprecated, renamed: "rx.items(dataSource:_:)") - public func rx_itemsWithDataSource< - DataSource: RxTableViewDataSourceType & UITableViewDataSource, - O: ObservableType> - (_ dataSource: DataSource) - -> (_ source: O) - -> Disposable - where DataSource.Element == O.E - { - return { source in - return self.rx.items(dataSource: dataSource)(source) - } - } - - /** - Synchronous helper method for retrieving a model at indexPath through a reactive data source. - */ - @available(*, deprecated, renamed: "rx.model(_:)") - public func rx_modelAtIndexPath(_ indexPath: IndexPath) throws -> T { - return try self.rx.model(indexPath) - } - -} -#endif diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UITextField+Rx.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UITextField+Rx.swift index 680cfdeb..0b2089c1 100644 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UITextField+Rx.swift +++ b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UITextField+Rx.swift @@ -16,14 +16,12 @@ import UIKit extension Reactive where Base: UITextField { - /** - Reactive wrapper for `text` property. - */ - public var text: ControlProperty { - return Reactive.value( + /// Reactive wrapper for `text` property. + public var text: ControlProperty { + return UIControl.rx.value( base, getter: { textField in - textField.text ?? "" + textField.text }, setter: { textField, value in // This check is important because setting text value always clears control state // including marked text selection which is imporant for proper input diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UITextView+Rx.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UITextView+Rx.swift index 752019f6..c1686b53 100644 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UITextView+Rx.swift +++ b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UITextView+Rx.swift @@ -18,23 +18,19 @@ import RxSwift extension UITextView { - /** - Factory method that enables subclasses to implement their own `delegate`. - - - returns: Instance of delegate proxy that wraps `delegate`. - */ + /// Factory method that enables subclasses to implement their own `delegate`. + /// + /// - returns: Instance of delegate proxy that wraps `delegate`. public override func createRxDelegateProxy() -> RxScrollViewDelegateProxy { return RxTextViewDelegateProxy(parentObject: self) } } extension Reactive where Base: UITextView { - /** - Reactive wrapper for `text` property. - */ - public var text: ControlProperty { - let source: Observable = Observable.deferred { [weak textView = self.base] in - let text = textView?.text ?? "" + /// Reactive wrapper for `text` property. + public var text: ControlProperty { + let source: Observable = Observable.deferred { [weak textView = self.base] in + let text = textView?.text let textChanged = textView?.textStorage // This project uses text storage notifications because @@ -46,7 +42,7 @@ extension Reactive where Base: UITextView { // so rebinding a value will cause an exception to be thrown. .observeOn(MainScheduler.asyncInstance) .map { _ in - return textView?.textStorage.string ?? "" + return textView?.textStorage.string } ?? Observable.empty() @@ -54,7 +50,7 @@ extension Reactive where Base: UITextView { .startWith(text) } - let bindingObserver = UIBindingObserver(UIElement: self.base) { (textView, text: String) in + let bindingObserver = UIBindingObserver(UIElement: self.base) { (textView, text: String?) in // This check is important because setting text value always clears control state // including marked text selection which is imporant for proper input // when IME input method is used. @@ -66,41 +62,33 @@ extension Reactive where Base: UITextView { return ControlProperty(values: source, valueSink: bindingObserver) } - /** - Reactive wrapper for `delegate` message. - */ + /// Reactive wrapper for `delegate` message. public var didBeginEditing: ControlEvent<()> { - return ControlEvent<()>(events: self.delegate.observe(#selector(UITextViewDelegate.textViewDidBeginEditing(_:))) + return ControlEvent<()>(events: self.delegate.methodInvoked(#selector(UITextViewDelegate.textViewDidBeginEditing(_:))) .map { a in return () }) } - /** - Reactive wrapper for `delegate` message. - */ + /// Reactive wrapper for `delegate` message. public var didEndEditing: ControlEvent<()> { - return ControlEvent<()>(events: self.delegate.observe(#selector(UITextViewDelegate.textViewDidEndEditing(_:))) + return ControlEvent<()>(events: self.delegate.methodInvoked(#selector(UITextViewDelegate.textViewDidEndEditing(_:))) .map { a in return () }) } - /** - Reactive wrapper for `delegate` message. - */ + /// Reactive wrapper for `delegate` message. public var didChange: ControlEvent<()> { - return ControlEvent<()>(events: self.delegate.observe(#selector(UITextViewDelegate.textViewDidChange(_:))) + return ControlEvent<()>(events: self.delegate.methodInvoked(#selector(UITextViewDelegate.textViewDidChange(_:))) .map { a in return () }) } - /** - Reactive wrapper for `delegate` message. - */ + /// Reactive wrapper for `delegate` message. public var didChangeSelection: ControlEvent<()> { - return ControlEvent<()>(events: self.delegate.observe(#selector(UITextViewDelegate.textViewDidChangeSelection(_:))) + return ControlEvent<()>(events: self.delegate.methodInvoked(#selector(UITextViewDelegate.textViewDidChangeSelection(_:))) .map { a in return () }) diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UIView+Rx.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UIView+Rx.swift index 5c67dedd..f071d74d 100644 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UIView+Rx.swift +++ b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UIView+Rx.swift @@ -1,6 +1,6 @@ // // UIView+Rx.swift -// Rx +// RxCocoa // // Created by Krunoslav Zaher on 12/6/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -15,22 +15,18 @@ import RxSwift #endif extension Reactive where Base: UIView { - /** - Bindable sink for `hidden` property. - */ - public var hidden: AnyObserver { + /// Bindable sink for `hidden` property. + public var isHidden: UIBindingObserver { return UIBindingObserver(UIElement: self.base) { view, hidden in view.isHidden = hidden - }.asObserver() + } } - /** - Bindable sink for `alpha` property. - */ - public var alpha: AnyObserver { + /// Bindable sink for `alpha` property. + public var alpha: UIBindingObserver { return UIBindingObserver(UIElement: self.base) { view, alpha in view.alpha = alpha - }.asObserver() + } } } diff --git a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UIViewController+Rx.swift b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UIViewController+Rx.swift index 2a284bdb..351549d4 100644 --- a/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UIViewController+Rx.swift +++ b/Project 07 - PokedexGo/Pods/RxCocoa/RxCocoa/iOS/UIViewController+Rx.swift @@ -1,6 +1,6 @@ // // UIViewController+Rx.swift -// Rx +// RxCocoa // // Created by Kyle Fuller on 27/05/2016. // Copyright © 2016 Krunoslav Zaher. All rights reserved. @@ -15,15 +15,14 @@ import Foundation import RxSwift #endif - extension Reactive where Base: UIViewController { + extension Reactive where Base: UIViewController { - /** - Bindable sink for `title`. - */ - public var title: AnyObserver { - return UIBindingObserver(UIElement: self.base) { viewController, title in - viewController.title = title - }.asObserver() + /// Bindable sink for `title`. + public var title: UIBindingObserver { + return UIBindingObserver(UIElement: self.base) { viewController, title in + viewController.title = title + } + } + } - } #endif diff --git a/Project 07 - PokedexGo/Pods/RxSwift/Platform/DataStructures/Bag.swift b/Project 07 - PokedexGo/Pods/RxSwift/Platform/DataStructures/Bag.swift new file mode 100644 index 00000000..4ab6f942 --- /dev/null +++ b/Project 07 - PokedexGo/Pods/RxSwift/Platform/DataStructures/Bag.swift @@ -0,0 +1,167 @@ +// +// Bag.swift +// Platform +// +// Created by Krunoslav Zaher on 2/28/15. +// Copyright © 2015 Krunoslav Zaher. All rights reserved. +// + +import Foundation +import Swift + +let arrayDictionaryMaxSize = 30 + +struct BagKey { + /** + Unique identifier for object added to `Bag`. + + It's underlying type is UInt64. If we assume there in an idealized CPU that works at 4GHz, + it would take ~150 years of continuous running time for it to overflow. + */ + fileprivate let rawValue: UInt64 +} + +/** +Data structure that represents a bag of elements typed `T`. + +Single element can be stored multiple times. + +Time and space complexity of insertion an deletion is O(n). + +It is suitable for storing small number of elements. +*/ +struct Bag : CustomDebugStringConvertible { + /// Type of identifier for inserted elements. + typealias KeyType = BagKey + + typealias Entry = (key: BagKey, value: T) + + fileprivate var _nextKey: BagKey = BagKey(rawValue: 0) + + // data + + // first fill inline variables + var _key0: BagKey? = nil + var _value0: T? = nil + + // last is sparse dictionary + var _dictionary: [BagKey : T]? = nil + + var _onlyFastPath = true + + /// Creates new empty `Bag`. + init() { + } + + /** + Inserts `value` into bag. + + - parameter element: Element to insert. + - returns: Key that can be used to remove element from bag. + */ + mutating func insert(_ element: T) -> BagKey { + let key = _nextKey + + _nextKey = BagKey(rawValue: _nextKey.rawValue &+ 1) + + if _key0 == nil { + _key0 = key + _value0 = element + return key + } + + _onlyFastPath = false + + if _dictionary != nil { + _dictionary![key] = element + return key + } + + if _dictionary == nil { + _dictionary = [:] + } + + _dictionary![key] = element + + return key + } + + /// - returns: Number of elements in bag. + var count: Int { + let dictionaryCount: Int = _dictionary?.count ?? 0 + return (_value0 != nil ? 1 : 0) + dictionaryCount + } + + /// Removes all elements from bag and clears capacity. + mutating func removeAll() { + _key0 = nil + _value0 = nil + + _dictionary?.removeAll(keepingCapacity: false) + } + + /** + Removes element with a specific `key` from bag. + + - parameter key: Key that identifies element to remove from bag. + - returns: Element that bag contained, or nil in case element was already removed. + */ + mutating func removeKey(_ key: BagKey) -> T? { + if _key0 == key { + _key0 = nil + let value = _value0! + _value0 = nil + return value + } + + if let existingObject = _dictionary?.removeValue(forKey: key) { + return existingObject + } + + return nil + } +} + +extension Bag { + /// A textual representation of `self`, suitable for debugging. + var debugDescription : String { + return "\(self.count) elements in Bag" + } +} + +extension Bag { + /// Enumerates elements inside the bag. + /// + /// - parameter action: Enumeration closure. + func forEach(_ action: (T) -> Void) { + if _onlyFastPath { + if let value0 = _value0 { + action(value0) + } + return + } + + let value0 = _value0 + let dictionary = _dictionary + + if let value0 = value0 { + action(value0) + } + + if dictionary?.count ?? 0 > 0 { + for element in dictionary!.values { + action(element) + } + } + } +} + +extension BagKey: Hashable { + var hashValue: Int { + return rawValue.hashValue + } +} + +func ==(lhs: BagKey, rhs: BagKey) -> Bool { + return lhs.rawValue == rhs.rawValue +} diff --git a/Project 07 - PokedexGo/Pods/RxSwift/Platform/DataStructures/InfiniteSequence.swift b/Project 07 - PokedexGo/Pods/RxSwift/Platform/DataStructures/InfiniteSequence.swift new file mode 100644 index 00000000..5fad3830 --- /dev/null +++ b/Project 07 - PokedexGo/Pods/RxSwift/Platform/DataStructures/InfiniteSequence.swift @@ -0,0 +1,28 @@ +// +// InfiniteSequence.swift +// Platform +// +// Created by Krunoslav Zaher on 6/13/15. +// Copyright © 2015 Krunoslav Zaher. All rights reserved. +// + +import Foundation + +/// Sequence that repeats `repeatedValue` infinite number of times. +struct InfiniteSequence : Sequence { + typealias Element = E + typealias Iterator = AnyIterator + + private let _repeatedValue: E + + init(repeatedValue: E) { + _repeatedValue = repeatedValue + } + + func makeIterator() -> Iterator { + let repeatedValue = _repeatedValue + return AnyIterator { + return repeatedValue + } + } +} diff --git a/Project 07 - PokedexGo/Pods/RxSwift/Platform/DataStructures/PriorityQueue.swift b/Project 07 - PokedexGo/Pods/RxSwift/Platform/DataStructures/PriorityQueue.swift new file mode 100644 index 00000000..725feeff --- /dev/null +++ b/Project 07 - PokedexGo/Pods/RxSwift/Platform/DataStructures/PriorityQueue.swift @@ -0,0 +1,114 @@ +// +// PriorityQueue.swift +// Platform +// +// Created by Krunoslav Zaher on 12/27/15. +// Copyright © 2015 Krunoslav Zaher. All rights reserved. +// + +import Foundation + +struct PriorityQueue { + private let _hasHigherPriority: (Element, Element) -> Bool + private let _isEqual: (Element, Element) -> Bool + + fileprivate var _elements = [Element]() + + init(hasHigherPriority: @escaping (Element, Element) -> Bool, isEqual: @escaping (Element, Element) -> Bool) { + _hasHigherPriority = hasHigherPriority + _isEqual = isEqual + } + + mutating func enqueue(_ element: Element) { + _elements.append(element) + bubbleToHigherPriority(_elements.count - 1) + } + + func peek() -> Element? { + return _elements.first + } + + var isEmpty: Bool { + return _elements.count == 0 + } + + mutating func dequeue() -> Element? { + guard let front = peek() else { + return nil + } + + removeAt(0) + + return front + } + + mutating func remove(_ element: Element) { + for i in 0 ..< _elements.count { + if _isEqual(_elements[i], element) { + removeAt(i) + return + } + } + } + + private mutating func removeAt(_ index: Int) { + let removingLast = index == _elements.count - 1 + if !removingLast { + swap(&_elements[index], &_elements[_elements.count - 1]) + } + + _ = _elements.popLast() + + if !removingLast { + bubbleToHigherPriority(index) + bubbleToLowerPriority(index) + } + } + + private mutating func bubbleToHigherPriority(_ initialUnbalancedIndex: Int) { + precondition(initialUnbalancedIndex >= 0) + precondition(initialUnbalancedIndex < _elements.count) + + var unbalancedIndex = initialUnbalancedIndex + + while unbalancedIndex > 0 { + let parentIndex = (unbalancedIndex - 1) / 2 + guard _hasHigherPriority(_elements[unbalancedIndex], _elements[parentIndex]) else { break } + + swap(&_elements[unbalancedIndex], &_elements[parentIndex]) + unbalancedIndex = parentIndex + } + } + + private mutating func bubbleToLowerPriority(_ initialUnbalancedIndex: Int) { + precondition(initialUnbalancedIndex >= 0) + precondition(initialUnbalancedIndex < _elements.count) + + var unbalancedIndex = initialUnbalancedIndex + while true { + let leftChildIndex = unbalancedIndex * 2 + 1 + let rightChildIndex = unbalancedIndex * 2 + 2 + + var highestPriorityIndex = unbalancedIndex + + if leftChildIndex < _elements.count && _hasHigherPriority(_elements[leftChildIndex], _elements[highestPriorityIndex]) { + highestPriorityIndex = leftChildIndex + } + + if rightChildIndex < _elements.count && _hasHigherPriority(_elements[rightChildIndex], _elements[highestPriorityIndex]) { + highestPriorityIndex = rightChildIndex + } + + guard highestPriorityIndex != unbalancedIndex else { break } + + swap(&_elements[highestPriorityIndex], &_elements[unbalancedIndex]) + unbalancedIndex = highestPriorityIndex + } + } +} + +extension PriorityQueue : CustomDebugStringConvertible { + var debugDescription: String { + return _elements.debugDescription + } +} diff --git a/Project 07 - PokedexGo/Pods/RxSwift/Platform/DataStructures/Queue.swift b/Project 07 - PokedexGo/Pods/RxSwift/Platform/DataStructures/Queue.swift new file mode 100644 index 00000000..cfe3df4d --- /dev/null +++ b/Project 07 - PokedexGo/Pods/RxSwift/Platform/DataStructures/Queue.swift @@ -0,0 +1,154 @@ +// +// Queue.swift +// Platform +// +// Created by Krunoslav Zaher on 3/21/15. +// Copyright © 2015 Krunoslav Zaher. All rights reserved. +// + +import Foundation + +/** +Data structure that represents queue. + +Complexity of `enqueue`, `dequeue` is O(1) when number of operations is +averaged over N operations. + +Complexity of `peek` is O(1). +*/ +struct Queue: Sequence { + /// Type of generator. + typealias Generator = AnyIterator + + private let _resizeFactor = 2 + + private var _storage: ContiguousArray + private var _count = 0 + private var _pushNextIndex = 0 + private let _initialCapacity: Int + + /** + Creates new queue. + + - parameter capacity: Capacity of newly created queue. + */ + init(capacity: Int) { + _initialCapacity = capacity + + _storage = ContiguousArray(repeating: nil, count: capacity) + } + + private var dequeueIndex: Int { + let index = _pushNextIndex - count + return index < 0 ? index + _storage.count : index + } + + /// - returns: Is queue empty. + var isEmpty: Bool { + return count == 0 + } + + /// - returns: Number of elements inside queue. + var count: Int { + return _count + } + + /// - returns: Element in front of a list of elements to `dequeue`. + func peek() -> T { + precondition(count > 0) + + return _storage[dequeueIndex]! + } + + mutating private func resizeTo(_ size: Int) { + var newStorage = ContiguousArray(repeating: nil, count: size) + + let count = _count + + let dequeueIndex = self.dequeueIndex + let spaceToEndOfQueue = _storage.count - dequeueIndex + + // first batch is from dequeue index to end of array + let countElementsInFirstBatch = Swift.min(count, spaceToEndOfQueue) + // second batch is wrapped from start of array to end of queue + let numberOfElementsInSecondBatch = count - countElementsInFirstBatch + + newStorage[0 ..< countElementsInFirstBatch] = _storage[dequeueIndex ..< (dequeueIndex + countElementsInFirstBatch)] + newStorage[countElementsInFirstBatch ..< (countElementsInFirstBatch + numberOfElementsInSecondBatch)] = _storage[0 ..< numberOfElementsInSecondBatch] + + _count = count + _pushNextIndex = count + _storage = newStorage + } + + /// Enqueues `element`. + /// + /// - parameter element: Element to enqueue. + mutating func enqueue(_ element: T) { + if count == _storage.count { + resizeTo(Swift.max(_storage.count, 1) * _resizeFactor) + } + + _storage[_pushNextIndex] = element + _pushNextIndex += 1 + _count += 1 + + if _pushNextIndex >= _storage.count { + _pushNextIndex -= _storage.count + } + } + + private mutating func dequeueElementOnly() -> T { + precondition(count > 0) + + let index = dequeueIndex + + defer { + _storage[index] = nil + _count -= 1 + } + + return _storage[index]! + } + + /// Dequeues element or throws an exception in case queue is empty. + /// + /// - returns: Dequeued element. + mutating func dequeue() -> T? { + if self.count == 0 { + return nil + } + + defer { + let downsizeLimit = _storage.count / (_resizeFactor * _resizeFactor) + if _count < downsizeLimit && downsizeLimit >= _initialCapacity { + resizeTo(_storage.count / _resizeFactor) + } + } + + return dequeueElementOnly() + } + + /// - returns: Generator of contained elements. + func makeIterator() -> AnyIterator { + var i = dequeueIndex + var count = _count + + return AnyIterator { + if count == 0 { + return nil + } + + defer { + count -= 1 + i += 1 + } + + if i >= self._storage.count { + i -= self._storage.count + } + + return self._storage[i] + } + } +} diff --git a/Project 07 - PokedexGo/Pods/RxSwift/Platform/DispatchQueue+Extensions.swift b/Project 07 - PokedexGo/Pods/RxSwift/Platform/DispatchQueue+Extensions.swift new file mode 100644 index 00000000..0df1ce79 --- /dev/null +++ b/Project 07 - PokedexGo/Pods/RxSwift/Platform/DispatchQueue+Extensions.swift @@ -0,0 +1,22 @@ +// +// DispatchQueue+Extensions.swift +// Platform +// +// Created by Krunoslav Zaher on 10/22/16. +// Copyright © 2016 Krunoslav Zaher. All rights reserved. +// + +import Foundation +import Dispatch + +extension DispatchQueue { + private static var token: DispatchSpecificKey<()> = { + let key = DispatchSpecificKey<()>() + DispatchQueue.main.setSpecific(key: key, value: ()) + return key + }() + + static var isMain: Bool { + return DispatchQueue.getSpecific(key: token) != nil + } +} diff --git a/Project 07 - PokedexGo/Pods/RxSwift/Platform/Platform.Darwin.swift b/Project 07 - PokedexGo/Pods/RxSwift/Platform/Platform.Darwin.swift new file mode 100644 index 00000000..e0d7f0de --- /dev/null +++ b/Project 07 - PokedexGo/Pods/RxSwift/Platform/Platform.Darwin.swift @@ -0,0 +1,49 @@ +// +// Platform.Darwin.swift +// Platform +// +// Created by Krunoslav Zaher on 12/29/15. +// Copyright © 2015 Krunoslav Zaher. All rights reserved. +// + +#if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) + + import Darwin + import Foundation + + typealias AtomicInt = Int32 + + let AtomicCompareAndSwap = OSAtomicCompareAndSwap32Barrier + let AtomicIncrement = OSAtomicIncrement32Barrier + let AtomicDecrement = OSAtomicDecrement32Barrier + + extension Thread { + + static func setThreadLocalStorageValue(_ value: T?, forKey key: String + ) { + let currentThread = Thread.current + let threadDictionary = currentThread.threadDictionary + + if let newValue = value { + threadDictionary[key] = newValue + } + else { + threadDictionary[key] = nil + } + + } + static func getThreadLocalStorageValueForKey(_ key: String) -> T? { + let currentThread = Thread.current + let threadDictionary = currentThread.threadDictionary + + return threadDictionary[key] as? T + } + } + + extension AtomicInt { + func valueSnapshot() -> Int32 { + return self + } + } + +#endif diff --git a/Project 07 - PokedexGo/Pods/RxSwift/Platform/Platform.Linux.swift b/Project 07 - PokedexGo/Pods/RxSwift/Platform/Platform.Linux.swift new file mode 100644 index 00000000..ae5a49db --- /dev/null +++ b/Project 07 - PokedexGo/Pods/RxSwift/Platform/Platform.Linux.swift @@ -0,0 +1,97 @@ +// +// Platform.Linux.swift +// Platform +// +// Created by Krunoslav Zaher on 12/29/15. +// Copyright © 2015 Krunoslav Zaher. All rights reserved. +// + +#if os(Linux) + //////////////////////////////////////////////////////////////////////////////// + // This is not the greatest API in the world, this is just a tribute. + // !!! Proof of concept until libdispatch becomes operational. !!! + //////////////////////////////////////////////////////////////////////////////// + + import Foundation + import XCTest + import Glibc + import SwiftShims + + final class AtomicInt { + typealias IntegerLiteralType = Int + fileprivate var value: Int32 = 0 + fileprivate var _lock = NSRecursiveLock() + + func lock() { + _lock.lock() + } + func unlock() { + _lock.unlock() + } + + func valueSnapshot() -> Int32 { + return value + } + } + + extension AtomicInt: ExpressibleByIntegerLiteral { + convenience init(integerLiteral value: Int) { + self.init() + self.value = Int32(value) + } + } + + func >(lhs: AtomicInt, rhs: Int32) -> Bool { + return lhs.value > rhs + } + func ==(lhs: AtomicInt, rhs: Int32) -> Bool { + return lhs.value == rhs + } + + func AtomicIncrement(_ atomic: inout AtomicInt) -> Int32 { + atomic.lock(); defer { atomic.unlock() } + atomic.value += 1 + return atomic.value + } + + func AtomicDecrement(_ atomic: inout AtomicInt) -> Int32 { + atomic.lock(); defer { atomic.unlock() } + atomic.value -= 1 + return atomic.value + } + + func AtomicCompareAndSwap(_ l: Int32, _ r: Int32, _ atomic: inout AtomicInt) -> Bool { + atomic.lock(); defer { atomic.unlock() } + if atomic.value == l { + atomic.value = r + return true + } + + return false + } + + extension Thread { + + static func setThreadLocalStorageValue(_ value: T?, forKey key: String) { + let currentThread = Thread.current + var threadDictionary = currentThread.threadDictionary + + if let newValue = value { + threadDictionary[key] = newValue + } + else { + threadDictionary[key] = nil + } + + currentThread.threadDictionary = threadDictionary + } + + static func getThreadLocalStorageValueForKey(_ key: String) -> T? { + let currentThread = Thread.current + let threadDictionary = currentThread.threadDictionary + + return threadDictionary[key] as? T + } + } + +#endif diff --git a/Project 07 - PokedexGo/Pods/RxSwift/README.md b/Project 07 - PokedexGo/Pods/RxSwift/README.md index 83e397c3..a5749ca1 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/README.md +++ b/Project 07 - PokedexGo/Pods/RxSwift/README.md @@ -1,19 +1,19 @@ Miss Electric Eel 2016 RxSwift: ReactiveX for Swift ====================================== -[![Travis CI](https://travis-ci.org/ReactiveX/RxSwift.svg?branch=master)](https://travis-ci.org/ReactiveX/RxSwift) ![platforms](https://img.shields.io/badge/platforms-iOS%20%7C%20OSX%20%7C%20tvOS%20%7C%20watchOS%20%7C%20Linux%28experimental%29-333333.svg) ![pod](https://img.shields.io/cocoapods/v/RxSwift.svg) [![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) +[![Travis CI](https://travis-ci.org/ReactiveX/RxSwift.svg?branch=master)](https://travis-ci.org/ReactiveX/RxSwift) ![platforms](https://img.shields.io/badge/platforms-iOS%20%7C%20macOS%20%7C%20tvOS%20%7C%20watchOS%20%7C%20Linux-333333.svg) ![pod](https://img.shields.io/cocoapods/v/RxSwift.svg) [![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) [![Swift Package Manager compatible](https://img.shields.io/badge/Swift%20Package%20Manager-compatible-brightgreen.svg)](https://github.com/apple/swift-package-manager) ## About Rx -**:warning: This readme describes RxSwift 3.0 version that requires Swift 3.0:warning:** +**:warning: This readme describes RxSwift 3.0 version that requires Swift 3.0.** -**:warning: If you are looking for Swift 2.3 compatible version, please take a look at RxSwift ~> 2.0 versions and [swift-2.3](https://github.com/ReactiveX/RxSwift/tree/rxswift-2.0) branch :warning:** +**:warning: If you are looking for Swift 2.3 compatible version, please take a look at RxSwift ~> 2.0 versions and [swift-2.3](https://github.com/ReactiveX/RxSwift/tree/rxswift-2.0) branch.** Rx is a [generic abstraction of computation](https://youtu.be/looJcaeboBY) expressed through `Observable` interface. This is a Swift version of [Rx](https://github.com/Reactive-Extensions/Rx.NET). -It tries to port as many concepts from the original version as possible, but some concepts were adapted for more pleasant and performant integration with iOS/OSX environment. +It tries to port as many concepts from the original version as possible, but some concepts were adapted for more pleasant and performant integration with iOS/macOS environment. Cross platform documentation can be found on [ReactiveX.io](http://reactivex.io/). @@ -33,12 +33,10 @@ KVO observing, async operations and streams are all unified under [abstraction o * [debugging](Documentation/GettingStarted.md#debugging) * [the math behind Rx](Documentation/MathBehindRx.md) * [what are hot and cold observable sequences?](Documentation/HotAndColdObservables.md) -* [what does the the public API look like?](Documentation/API.md) - ###### ... install -* Integrate RxSwift/RxCocoa with my app. [Installation Guide](Documentation/Installation.md) +* Integrate RxSwift/RxCocoa with my app. [Installation Guide](#installation) ###### ... hack around @@ -48,7 +46,7 @@ KVO observing, async operations and streams are all unified under [abstraction o ###### ... interact * All of this is great, but it would be nice to talk with other people using RxSwift and exchange experiences.
[![Slack channel](http://rxswift-slack.herokuapp.com/badge.svg)](http://slack.rxswift.org) [Join Slack Channel](http://rxswift-slack.herokuapp.com) -* Report a problem using the library. [Open an Issue With Bug Template](ISSUE_TEMPLATE.md) +* Report a problem using the library. [Open an Issue With Bug Template](.github/ISSUE_TEMPLATE.md) * Request a new feature. [Open an Issue With Feature Request Template](Documentation/NewFeatureRequestTemplate.md) @@ -85,7 +83,7 @@ let searchResults = searchBar.rx.text .distinctUntilChanged() .flatMapLatest { query -> Observable<[Repository]> in if query.isEmpty { - return Observable.just([]) + return .just([]) } return searchGitHub(query) @@ -111,14 +109,9 @@ searchResults ## Requirements -* Xcode 8.0 GM (8A218a) +* Xcode 8.0 * Swift 3.0 -* iOS 8.0+ -* Mac OS X 10.10+ -* tvOS 9.0+ -* watchOS 2.0+ - ## Installation Rx doesn't contain any external dependencies. @@ -131,54 +124,66 @@ Open Rx.xcworkspace, choose `RxExample` and hit run. This method will build ever ### [CocoaPods](https://guides.cocoapods.org/using/using-cocoapods.html) +**Tested with `pod --version`: `1.1.1`** + ``` # Podfile use_frameworks! target 'YOUR_TARGET_NAME' do - pod 'RxSwift', '~> 3.0.0-beta.1' - pod 'RxCocoa', '~> 3.0.0-beta.1' + pod 'RxSwift', '~> 3.0' + pod 'RxCocoa', '~> 3.0' end # RxTests and RxBlocking make the most sense in the context of unit/integration tests target 'YOUR_TESTING_TARGET' do - pod 'RxBlocking', '~> 3.0.0-beta.1' - pod 'RxTests', '~> 3.0.0-beta.1' + pod 'RxBlocking', '~> 3.0' + pod 'RxTest', '~> 3.0' end ``` Replace `YOUR_TARGET_NAME` and then, in the `Podfile` directory, type: -**:warning: If you want to use CocoaPods with Xcode 8.0 beta and Swift 3.0, you might need to add the following -lines to your podfile: :warning:** - -``` -post_install do |installer| - installer.pods_project.targets.each do |target| - target.build_configurations.each do |config| - config.build_settings['SWIFT_VERSION'] = '3.0' - config.build_settings['MACOSX_DEPLOYMENT_TARGET'] = '10.10' - end - end -end -``` - ``` $ pod install ``` ### [Carthage](https://github.com/Carthage/Carthage) +**Tested with `carthage version`: `0.18.1`** + Add this to `Cartfile` ``` -github "ReactiveX/RxSwift" "3.0.0-beta.1" +github "ReactiveX/RxSwift" ~> 3.0 ``` ``` $ carthage update ``` +### [Swift Package Manager](https://github.com/apple/swift-package-manager) + +**Tested with `swift build --version`: `3.0.0 (swiftpm-19)`** + +Create a `Package.swift` file. + +``` +import PackageDescription + +let package = Package( + name: "RxTestProject", + targets: [], + dependencies: [ + .Package(url: "https://github.com/ReactiveX/RxSwift.git", majorVersion: 3) + ] +) +``` + +``` +$ swift build +``` + ### Manually using git submodules * Add RxSwift as a submodule diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/AnyObserver.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/AnyObserver.swift index d1e21712..cab759aa 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/AnyObserver.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/AnyObserver.swift @@ -1,6 +1,6 @@ // // AnyObserver.swift -// Rx +// RxSwift // // Created by Krunoslav Zaher on 2/28/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -8,68 +8,62 @@ import Foundation -/** -A type-erased `ObserverType`. - -Forwards operations to an arbitrary underlying observer with the same `Element` type, hiding the specifics of the underlying observer type. -*/ +/// A type-erased `ObserverType`. +/// +/// Forwards operations to an arbitrary underlying observer with the same `Element` type, hiding the specifics of the underlying observer type. public struct AnyObserver : ObserverType { - /** - The type of elements in sequence that observer can observe. - */ + /// The type of elements in sequence that observer can observe. public typealias E = Element - /** - Anonymous event handler type. - */ + /// Anonymous event handler type. public typealias EventHandler = (Event) -> Void - public let observer: EventHandler + private let observer: EventHandler - /** - Construct an instance whose `on(event)` calls `eventHandler(event)` - - - parameter eventHandler: Event handler that observes sequences events. - */ + /// Construct an instance whose `on(event)` calls `eventHandler(event)` + /// + /// - parameter eventHandler: Event handler that observes sequences events. public init(eventHandler: @escaping EventHandler) { self.observer = eventHandler } - /** - Construct an instance whose `on(event)` calls `observer.on(event)` - - - parameter observer: Observer that receives sequence events. - */ + /// Construct an instance whose `on(event)` calls `observer.on(event)` + /// + /// - parameter observer: Observer that receives sequence events. public init(_ observer: O) where O.E == Element { self.observer = observer.on } - /** - Send `event` to this observer. - - - parameter event: Event instance. - */ + /// Send `event` to this observer. + /// + /// - parameter event: Event instance. public func on(_ event: Event) { return self.observer(event) } - /** - Erases type of observer and returns canonical observer. - - - returns: type erased observer. - */ + /// Erases type of observer and returns canonical observer. + /// + /// - returns: type erased observer. public func asObserver() -> AnyObserver { return self } } extension ObserverType { - /** - Erases type of observer and returns canonical observer. - - - returns: type erased observer. - */ + /// Erases type of observer and returns canonical observer. + /// + /// - returns: type erased observer. public func asObserver() -> AnyObserver { return AnyObserver(self) } + + /// Transforms observer of type R to type E using custom transform method. + /// Each event sent to result observer is transformed and sent to `self`. + /// + /// - returns: observer that transforms events. + public func mapObserver(_ transform: @escaping (R) throws -> E) -> AnyObserver { + return AnyObserver { e in + self.on(e.map(transform)) + } + } } diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Cancelable.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Cancelable.swift index 209379c1..2398be62 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Cancelable.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Cancelable.swift @@ -1,6 +1,6 @@ // // Cancelable.swift -// Rx +// RxSwift // // Created by Krunoslav Zaher on 3/12/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -8,21 +8,8 @@ import Foundation -/** -Represents disposable resource with state tracking. -*/ +/// Represents disposable resource with state tracking. public protocol Cancelable : Disposable { - /** - - returns: Was resource disposed. - */ + /// Was resource disposed. var isDisposed: Bool { get } } - -public extension Cancelable { - - @available(*, deprecated, renamed: "isDisposed") - var disposed: Bool { - return isDisposed - } - -} diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Concurrency/AsyncLock.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Concurrency/AsyncLock.swift index c534678a..3ba6ed21 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Concurrency/AsyncLock.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Concurrency/AsyncLock.swift @@ -1,6 +1,6 @@ // // AsyncLock.swift -// Rx +// RxSwift // // Created by Krunoslav Zaher on 3/21/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Concurrency/Lock.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Concurrency/Lock.swift index 5c9a2ae9..4a0c1cd8 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Concurrency/Lock.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Concurrency/Lock.swift @@ -1,6 +1,6 @@ // // Lock.swift -// Rx +// RxSwift // // Created by Krunoslav Zaher on 3/31/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -13,54 +13,8 @@ protocol Lock { func unlock() } -#if os(Linux) - import Glibc - - /** - Simple wrapper for spin lock. - */ - class SpinLock { - private var _lock: pthread_spinlock_t = 0 - - init() { - if (pthread_spin_init(&_lock, 0) != 0) { - fatalError("Spin lock initialization failed") - } - } - - func lock() { - pthread_spin_lock(&_lock) - } - - func unlock() { - pthread_spin_unlock(&_lock) - } - - func performLocked(@noescape action: () -> Void) { - lock(); defer { unlock() } - action() - } - - func calculateLocked(@noescape action: () -> T) -> T { - lock(); defer { unlock() } - return action() - } - - func calculateLockedOrFail(@noescape action: () throws -> T) throws -> T { - lock(); defer { unlock() } - let result = try action() - return result - } - - deinit { - pthread_spin_destroy(&_lock) - } - } -#else - - // https://lists.swift.org/pipermail/swift-dev/Week-of-Mon-20151214/000321.html - typealias SpinLock = NSRecursiveLock -#endif +// https://lists.swift.org/pipermail/swift-dev/Week-of-Mon-20151214/000321.html +typealias SpinLock = NSRecursiveLock extension NSRecursiveLock : Lock { func performLocked(_ action: () -> Void) { @@ -79,29 +33,3 @@ extension NSRecursiveLock : Lock { return result } } - -/* -let RECURSIVE_MUTEX = _initializeRecursiveMutex() - -func _initializeRecursiveMutex() -> pthread_mutex_t { - var mutex: pthread_mutex_t = pthread_mutex_t() - var mta: pthread_mutexattr_t = pthread_mutexattr_t() - - pthread_mutex_init(&mutex, nil) - pthread_mutexattr_init(&mta) - pthread_mutexattr_settype(&mta, PTHREAD_MUTEX_RECURSIVE) - pthread_mutex_init(&mutex, &mta) - - return mutex -} - -extension pthread_mutex_t { - mutating func lock() { - pthread_mutex_lock(&self) - } - - mutating func unlock() { - pthread_mutex_unlock(&self) - } -} -*/ diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Concurrency/LockOwnerType.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Concurrency/LockOwnerType.swift index fe61d72f..41595a9a 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Concurrency/LockOwnerType.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Concurrency/LockOwnerType.swift @@ -1,6 +1,6 @@ // // LockOwnerType.swift -// Rx +// RxSwift // // Created by Krunoslav Zaher on 10/25/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Concurrency/SynchronizedDisposeType.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Concurrency/SynchronizedDisposeType.swift index 5764575e..9bd95b9c 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Concurrency/SynchronizedDisposeType.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Concurrency/SynchronizedDisposeType.swift @@ -1,6 +1,6 @@ // // SynchronizedDisposeType.swift -// Rx +// RxSwift // // Created by Krunoslav Zaher on 10/25/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -17,4 +17,4 @@ extension SynchronizedDisposeType { lock(); defer { unlock() } _synchronized_dispose() } -} \ No newline at end of file +} diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Concurrency/SynchronizedOnType.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Concurrency/SynchronizedOnType.swift index 366253ec..3c383d15 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Concurrency/SynchronizedOnType.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Concurrency/SynchronizedOnType.swift @@ -1,6 +1,6 @@ // // SynchronizedOnType.swift -// Rx +// RxSwift // // Created by Krunoslav Zaher on 10/25/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Concurrency/SynchronizedSubscribeType.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Concurrency/SynchronizedSubscribeType.swift index 04fbdad4..ca790124 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Concurrency/SynchronizedSubscribeType.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Concurrency/SynchronizedSubscribeType.swift @@ -1,6 +1,6 @@ // // SynchronizedSubscribeType.swift -// Rx +// RxSwift // // Created by Krunoslav Zaher on 10/25/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Concurrency/SynchronizedUnsubscribeType.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Concurrency/SynchronizedUnsubscribeType.swift index ce5deda6..fc82ddd8 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Concurrency/SynchronizedUnsubscribeType.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Concurrency/SynchronizedUnsubscribeType.swift @@ -1,6 +1,6 @@ // // SynchronizedUnsubscribeType.swift -// Rx +// RxSwift // // Created by Krunoslav Zaher on 10/25/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/ConnectableObservableType.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/ConnectableObservableType.swift index 6722a4ca..bf8f5f04 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/ConnectableObservableType.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/ConnectableObservableType.swift @@ -1,6 +1,6 @@ // // ConnectableObservableType.swift -// Rx +// RxSwift // // Created by Krunoslav Zaher on 3/1/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -18,4 +18,4 @@ public protocol ConnectableObservableType : ObservableType { - returns: Disposable used to disconnect the observable wrapper from its source, causing subscribed observer to stop receiving values from the underlying observable sequence. */ func connect() -> Disposable -} \ No newline at end of file +} diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/DataStructures/Bag.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/DataStructures/Bag.swift deleted file mode 100644 index d09078ec..00000000 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/DataStructures/Bag.swift +++ /dev/null @@ -1,336 +0,0 @@ -// -// Bag.swift -// Rx -// -// Created by Krunoslav Zaher on 2/28/15. -// Copyright © 2015 Krunoslav Zaher. All rights reserved. -// - -import Foundation -import Swift - -let arrayDictionaryMaxSize = 30 - -/** -Class that enables using memory allocations as a means to uniquely identify objects. -*/ -class Identity { - // weird things have known to happen with Swift - var _forceAllocation: Int32 = 0 -} - -func hash(_ _x: Int) -> Int { - var x = _x - x = ((x >> 16) ^ x) &* 0x45d9f3b - x = ((x >> 16) ^ x) &* 0x45d9f3b - x = ((x >> 16) ^ x) - return x; -} - -/** -Unique identifier for object added to `Bag`. -*/ -public struct BagKey : Hashable { - let uniqueIdentity: Identity? - let key: Int - - public var hashValue: Int { - if let uniqueIdentity = uniqueIdentity { - return hash(key) ^ (ObjectIdentifier(uniqueIdentity).hashValue) - } - else { - return hash(key) - } - } -} - -/** -Compares two `BagKey`s. -*/ -public func == (lhs: BagKey, rhs: BagKey) -> Bool { - return lhs.key == rhs.key && lhs.uniqueIdentity === rhs.uniqueIdentity -} - -/** -Data structure that represents a bag of elements typed `T`. - -Single element can be stored multiple times. - -Time and space complexity of insertion an deletion is O(n). - -It is suitable for storing small number of elements. -*/ -public struct Bag : CustomDebugStringConvertible { - /** - Type of identifier for inserted elements. - */ - public typealias KeyType = BagKey - - fileprivate typealias ScopeUniqueTokenType = Int - - typealias Entry = (key: BagKey, value: T) - - fileprivate var _uniqueIdentity: Identity? - fileprivate var _nextKey: ScopeUniqueTokenType = 0 - - // data - - // first fill inline variables - fileprivate var _key0: BagKey? = nil - fileprivate var _value0: T? = nil - - fileprivate var _key1: BagKey? = nil - fileprivate var _value1: T? = nil - - // then fill "array dictionary" - fileprivate var _pairs = ContiguousArray() - - // last is sparse dictionary - fileprivate var _dictionary: [BagKey : T]? = nil - - fileprivate var _onlyFastPath = true - - /** - Creates new empty `Bag`. - */ - public init() { - } - - /** - Inserts `value` into bag. - - - parameter element: Element to insert. - - returns: Key that can be used to remove element from bag. - */ - public mutating func insert(_ element: T) -> BagKey { - _nextKey = _nextKey &+ 1 - -#if DEBUG - _nextKey = _nextKey % 20 -#endif - - if _nextKey == 0 { - _uniqueIdentity = Identity() - } - - let key = BagKey(uniqueIdentity: _uniqueIdentity, key: _nextKey) - - if _key0 == nil { - _key0 = key - _value0 = element - return key - } - - _onlyFastPath = false - - if _key1 == nil { - _key1 = key - _value1 = element - return key - } - - if _dictionary != nil { - _dictionary![key] = element - return key - } - - if _pairs.count < arrayDictionaryMaxSize { - _pairs.append(key: key, value: element) - return key - } - - if _dictionary == nil { - _dictionary = [:] - } - - _dictionary![key] = element - - return key - } - - /** - - returns: Number of elements in bag. - */ - public var count: Int { - let dictionaryCount: Int = _dictionary?.count ?? 0 - return _pairs.count + (_value0 != nil ? 1 : 0) + (_value1 != nil ? 1 : 0) + dictionaryCount - } - - /** - Removes all elements from bag and clears capacity. - */ - public mutating func removeAll() { - _key0 = nil - _value0 = nil - _key1 = nil - _value1 = nil - - _pairs.removeAll(keepingCapacity: false) - _dictionary?.removeAll(keepingCapacity: false) - } - - /** - Removes element with a specific `key` from bag. - - - parameter key: Key that identifies element to remove from bag. - - returns: Element that bag contained, or nil in case element was already removed. - */ - public mutating func removeKey(_ key: BagKey) -> T? { - if _key0 == key { - _key0 = nil - let value = _value0! - _value0 = nil - return value - } - - if _key1 == key { - _key1 = nil - let value = _value1! - _value1 = nil - return value - } - - if let existingObject = _dictionary?.removeValue(forKey: key) { - return existingObject - } - - for i in 0 ..< _pairs.count { - if _pairs[i].key == key { - let value = _pairs[i].value - _pairs.remove(at: i) - return value - } - } - - return nil - } -} - -extension Bag { - /** - A textual representation of `self`, suitable for debugging. - */ - public var debugDescription : String { - return "\(self.count) elements in Bag" - } -} - - -// MARK: forEach - -extension Bag { - /** - Enumerates elements inside the bag. - - - parameter action: Enumeration closure. - */ - public func forEach(_ action: (T) -> Void) { - if _onlyFastPath { - if let value0 = _value0 { - action(value0) - } - return - } - - let pairs = _pairs - let value0 = _value0 - let value1 = _value1 - let dictionary = _dictionary - - if let value0 = value0 { - action(value0) - } - - if let value1 = value1 { - action(value1) - } - - for i in 0 ..< pairs.count { - action(pairs[i].value) - } - - if dictionary?.count ?? 0 > 0 { - for element in dictionary!.values { - action(element) - } - } - } -} - -extension Bag where T: ObserverType { - /** - Dispatches `event` to app observers contained inside bag. - - - parameter action: Enumeration closure. - */ - public func on(_ event: Event) { - if _onlyFastPath { - _value0?.on(event) - return - } - - let pairs = _pairs - let value0 = _value0 - let value1 = _value1 - let dictionary = _dictionary - - if let value0 = value0 { - value0.on(event) - } - - if let value1 = value1 { - value1.on(event) - } - - for i in 0 ..< pairs.count { - pairs[i].value.on(event) - } - - if dictionary?.count ?? 0 > 0 { - for element in dictionary!.values { - element.on(event) - } - } - } -} - -/** -Dispatches `dispose` to all disposables contained inside bag. -*/ -@available(*, deprecated, renamed: "disposeAll(in:)") -public func disposeAllIn(_ bag: Bag) { - disposeAll(in: bag) -} - -/** - Dispatches `dispose` to all disposables contained inside bag. - */ -public func disposeAll(in bag: Bag) { - if bag._onlyFastPath { - bag._value0?.dispose() - return - } - - let pairs = bag._pairs - let value0 = bag._value0 - let value1 = bag._value1 - let dictionary = bag._dictionary - - if let value0 = value0 { - value0.dispose() - } - - if let value1 = value1 { - value1.dispose() - } - - for i in 0 ..< pairs.count { - pairs[i].value.dispose() - } - - if dictionary?.count ?? 0 > 0 { - for element in dictionary!.values { - element.dispose() - } - } -} diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Disposable.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Disposable.swift index da760fff..11e5d16c 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Disposable.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Disposable.swift @@ -1,6 +1,6 @@ // // Disposable.swift -// Rx +// RxSwift // // Created by Krunoslav Zaher on 2/8/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -12,4 +12,4 @@ import Foundation public protocol Disposable { /// Dispose resource. func dispose() -} \ No newline at end of file +} diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Disposables/AnonymousDisposable.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Disposables/AnonymousDisposable.swift index d60b5b16..74461a62 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Disposables/AnonymousDisposable.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Disposables/AnonymousDisposable.swift @@ -1,6 +1,6 @@ // // AnonymousDisposable.swift -// Rx +// RxSwift // // Created by Krunoslav Zaher on 2/15/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -8,31 +8,24 @@ import Foundation -/** -Represents an Action-based disposable. - -When dispose method is called, disposal action will be dereferenced. -*/ -public final class AnonymousDisposable : DisposeBase, Cancelable { +/// Represents an Action-based disposable. +/// +/// When dispose method is called, disposal action will be dereferenced. +fileprivate final class AnonymousDisposable : DisposeBase, Cancelable { public typealias DisposeAction = () -> Void private var _isDisposed: AtomicInt = 0 private var _disposeAction: DisposeAction? - /** - - returns: Was resource disposed. - */ + /// - returns: Was resource disposed. public var isDisposed: Bool { return _isDisposed == 1 } - /** - Constructs a new disposable with the given action used for disposal. - - - parameter disposeAction: Disposal action which will be run upon calling `dispose`. - */ - @available(*, deprecated, renamed: "Disposables.create") - public init(_ disposeAction: @escaping DisposeAction) { + /// Constructs a new disposable with the given action used for disposal. + /// + /// - parameter disposeAction: Disposal action which will be run upon calling `dispose`. + fileprivate init(_ disposeAction: @escaping DisposeAction) { _disposeAction = disposeAction super.init() } @@ -43,12 +36,10 @@ public final class AnonymousDisposable : DisposeBase, Cancelable { super.init() } - /** - Calls the disposal action if and only if the current instance hasn't been disposed yet. - - After invoking disposal action, disposal action will be dereferenced. - */ - public func dispose() { + /// Calls the disposal action if and only if the current instance hasn't been disposed yet. + /// + /// After invoking disposal action, disposal action will be dereferenced. + fileprivate func dispose() { if AtomicCompareAndSwap(0, 1, &_isDisposed) { assert(_isDisposed == 1) @@ -60,14 +51,12 @@ public final class AnonymousDisposable : DisposeBase, Cancelable { } } -public extension Disposables { +extension Disposables { - /** - Constructs a new disposable with the given action used for disposal. - - - parameter dispose: Disposal action which will be run upon calling `dispose`. - */ - static func create(with dispose: @escaping () -> ()) -> Cancelable { + /// Constructs a new disposable with the given action used for disposal. + /// + /// - parameter dispose: Disposal action which will be run upon calling `dispose`. + public static func create(with dispose: @escaping () -> ()) -> Cancelable { return AnonymousDisposable(disposeAction: dispose) } diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Disposables/BinaryDisposable.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Disposables/BinaryDisposable.swift index 1c597f49..aef8200e 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Disposables/BinaryDisposable.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Disposables/BinaryDisposable.swift @@ -8,9 +8,7 @@ import Foundation -/** -Represents two disposable resources that are disposed together. -*/ +/// Represents two disposable resources that are disposed together. private final class BinaryDisposable : DisposeBase, Cancelable { private var _isDisposed: AtomicInt = 0 @@ -19,30 +17,24 @@ private final class BinaryDisposable : DisposeBase, Cancelable { private var _disposable1: Disposable? private var _disposable2: Disposable? - /** - - returns: Was resource disposed. - */ + /// - returns: Was resource disposed. var isDisposed: Bool { return _isDisposed > 0 } - /** - Constructs new binary disposable from two disposables. - - - parameter disposable1: First disposable - - parameter disposable2: Second disposable - */ + /// Constructs new binary disposable from two disposables. + /// + /// - parameter disposable1: First disposable + /// - parameter disposable2: Second disposable init(_ disposable1: Disposable, _ disposable2: Disposable) { _disposable1 = disposable1 _disposable2 = disposable2 super.init() } - /** - Calls the disposal action if and only if the current instance hasn't been disposed yet. - - After invoking disposal action, disposal action will be dereferenced. - */ + /// Calls the disposal action if and only if the current instance hasn't been disposed yet. + /// + /// After invoking disposal action, disposal action will be dereferenced. func dispose() { if AtomicCompareAndSwap(0, 1, &_isDisposed) { _disposable1?.dispose() @@ -53,12 +45,10 @@ private final class BinaryDisposable : DisposeBase, Cancelable { } } -public extension Disposables { +extension Disposables { - /** - Creates a disposable with the given disposables. - */ - static func create(_ disposable1: Disposable, _ disposable2: Disposable) -> Cancelable { + /// Creates a disposable with the given disposables. + public static func create(_ disposable1: Disposable, _ disposable2: Disposable) -> Cancelable { return BinaryDisposable(disposable1, disposable2) } diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Disposables/BooleanDisposable.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Disposables/BooleanDisposable.swift index 2464a897..bdd285e1 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Disposables/BooleanDisposable.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Disposables/BooleanDisposable.swift @@ -1,6 +1,6 @@ // // BooleanDisposable.swift -// Rx +// RxSwift // // Created by Junior B. on 10/29/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -8,37 +8,27 @@ import Foundation -/** -Represents a disposable resource that can be checked for disposal status. -*/ +/// Represents a disposable resource that can be checked for disposal status. public final class BooleanDisposable : Disposable, Cancelable { - + internal static let BooleanDisposableTrue = BooleanDisposable(isDisposed: true) private var _isDisposed = false - /** - Initializes a new instance of the `BooleanDisposable` class - */ + /// Initializes a new instance of the `BooleanDisposable` class public init() { } - /** - Initializes a new instance of the `BooleanDisposable` class with given value - */ + /// Initializes a new instance of the `BooleanDisposable` class with given value public init(isDisposed: Bool) { self._isDisposed = isDisposed } - /** - - returns: Was resource disposed. - */ + /// - returns: Was resource disposed. public var isDisposed: Bool { return _isDisposed } - /** - Sets the status to disposed, which can be observer through the `isDisposed` property. - */ + /// Sets the status to disposed, which can be observer through the `isDisposed` property. public func dispose() { _isDisposed = true } diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Disposables/CompositeDisposable.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Disposables/CompositeDisposable.swift index a7e4b5b2..e8c31dff 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Disposables/CompositeDisposable.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Disposables/CompositeDisposable.swift @@ -1,6 +1,6 @@ // // CompositeDisposable.swift -// Rx +// RxSwift // // Created by Krunoslav Zaher on 2/20/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -8,12 +8,16 @@ import Foundation -/** -Represents a group of disposable resources that are disposed together. -*/ +/// Represents a group of disposable resources that are disposed together. public final class CompositeDisposable : DisposeBase, Disposable, Cancelable { - public typealias DisposeKey = Bag.KeyType - + /// Key used to remove disposable from composite disposable + public struct DisposeKey { + fileprivate let key: BagKey + fileprivate init(key: BagKey) { + self.key = key + } + } + private var _lock = SpinLock() // state @@ -27,18 +31,14 @@ public final class CompositeDisposable : DisposeBase, Disposable, Cancelable { public override init() { } - /** - Initializes a new instance of composite disposable with the specified number of disposables. - */ + /// Initializes a new instance of composite disposable with the specified number of disposables. public init(_ disposable1: Disposable, _ disposable2: Disposable) { // This overload is here to make sure we are using optimized version up to 4 arguments. let _ = _disposables!.insert(disposable1) let _ = _disposables!.insert(disposable2) } - /** - Initializes a new instance of composite disposable with the specified number of disposables. - */ + /// Initializes a new instance of composite disposable with the specified number of disposables. public init(_ disposable1: Disposable, _ disposable2: Disposable, _ disposable3: Disposable) { // This overload is here to make sure we are using optimized version up to 4 arguments. let _ = _disposables!.insert(disposable1) @@ -46,9 +46,7 @@ public final class CompositeDisposable : DisposeBase, Disposable, Cancelable { let _ = _disposables!.insert(disposable3) } - /** - Initializes a new instance of composite disposable with the specified number of disposables. - */ + /// Initializes a new instance of composite disposable with the specified number of disposables. public init(_ disposable1: Disposable, _ disposable2: Disposable, _ disposable3: Disposable, _ disposable4: Disposable, _ disposables: Disposable...) { // This overload is here to make sure we are using optimized version up to 4 arguments. let _ = _disposables!.insert(disposable1) @@ -61,27 +59,13 @@ public final class CompositeDisposable : DisposeBase, Disposable, Cancelable { } } - /** - Initializes a new instance of composite disposable with the specified number of disposables. - */ + /// Initializes a new instance of composite disposable with the specified number of disposables. public init(disposables: [Disposable]) { for disposable in disposables { let _ = _disposables!.insert(disposable) } } - /** - Adds a disposable to the CompositeDisposable or disposes the disposable if the CompositeDisposable is disposed. - - - parameter disposable: Disposable to add. - - returns: Key that can be used to remove disposable from composite disposable. In case dispose bag was already - disposed `nil` will be returned. - */ - @available(*, deprecated, renamed: "insert(_:)") - public func addDisposable(_ disposable: Disposable) -> DisposeKey? { - return insert(disposable) - } - /** Adds a disposable to the CompositeDisposable or disposes the disposable if the CompositeDisposable is disposed. @@ -102,44 +86,29 @@ public final class CompositeDisposable : DisposeBase, Disposable, Cancelable { private func _insert(_ disposable: Disposable) -> DisposeKey? { _lock.lock(); defer { _lock.unlock() } - return _disposables?.insert(disposable) + let bagKey = _disposables?.insert(disposable) + return bagKey.map(DisposeKey.init) } - /** - - returns: Gets the number of disposables contained in the `CompositeDisposable`. - */ + /// - returns: Gets the number of disposables contained in the `CompositeDisposable`. public var count: Int { _lock.lock(); defer { _lock.unlock() } return _disposables?.count ?? 0 } - /** - Removes and disposes the disposable identified by `disposeKey` from the CompositeDisposable. - - - parameter disposeKey: Key used to identify disposable to be removed. - */ - @available(*, deprecated, renamed: "remove(for:)") - public func removeDisposable(_ disposeKey: DisposeKey) { - remove(for: disposeKey) - } - - /** - Removes and disposes the disposable identified by `disposeKey` from the CompositeDisposable. - - - parameter disposeKey: Key used to identify disposable to be removed. - */ + /// Removes and disposes the disposable identified by `disposeKey` from the CompositeDisposable. + /// + /// - parameter disposeKey: Key used to identify disposable to be removed. public func remove(for disposeKey: DisposeKey) { _remove(for: disposeKey)?.dispose() } private func _remove(for disposeKey: DisposeKey) -> Disposable? { _lock.lock(); defer { _lock.unlock() } - return _disposables?.removeKey(disposeKey) + return _disposables?.removeKey(disposeKey.key) } - /** - Disposes all disposables in the group and removes them from the group. - */ + /// Disposes all disposables in the group and removes them from the group. public func dispose() { if let disposables = _dispose() { disposeAll(in: disposables) @@ -155,3 +124,30 @@ public final class CompositeDisposable : DisposeBase, Disposable, Cancelable { return disposeBag } } + +extension Disposables { + + /// Creates a disposable with the given disposables. + public static func create(_ disposable1: Disposable, _ disposable2: Disposable, _ disposable3: Disposable) -> Cancelable { + return CompositeDisposable(disposable1, disposable2, disposable3) + } + + /// Creates a disposable with the given disposables. + public static func create(_ disposable1: Disposable, _ disposable2: Disposable, _ disposable3: Disposable, _ disposables: Disposable ...) -> Cancelable { + var disposables = disposables + disposables.append(disposable1) + disposables.append(disposable2) + disposables.append(disposable3) + return CompositeDisposable(disposables: disposables) + } + + /// Creates a disposable with the given disposables. + public static func create(_ disposables: [Disposable]) -> Cancelable { + switch disposables.count { + case 2: + return Disposables.create(disposables[0], disposables[1]) + default: + return CompositeDisposable(disposables: disposables) + } + } +} diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Disposables/Disposables.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Disposables/Disposables.swift index 694b1e5f..b409d52b 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Disposables/Disposables.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Disposables/Disposables.swift @@ -1,61 +1,15 @@ // // Disposables.swift -// Rx +// RxSwift // // Created by Mohsen Ramezanpoor on 01/08/2016. -// Copyright © 2016 Mohsen Ramezanpoor. All rights reserved. +// Copyright © 2016 Krunoslav Zaher. All rights reserved. // import Foundation -/** - A collection of utility methods for common disposable operations. - */ +/// A collection of utility methods for common disposable operations. public struct Disposables { - private init() {} - } -public extension Disposables { - - private static let noOp: Disposable = NopDisposable() - - /** - Creates a disposable that does nothing on disposal. - */ - static func create() -> Disposable { - return noOp - } - - /** - Creates a disposable with the given disposables. - */ - static func create(_ disposable1: Disposable, _ disposable2: Disposable, _ disposable3: Disposable) -> Cancelable { - return CompositeDisposable(disposable1, disposable2, disposable3) - } - - /** - Creates a disposable with the given disposables. - */ - static func create(_ disposable1: Disposable, _ disposable2: Disposable, _ disposable3: Disposable, _ disposables: Disposable ...) -> Cancelable { - var disposables = disposables - disposables.append(disposable1) - disposables.append(disposable2) - disposables.append(disposable3) - return CompositeDisposable(disposables: disposables) - } - - /** - Creates a disposable with the given disposables. - */ - static func create(_ disposables: [Disposable]) -> Cancelable { - switch disposables.count { - case 2: - return Disposables.create(disposables[0], disposables[1]) - default: - return CompositeDisposable(disposables: disposables) - } - } - -} diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Disposables/DisposeBag.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Disposables/DisposeBag.swift index 34a3b0c5..d9cb86f7 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Disposables/DisposeBag.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Disposables/DisposeBag.swift @@ -1,6 +1,6 @@ // // DisposeBag.swift -// Rx +// RxSwift // // Created by Krunoslav Zaher on 3/25/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -9,11 +9,9 @@ import Foundation extension Disposable { - /** - Adds `self` to `bag`. - - - parameter bag: `DisposeBag` to add `self` to. - */ + /// Adds `self` to `bag`. + /// + /// - parameter bag: `DisposeBag` to add `self` to. public func addDisposableTo(_ bag: DisposeBag) { bag.insert(self) } @@ -39,28 +37,14 @@ public final class DisposeBag: DisposeBase { private var _disposables = [Disposable]() private var _isDisposed = false - /** - Constructs new empty dispose bag. - */ + /// Constructs new empty dispose bag. public override init() { super.init() } - /** - Adds `disposable` to be disposed when dispose bag is being deinited. - - - parameter disposable: Disposable to add. - */ - @available(*, deprecated, renamed: "insert(_:)") - public func addDisposable(_ disposable: Disposable) { - insert(disposable) - } - - /** - Adds `disposable` to be disposed when dispose bag is being deinited. - - - parameter disposable: Disposable to add. - */ + /// Adds `disposable` to be disposed when dispose bag is being deinited. + /// + /// - parameter disposable: Disposable to add. public func insert(_ disposable: Disposable) { _insert(disposable)?.dispose() } @@ -76,9 +60,7 @@ public final class DisposeBag: DisposeBase { return nil } - /** - This is internal on purpose, take a look at `CompositeDisposable` instead. - */ + /// This is internal on purpose, take a look at `CompositeDisposable` instead. private func dispose() { let oldDisposables = _dispose() diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Disposables/DisposeBase.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Disposables/DisposeBase.swift index 16da27ce..0a363bbf 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Disposables/DisposeBase.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Disposables/DisposeBase.swift @@ -1,6 +1,6 @@ // // DisposeBase.swift -// Rx +// RxSwift // // Created by Krunoslav Zaher on 4/4/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -8,19 +8,17 @@ import Foundation -/** -Base class for all disposables. -*/ +/// Base class for all disposables. public class DisposeBase { init() { #if TRACE_RESOURCES - let _ = AtomicIncrement(&resourceCount) + let _ = Resources.incrementTotal() #endif } deinit { #if TRACE_RESOURCES - let _ = AtomicDecrement(&resourceCount) + let _ = Resources.decrementTotal() #endif } } diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Disposables/NopDisposable.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Disposables/NopDisposable.swift index 0203f226..9f1df161 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Disposables/NopDisposable.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Disposables/NopDisposable.swift @@ -1,6 +1,6 @@ // // NopDisposable.swift -// Rx +// RxSwift // // Created by Krunoslav Zaher on 2/15/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -8,26 +8,27 @@ import Foundation -/** -Represents a disposable that does nothing on disposal. - -Nop = No Operation -*/ -public struct NopDisposable : Disposable { +/// Represents a disposable that does nothing on disposal. +/// +/// Nop = No Operation +fileprivate struct NopDisposable : Disposable { - /** - Singleton instance of `NopDisposable`. - */ - @available(*, deprecated, renamed: "Disposables.create()") - public static let instance: Disposable = NopDisposable() + fileprivate static let noOp: Disposable = NopDisposable() - init() { + fileprivate init() { } - /** - Does nothing. - */ + /// Does nothing. public func dispose() { } } + +extension Disposables { + /** + Creates a disposable that does nothing on disposal. + */ + static public func create() -> Disposable { + return NopDisposable.noOp + } +} diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Disposables/RefCountDisposable.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Disposables/RefCountDisposable.swift index 775b0863..df0ab3e3 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Disposables/RefCountDisposable.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Disposables/RefCountDisposable.swift @@ -1,6 +1,6 @@ // // RefCountDisposable.swift -// Rx +// RxSwift // // Created by Junior B. on 10/29/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -8,26 +8,20 @@ import Foundation -/** - Represents a disposable resource that only disposes its underlying disposable resource when all dependent disposable objects have been disposed. - */ +/// Represents a disposable resource that only disposes its underlying disposable resource when all dependent disposable objects have been disposed. public final class RefCountDisposable : DisposeBase, Cancelable { private var _lock = SpinLock() private var _disposable = nil as Disposable? private var _primaryDisposed = false private var _count = 0 - /** - - returns: Was resource disposed. - */ + /// - returns: Was resource disposed. public var isDisposed: Bool { _lock.lock(); defer { _lock.unlock() } return _disposable == nil } - /** - Initializes a new instance of the `RefCountDisposable`. - */ + /// Initializes a new instance of the `RefCountDisposable`. public init(disposable: Disposable) { _disposable = disposable super.init() @@ -55,9 +49,7 @@ public final class RefCountDisposable : DisposeBase, Cancelable { } } - /** - Disposes the underlying disposable only when all dependent disposables have been disposed. - */ + /// Disposes the underlying disposable only when all dependent disposables have been disposed. public func dispose() { let oldDisposable: Disposable? = _lock.calculateLocked { if let oldDisposable = _disposable, !_primaryDisposed diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Disposables/ScheduledDisposable.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Disposables/ScheduledDisposable.swift index d2f80a09..a9226002 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Disposables/ScheduledDisposable.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Disposables/ScheduledDisposable.swift @@ -13,9 +13,7 @@ private let disposeScheduledDisposable: (ScheduledDisposable) -> Disposable = { return Disposables.create() } -/** -Represents a disposable resource whose disposal invocation will be scheduled on the specified scheduler. -*/ +/// Represents a disposable resource whose disposal invocation will be scheduled on the specified scheduler. public final class ScheduledDisposable : Cancelable { public let scheduler: ImmediateSchedulerType @@ -24,9 +22,7 @@ public final class ScheduledDisposable : Cancelable { // state private var _disposable: Disposable? - /** - - returns: Was resource disposed. - */ + /// - returns: Was resource disposed. public var isDisposed: Bool { return _isDisposed == 1 } @@ -42,9 +38,7 @@ public final class ScheduledDisposable : Cancelable { _disposable = disposable } - /** - Disposes the wrapped disposable on the provided scheduler. - */ + /// Disposes the wrapped disposable on the provided scheduler. public func dispose() { let _ = scheduler.schedule(self, action: disposeScheduledDisposable) } diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Disposables/SerialDisposable.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Disposables/SerialDisposable.swift index 8aa355c4..a87814fc 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Disposables/SerialDisposable.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Disposables/SerialDisposable.swift @@ -1,6 +1,6 @@ // // SerialDisposable.swift -// Rx +// RxSwift // // Created by Krunoslav Zaher on 3/12/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -8,9 +8,7 @@ import Foundation -/** -Represents a disposable resource whose underlying disposable resource can be replaced by another disposable resource, causing automatic disposal of the previous underlying disposable resource. -*/ +/// Represents a disposable resource whose underlying disposable resource can be replaced by another disposable resource, causing automatic disposal of the previous underlying disposable resource. public final class SerialDisposable : DisposeBase, Cancelable { private var _lock = SpinLock() @@ -18,16 +16,12 @@ public final class SerialDisposable : DisposeBase, Cancelable { private var _current = nil as Disposable? private var _isDisposed = false - /** - - returns: Was resource disposed. - */ + /// - returns: Was resource disposed. public var isDisposed: Bool { return _isDisposed } - /** - Initializes a new instance of the `SerialDisposable`. - */ + /// Initializes a new instance of the `SerialDisposable`. override public init() { super.init() } @@ -63,9 +57,7 @@ public final class SerialDisposable : DisposeBase, Cancelable { } } - /** - Disposes the underlying disposable as well as all future replacements. - */ + /// Disposes the underlying disposable as well as all future replacements. public func dispose() { _dispose()?.dispose() } diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Disposables/SingleAssignmentDisposable.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Disposables/SingleAssignmentDisposable.swift index 56f45d70..18d27eca 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Disposables/SingleAssignmentDisposable.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Disposables/SingleAssignmentDisposable.swift @@ -1,6 +1,6 @@ // // SingleAssignmentDisposable.swift -// Rx +// RxSwift // // Created by Krunoslav Zaher on 2/15/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -14,76 +14,84 @@ Represents a disposable resource which only allows a single assignment of its un If an underlying disposable resource has already been set, future attempts to set the underlying disposable resource will throw an exception. */ public class SingleAssignmentDisposable : DisposeBase, Disposable, Cancelable { - private var _lock = SpinLock() - +#if os(Linux) + fileprivate let _lock = SpinLock() +#endif + + fileprivate enum DisposeState: UInt32 { + case disposed = 1 + case disposableSet = 2 + } + + // Jeej, swift API consistency rules + fileprivate enum DisposeStateInt32: Int32 { + case disposed = 1 + case disposableSet = 2 + } + // state - private var _isDisposed = false - private var _disposableSet = false + private var _state: UInt32 = 0 private var _disposable = nil as Disposable? - /** - - returns: A value that indicates whether the object is disposed. - */ + /// - returns: A value that indicates whether the object is disposed. public var isDisposed: Bool { - return _isDisposed + return (_state & DisposeState.disposed.rawValue) != 0 } - /** - Initializes a new instance of the `SingleAssignmentDisposable`. - */ + /// Initializes a new instance of the `SingleAssignmentDisposable`. public override init() { super.init() } - /** - Gets or sets the underlying disposable. After disposal, the result of getting this property is undefined. - - **Throws exception if the `SingleAssignmentDisposable` has already been assigned to.** - */ - public var disposable: Disposable { - get { - _lock.lock(); defer { _lock.unlock() } - return _disposable ?? Disposables.create() - } - set { - _setDisposable(newValue)?.dispose() - } - } + /// Gets or sets the underlying disposable. After disposal, the result of getting this property is undefined. + /// + /// **Throws exception if the `SingleAssignmentDisposable` has already been assigned to.** + public func setDisposable(_ disposable: Disposable) { + _disposable = disposable - private func _setDisposable(_ newValue: Disposable) -> Disposable? { - _lock.lock(); defer { _lock.unlock() } - if _disposableSet { + #if os(Linux) + _lock.lock() + let previousState = Int32(_state) + _state = _state | DisposeState.disposableSet.rawValue + // We know about `defer { _lock.unlock() }`, but this resolves Swift compiler bug. Using `defer` here causes anomaly. + _lock.unlock() + #else + let previousState = OSAtomicOr32OrigBarrier(DisposeState.disposableSet.rawValue, &_state) + #endif + + if (previousState & DisposeStateInt32.disposableSet.rawValue) != 0 { rxFatalError("oldState.disposable != nil") } - _disposableSet = true - - if _isDisposed { - return newValue + if (previousState & DisposeStateInt32.disposed.rawValue) != 0 { + disposable.dispose() + _disposable = nil } - - _disposable = newValue - - return nil } - /** - Disposes the underlying disposable. - */ + /// Disposes the underlying disposable. public func dispose() { - if _isDisposed { + #if os(Linux) + _lock.lock() + let previousState = Int32(_state) + _state = _state | DisposeState.disposed.rawValue + // We know about `defer { _lock.unlock() }`, but this resolves Swift compiler bug. Using `defer` here causes anomaly. + _lock.unlock() + #else + let previousState = OSAtomicOr32OrigBarrier(DisposeState.disposed.rawValue, &_state) + #endif + + if (previousState & DisposeStateInt32.disposed.rawValue) != 0 { return } - _dispose()?.dispose() - } - private func _dispose() -> Disposable? { - _lock.lock(); defer { _lock.unlock() } - - _isDisposed = true - let disposable = _disposable - _disposable = nil - - return disposable + if (previousState & DisposeStateInt32.disposableSet.rawValue) != 0 { + guard let disposable = _disposable else { + rxFatalError("Disposable not set") + } + disposable.dispose() + _disposable = nil + } } + } diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Disposables/StableCompositeDisposable.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Disposables/StableCompositeDisposable.swift deleted file mode 100644 index ad10eacc..00000000 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Disposables/StableCompositeDisposable.swift +++ /dev/null @@ -1,16 +0,0 @@ -// -// StableCompositeDisposable.swift -// RxSwift -// -// Created by Krunoslav Zaher on 6/12/15. -// Copyright © 2015 Krunoslav Zaher. All rights reserved. -// - -import Foundation - -public final class StableCompositeDisposable { - @available(*, deprecated, renamed: "Disposables.create") - public static func create(_ disposable1: Disposable, _ disposable2: Disposable) -> Disposable { - return Disposables.create(disposable1, disposable2) - } -} diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Disposables/SubscriptionDisposable.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Disposables/SubscriptionDisposable.swift index 64610d25..9a3d639b 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Disposables/SubscriptionDisposable.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Disposables/SubscriptionDisposable.swift @@ -1,6 +1,6 @@ // // SubscriptionDisposable.swift -// Rx +// RxSwift // // Created by Krunoslav Zaher on 10/25/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Errors.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Errors.swift index 8074e161..92cb2f13 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Errors.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Errors.swift @@ -1,6 +1,6 @@ // // Errors.swift -// Rx +// RxSwift // // Created by Krunoslav Zaher on 3/28/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -11,46 +11,28 @@ import Foundation let RxErrorDomain = "RxErrorDomain" let RxCompositeFailures = "RxCompositeFailures" -/** -Generic Rx error codes. -*/ +/// Generic Rx error codes. public enum RxError : Swift.Error , CustomDebugStringConvertible { - /** - Unknown error occured. - */ + /// Unknown error occured. case unknown - /** - Performing an action on disposed object. - */ + /// Performing an action on disposed object. case disposed(object: AnyObject) - /** - Aritmetic overflow error. - */ + /// Aritmetic overflow error. case overflow - /** - Argument out of range error. - */ + /// Argument out of range error. case argumentOutOfRange - /** - Sequence doesn't contain any elements. - */ + /// Sequence doesn't contain any elements. case noElements - /** - Sequence contains more than one element. - */ + /// Sequence contains more than one element. case moreThanOneElement - /** - Timeout error. - */ + /// Timeout error. case timeout } -public extension RxError { - /** - A textual representation of `self`, suitable for debugging. - */ +extension RxError { + /// A textual representation of `self`, suitable for debugging. public var debugDescription: String { switch self { case .unknown: diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Event.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Event.swift index 5fcf8f29..d0f995c8 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Event.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Event.swift @@ -1,6 +1,6 @@ // // Event.swift -// Rx +// RxSwift // // Created by Krunoslav Zaher on 2/8/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -8,12 +8,10 @@ import Foundation -/** -Represents a sequence event. - -Sequence grammar: -next\* (error | completed) -*/ +/// Represents a sequence event. +/// +/// Sequence grammar: +/// **next\* (error | completed)** public enum Event { /// Next element is produced. case next(Element) @@ -40,7 +38,7 @@ extension Event : CustomDebugStringConvertible { } extension Event { - /// - returns: Is `Completed` or `Error` event. + /// Is `Completed` or `Error` event. public var isStopEvent: Bool { switch self { case .next: return false @@ -48,7 +46,7 @@ extension Event { } } - /// - returns: If `Next` event, returns element value. + /// If `Next` event, returns element value. public var element: Element? { if case .next(let value) = self { return value @@ -56,7 +54,7 @@ extension Event { return nil } - /// - returns: If `Error` event, returns error. + /// If `Error` event, returns error. public var error: Swift.Error? { if case .error(let error) = self { return error @@ -64,3 +62,23 @@ extension Event { return nil } } + +extension Event { + /// Maps sequence elements using transform. If error happens during the transform .error + /// will be returned as value + public func map(_ transform: (Element) throws -> Result) -> Event { + do { + switch self { + case let .next(element): + return .next(try transform(element)) + case let .error(error): + return .error(error) + case .completed: + return .completed + } + } + catch let e { + return .error(e) + } + } +} diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Extensions/Bag+Rx.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Extensions/Bag+Rx.swift new file mode 100644 index 00000000..7a917e32 --- /dev/null +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Extensions/Bag+Rx.swift @@ -0,0 +1,58 @@ +// +// Bag+Rx.swift +// RxSwift +// +// Created by Krunoslav Zaher on 10/19/16. +// Copyright © 2016 Krunoslav Zaher. All rights reserved. +// + +import Foundation + + +// MARK: forEach + +extension Bag where T: ObserverType { + /// Dispatches `event` to app observers contained inside bag. + /// + /// - parameter action: Enumeration closure. + func on(_ event: Event) { + if _onlyFastPath { + _value0?.on(event) + return + } + + let value0 = _value0 + let dictionary = _dictionary + + if let value0 = value0 { + value0.on(event) + } + + if let dictionary = dictionary { + for element in dictionary.values { + element.on(event) + } + } + } +} + +/// Dispatches `dispose` to all disposables contained inside bag. +func disposeAll(in bag: Bag) { + if bag._onlyFastPath { + bag._value0?.dispose() + return + } + + let value0 = bag._value0 + let dictionary = bag._dictionary + + if let value0 = value0 { + value0.dispose() + } + + if let dictionary = dictionary { + for element in dictionary.values { + element.dispose() + } + } +} diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Extensions/String+Rx.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Extensions/String+Rx.swift index b794766e..40fd9a84 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Extensions/String+Rx.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Extensions/String+Rx.swift @@ -1,6 +1,6 @@ // // String+Rx.swift -// Rx +// RxSwift // // Created by Krunoslav Zaher on 12/25/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -9,9 +9,7 @@ import Foundation extension String { - /** - This is needed because on Linux Swift doesn't have `rangeOfString(..., options: .BackwardsSearch)` - */ + /// This is needed because on Linux Swift doesn't have `rangeOfString(..., options: .BackwardsSearch)` func lastIndexOf(_ character: Character) -> Index? { var index = endIndex while index > startIndex { diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/ImmediateSchedulerType.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/ImmediateSchedulerType.swift index c535bd35..fa0c2d34 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/ImmediateSchedulerType.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/ImmediateSchedulerType.swift @@ -8,9 +8,7 @@ import Foundation -/** -Represents an object that immediately schedules units of work. -*/ +/// Represents an object that immediately schedules units of work. public protocol ImmediateSchedulerType { /** Schedules an action to be executed immediatelly. diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observable.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observable.swift index 9c0f325b..f394063e 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observable.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observable.swift @@ -1,6 +1,6 @@ // // Observable.swift -// Rx +// RxSwift // // Created by Krunoslav Zaher on 2/8/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -8,20 +8,16 @@ import Foundation -/** -A type-erased `ObservableType`. - -It represents a push style sequence. -*/ +/// A type-erased `ObservableType`. +/// +/// It represents a push style sequence. public class Observable : ObservableType { - /** - Type of elements in sequence. - */ + /// Type of elements in sequence. public typealias E = Element init() { #if TRACE_RESOURCES - OSAtomicIncrement32(&resourceCount) + let _ = Resources.incrementTotal() #endif } @@ -35,18 +31,16 @@ public class Observable : ObservableType { deinit { #if TRACE_RESOURCES - let _ = AtomicDecrement(&resourceCount) + let _ = Resources.decrementTotal() #endif } // this is kind of ugly I know :( // Swift compiler reports "Not supported yet" when trying to override protocol extensions, so ¯\_(ツ)_/¯ - /** - Optimizations for map operator - */ + /// Optimizations for map operator internal func composeMap(_ selector: @escaping (Element) throws -> R) -> Observable { - return Map(source: self, selector: selector) + return Map(source: self, transform: selector) } } diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/ObservableConvertibleType.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/ObservableConvertibleType.swift index a749a067..2a94d634 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/ObservableConvertibleType.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/ObservableConvertibleType.swift @@ -1,6 +1,6 @@ // // ObservableConvertibleType.swift -// Rx +// RxSwift // // Created by Krunoslav Zaher on 9/17/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -8,19 +8,13 @@ import Foundation -/** -Type that can be converted to observable sequence (`Observer`). -*/ +/// Type that can be converted to observable sequence (`Observer`). public protocol ObservableConvertibleType { - /** - Type of elements in sequence. - */ + /// Type of elements in sequence. associatedtype E - - /** - Converts `self` to `Observable` sequence. - - - returns: Observable sequence that represents `self`. - */ + + /// Converts `self` to `Observable` sequence. + /// + /// - returns: Observable sequence that represents `self`. func asObservable() -> Observable } diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/ObservableType+Extensions.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/ObservableType+Extensions.swift index 5cb701f5..ea225ab5 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/ObservableType+Extensions.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/ObservableType+Extensions.swift @@ -1,6 +1,6 @@ // // ObservableType+Extensions.swift -// Rx +// RxSwift // // Created by Krunoslav Zaher on 2/21/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -15,7 +15,6 @@ extension ObservableType { - parameter on: Action to invoke for each event in the observable sequence. - returns: Subscription object used to unsubscribe from the observable sequence. */ - // @warn_unused_result(message: "http://git.io/rxs.ud") public func subscribe(_ on: @escaping (Event) -> Void) -> Disposable { let observer = AnonymousObserver { e in @@ -35,7 +34,6 @@ extension ObservableType { gracefully completed, errored, or if the generation is cancelled by disposing subscription). - returns: Subscription object used to unsubscribe from the observable sequence. */ - // @warn_unused_result(message: "http://git.io/rxs.ud") public func subscribe(file: String = #file, line: UInt = #line, function: String = #function, onNext: ((E) -> Void)? = nil, onError: ((Swift.Error) -> Void)? = nil, onCompleted: (() -> Void)? = nil, onDisposed: (() -> Void)? = nil) -> Disposable { @@ -81,7 +79,6 @@ extension ObservableType { gracefully completed, errored, or if the generation is cancelled by disposing subscription). - returns: Subscription object used to unsubscribe from the observable sequence. */ - // @warn_unused_result(message: "http://git.io/rxs.ud") public func subscribe(onNext: ((E) -> Void)? = nil, onError: ((Swift.Error) -> Void)? = nil, onCompleted: (() -> Void)? = nil, onDisposed: (() -> Void)? = nil) -> Disposable { @@ -112,67 +109,10 @@ extension ObservableType { ) } #endif - - /** - Subscribes an element handler to an observable sequence. - - - parameter onNext: Action to invoke for each element in the observable sequence. - - returns: Subscription object used to unsubscribe from the observable sequence. - */ - // @warn_unused_result(message: "http://git.io/rxs.ud") - @available(*, deprecated, renamed: "subscribe(onNext:)") - public func subscribeNext(_ onNext: @escaping (E) -> Void) - -> Disposable { - let observer = AnonymousObserver { e in - if case .next(let value) = e { - onNext(value) - } - } - return self.subscribeSafe(observer) - } - - /** - Subscribes an error handler to an observable sequence. - - - parameter onError: Action to invoke upon errored termination of the observable sequence. - - returns: Subscription object used to unsubscribe from the observable sequence. - */ - // @warn_unused_result(message: "http://git.io/rxs.ud") - @available(*, deprecated, renamed: "subscribe(onError:)") - public func subscribeError(_ onError: @escaping (Swift.Error) -> Void) - -> Disposable { - let observer = AnonymousObserver { e in - if case .error(let error) = e { - onError(error) - } - } - return self.subscribeSafe(observer) - } - - /** - Subscribes a completion handler to an observable sequence. - - - parameter onCompleted: Action to invoke upon graceful termination of the observable sequence. - - returns: Subscription object used to unsubscribe from the observable sequence. - */ - // @warn_unused_result(message: "http://git.io/rxs.ud") - @available(*, deprecated, renamed: "subscribe(onCompleted:)") - public func subscribeCompleted(_ onCompleted: @escaping () -> Void) - -> Disposable { - let observer = AnonymousObserver { e in - if case .completed = e { - onCompleted() - } - } - return self.subscribeSafe(observer) - } } -public extension ObservableType { - /** - All internal subscribe calls go through this method. - */ - // @warn_unused_result(message: "http://git.io/rxs.ud") +extension ObservableType { + /// All internal subscribe calls go through this method. func subscribeSafe(_ observer: O) -> Disposable where O.E == E { return self.asObservable().subscribe(observer) } diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/ObservableType.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/ObservableType.swift index 6c7be851..7fd799cc 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/ObservableType.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/ObservableType.swift @@ -8,13 +8,9 @@ import Foundation -/** -Represents a push style sequence. -*/ +/// Represents a push style sequence. public protocol ObservableType : ObservableConvertibleType { - /** - Type of elements in sequence. - */ + /// Type of elements in sequence. associatedtype E /** @@ -40,16 +36,12 @@ public protocol ObservableType : ObservableConvertibleType { - returns: Subscription for `observer` that can be used to cancel production of sequence elements and free resources. */ - // @warn_unused_result(message: "http://git.io/rxs.ud") func subscribe(_ observer: O) -> Disposable where O.E == E } extension ObservableType { - /** - Default implementation of converting `ObservableType` to `Observable`. - */ - // @warn_unused_result(message:"http://git.io/rxs.uo") + /// Default implementation of converting `ObservableType` to `Observable`. public func asObservable() -> Observable { // temporary workaround //return Observable.create(subscribe: self.subscribe) diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/AddRef.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/AddRef.swift index 37ccaa09..36f9d794 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/AddRef.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/AddRef.swift @@ -1,6 +1,6 @@ // // AddRef.swift -// Rx +// RxSwift // // Created by Junior B. on 30/10/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -11,8 +11,8 @@ import Foundation class AddRefSink : Sink, ObserverType { typealias Element = O.E - override init(observer: O) { - super.init(observer: observer) + override init(observer: O, cancel: Cancelable) { + super.init(observer: observer, cancel: cancel) } func on(_ event: Event) { @@ -37,11 +37,11 @@ class AddRef : Producer { _refCount = refCount } - override func run(_ observer: O) -> Disposable where O.E == Element { + override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element { let releaseDisposable = _refCount.retain() - let sink = AddRefSink(observer: observer) - sink.disposable = Disposables.create(releaseDisposable, _source.subscribeSafe(sink)) + let sink = AddRefSink(observer: observer, cancel: cancel) + let subscription = Disposables.create(releaseDisposable, _source.subscribeSafe(sink)) - return sink + return (sink: sink, subscription: subscription) } } diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Amb.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Amb.swift index 851a3dac..f880354c 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Amb.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Amb.swift @@ -26,7 +26,7 @@ class AmbObserver : ObserverType where O.E == Elem init(parent: Parent, cancel: Disposable, sink: @escaping Sink) { #if TRACE_RESOURCES - let _ = AtomicIncrement(&resourceCount) + let _ = Resources.incrementTotal() #endif _parent = parent @@ -43,7 +43,7 @@ class AmbObserver : ObserverType where O.E == Elem deinit { #if TRACE_RESOURCES - let _ = AtomicDecrement(&resourceCount) + let _ = Resources.decrementTotal() #endif } } @@ -58,9 +58,9 @@ class AmbSink : Sink where O.E == ElementType { // state private var _choice = AmbState.neither - init(parent: Parent, observer: O) { + init(parent: Parent, observer: O, cancel: Cancelable) { _parent = parent - super.init(observer: observer) + super.init(observer: observer, cancel: cancel) } func run() -> Disposable { @@ -98,8 +98,8 @@ class AmbSink : Sink where O.E == ElementType { decide(o, e, .right, subscription1) } - subscription1.disposable = _parent._left.subscribe(sink1) - subscription2.disposable = _parent._right.subscribe(sink2) + subscription1.setDisposable(_parent._left.subscribe(sink1)) + subscription2.setDisposable(_parent._right.subscribe(sink2)) return disposeAll } @@ -114,9 +114,9 @@ class Amb: Producer { _right = right } - override func run(_ observer: O) -> Disposable where O.E == Element { - let sink = AmbSink(parent: self, observer: observer) - sink.disposable = sink.run() - return sink + override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element { + let sink = AmbSink(parent: self, observer: observer, cancel: cancel) + let subscription = sink.run() + return (sink: sink, subscription: subscription) } } diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/AnonymousObservable.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/AnonymousObservable.swift index c6317ab7..bf3627a3 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/AnonymousObservable.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/AnonymousObservable.swift @@ -1,6 +1,6 @@ // // AnonymousObservable.swift -// Rx +// RxSwift // // Created by Krunoslav Zaher on 2/8/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -15,8 +15,8 @@ class AnonymousObservableSink : Sink, ObserverType { // state private var _isStopped: AtomicInt = 0 - override init(observer: O) { - super.init(observer: observer) + override init(observer: O, cancel: Cancelable) { + super.init(observer: observer, cancel: cancel) } func on(_ event: Event) { @@ -48,9 +48,9 @@ class AnonymousObservable : Producer { _subscribeHandler = subscribeHandler } - override func run(_ observer: O) -> Disposable where O.E == Element { - let sink = AnonymousObservableSink(observer: observer) - sink.disposable = sink.run(self) - return sink + override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element { + let sink = AnonymousObservableSink(observer: observer, cancel: cancel) + let subscription = sink.run(self) + return (sink: sink, subscription: subscription) } } diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Buffer.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Buffer.swift index 626c5fb6..c773f473 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Buffer.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Buffer.swift @@ -1,6 +1,6 @@ // // Buffer.swift -// Rx +// RxSwift // // Created by Krunoslav Zaher on 9/13/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -22,10 +22,10 @@ class BufferTimeCount : Producer<[Element]> { _scheduler = scheduler } - override func run(_ observer: O) -> Disposable where O.E == [Element] { - let sink = BufferTimeCountSink(parent: self, observer: observer) - sink.disposable = sink.run() - return sink + override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == [Element] { + let sink = BufferTimeCountSink(parent: self, observer: observer, cancel: cancel) + let subscription = sink.run() + return (sink: sink, subscription: subscription) } } @@ -46,9 +46,9 @@ class BufferTimeCountSink private var _buffer = [Element]() private var _windowID = 0 - init(parent: Parent, observer: O) { + init(parent: Parent, observer: O, cancel: Cancelable) { _parent = parent - super.init(observer: observer) + super.init(observer: observer, cancel: cancel) } func run() -> Disposable { @@ -104,7 +104,7 @@ class BufferTimeCountSink _timerD.disposable = nextTimer - nextTimer.disposable = _parent._scheduler.scheduleRelative(windowID, dueTime: _parent._timeSpan) { previousWindowID in + let disposable = _parent._scheduler.scheduleRelative(windowID, dueTime: _parent._timeSpan) { previousWindowID in self._lock.performLocked { if previousWindowID != self._windowID { return @@ -115,5 +115,7 @@ class BufferTimeCountSink return Disposables.create() } + + nextTimer.setDisposable(disposable) } } diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Catch.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Catch.swift index bd1f0b50..0f430695 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Catch.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Catch.swift @@ -39,15 +39,15 @@ class CatchSink : Sink, ObserverType { private let _parent: Parent private let _subscription = SerialDisposable() - init(parent: Parent, observer: O) { + init(parent: Parent, observer: O, cancel: Cancelable) { _parent = parent - super.init(observer: observer) + super.init(observer: observer, cancel: cancel) } func run() -> Disposable { let d1 = SingleAssignmentDisposable() _subscription.disposable = d1 - d1.disposable = _parent._source.subscribe(self) + d1.setDisposable(_parent._source.subscribe(self)) return _subscription } @@ -86,10 +86,10 @@ class Catch : Producer { _handler = handler } - override func run(_ observer: O) -> Disposable where O.E == Element { - let sink = CatchSink(parent: self, observer: observer) - sink.disposable = sink.run() - return sink + override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element { + let sink = CatchSink(parent: self, observer: observer, cancel: cancel) + let subscription = sink.run() + return (sink: sink, subscription: subscription) } } @@ -103,8 +103,8 @@ class CatchSequenceSink private var _lastError: Swift.Error? - override init(observer: O) { - super.init(observer: observer) + override init(observer: O, cancel: Cancelable) { + super.init(observer: observer, cancel: cancel) } func on(_ event: Event) { @@ -154,9 +154,9 @@ class CatchSequence : Producer where S.Iterat self.sources = sources } - override func run(_ observer: O) -> Disposable where O.E == Element { - let sink = CatchSequenceSink(observer: observer) - sink.disposable = sink.run((self.sources.makeIterator(), nil)) - return sink + override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element { + let sink = CatchSequenceSink(observer: observer, cancel: cancel) + let subscription = sink.run((self.sources.makeIterator(), nil)) + return (sink: sink, subscription: subscription) } } diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/CombineLatest+CollectionType.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/CombineLatest+Collection.swift similarity index 87% rename from Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/CombineLatest+CollectionType.swift rename to Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/CombineLatest+Collection.swift index 4e40ef86..713a6531 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/CombineLatest+CollectionType.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/CombineLatest+Collection.swift @@ -1,6 +1,6 @@ // // CombineLatest+Collection.swift -// Rx +// RxSwift // // Created by Krunoslav Zaher on 8/29/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -24,7 +24,7 @@ class CombineLatestCollectionTypeSink var _numberOfDone = 0 var _subscriptions: [SingleAssignmentDisposable] - init(parent: Parent, observer: O) { + init(parent: Parent, observer: O, cancel: Cancelable) { _parent = parent _values = [SourceElement?](repeating: nil, count: parent._count) _isDone = [Bool](repeating: false, count: parent._count) @@ -35,7 +35,7 @@ class CombineLatestCollectionTypeSink _subscriptions.append(SingleAssignmentDisposable()) } - super.init(observer: observer) + super.init(observer: observer, cancel: cancel) } func on(_ event: Event, atIndex: Int) { @@ -93,9 +93,11 @@ class CombineLatestCollectionTypeSink for i in _parent._sources { let index = j let source = i.asObservable() - _subscriptions[j].disposable = source.subscribe(AnyObserver { event in + let disposable = source.subscribe(AnyObserver { event in self.on(event, atIndex: index) }) + + _subscriptions[j].setDisposable(disposable) j += 1 } @@ -117,9 +119,9 @@ class CombineLatestCollectionType : Producer where C.Iterat _count = Int(self._sources.count.toIntMax()) } - override func run(_ observer: O) -> Disposable where O.E == R { - let sink = CombineLatestCollectionTypeSink(parent: self, observer: observer) - sink.disposable = sink.run() - return sink + override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == R { + let sink = CombineLatestCollectionTypeSink(parent: self, observer: observer, cancel: cancel) + let subscription = sink.run() + return (sink: sink, subscription: subscription) } } diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/CombineLatest+arity.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/CombineLatest+arity.swift index f2284278..2969b45a 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/CombineLatest+arity.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/CombineLatest+arity.swift @@ -1,4 +1,4 @@ -// This file is autogenerated. Take a look at `Preprocessor` target in RxSwift project +// This file is autogenerated. Take a look at `Preprocessor` target in RxSwift project // // CombineLatest+arity.swift // RxSwift @@ -22,7 +22,6 @@ extension Observable { - parameter resultSelector: Function to invoke whenever any of the sources produces an element. - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public static func combineLatest (_ source1: O1, _ source2: O2, resultSelector: @escaping (O1.E, O2.E) throws -> E) -> Observable { @@ -42,9 +41,9 @@ class CombineLatestSink2_ : CombineLatestSink { var _latestElement1: E1! = nil var _latestElement2: E2! = nil - init(parent: Parent, observer: O) { + init(parent: Parent, observer: O, cancel: Cancelable) { _parent = parent - super.init(arity: 2, observer: observer) + super.init(arity: 2, observer: observer, cancel: cancel) } func run() -> Disposable { @@ -54,8 +53,8 @@ class CombineLatestSink2_ : CombineLatestSink { let observer1 = CombineLatestObserver(lock: _lock, parent: self, index: 0, setLatestValue: { (e: E1) -> Void in self._latestElement1 = e }, this: subscription1) let observer2 = CombineLatestObserver(lock: _lock, parent: self, index: 1, setLatestValue: { (e: E2) -> Void in self._latestElement2 = e }, this: subscription2) - subscription1.disposable = _parent._source1.subscribe(observer1) - subscription2.disposable = _parent._source2.subscribe(observer2) + subscription1.setDisposable(_parent._source1.subscribe(observer1)) + subscription2.setDisposable(_parent._source2.subscribe(observer2)) return Disposables.create([ subscription1, @@ -83,10 +82,10 @@ class CombineLatest2 : Producer { _resultSelector = resultSelector } - override func run(_ observer: O) -> Disposable where O.E == R { - let sink = CombineLatestSink2_(parent: self, observer: observer) - sink.disposable = sink.run() - return sink + override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == R { + let sink = CombineLatestSink2_(parent: self, observer: observer, cancel: cancel) + let subscription = sink.run() + return (sink: sink, subscription: subscription) } } @@ -103,7 +102,6 @@ extension Observable { - parameter resultSelector: Function to invoke whenever any of the sources produces an element. - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public static func combineLatest (_ source1: O1, _ source2: O2, _ source3: O3, resultSelector: @escaping (O1.E, O2.E, O3.E) throws -> E) -> Observable { @@ -124,9 +122,9 @@ class CombineLatestSink3_ : CombineLatestSink { var _latestElement2: E2! = nil var _latestElement3: E3! = nil - init(parent: Parent, observer: O) { + init(parent: Parent, observer: O, cancel: Cancelable) { _parent = parent - super.init(arity: 3, observer: observer) + super.init(arity: 3, observer: observer, cancel: cancel) } func run() -> Disposable { @@ -138,9 +136,9 @@ class CombineLatestSink3_ : CombineLatestSink { let observer2 = CombineLatestObserver(lock: _lock, parent: self, index: 1, setLatestValue: { (e: E2) -> Void in self._latestElement2 = e }, this: subscription2) let observer3 = CombineLatestObserver(lock: _lock, parent: self, index: 2, setLatestValue: { (e: E3) -> Void in self._latestElement3 = e }, this: subscription3) - subscription1.disposable = _parent._source1.subscribe(observer1) - subscription2.disposable = _parent._source2.subscribe(observer2) - subscription3.disposable = _parent._source3.subscribe(observer3) + subscription1.setDisposable(_parent._source1.subscribe(observer1)) + subscription2.setDisposable(_parent._source2.subscribe(observer2)) + subscription3.setDisposable(_parent._source3.subscribe(observer3)) return Disposables.create([ subscription1, @@ -171,10 +169,10 @@ class CombineLatest3 : Producer { _resultSelector = resultSelector } - override func run(_ observer: O) -> Disposable where O.E == R { - let sink = CombineLatestSink3_(parent: self, observer: observer) - sink.disposable = sink.run() - return sink + override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == R { + let sink = CombineLatestSink3_(parent: self, observer: observer, cancel: cancel) + let subscription = sink.run() + return (sink: sink, subscription: subscription) } } @@ -191,7 +189,6 @@ extension Observable { - parameter resultSelector: Function to invoke whenever any of the sources produces an element. - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public static func combineLatest (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, resultSelector: @escaping (O1.E, O2.E, O3.E, O4.E) throws -> E) -> Observable { @@ -213,9 +210,9 @@ class CombineLatestSink4_ : CombineLatestSink Disposable { @@ -229,10 +226,10 @@ class CombineLatestSink4_ : CombineLatestSink Void in self._latestElement3 = e }, this: subscription3) let observer4 = CombineLatestObserver(lock: _lock, parent: self, index: 3, setLatestValue: { (e: E4) -> Void in self._latestElement4 = e }, this: subscription4) - subscription1.disposable = _parent._source1.subscribe(observer1) - subscription2.disposable = _parent._source2.subscribe(observer2) - subscription3.disposable = _parent._source3.subscribe(observer3) - subscription4.disposable = _parent._source4.subscribe(observer4) + subscription1.setDisposable(_parent._source1.subscribe(observer1)) + subscription2.setDisposable(_parent._source2.subscribe(observer2)) + subscription3.setDisposable(_parent._source3.subscribe(observer3)) + subscription4.setDisposable(_parent._source4.subscribe(observer4)) return Disposables.create([ subscription1, @@ -266,10 +263,10 @@ class CombineLatest4 : Producer { _resultSelector = resultSelector } - override func run(_ observer: O) -> Disposable where O.E == R { - let sink = CombineLatestSink4_(parent: self, observer: observer) - sink.disposable = sink.run() - return sink + override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == R { + let sink = CombineLatestSink4_(parent: self, observer: observer, cancel: cancel) + let subscription = sink.run() + return (sink: sink, subscription: subscription) } } @@ -286,7 +283,6 @@ extension Observable { - parameter resultSelector: Function to invoke whenever any of the sources produces an element. - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public static func combineLatest (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, resultSelector: @escaping (O1.E, O2.E, O3.E, O4.E, O5.E) throws -> E) -> Observable { @@ -309,9 +305,9 @@ class CombineLatestSink5_ : CombineLatestSi var _latestElement4: E4! = nil var _latestElement5: E5! = nil - init(parent: Parent, observer: O) { + init(parent: Parent, observer: O, cancel: Cancelable) { _parent = parent - super.init(arity: 5, observer: observer) + super.init(arity: 5, observer: observer, cancel: cancel) } func run() -> Disposable { @@ -327,11 +323,11 @@ class CombineLatestSink5_ : CombineLatestSi let observer4 = CombineLatestObserver(lock: _lock, parent: self, index: 3, setLatestValue: { (e: E4) -> Void in self._latestElement4 = e }, this: subscription4) let observer5 = CombineLatestObserver(lock: _lock, parent: self, index: 4, setLatestValue: { (e: E5) -> Void in self._latestElement5 = e }, this: subscription5) - subscription1.disposable = _parent._source1.subscribe(observer1) - subscription2.disposable = _parent._source2.subscribe(observer2) - subscription3.disposable = _parent._source3.subscribe(observer3) - subscription4.disposable = _parent._source4.subscribe(observer4) - subscription5.disposable = _parent._source5.subscribe(observer5) + subscription1.setDisposable(_parent._source1.subscribe(observer1)) + subscription2.setDisposable(_parent._source2.subscribe(observer2)) + subscription3.setDisposable(_parent._source3.subscribe(observer3)) + subscription4.setDisposable(_parent._source4.subscribe(observer4)) + subscription5.setDisposable(_parent._source5.subscribe(observer5)) return Disposables.create([ subscription1, @@ -368,10 +364,10 @@ class CombineLatest5 : Producer { _resultSelector = resultSelector } - override func run(_ observer: O) -> Disposable where O.E == R { - let sink = CombineLatestSink5_(parent: self, observer: observer) - sink.disposable = sink.run() - return sink + override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == R { + let sink = CombineLatestSink5_(parent: self, observer: observer, cancel: cancel) + let subscription = sink.run() + return (sink: sink, subscription: subscription) } } @@ -388,7 +384,6 @@ extension Observable { - parameter resultSelector: Function to invoke whenever any of the sources produces an element. - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public static func combineLatest (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, resultSelector: @escaping (O1.E, O2.E, O3.E, O4.E, O5.E, O6.E) throws -> E) -> Observable { @@ -412,9 +407,9 @@ class CombineLatestSink6_ : CombineLate var _latestElement5: E5! = nil var _latestElement6: E6! = nil - init(parent: Parent, observer: O) { + init(parent: Parent, observer: O, cancel: Cancelable) { _parent = parent - super.init(arity: 6, observer: observer) + super.init(arity: 6, observer: observer, cancel: cancel) } func run() -> Disposable { @@ -432,12 +427,12 @@ class CombineLatestSink6_ : CombineLate let observer5 = CombineLatestObserver(lock: _lock, parent: self, index: 4, setLatestValue: { (e: E5) -> Void in self._latestElement5 = e }, this: subscription5) let observer6 = CombineLatestObserver(lock: _lock, parent: self, index: 5, setLatestValue: { (e: E6) -> Void in self._latestElement6 = e }, this: subscription6) - subscription1.disposable = _parent._source1.subscribe(observer1) - subscription2.disposable = _parent._source2.subscribe(observer2) - subscription3.disposable = _parent._source3.subscribe(observer3) - subscription4.disposable = _parent._source4.subscribe(observer4) - subscription5.disposable = _parent._source5.subscribe(observer5) - subscription6.disposable = _parent._source6.subscribe(observer6) + subscription1.setDisposable(_parent._source1.subscribe(observer1)) + subscription2.setDisposable(_parent._source2.subscribe(observer2)) + subscription3.setDisposable(_parent._source3.subscribe(observer3)) + subscription4.setDisposable(_parent._source4.subscribe(observer4)) + subscription5.setDisposable(_parent._source5.subscribe(observer5)) + subscription6.setDisposable(_parent._source6.subscribe(observer6)) return Disposables.create([ subscription1, @@ -477,10 +472,10 @@ class CombineLatest6 : Producer { _resultSelector = resultSelector } - override func run(_ observer: O) -> Disposable where O.E == R { - let sink = CombineLatestSink6_(parent: self, observer: observer) - sink.disposable = sink.run() - return sink + override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == R { + let sink = CombineLatestSink6_(parent: self, observer: observer, cancel: cancel) + let subscription = sink.run() + return (sink: sink, subscription: subscription) } } @@ -497,7 +492,6 @@ extension Observable { - parameter resultSelector: Function to invoke whenever any of the sources produces an element. - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public static func combineLatest (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, _ source7: O7, resultSelector: @escaping (O1.E, O2.E, O3.E, O4.E, O5.E, O6.E, O7.E) throws -> E) -> Observable { @@ -522,9 +516,9 @@ class CombineLatestSink7_ : Combine var _latestElement6: E6! = nil var _latestElement7: E7! = nil - init(parent: Parent, observer: O) { + init(parent: Parent, observer: O, cancel: Cancelable) { _parent = parent - super.init(arity: 7, observer: observer) + super.init(arity: 7, observer: observer, cancel: cancel) } func run() -> Disposable { @@ -544,13 +538,13 @@ class CombineLatestSink7_ : Combine let observer6 = CombineLatestObserver(lock: _lock, parent: self, index: 5, setLatestValue: { (e: E6) -> Void in self._latestElement6 = e }, this: subscription6) let observer7 = CombineLatestObserver(lock: _lock, parent: self, index: 6, setLatestValue: { (e: E7) -> Void in self._latestElement7 = e }, this: subscription7) - subscription1.disposable = _parent._source1.subscribe(observer1) - subscription2.disposable = _parent._source2.subscribe(observer2) - subscription3.disposable = _parent._source3.subscribe(observer3) - subscription4.disposable = _parent._source4.subscribe(observer4) - subscription5.disposable = _parent._source5.subscribe(observer5) - subscription6.disposable = _parent._source6.subscribe(observer6) - subscription7.disposable = _parent._source7.subscribe(observer7) + subscription1.setDisposable(_parent._source1.subscribe(observer1)) + subscription2.setDisposable(_parent._source2.subscribe(observer2)) + subscription3.setDisposable(_parent._source3.subscribe(observer3)) + subscription4.setDisposable(_parent._source4.subscribe(observer4)) + subscription5.setDisposable(_parent._source5.subscribe(observer5)) + subscription6.setDisposable(_parent._source6.subscribe(observer6)) + subscription7.setDisposable(_parent._source7.subscribe(observer7)) return Disposables.create([ subscription1, @@ -593,10 +587,10 @@ class CombineLatest7 : Producer { _resultSelector = resultSelector } - override func run(_ observer: O) -> Disposable where O.E == R { - let sink = CombineLatestSink7_(parent: self, observer: observer) - sink.disposable = sink.run() - return sink + override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == R { + let sink = CombineLatestSink7_(parent: self, observer: observer, cancel: cancel) + let subscription = sink.run() + return (sink: sink, subscription: subscription) } } @@ -613,7 +607,6 @@ extension Observable { - parameter resultSelector: Function to invoke whenever any of the sources produces an element. - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public static func combineLatest (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, _ source7: O7, _ source8: O8, resultSelector: @escaping (O1.E, O2.E, O3.E, O4.E, O5.E, O6.E, O7.E, O8.E) throws -> E) -> Observable { @@ -639,9 +632,9 @@ class CombineLatestSink8_ : Com var _latestElement7: E7! = nil var _latestElement8: E8! = nil - init(parent: Parent, observer: O) { + init(parent: Parent, observer: O, cancel: Cancelable) { _parent = parent - super.init(arity: 8, observer: observer) + super.init(arity: 8, observer: observer, cancel: cancel) } func run() -> Disposable { @@ -663,14 +656,14 @@ class CombineLatestSink8_ : Com let observer7 = CombineLatestObserver(lock: _lock, parent: self, index: 6, setLatestValue: { (e: E7) -> Void in self._latestElement7 = e }, this: subscription7) let observer8 = CombineLatestObserver(lock: _lock, parent: self, index: 7, setLatestValue: { (e: E8) -> Void in self._latestElement8 = e }, this: subscription8) - subscription1.disposable = _parent._source1.subscribe(observer1) - subscription2.disposable = _parent._source2.subscribe(observer2) - subscription3.disposable = _parent._source3.subscribe(observer3) - subscription4.disposable = _parent._source4.subscribe(observer4) - subscription5.disposable = _parent._source5.subscribe(observer5) - subscription6.disposable = _parent._source6.subscribe(observer6) - subscription7.disposable = _parent._source7.subscribe(observer7) - subscription8.disposable = _parent._source8.subscribe(observer8) + subscription1.setDisposable(_parent._source1.subscribe(observer1)) + subscription2.setDisposable(_parent._source2.subscribe(observer2)) + subscription3.setDisposable(_parent._source3.subscribe(observer3)) + subscription4.setDisposable(_parent._source4.subscribe(observer4)) + subscription5.setDisposable(_parent._source5.subscribe(observer5)) + subscription6.setDisposable(_parent._source6.subscribe(observer6)) + subscription7.setDisposable(_parent._source7.subscribe(observer7)) + subscription8.setDisposable(_parent._source8.subscribe(observer8)) return Disposables.create([ subscription1, @@ -716,10 +709,10 @@ class CombineLatest8 : Producer { _resultSelector = resultSelector } - override func run(_ observer: O) -> Disposable where O.E == R { - let sink = CombineLatestSink8_(parent: self, observer: observer) - sink.disposable = sink.run() - return sink + override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == R { + let sink = CombineLatestSink8_(parent: self, observer: observer, cancel: cancel) + let subscription = sink.run() + return (sink: sink, subscription: subscription) } } diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/CombineLatest.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/CombineLatest.swift index 5a72e182..be5cc2ee 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/CombineLatest.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/CombineLatest.swift @@ -1,6 +1,6 @@ // // CombineLatest.swift -// Rx +// RxSwift // // Created by Krunoslav Zaher on 3/21/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -27,12 +27,12 @@ class CombineLatestSink private var _hasValue: [Bool] private var _isDone: [Bool] - init(arity: Int, observer: O) { + init(arity: Int, observer: O, cancel: Cancelable) { _arity = arity _hasValue = [Bool](repeating: false, count: arity) _isDone = [Bool](repeating: false, count: arity) - super.init(observer: observer) + super.init(observer: observer, cancel: cancel) } func getResult() throws -> Element { diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Concat.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Concat.swift index 8ee3020d..51ac494c 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Concat.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Concat.swift @@ -1,6 +1,6 @@ // // Concat.swift -// Rx +// RxSwift // // Created by Krunoslav Zaher on 3/21/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -14,8 +14,8 @@ class ConcatSink , ObserverType where S.Iterator.Element : ObservableConvertibleType, S.Iterator.Element.E == O.E { typealias Element = O.E - override init(observer: O) { - super.init(observer: observer) + override init(observer: O, cancel: Cancelable) { + super.init(observer: observer, cancel: cancel) } func on(_ event: Event){ @@ -55,9 +55,9 @@ class Concat : Producer where S.Iterator.Elem _count = count } - override func run(_ observer: O) -> Disposable where O.E == Element { - let sink = ConcatSink(observer: observer) - sink.disposable = sink.run((_sources.makeIterator(), _count)) - return sink + override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element { + let sink = ConcatSink(observer: observer, cancel: cancel) + let subscription = sink.run((_sources.makeIterator(), _count)) + return (sink: sink, subscription: subscription) } } diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/ConnectableObservable.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/ConnectableObservable.swift index db5611b5..12eb5553 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/ConnectableObservable.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/ConnectableObservable.swift @@ -1,6 +1,6 @@ // // ConnectableObservable.swift -// Rx +// RxSwift // // Created by Krunoslav Zaher on 3/1/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Debug.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Debug.swift index 0eae1581..76f8ecd4 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Debug.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Debug.swift @@ -21,19 +21,20 @@ class DebugSink : Sink, ObserverType private let _parent: Parent private let _timestampFormatter = DateFormatter() - init(parent: Parent, observer: O) { + init(parent: Parent, observer: O, cancel: Cancelable) { _parent = parent _timestampFormatter.dateFormat = dateFormat logEvent(_parent._identifier, dateFormat: _timestampFormatter, content: "subscribed") - super.init(observer: observer) + super.init(observer: observer, cancel: cancel) } func on(_ event: Event) { let maxEventTextLength = 40 let eventText = "\(event)" - let eventNormalized = eventText.characters.count > maxEventTextLength + + let eventNormalized = (eventText.characters.count > maxEventTextLength) && _parent._trimOutput ? String(eventText.characters.prefix(maxEventTextLength / 2)) + "..." + String(eventText.characters.suffix(maxEventTextLength / 2)) : eventText @@ -46,17 +47,20 @@ class DebugSink : Sink, ObserverType } override func dispose() { - logEvent(_parent._identifier, dateFormat: _timestampFormatter, content: "isDisposed") + if !self.disposed { + logEvent(_parent._identifier, dateFormat: _timestampFormatter, content: "isDisposed") + } super.dispose() } } class Debug : Producer { fileprivate let _identifier: String - + fileprivate let _trimOutput: Bool fileprivate let _source: Source - init(source: Source, identifier: String?, file: String, line: UInt, function: String) { + init(source: Source, identifier: String?, trimOutput: Bool, file: String, line: UInt, function: String) { + _trimOutput = trimOutput if let identifier = identifier { _identifier = identifier } @@ -73,9 +77,9 @@ class Debug : Producer { _source = source } - override func run(_ observer: O) -> Disposable where O.E == Source.E { - let sink = DebugSink(parent: self, observer: observer) - sink.disposable = _source.subscribe(sink) - return sink + override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Source.E { + let sink = DebugSink(parent: self, observer: observer, cancel: cancel) + let subscription = _source.subscribe(sink) + return (sink: sink, subscription: subscription) } } diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Debunce.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Debunce.swift index 13b04136..99e8013f 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Debunce.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Debunce.swift @@ -1,6 +1,6 @@ // // Debunce.swift -// Rx +// RxSwift // // Created by Krunoslav Zaher on 9/11/16. // Copyright © 2016 Krunoslav Zaher. All rights reserved. @@ -26,10 +26,10 @@ class DebounceSink let cancellable = SerialDisposable() - init(parent: ParentType, observer: O) { + init(parent: ParentType, observer: O, cancel: Cancelable) { _parent = parent - super.init(observer: observer) + super.init(observer: observer, cancel: cancel) } func run() -> Disposable { @@ -55,7 +55,7 @@ class DebounceSink let d = SingleAssignmentDisposable() self.cancellable.disposable = d - d.disposable = scheduler.scheduleRelative(currentId, dueTime: dueTime, action: self.propagate) + d.setDisposable(scheduler.scheduleRelative(currentId, dueTime: dueTime, action: self.propagate)) case .error: _value = nil forwardOn(event) @@ -95,10 +95,10 @@ class Debounce : Producer { _scheduler = scheduler } - override func run(_ observer: O) -> Disposable where O.E == Element { - let sink = DebounceSink(parent: self, observer: observer) - sink.disposable = sink.run() - return sink + override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element { + let sink = DebounceSink(parent: self, observer: observer, cancel: cancel) + let subscription = sink.run() + return (sink: sink, subscription: subscription) } } diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Deferred.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Deferred.swift index 0d66aeb2..43182ce8 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Deferred.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Deferred.swift @@ -13,9 +13,9 @@ class DeferredSink : Sink, ObserverType w private let _observableFactory: () throws -> S - init(observableFactory: @escaping () throws -> S, observer: O) { + init(observableFactory: @escaping () throws -> S, observer: O, cancel: Cancelable) { _observableFactory = observableFactory - super.init(observer: observer) + super.init(observer: observer, cancel: cancel) } func run() -> Disposable { @@ -53,9 +53,9 @@ class Deferred : Producer { _observableFactory = observableFactory } - override func run(_ observer: O) -> Disposable where O.E == S.E { - let sink = DeferredSink(observableFactory: _observableFactory, observer: observer) - sink.disposable = sink.run() - return sink + override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == S.E { + let sink = DeferredSink(observableFactory: _observableFactory, observer: observer, cancel: cancel) + let subscription = sink.run() + return (sink: sink, subscription: subscription) } } diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Delay.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Delay.swift index cc1389aa..1697692e 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Delay.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Delay.swift @@ -33,10 +33,10 @@ class DelaySink private var _queue = Queue<(eventTime: RxTime, event: Event)>(capacity: 0) private var _disposed = false - init(observer: O, dueTime: RxTimeInterval, scheduler: SchedulerType) { + init(observer: O, dueTime: RxTimeInterval, scheduler: SchedulerType, cancel: Cancelable) { _dueTime = dueTime _scheduler = scheduler - super.init(observer: observer) + super.init(observer: observer, cancel: cancel) } // All of these complications in this method are caused by the fact that @@ -140,7 +140,7 @@ class DelaySink } func run(source: Source) -> Disposable { - _sourceSubscription.disposable = source.subscribeSafe(self) + _sourceSubscription.setDisposable(source.subscribeSafe(self)) return Disposables.create(_sourceSubscription, _cancelable) } } @@ -156,9 +156,9 @@ class Delay: Producer { _scheduler = scheduler } - override func run(_ observer: O) -> Disposable where O.E == Element { - let sink = DelaySink(observer: observer, dueTime: _dueTime, scheduler: _scheduler) - sink.disposable = sink.run(source: _source) - return sink + override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element { + let sink = DelaySink(observer: observer, dueTime: _dueTime, scheduler: _scheduler, cancel: cancel) + let subscription = sink.run(source: _source) + return (sink: sink, subscription: subscription) } } diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/DelaySubscription.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/DelaySubscription.swift index fd6a1186..d7abf206 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/DelaySubscription.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/DelaySubscription.swift @@ -16,9 +16,9 @@ class DelaySubscriptionSink private let _parent: Parent - init(parent: Parent, observer: O) { + init(parent: Parent, observer: O, cancel: Cancelable) { _parent = parent - super.init(observer: observer) + super.init(observer: observer, cancel: cancel) } func on(_ event: Event) { @@ -41,12 +41,12 @@ class DelaySubscription: Producer { _scheduler = scheduler } - override func run(_ observer: O) -> Disposable where O.E == Element { - let sink = DelaySubscriptionSink(parent: self, observer: observer) - sink.disposable = _scheduler.scheduleRelative((), dueTime: _dueTime) { _ in + override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element { + let sink = DelaySubscriptionSink(parent: self, observer: observer, cancel: cancel) + let subscription = _scheduler.scheduleRelative((), dueTime: _dueTime) { _ in return self._source.subscribe(sink) } - return sink + return (sink: sink, subscription: subscription) } } diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/DistinctUntilChanged.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/DistinctUntilChanged.swift index ee9e3dc0..a54f6cfe 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/DistinctUntilChanged.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/DistinctUntilChanged.swift @@ -1,6 +1,6 @@ // // DistinctUntilChanged.swift -// Rx +// RxSwift // // Created by Krunoslav Zaher on 3/15/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -14,9 +14,9 @@ class DistinctUntilChangedSink: Sink, ObserverType { private let _parent: DistinctUntilChanged private var _currentKey: Key? = nil - init(parent: DistinctUntilChanged, observer: O) { + init(parent: DistinctUntilChanged, observer: O, cancel: Cancelable) { _parent = parent - super.init(observer: observer) + super.init(observer: observer, cancel: cancel) } func on(_ event: Event) { @@ -62,9 +62,9 @@ class DistinctUntilChanged: Producer { _comparer = comparer } - override func run(_ observer: O) -> Disposable where O.E == Element { - let sink = DistinctUntilChangedSink(parent: self, observer: observer) - sink.disposable = _source.subscribe(sink) - return sink + override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element { + let sink = DistinctUntilChangedSink(parent: self, observer: observer, cancel: cancel) + let subscription = _source.subscribe(sink) + return (sink: sink, subscription: subscription) } } diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Do.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Do.swift index 28e70b4d..0e766ddd 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Do.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Do.swift @@ -1,6 +1,6 @@ // // Do.swift -// Rx +// RxSwift // // Created by Krunoslav Zaher on 2/21/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -14,9 +14,9 @@ class DoSink : Sink, ObserverType { private let _parent: Parent - init(parent: Parent, observer: O) { + init(parent: Parent, observer: O, cancel: Cancelable) { _parent = parent - super.init(observer: observer) + super.init(observer: observer, cancel: cancel) } func on(_ event: Event) { @@ -49,15 +49,15 @@ class Do : Producer { _onDispose = onDispose } - override func run(_ observer: O) -> Disposable where O.E == Element { + override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element { _onSubscribe?() - let sink = DoSink(parent: self, observer: observer) + let sink = DoSink(parent: self, observer: observer, cancel: cancel) let subscription = _source.subscribe(sink) let onDispose = _onDispose - sink.disposable = Disposables.create { + let allSubscriptions = Disposables.create { subscription.dispose() onDispose?() } - return sink + return (sink: sink, subscription: allSubscriptions) } } diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/ElementAt.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/ElementAt.swift index 3435f6a3..62b55871 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/ElementAt.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/ElementAt.swift @@ -1,6 +1,6 @@ // // ElementAt.swift -// Rx +// RxSwift // // Created by Junior B. on 21/10/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -15,11 +15,11 @@ class ElementAtSink : Sink, ObserverType where O let _parent: Parent var _i: Int - init(parent: Parent, observer: O) { + init(parent: Parent, observer: O, cancel: Cancelable) { _parent = parent _i = parent._index - super.init(observer: observer) + super.init(observer: observer, cancel: cancel) } func on(_ event: Event) { @@ -71,9 +71,9 @@ class ElementAt : Producer { self._throwOnEmpty = throwOnEmpty } - override func run(_ observer: O) -> Disposable where O.E == SourceType { - let sink = ElementAtSink(parent: self, observer: observer) - sink.disposable = _source.subscribeSafe(sink) - return sink + override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == SourceType { + let sink = ElementAtSink(parent: self, observer: observer, cancel: cancel) + let subscription = _source.subscribeSafe(sink) + return (sink: sink, subscription: subscription) } } diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Empty.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Empty.swift index f28690f5..39861a79 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Empty.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Empty.swift @@ -1,6 +1,6 @@ // // Empty.swift -// Rx +// RxSwift // // Created by Krunoslav Zaher on 8/30/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Error.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Error.swift index 49d89d90..6ddae8b0 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Error.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Error.swift @@ -1,6 +1,6 @@ // // Error.swift -// Rx +// RxSwift // // Created by Krunoslav Zaher on 8/30/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Filter.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Filter.swift index b3d92b62..2f031358 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Filter.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Filter.swift @@ -1,6 +1,6 @@ // // Filter.swift -// Rx +// RxSwift // // Created by Krunoslav Zaher on 2/17/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -14,9 +14,9 @@ class FilterSink: Sink, ObserverType { private let _predicate: Predicate - init(predicate: @escaping Predicate, observer: O) { + init(predicate: @escaping Predicate, observer: O, cancel: Cancelable) { _predicate = predicate - super.init(observer: observer) + super.init(observer: observer, cancel: cancel) } func on(_ event: Event) { @@ -50,9 +50,9 @@ class Filter : Producer { _predicate = predicate } - override func run(_ observer: O) -> Disposable where O.E == Element { - let sink = FilterSink(predicate: _predicate, observer: observer) - sink.disposable = _source.subscribe(sink) - return sink + override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element { + let sink = FilterSink(predicate: _predicate, observer: observer, cancel: cancel) + let subscription = _source.subscribe(sink) + return (sink: sink, subscription: subscription) } } diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Generate.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Generate.swift index 8b461e62..aebfb953 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Generate.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Generate.swift @@ -1,6 +1,6 @@ // // Generate.swift -// Rx +// RxSwift // // Created by Krunoslav Zaher on 9/2/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -15,10 +15,10 @@ class GenerateSink : Sink { private var _state: S - init(parent: Parent, observer: O) { + init(parent: Parent, observer: O, cancel: Cancelable) { _parent = parent _state = parent._initialState - super.init(observer: observer) + super.init(observer: observer, cancel: cancel) } func run() -> Disposable { @@ -63,9 +63,9 @@ class Generate : Producer { super.init() } - override func run(_ observer: O) -> Disposable where O.E == E { - let sink = GenerateSink(parent: self, observer: observer) - sink.disposable = sink.run() - return sink + override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == E { + let sink = GenerateSink(parent: self, observer: observer, cancel: cancel) + let subscription = sink.run() + return (sink: sink, subscription: subscription) } } diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Just.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Just.swift index 6e86206e..08ef34c8 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Just.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Just.swift @@ -1,6 +1,6 @@ // // Just.swift -// Rx +// RxSwift // // Created by Krunoslav Zaher on 8/30/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -13,9 +13,9 @@ class JustScheduledSink : Sink { private let _parent: Parent - init(parent: Parent, observer: O) { + init(parent: Parent, observer: O, cancel: Cancelable) { _parent = parent - super.init(observer: observer) + super.init(observer: observer, cancel: cancel) } func run() -> Disposable { @@ -39,10 +39,10 @@ class JustScheduled : Producer { _element = element } - override func subscribe(_ observer: O) -> Disposable where O.E == E { - let sink = JustScheduledSink(parent: self, observer: observer) - sink.disposable = sink.run() - return sink + override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == E { + let sink = JustScheduledSink(parent: self, observer: observer, cancel: cancel) + let subscription = sink.run() + return (sink: sink, subscription: subscription) } } diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Map.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Map.swift index 8e745c98..1a28fcb9 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Map.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Map.swift @@ -1,6 +1,6 @@ // // Map.swift -// Rx +// RxSwift // // Created by Krunoslav Zaher on 3/15/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -9,23 +9,23 @@ import Foundation class MapSink : Sink, ObserverType { - typealias Selector = (SourceType) throws -> ResultType + typealias Transform = (SourceType) throws -> ResultType typealias ResultType = O.E typealias Element = SourceType - private let _selector: Selector + private let _transform: Transform - init(selector: @escaping Selector, observer: O) { - _selector = selector - super.init(observer: observer) + init(transform: @escaping Transform, observer: O, cancel: Cancelable) { + _transform = transform + super.init(observer: observer, cancel: cancel) } func on(_ event: Event) { switch event { case .next(let element): do { - let mappedElement = try _selector(element) + let mappedElement = try _transform(element) forwardOn(.next(mappedElement)) } catch let e { @@ -53,9 +53,9 @@ class MapWithIndexSink : Sink, ObserverType { private var _index = 0 - init(selector: @escaping Selector, observer: O) { + init(selector: @escaping Selector, observer: O, cancel: Cancelable) { _selector = selector - super.init(observer: observer) + super.init(observer: observer, cancel: cancel) } func on(_ event: Event) { @@ -91,50 +91,55 @@ class MapWithIndex : Producer { _selector = selector } - override func run(_ observer: O) -> Disposable where O.E == ResultType { - let sink = MapWithIndexSink(selector: _selector, observer: observer) - sink.disposable = _source.subscribe(sink) - return sink + override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == ResultType { + let sink = MapWithIndexSink(selector: _selector, observer: observer, cancel: cancel) + let subscription = _source.subscribe(sink) + return (sink: sink, subscription: subscription) } } #if TRACE_RESOURCES -public var numberOfMapOperators: Int32 = 0 + var _numberOfMapOperators: AtomicInt = 0 + extension Resources { + public static var numberOfMapOperators: Int32 { + return _numberOfMapOperators.valueSnapshot() + } + } #endif class Map: Producer { - typealias Selector = (SourceType) throws -> ResultType + typealias Transform = (SourceType) throws -> ResultType private let _source: Observable - private let _selector: Selector + private let _transform: Transform - init(source: Observable, selector: @escaping Selector) { + init(source: Observable, transform: @escaping Transform) { _source = source - _selector = selector + _transform = transform #if TRACE_RESOURCES - let _ = AtomicIncrement(&numberOfMapOperators) + let _ = AtomicIncrement(&_numberOfMapOperators) #endif } override func composeMap(_ selector: @escaping (ResultType) throws -> R) -> Observable { - let originalSelector = _selector - return Map(source: _source, selector: { (s: SourceType) throws -> R in + let originalSelector = _transform + return Map(source: _source, transform: { (s: SourceType) throws -> R in let r: ResultType = try originalSelector(s) return try selector(r) }) } - override func run(_ observer: O) -> Disposable where O.E == ResultType { - let sink = MapSink(selector: _selector, observer: observer) - sink.disposable = _source.subscribe(sink) - return sink + override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == ResultType { + let sink = MapSink(transform: _transform, observer: observer, cancel: cancel) + let subscription = _source.subscribe(sink) + return (sink: sink, subscription: subscription) } #if TRACE_RESOURCES deinit { - let _ = AtomicDecrement(&numberOfMapOperators) + let _ = AtomicDecrement(&_numberOfMapOperators) } #endif } diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Merge.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Merge.swift index 2af933c9..cd700ab5 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Merge.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Merge.swift @@ -1,6 +1,6 @@ // // Merge.swift -// Rx +// RxSwift // // Created by Krunoslav Zaher on 3/28/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -15,7 +15,7 @@ class MergeLimitedSinkIter , LockOwnerType , SynchronizedOnType where S.E == O.E { typealias E = O.E - typealias DisposeKey = Bag.KeyType + typealias DisposeKey = CompositeDisposable.DisposeKey typealias Parent = MergeLimitedSink private let _parent: Parent @@ -78,18 +78,18 @@ class MergeLimitedSink fileprivate let _sourceSubscription = SingleAssignmentDisposable() fileprivate let _group = CompositeDisposable() - init(maxConcurrent: Int, observer: O) { + init(maxConcurrent: Int, observer: O, cancel: Cancelable) { _maxConcurrent = maxConcurrent let _ = _group.insert(_sourceSubscription) - super.init(observer: observer) + super.init(observer: observer, cancel: cancel) } func run(_ source: Observable) -> Disposable { let _ = _group.insert(_sourceSubscription) let disposable = source.subscribe(self) - _sourceSubscription.disposable = disposable + _sourceSubscription.setDisposable(disposable) return _group } @@ -102,7 +102,7 @@ class MergeLimitedSink let observer = MergeLimitedSinkIter(parent: self, disposeKey: key) let disposable = innerSource.asObservable().subscribe(observer) - subscription.disposable = disposable + subscription.setDisposable(disposable) } } @@ -152,18 +152,18 @@ class MergeLimited : Producer { _maxConcurrent = maxConcurrent } - override func run(_ observer: O) -> Disposable where O.E == S.E { - let sink = MergeLimitedSink(maxConcurrent: _maxConcurrent, observer: observer) - sink.disposable = sink.run(_source) - return sink + override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == S.E { + let sink = MergeLimitedSink(maxConcurrent: _maxConcurrent, observer: observer, cancel: cancel) + let subscription = sink.run(_source) + return (sink: sink, subscription: subscription) } } // MARK: Merge final class MergeBasicSink : MergeSink where O.E == S.E { - override init(observer: O) { - super.init(observer: observer) + override init(observer: O, cancel: Cancelable) { + super.init(observer: observer, cancel: cancel) } override func performMap(_ element: S) throws -> S { @@ -178,9 +178,9 @@ final class FlatMapSink S { @@ -194,9 +194,9 @@ final class FlatMapWithIndexSink S { @@ -215,9 +215,9 @@ final class FlatMapFirstSink S { @@ -288,8 +288,8 @@ class MergeSink fileprivate var _stopped = false - override init(observer: O) { - super.init(observer: observer) + override init(observer: O, cancel: Cancelable) { + super.init(observer: observer, cancel: cancel) } func performMap(_ element: SourceType) throws -> S { @@ -334,7 +334,7 @@ class MergeSink if let disposeKey = _group.insert(iterDisposable) { let iter = MergeSinkIter(parent: self, disposeKey: disposeKey) let subscription = source.subscribe(iter) - iterDisposable.disposable = subscription + iterDisposable.setDisposable(subscription) } } @@ -342,7 +342,7 @@ class MergeSink let _ = _group.insert(_sourceSubscription) let subscription = source.subscribe(self) - _sourceSubscription.disposable = subscription + _sourceSubscription.setDisposable(subscription) return _group } @@ -362,10 +362,10 @@ final class FlatMap: Producer { _selector = selector } - override func run(_ observer: O) -> Disposable where O.E == S.E { - let sink = FlatMapSink(selector: _selector, observer: observer) - sink.disposable = sink.run(_source) - return sink + override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == S.E { + let sink = FlatMapSink(selector: _selector, observer: observer, cancel: cancel) + let subscription = sink.run(_source) + return (sink: sink, subscription: subscription) } } @@ -381,10 +381,10 @@ final class FlatMapWithIndex: Producer _selector = selector } - override func run(_ observer: O) -> Disposable where O.E == S.E { - let sink = FlatMapWithIndexSink(selector: _selector, observer: observer) - sink.disposable = sink.run(_source) - return sink + override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == S.E { + let sink = FlatMapWithIndexSink(selector: _selector, observer: observer, cancel: cancel) + let subscription = sink.run(_source) + return (sink: sink, subscription: subscription) } } @@ -401,10 +401,10 @@ final class FlatMapFirst: Producer(_ observer: O) -> Disposable where O.E == S.E { - let sink = FlatMapFirstSink(selector: _selector, observer: observer) - sink.disposable = sink.run(_source) - return sink + override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == S.E { + let sink = FlatMapFirstSink(selector: _selector, observer: observer, cancel: cancel) + let subscription = sink.run(_source) + return (sink: sink, subscription: subscription) } } @@ -415,10 +415,10 @@ final class Merge : Producer { _source = source } - override func run(_ observer: O) -> Disposable where O.E == S.E { - let sink = MergeBasicSink(observer: observer) - sink.disposable = sink.run(_source) - return sink + override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == S.E { + let sink = MergeBasicSink(observer: observer, cancel: cancel) + let subscription = sink.run(_source) + return (sink: sink, subscription: subscription) } } diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Multicast.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Multicast.swift index c4ef0c83..fe4ec2d4 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Multicast.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Multicast.swift @@ -1,6 +1,6 @@ // // Multicast.swift -// Rx +// RxSwift // // Created by Krunoslav Zaher on 2/27/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -15,9 +15,9 @@ class MulticastSink: Sink, ObserverType { private let _parent: MutlicastType - init(parent: MutlicastType, observer: O) { + init(parent: MutlicastType, observer: O, cancel: Cancelable) { _parent = parent - super.init(observer: observer) + super.init(observer: observer, cancel: cancel) } func run() -> Disposable { @@ -63,9 +63,9 @@ class Multicast: Producer { _selector = selector } - override func run(_ observer: O) -> Disposable where O.E == R { - let sink = MulticastSink(parent: self, observer: observer) - sink.disposable = sink.run() - return sink + override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == R { + let sink = MulticastSink(parent: self, observer: observer, cancel: cancel) + let subscription = sink.run() + return (sink: sink, subscription: subscription) } } diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Never.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Never.swift index 82d28ec7..2e1df694 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Never.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Never.swift @@ -1,6 +1,6 @@ // // Never.swift -// Rx +// RxSwift // // Created by Krunoslav Zaher on 8/30/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/ObserveOn.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/ObserveOn.swift index 31738cce..9c561b15 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/ObserveOn.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/ObserveOn.swift @@ -17,19 +17,19 @@ class ObserveOn : Producer { self.source = source #if TRACE_RESOURCES - let _ = AtomicIncrement(&resourceCount) + let _ = Resources.incrementTotal() #endif } - override func run(_ observer: O) -> Disposable where O.E == E { - let sink = ObserveOnSink(scheduler: scheduler, observer: observer) - sink._subscription.disposable = source.subscribe(sink) - return sink + override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == E { + let sink = ObserveOnSink(scheduler: scheduler, observer: observer, cancel: cancel) + let subscription = source.subscribe(sink) + return (sink: sink, subscription: subscription) } #if TRACE_RESOURCES deinit { - let _ = AtomicDecrement(&resourceCount) + let _ = Resources.decrementTotal() } #endif } @@ -47,18 +47,19 @@ class ObserveOnSink : ObserverBase { let _scheduler: ImmediateSchedulerType var _lock = SpinLock() + let _observer: O // state var _state = ObserveOnState.stopped - var _observer: O? var _queue = Queue>(capacity: 10) let _scheduleDisposable = SerialDisposable() - let _subscription = SingleAssignmentDisposable() + let _cancel: Cancelable - init(scheduler: ImmediateSchedulerType, observer: O) { + init(scheduler: ImmediateSchedulerType, observer: O, cancel: Cancelable) { _scheduler = scheduler _observer = observer + _cancel = cancel } override func onCore(_ event: Event) { @@ -80,7 +81,7 @@ class ObserveOnSink : ObserverBase { } func run(_ state: Void, recurse: (Void) -> Void) { - let (nextEvent, observer) = self._lock.calculateLocked { () -> (Event?, O?) in + let (nextEvent, observer) = self._lock.calculateLocked { () -> (Event?, O) in if self._queue.count > 0 { return (self._queue.dequeue(), self._observer) } @@ -90,8 +91,8 @@ class ObserveOnSink : ObserverBase { } } - if let nextEvent = nextEvent { - observer?.on(nextEvent) + if let nextEvent = nextEvent, !_cancel.isDisposed { + observer.on(nextEvent) if nextEvent.isStopEvent { dispose() } @@ -122,12 +123,7 @@ class ObserveOnSink : ObserverBase { override func dispose() { super.dispose() - _subscription.dispose() + _cancel.dispose() _scheduleDisposable.dispose() - - _lock.lock(); defer { _lock.unlock() } // { - _observer = nil - - // } } } diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/ObserveOnSerialDispatchQueue.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/ObserveOnSerialDispatchQueue.swift index 20711e03..7f4ab9c4 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/ObserveOnSerialDispatchQueue.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/ObserveOnSerialDispatchQueue.swift @@ -9,25 +9,31 @@ import Foundation #if TRACE_RESOURCES -/** -Counts number of `SerialDispatchQueueObservables`. + fileprivate var _numberOfSerialDispatchQueueObservables: AtomicInt = 0 + extension Resources { + /** + Counts number of `SerialDispatchQueueObservables`. -Purposed for unit tests. -*/ -public var numberOfSerialDispatchQueueObservables: AtomicInt = 0 + Purposed for unit tests. + */ + public static var numberOfSerialDispatchQueueObservables: Int32 { + return _numberOfSerialDispatchQueueObservables.valueSnapshot() + } + } #endif class ObserveOnSerialDispatchQueueSink : ObserverBase { let scheduler: SerialDispatchQueueScheduler let observer: O - let subscription = SingleAssignmentDisposable() + let cancel: Cancelable var cachedScheduleLambda: ((ObserveOnSerialDispatchQueueSink, Event) -> Disposable)! - init(scheduler: SerialDispatchQueueScheduler, observer: O) { + init(scheduler: SerialDispatchQueueScheduler, observer: O, cancel: Cancelable) { self.scheduler = scheduler self.observer = observer + self.cancel = cancel super.init() cachedScheduleLambda = { sink, event in @@ -48,7 +54,7 @@ class ObserveOnSerialDispatchQueueSink : ObserverBase { override func dispose() { super.dispose() - subscription.dispose() + cancel.dispose() } } @@ -61,21 +67,21 @@ class ObserveOnSerialDispatchQueue : Producer { self.source = source #if TRACE_RESOURCES - let _ = AtomicIncrement(&resourceCount) - let _ = AtomicIncrement(&numberOfSerialDispatchQueueObservables) + let _ = Resources.incrementTotal() + let _ = AtomicIncrement(&_numberOfSerialDispatchQueueObservables) #endif } - override func run(_ observer: O) -> Disposable where O.E == E { - let sink = ObserveOnSerialDispatchQueueSink(scheduler: scheduler, observer: observer) - sink.subscription.disposable = source.subscribe(sink) - return sink + override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == E { + let sink = ObserveOnSerialDispatchQueueSink(scheduler: scheduler, observer: observer, cancel: cancel) + let subscription = source.subscribe(sink) + return (sink: sink, subscription: subscription) } #if TRACE_RESOURCES deinit { - let _ = AtomicDecrement(&resourceCount) - let _ = AtomicDecrement(&numberOfSerialDispatchQueueObservables) + let _ = Resources.decrementTotal() + let _ = AtomicDecrement(&_numberOfSerialDispatchQueueObservables) } #endif } diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Producer.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Producer.swift index 2046a229..ca20f8a9 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Producer.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Producer.swift @@ -1,6 +1,6 @@ // // Producer.swift -// Rx +// RxSwift // // Created by Krunoslav Zaher on 2/20/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -15,16 +15,105 @@ class Producer : Observable { override func subscribe(_ observer: O) -> Disposable where O.E == Element { if !CurrentThreadScheduler.isScheduleRequired { - return run(observer) + // The returned disposable needs to release all references once it was disposed. + let disposer = SinkDisposer() + let sinkAndSubscription = run(observer, cancel: disposer) + disposer.setSinkAndSubscription(sink: sinkAndSubscription.sink, subscription: sinkAndSubscription.subscription) + + return disposer } else { return CurrentThreadScheduler.instance.schedule(()) { _ in - return self.run(observer) + let disposer = SinkDisposer() + let sinkAndSubscription = self.run(observer, cancel: disposer) + disposer.setSinkAndSubscription(sink: sinkAndSubscription.sink, subscription: sinkAndSubscription.subscription) + + return disposer } } } - func run(_ observer: O) -> Disposable where O.E == Element { + func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element { abstractMethod() } } + +fileprivate class SinkDisposer: Cancelable { + #if os(Linux) + fileprivate let _lock = SpinLock() + #endif + + fileprivate enum DisposeState: UInt32 { + case disposed = 1 + case sinkAndSubscriptionSet = 2 + } + + // Jeej, swift API consistency rules + fileprivate enum DisposeStateInt32: Int32 { + case disposed = 1 + case sinkAndSubscriptionSet = 2 + } + + private var _state: UInt32 = 0 + private var _sink: Disposable? = nil + private var _subscription: Disposable? = nil + + var isDisposed: Bool { + return (_state & DisposeState.disposed.rawValue) != 0 + } + + func setSinkAndSubscription(sink: Disposable, subscription: Disposable) { + _sink = sink + _subscription = subscription + + #if os(Linux) + _lock.lock() + let previousState = Int32(_state) + _state = _state | DisposeState.sinkAndSubscriptionSet.rawValue + // We know about `defer { _lock.unlock() }`, but this resolves Swift compiler bugs. Using `defer` here causes anomaly. + _lock.unlock() + #else + let previousState = OSAtomicOr32OrigBarrier(DisposeState.sinkAndSubscriptionSet.rawValue, &_state) + #endif + if (previousState & DisposeStateInt32.sinkAndSubscriptionSet.rawValue) != 0 { + rxFatalError("Sink and subscription were already set") + } + + if (previousState & DisposeStateInt32.disposed.rawValue) != 0 { + sink.dispose() + subscription.dispose() + _sink = nil + _subscription = nil + } + } + + func dispose() { + #if os(Linux) + _lock.lock() + let previousState = Int32(_state) + _state = _state | DisposeState.disposed.rawValue + // We know about `defer { _lock.unlock() }`, but this resolves Swift compiler bugs. Using `defer` here causes anomaly. + _lock.unlock() + #else + let previousState = OSAtomicOr32OrigBarrier(DisposeState.disposed.rawValue, &_state) + #endif + if (previousState & DisposeStateInt32.disposed.rawValue) != 0 { + return + } + + if (previousState & DisposeStateInt32.sinkAndSubscriptionSet.rawValue) != 0 { + guard let sink = _sink else { + rxFatalError("Sink not set") + } + guard let subscription = _subscription else { + rxFatalError("Subscription not set") + } + + sink.dispose() + subscription.dispose() + + _sink = nil + _subscription = nil + } + } +} diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Range.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Range.swift index 15319991..74ece4d4 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Range.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Range.swift @@ -1,6 +1,6 @@ // // Range.swift -// Rx +// RxSwift // // Created by Krunoslav Zaher on 9/13/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -27,10 +27,10 @@ class RangeProducer : Producer { _scheduler = scheduler } - override func run(_ observer: O) -> Disposable where O.E == E { - let sink = RangeSink(parent: self, observer: observer) - sink.disposable = sink.run() - return sink + override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == E { + let sink = RangeSink(parent: self, observer: observer, cancel: cancel) + let subscription = sink.run() + return (sink: sink, subscription: subscription) } } @@ -39,9 +39,9 @@ class RangeSink : Sink where O.E: SignedInteger { private let _parent: Parent - init(parent: Parent, observer: O) { + init(parent: Parent, observer: O, cancel: Cancelable) { _parent = parent - super.init(observer: observer) + super.init(observer: observer, cancel: cancel) } func run() -> Disposable { diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Reduce.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Reduce.swift index 68d76bad..f203709c 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Reduce.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Reduce.swift @@ -1,6 +1,6 @@ // // Reduce.swift -// Rx +// RxSwift // // Created by Krunoslav Zaher on 4/1/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -15,11 +15,11 @@ class ReduceSink : Sink, Observe private let _parent: Parent private var _accumulation: AccumulateType - init(parent: Parent, observer: O) { + init(parent: Parent, observer: O, cancel: Cancelable) { _parent = parent _accumulation = parent._seed - super.init(observer: observer) + super.init(observer: observer, cancel: cancel) } func on(_ event: Event) { @@ -65,10 +65,10 @@ class Reduce : Producer { _accumulator = accumulator _mapResult = mapResult } - - override func run(_ observer: O) -> Disposable where O.E == ResultType { - let sink = ReduceSink(parent: self, observer: observer) - sink.disposable = _source.subscribe(sink) - return sink + + override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == ResultType { + let sink = ReduceSink(parent: self, observer: observer, cancel: cancel) + let subscription = _source.subscribe(sink) + return (sink: sink, subscription: subscription) } } diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/RefCount.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/RefCount.swift index 11f1756a..1c5e88cb 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/RefCount.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/RefCount.swift @@ -1,6 +1,6 @@ // // RefCount.swift -// Rx +// RxSwift // // Created by Krunoslav Zaher on 3/5/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -16,9 +16,9 @@ class RefCountSink private let _parent: Parent - init(parent: Parent, observer: O) { + init(parent: Parent, observer: O, cancel: Cancelable) { _parent = parent - super.init(observer: observer) + super.init(observer: observer, cancel: cancel) } func run() -> Disposable { @@ -76,9 +76,9 @@ class RefCount: Producer { _source = source } - override func run(_ observer: O) -> Disposable where O.E == CO.E { - let sink = RefCountSink(parent: self, observer: observer) - sink.disposable = sink.run() - return sink + override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == CO.E { + let sink = RefCountSink(parent: self, observer: observer, cancel: cancel) + let subscription = sink.run() + return (sink: sink, subscription: subscription) } } diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Repeat.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Repeat.swift index d8e20baf..90b850b9 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Repeat.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Repeat.swift @@ -1,6 +1,6 @@ // // Repeat.swift -// RxExample +// RxSwift // // Created by Krunoslav Zaher on 9/13/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -17,11 +17,11 @@ class RepeatElement : Producer { _scheduler = scheduler } - override func run(_ observer: O) -> Disposable where O.E == Element { - let sink = RepeatElementSink(parent: self, observer: observer) - sink.disposable = sink.run() + override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element { + let sink = RepeatElementSink(parent: self, observer: observer, cancel: cancel) + let subscription = sink.run() - return sink + return (sink: sink, subscription: subscription) } } @@ -30,9 +30,9 @@ class RepeatElementSink : Sink { private let _parent: Parent - init(parent: Parent, observer: O) { + init(parent: Parent, observer: O, cancel: Cancelable) { _parent = parent - super.init(observer: observer) + super.init(observer: observer, cancel: cancel) } func run() -> Disposable { diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/RetryWhen.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/RetryWhen.swift index ceed0edc..00cba3d1 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/RetryWhen.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/RetryWhen.swift @@ -1,6 +1,6 @@ // // RetryWhen.swift -// Rx +// RxSwift // // Created by Junior B. on 06/10/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -60,7 +60,7 @@ class RetryWhenSequenceSinkIter fileprivate let _notifier = PublishSubject() - init(parent: Parent, observer: O) { + init(parent: Parent, observer: O, cancel: Cancelable) { _parent = parent _handler = parent._notificationHandler(_errorSubject).asObservable() - super.init(observer: observer) + super.init(observer: observer, cancel: cancel) } override func done() { @@ -120,7 +120,7 @@ class RetryWhenSequenceSink) -> Disposable { let iter = RetryWhenSequenceSinkIter(parent: self) - iter.disposable = source.subscribe(iter) + iter.setDisposable(source.subscribe(iter)) return iter } @@ -142,9 +142,9 @@ class RetryWhenSequence : _notificationHandler = notificationHandler } - override func run(_ observer: O) -> Disposable where O.E == Element { - let sink = RetryWhenSequenceSink(parent: self, observer: observer) - sink.disposable = sink.run((self._sources.makeIterator(), nil)) - return sink + override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element { + let sink = RetryWhenSequenceSink(parent: self, observer: observer, cancel: cancel) + let subscription = sink.run((self._sources.makeIterator(), nil)) + return (sink: sink, subscription: subscription) } } diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Sample.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Sample.swift index bfa3234b..7190bfb7 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Sample.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Sample.swift @@ -79,13 +79,13 @@ class SampleSequenceSink fileprivate let _sourceSubscription = SingleAssignmentDisposable() - init(parent: Parent, observer: O) { + init(parent: Parent, observer: O, cancel: Cancelable) { _parent = parent - super.init(observer: observer) + super.init(observer: observer, cancel: cancel) } func run() -> Disposable { - _sourceSubscription.disposable = _parent._source.subscribe(self) + _sourceSubscription.setDisposable(_parent._source.subscribe(self)) let samplerSubscription = _parent._sampler.subscribe(SamplerSink(parent: self)) return Disposables.create(_sourceSubscription, samplerSubscription) @@ -121,9 +121,9 @@ class Sample : Producer { _onlyNew = onlyNew } - override func run(_ observer: O) -> Disposable where O.E == Element { - let sink = SampleSequenceSink(parent: self, observer: observer) - sink.disposable = sink.run() - return sink + override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element { + let sink = SampleSequenceSink(parent: self, observer: observer, cancel: cancel) + let subscription = sink.run() + return (sink: sink, subscription: subscription) } } diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Scan.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Scan.swift index 6c7332bd..dbb9173a 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Scan.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Scan.swift @@ -15,10 +15,10 @@ class ScanSink : Sink, ObserverType fileprivate let _parent: Parent fileprivate var _accumulate: Accumulate - init(parent: Parent, observer: O) { + init(parent: Parent, observer: O, cancel: Cancelable) { _parent = parent _accumulate = parent._seed - super.init(observer: observer) + super.init(observer: observer, cancel: cancel) } func on(_ event: Event) { @@ -56,9 +56,9 @@ class Scan: Producer { _accumulator = accumulator } - override func run(_ observer: O) -> Disposable where O.E == Accumulate { - let sink = ScanSink(parent: self, observer: observer) - sink.disposable = _source.subscribe(sink) - return sink + override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Accumulate { + let sink = ScanSink(parent: self, observer: observer, cancel: cancel) + let subscription = _source.subscribe(sink) + return (sink: sink, subscription: subscription) } } diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Sequence.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Sequence.swift index 205e4223..b5f972d9 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Sequence.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Sequence.swift @@ -1,6 +1,6 @@ // // Sequence.swift -// Rx +// RxSwift // // Created by Krunoslav Zaher on 11/14/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -13,9 +13,9 @@ class ObservableSequenceSink : Sink where S.Ite private let _parent: Parent - init(parent: Parent, observer: O) { + init(parent: Parent, observer: O, cancel: Cancelable) { _parent = parent - super.init(observer: observer) + super.init(observer: observer, cancel: cancel) } func run() -> Disposable { @@ -41,9 +41,9 @@ class ObservableSequence : Producer { _scheduler = scheduler } - override func subscribe(_ observer: O) -> Disposable where O.E == E { - let sink = ObservableSequenceSink(parent: self, observer: observer) - sink.disposable = sink.run() - return sink + override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == E { + let sink = ObservableSequenceSink(parent: self, observer: observer, cancel: cancel) + let subscription = sink.run() + return (sink: sink, subscription: subscription) } } diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/ShareReplay1.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/ShareReplay1.swift index fd8779b4..6f7497b7 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/ShareReplay1.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/ShareReplay1.swift @@ -1,6 +1,6 @@ // // ShareReplay1.swift -// Rx +// RxSwift // // Created by Krunoslav Zaher on 10/10/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -53,7 +53,7 @@ final class ShareReplay1 let connection = SingleAssignmentDisposable() _connection = connection - connection.disposable = self._source.subscribe(self) + connection.setDisposable(self._source.subscribe(self)) } return SubscriptionDisposable(owner: self, key: disposeKey) @@ -77,13 +77,13 @@ final class ShareReplay1 } func on(_ event: Event) { - _lock.lock(); defer { _lock.unlock() } - _synchronized_on(event) + _synchronized_on(event).on(event) } - func _synchronized_on(_ event: Event) { + func _synchronized_on(_ event: Event) -> Bag> { + _lock.lock(); defer { _lock.unlock() } if _stopped { - return + return Bag() } switch event { @@ -96,6 +96,6 @@ final class ShareReplay1 _connection = nil } - _observers.on(event) + return _observers } } diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/ShareReplay1WhileConnected.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/ShareReplay1WhileConnected.swift index 4e0aa51d..fa8c2523 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/ShareReplay1WhileConnected.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/ShareReplay1WhileConnected.swift @@ -1,6 +1,6 @@ // // ShareReplay1WhileConnected.swift -// Rx +// RxSwift // // Created by Krunoslav Zaher on 12/6/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -46,7 +46,7 @@ final class ShareReplay1WhileConnected let connection = SingleAssignmentDisposable() _connection = connection - connection.disposable = self._source.subscribe(self) + connection.setDisposable(self._source.subscribe(self)) } return SubscriptionDisposable(owner: self, key: disposeKey) @@ -71,22 +71,22 @@ final class ShareReplay1WhileConnected } func on(_ event: Event) { - _lock.lock(); defer { _lock.unlock() } - _synchronized_on(event) + _synchronized_on(event).on(event) } - func _synchronized_on(_ event: Event) { + func _synchronized_on(_ event: Event) -> Bag> { + _lock.lock(); defer { _lock.unlock() } switch event { case .next(let element): _element = element - _observers.on(event) + return _observers case .error, .completed: _element = nil _connection?.dispose() _connection = nil let observers = _observers _observers = Bag() - observers.on(event) + return observers } } } diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/SingleAsync.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/SingleAsync.swift index 5fecf91c..e0316fd3 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/SingleAsync.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/SingleAsync.swift @@ -1,6 +1,6 @@ // // SingleAsync.swift -// Rx +// RxSwift // // Created by Junior B. on 09/11/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -15,9 +15,9 @@ class SingleAsyncSink : Sink, ObserverType wher private let _parent: Parent private var _seenValue: Bool = false - init(parent: Parent, observer: O) { + init(parent: Parent, observer: O, cancel: Cancelable) { _parent = parent - super.init(observer: observer) + super.init(observer: observer, cancel: cancel) } func on(_ event: Event) { @@ -68,9 +68,9 @@ class SingleAsync: Producer { _predicate = predicate } - override func run(_ observer: O) -> Disposable where O.E == Element { - let sink = SingleAsyncSink(parent: self, observer: observer) - sink.disposable = _source.subscribe(sink) - return sink + override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element { + let sink = SingleAsyncSink(parent: self, observer: observer, cancel: cancel) + let subscription = _source.subscribe(sink) + return (sink: sink, subscription: subscription) } } diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Sink.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Sink.swift index b548906c..21e1d787 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Sink.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Sink.swift @@ -1,6 +1,6 @@ // // Sink.swift -// Rx +// RxSwift // // Created by Krunoslav Zaher on 2/19/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -8,18 +8,22 @@ import Foundation -class Sink : SingleAssignmentDisposable { +class Sink : Disposable { fileprivate let _observer: O + fileprivate let _cancel: Cancelable + fileprivate var _disposed: Bool - init(observer: O) { + init(observer: O, cancel: Cancelable) { #if TRACE_RESOURCES - let _ = AtomicIncrement(&resourceCount) + let _ = Resources.incrementTotal() #endif _observer = observer + _cancel = cancel + _disposed = false } final func forwardOn(_ event: Event) { - if isDisposed { + if _disposed { return } _observer.on(event) @@ -29,9 +33,18 @@ class Sink : SingleAssignmentDisposable { return SinkForward(forward: self) } + var disposed: Bool { + return _disposed + } + + func dispose() { + _disposed = true + _cancel.dispose() + } + deinit { #if TRACE_RESOURCES - let _ = AtomicDecrement(&resourceCount) + let _ = Resources.decrementTotal() #endif } } @@ -51,7 +64,7 @@ class SinkForward: ObserverType { _forward._observer.on(event) case .error, .completed: _forward._observer.on(event) - _forward.dispose() + _forward._cancel.dispose() } } } diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Skip.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Skip.swift index ad8b815a..95252c49 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Skip.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Skip.swift @@ -18,10 +18,10 @@ class SkipCountSink : Sink, ObserverType where var remaining: Int - init(parent: Parent, observer: O) { + init(parent: Parent, observer: O, cancel: Cancelable) { self.parent = parent self.remaining = parent.count - super.init(observer: observer) + super.init(observer: observer, cancel: cancel) } func on(_ event: Event) { @@ -54,11 +54,11 @@ class SkipCount: Producer { self.count = count } - override func run(_ observer: O) -> Disposable where O.E == Element { - let sink = SkipCountSink(parent: self, observer: observer) - sink.disposable = source.subscribe(sink) + override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element { + let sink = SkipCountSink(parent: self, observer: observer, cancel: cancel) + let subscription = source.subscribe(sink) - return sink + return (sink: sink, subscription: subscription) } } @@ -73,9 +73,9 @@ class SkipTimeSink : Sink, ObserverType where O // state var open = false - init(parent: Parent, observer: O) { + init(parent: Parent, observer: O, cancel: Cancelable) { self.parent = parent - super.init(observer: observer) + super.init(observer: observer, cancel: cancel) } func on(_ event: Event) { @@ -120,9 +120,9 @@ class SkipTime: Producer { self.duration = duration } - override func run(_ observer: O) -> Disposable where O.E == Element { - let sink = SkipTimeSink(parent: self, observer: observer) - sink.disposable = sink.run() - return sink + override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element { + let sink = SkipTimeSink(parent: self, observer: observer, cancel: cancel) + let subscription = sink.run() + return (sink: sink, subscription: subscription) } } diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/SkipUntil.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/SkipUntil.swift index 59508141..8217730b 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/SkipUntil.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/SkipUntil.swift @@ -1,6 +1,6 @@ // // SkipUntil.swift -// Rx +// RxSwift // // Created by Yury Korolev on 10/3/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -26,7 +26,7 @@ class SkipUntilSinkOther init(parent: Parent) { _parent = parent #if TRACE_RESOURCES - let _ = AtomicIncrement(&resourceCount) + let _ = Resources.incrementTotal() #endif } @@ -49,7 +49,7 @@ class SkipUntilSinkOther #if TRACE_RESOURCES deinit { - let _ = AtomicDecrement(&resourceCount) + let _ = Resources.decrementTotal() } #endif @@ -70,9 +70,9 @@ class SkipUntilSink fileprivate let _sourceSubscription = SingleAssignmentDisposable() - init(parent: Parent, observer: O) { + init(parent: Parent, observer: O, cancel: Cancelable) { _parent = parent - super.init(observer: observer) + super.init(observer: observer, cancel: cancel) } func on(_ event: Event) { @@ -100,8 +100,8 @@ class SkipUntilSink let sourceSubscription = _parent._source.subscribe(self) let otherObserver = SkipUntilSinkOther(parent: self) let otherSubscription = _parent._other.subscribe(otherObserver) - _sourceSubscription.disposable = sourceSubscription - otherObserver._subscription.disposable = otherSubscription + _sourceSubscription.setDisposable(sourceSubscription) + otherObserver._subscription.setDisposable(otherSubscription) return Disposables.create(_sourceSubscription, otherObserver._subscription) } @@ -117,9 +117,9 @@ class SkipUntil: Producer { _other = other } - override func run(_ observer: O) -> Disposable where O.E == Element { - let sink = SkipUntilSink(parent: self, observer: observer) - sink.disposable = sink.run() - return sink + override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element { + let sink = SkipUntilSink(parent: self, observer: observer, cancel: cancel) + let subscription = sink.run() + return (sink: sink, subscription: subscription) } } diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/SkipWhile.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/SkipWhile.swift index b6e4b822..4f5610aa 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/SkipWhile.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/SkipWhile.swift @@ -1,6 +1,6 @@ // // SkipWhile.swift -// Rx +// RxSwift // // Created by Yury Korolev on 10/9/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -14,9 +14,9 @@ class SkipWhileSink : Sink, ObserverType where fileprivate let _parent: Parent fileprivate var _running = false - init(parent: Parent, observer: O) { + init(parent: Parent, observer: O, cancel: Cancelable) { _parent = parent - super.init(observer: observer) + super.init(observer: observer, cancel: cancel) } func on(_ event: Event) { @@ -51,9 +51,9 @@ class SkipWhileSinkWithIndex : Sink, ObserverTy fileprivate var _index = 0 fileprivate var _running = false - init(parent: Parent, observer: O) { + init(parent: Parent, observer: O, cancel: Cancelable) { _parent = parent - super.init(observer: observer) + super.init(observer: observer, cancel: cancel) } func on(_ event: Event) { @@ -100,16 +100,16 @@ class SkipWhile: Producer { _predicateWithIndex = predicate } - override func run(_ observer: O) -> Disposable where O.E == Element { + override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element { if let _ = _predicate { - let sink = SkipWhileSink(parent: self, observer: observer) - sink.disposable = _source.subscribe(sink) - return sink + let sink = SkipWhileSink(parent: self, observer: observer, cancel: cancel) + let subscription = _source.subscribe(sink) + return (sink: sink, subscription: subscription) } else { - let sink = SkipWhileSinkWithIndex(parent: self, observer: observer) - sink.disposable = _source.subscribe(sink) - return sink + let sink = SkipWhileSinkWithIndex(parent: self, observer: observer, cancel: cancel) + let subscription = _source.subscribe(sink) + return (sink: sink, subscription: subscription) } } } diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/StartWith.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/StartWith.swift index 7c46f1e7..a5ac927c 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/StartWith.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/StartWith.swift @@ -1,6 +1,6 @@ // // StartWith.swift -// RxCocoa +// RxSwift // // Created by Krunoslav Zaher on 4/6/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -18,11 +18,11 @@ class StartWith: Producer { super.init() } - override func run(_ observer: O) -> Disposable where O.E == Element { + override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element { for e in elements { observer.on(.next(e)) } - return source.subscribe(observer) + return (sink: Disposables.create(), subscription: source.subscribe(observer)) } } diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/SubscribeOn.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/SubscribeOn.swift index fe810ee5..b2f871ca 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/SubscribeOn.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/SubscribeOn.swift @@ -14,9 +14,9 @@ class SubscribeOnSink : Sink, ObserverTy let parent: Parent - init(parent: Parent, observer: O) { + init(parent: Parent, observer: O, cancel: Cancelable) { self.parent = parent - super.init(observer: observer) + super.init(observer: observer, cancel: cancel) } func on(_ event: Event) { @@ -33,11 +33,13 @@ class SubscribeOnSink : Sink, ObserverTy disposeEverything.disposable = cancelSchedule - cancelSchedule.disposable = parent.scheduler.schedule(()) { (_) -> Disposable in + let disposeSchedule = parent.scheduler.schedule(()) { (_) -> Disposable in let subscription = self.parent.source.subscribe(self) disposeEverything.disposable = ScheduledDisposable(scheduler: self.parent.scheduler, disposable: subscription) return Disposables.create() } + + cancelSchedule.setDisposable(disposeSchedule) return disposeEverything } @@ -52,9 +54,9 @@ class SubscribeOn : Producer { self.scheduler = scheduler } - override func run(_ observer: O) -> Disposable where O.E == Ob.E { - let sink = SubscribeOnSink(parent: self, observer: observer) - sink.disposable = sink.run() - return sink + override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Ob.E { + let sink = SubscribeOnSink(parent: self, observer: observer, cancel: cancel) + let subscription = sink.run() + return (sink: sink, subscription: subscription) } } diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Switch.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Switch.swift index cf136aef..5b8e34fa 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Switch.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Switch.swift @@ -1,6 +1,6 @@ // // Switch.swift -// Rx +// RxSwift // // Created by Krunoslav Zaher on 3/12/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -25,13 +25,13 @@ class SwitchSink fileprivate var _latest = 0 fileprivate var _hasLatest = false - override init(observer: O) { - super.init(observer: observer) + override init(observer: O, cancel: Cancelable) { + super.init(observer: observer, cancel: cancel) } func run(_ source: Observable) -> Disposable { let subscription = source.subscribe(self) - _subscriptions.disposable = subscription + _subscriptions.setDisposable(subscription) return Disposables.create(_subscriptions, _innerSubscription) } @@ -57,7 +57,7 @@ class SwitchSink let observer = SwitchSinkIter(parent: self, id: latest, _self: d) let disposable = observable.subscribe(observer) - d.disposable = disposable + d.setDisposable(disposable) } catch let error { forwardOn(.error(error)) @@ -134,8 +134,8 @@ class SwitchSinkIter // MARK: Specializations final class SwitchIdentitySink : SwitchSink where O.E == S.E { - override init(observer: O) { - super.init(observer: observer) + override init(observer: O, cancel: Cancelable) { + super.init(observer: observer, cancel: cancel) } override func performMap(_ element: S) throws -> S { @@ -148,9 +148,9 @@ final class MapSwitchSink S { @@ -167,10 +167,10 @@ final class Switch : Producer { _source = source } - override func run(_ observer: O) -> Disposable where O.E == S.E { - let sink = SwitchIdentitySink(observer: observer) - sink.disposable = sink.run(_source) - return sink + override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == S.E { + let sink = SwitchIdentitySink(observer: observer, cancel: cancel) + let subscription = sink.run(_source) + return (sink: sink, subscription: subscription) } } @@ -185,9 +185,9 @@ final class FlatMapLatest : Producer(_ observer: O) -> Disposable where O.E == S.E { - let sink = MapSwitchSink(selector: _selector, observer: observer) - sink.disposable = sink.run(_source) - return sink + override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == S.E { + let sink = MapSwitchSink(selector: _selector, observer: observer, cancel: cancel) + let subscription = sink.run(_source) + return (sink: sink, subscription: subscription) } } diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Take.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Take.swift index 2450ed20..d1c1e18c 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Take.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Take.swift @@ -18,10 +18,10 @@ class TakeCountSink : Sink, ObserverType where private var _remaining: Int - init(parent: Parent, observer: O) { + init(parent: Parent, observer: O, cancel: Cancelable) { _parent = parent _remaining = parent._count - super.init(observer: observer) + super.init(observer: observer, cancel: cancel) } func on(_ event: Event) { @@ -61,10 +61,10 @@ class TakeCount: Producer { _count = count } - override func run(_ observer: O) -> Disposable where O.E == Element { - let sink = TakeCountSink(parent: self, observer: observer) - sink.disposable = _source.subscribe(sink) - return sink + override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element { + let sink = TakeCountSink(parent: self, observer: observer, cancel: cancel) + let subscription = _source.subscribe(sink) + return (sink: sink, subscription: subscription) } } @@ -82,9 +82,9 @@ class TakeTimeSink let _lock = NSRecursiveLock() - init(parent: Parent, observer: O) { + init(parent: Parent, observer: O, cancel: Cancelable) { _parent = parent - super.init(observer: observer) + super.init(observer: observer, cancel: cancel) } func on(_ event: Event) { @@ -136,9 +136,9 @@ class TakeTime : Producer { _duration = duration } - override func run(_ observer: O) -> Disposable where O.E == Element { - let sink = TakeTimeSink(parent: self, observer: observer) - sink.disposable = sink.run() - return sink + override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element { + let sink = TakeTimeSink(parent: self, observer: observer, cancel: cancel) + let subscription = sink.run() + return (sink: sink, subscription: subscription) } } diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/TakeLast.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/TakeLast.swift index dd63912b..7a414796 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/TakeLast.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/TakeLast.swift @@ -1,6 +1,6 @@ // // TakeLast.swift -// Rx +// RxSwift // // Created by Tomi Koskinen on 25/10/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -17,10 +17,10 @@ class TakeLastSink : Sink, ObserverType where O private var _elements: Queue - init(parent: Parent, observer: O) { + init(parent: Parent, observer: O, cancel: Cancelable) { _parent = parent _elements = Queue(capacity: parent._count + 1) - super.init(observer: observer) + super.init(observer: observer, cancel: cancel) } func on(_ event: Event) { @@ -55,9 +55,9 @@ class TakeLast: Producer { _count = count } - override func run(_ observer: O) -> Disposable where O.E == Element { - let sink = TakeLastSink(parent: self, observer: observer) - sink.disposable = _source.subscribe(sink) - return sink + override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element { + let sink = TakeLastSink(parent: self, observer: observer, cancel: cancel) + let subscription = _source.subscribe(sink) + return (sink: sink, subscription: subscription) } } diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/TakeUntil.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/TakeUntil.swift index c71b9c19..0769e8a5 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/TakeUntil.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/TakeUntil.swift @@ -26,7 +26,7 @@ class TakeUntilSinkOther init(parent: Parent) { _parent = parent #if TRACE_RESOURCES - let _ = AtomicIncrement(&resourceCount) + let _ = Resources.incrementTotal() #endif } @@ -50,7 +50,7 @@ class TakeUntilSinkOther #if TRACE_RESOURCES deinit { - let _ = AtomicDecrement(&resourceCount) + let _ = Resources.decrementTotal() } #endif } @@ -70,9 +70,9 @@ class TakeUntilSink // state fileprivate var _open = false - init(parent: Parent, observer: O) { + init(parent: Parent, observer: O, cancel: Cancelable) { _parent = parent - super.init(observer: observer) + super.init(observer: observer, cancel: cancel) } func on(_ event: Event) { @@ -95,7 +95,7 @@ class TakeUntilSink func run() -> Disposable { let otherObserver = TakeUntilSinkOther(parent: self) let otherSubscription = _parent._other.subscribe(otherObserver) - otherObserver._subscription.disposable = otherSubscription + otherObserver._subscription.setDisposable(otherSubscription) let sourceSubscription = _parent._source.subscribe(self) return Disposables.create(sourceSubscription, otherObserver._subscription) @@ -112,9 +112,9 @@ class TakeUntil: Producer { _other = other } - override func run(_ observer: O) -> Disposable where O.E == Element { - let sink = TakeUntilSink(parent: self, observer: observer) - sink.disposable = sink.run() - return sink + override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element { + let sink = TakeUntilSink(parent: self, observer: observer, cancel: cancel) + let subscription = sink.run() + return (sink: sink, subscription: subscription) } } diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/TakeWhile.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/TakeWhile.swift index 9147302a..259bc250 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/TakeWhile.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/TakeWhile.swift @@ -18,9 +18,9 @@ class TakeWhileSink fileprivate var _running = true - init(parent: Parent, observer: O) { + init(parent: Parent, observer: O, cancel: Cancelable) { _parent = parent - super.init(observer: observer) + super.init(observer: observer, cancel: cancel) } func on(_ event: Event) { @@ -63,9 +63,9 @@ class TakeWhileSinkWithIndex fileprivate var _running = true fileprivate var _index = 0 - init(parent: Parent, observer: O) { + init(parent: Parent, observer: O, cancel: Cancelable) { _parent = parent - super.init(observer: observer) + super.init(observer: observer, cancel: cancel) } func on(_ event: Event) { @@ -118,15 +118,15 @@ class TakeWhile: Producer { _predicateWithIndex = predicate } - override func run(_ observer: O) -> Disposable where O.E == Element { + override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element { if let _ = _predicate { - let sink = TakeWhileSink(parent: self, observer: observer) - sink.disposable = _source.subscribe(sink) - return sink + let sink = TakeWhileSink(parent: self, observer: observer, cancel: cancel) + let subscription = _source.subscribe(sink) + return (sink: sink, subscription: subscription) } else { - let sink = TakeWhileSinkWithIndex(parent: self, observer: observer) - sink.disposable = _source.subscribe(sink) - return sink + let sink = TakeWhileSinkWithIndex(parent: self, observer: observer, cancel: cancel) + let subscription = _source.subscribe(sink) + return (sink: sink, subscription: subscription) } } } diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Throttle.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Throttle.swift index 90841b09..f9683fed 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Throttle.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Throttle.swift @@ -1,6 +1,6 @@ // // Throttle.swift -// Rx +// RxSwift // // Created by Krunoslav Zaher on 3/22/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -27,10 +27,10 @@ class ThrottleSink let cancellable = SerialDisposable() - init(parent: ParentType, observer: O) { + init(parent: ParentType, observer: O, cancel: Cancelable) { _parent = parent - super.init(observer: observer) + super.init(observer: observer, cancel: cancel) } func run() -> Disposable { @@ -82,7 +82,7 @@ class ThrottleSink let d = SingleAssignmentDisposable() self.cancellable.disposable = d - d.disposable = scheduler.scheduleRelative(0, dueTime: dueTime - timeIntervalSinceLast, action: self.propagate) + d.setDisposable(scheduler.scheduleRelative(0, dueTime: dueTime - timeIntervalSinceLast, action: self.propagate)) case .error: _lastUnsentElement = nil forwardOn(event) @@ -134,10 +134,10 @@ class Throttle : Producer { _scheduler = scheduler } - override func run(_ observer: O) -> Disposable where O.E == Element { - let sink = ThrottleSink(parent: self, observer: observer) - sink.disposable = sink.run() - return sink + override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element { + let sink = ThrottleSink(parent: self, observer: observer, cancel: cancel) + let subscription = sink.run() + return (sink: sink, subscription: subscription) } } diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Timeout.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Timeout.swift index 654f6c77..f354ccfe 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Timeout.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Timeout.swift @@ -1,6 +1,6 @@ // // Timeout.swift -// Rx +// RxSwift // // Created by Tomi Koskinen on 13/11/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -22,9 +22,9 @@ class TimeoutSink: Sink, LockOwnerType, Observe private var _id = 0 private var _switched = false - init(parent: Parent, observer: O) { + init(parent: Parent, observer: O, cancel: Cancelable) { _parent = parent - super.init(observer: observer) + super.init(observer: observer, cancel: cancel) } func run() -> Disposable { @@ -33,7 +33,7 @@ class TimeoutSink: Sink, LockOwnerType, Observe _createTimeoutTimer() - original.disposable = _parent._source.subscribeSafe(self) + original.setDisposable(_parent._source.subscribeSafe(self)) return Disposables.create(_subscription, _timerD) } @@ -79,7 +79,7 @@ class TimeoutSink: Sink, LockOwnerType, Observe let nextTimer = SingleAssignmentDisposable() _timerD.disposable = nextTimer - nextTimer.disposable = _parent._scheduler.scheduleRelative(_id, dueTime: _parent._dueTime) { state in + let disposeSchedule = _parent._scheduler.scheduleRelative(_id, dueTime: _parent._dueTime) { state in var timerWins = false @@ -94,6 +94,8 @@ class TimeoutSink: Sink, LockOwnerType, Observe return Disposables.create() } + + nextTimer.setDisposable(disposeSchedule) } } @@ -112,9 +114,9 @@ class Timeout : Producer { _scheduler = scheduler } - override func run(_ observer: O) -> Disposable where O.E == Element { - let sink = TimeoutSink(parent: self, observer: observer) - sink.disposable = sink.run() - return sink + override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element { + let sink = TimeoutSink(parent: self, observer: observer, cancel: cancel) + let subscription = sink.run() + return (sink: sink, subscription: subscription) } } diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Timer.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Timer.swift index 077fc8bb..7c2df2c3 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Timer.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Timer.swift @@ -13,9 +13,9 @@ class TimerSink : Sink where O.E : SignedInteger { private let _parent: Parent - init(parent: Parent, observer: O) { + init(parent: Parent, observer: O, cancel: Cancelable) { _parent = parent - super.init(observer: observer) + super.init(observer: observer, cancel: cancel) } func run() -> Disposable { @@ -31,9 +31,9 @@ class TimerOneOffSink : Sink where O.E : SignedInteger { private let _parent: Parent - init(parent: Parent, observer: O) { + init(parent: Parent, observer: O, cancel: Cancelable) { _parent = parent - super.init(observer: observer) + super.init(observer: observer, cancel: cancel) } func run() -> Disposable { @@ -57,16 +57,16 @@ class Timer: Producer { _period = period } - override func run(_ observer: O) -> Disposable where O.E == E { + override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == E { if let _ = _period { - let sink = TimerSink(parent: self, observer: observer) - sink.disposable = sink.run() - return sink + let sink = TimerSink(parent: self, observer: observer, cancel: cancel) + let subscription = sink.run() + return (sink: sink, subscription: subscription) } else { - let sink = TimerOneOffSink(parent: self, observer: observer) - sink.disposable = sink.run() - return sink + let sink = TimerOneOffSink(parent: self, observer: observer, cancel: cancel) + let subscription = sink.run() + return (sink: sink, subscription: subscription) } } } diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/ToArray.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/ToArray.swift index 1ecd1285..623d6e21 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/ToArray.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/ToArray.swift @@ -1,6 +1,6 @@ // // ToArray.swift -// Rx +// RxSwift // // Created by Junior B. on 20/10/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -14,10 +14,10 @@ class ToArraySink : Sink, ObserverType where O.E let _parent: Parent var _list = Array() - init(parent: Parent, observer: O) { + init(parent: Parent, observer: O, cancel: Cancelable) { _parent = parent - super.init(observer: observer) + super.init(observer: observer, cancel: cancel) } func on(_ event: Event) { @@ -42,9 +42,9 @@ class ToArray : Producer<[SourceType]> { _source = source } - override func run(_ observer: O) -> Disposable where O.E == [SourceType] { - let sink = ToArraySink(parent: self, observer: observer) - sink.disposable = _source.subscribe(sink) - return sink + override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == [SourceType] { + let sink = ToArraySink(parent: self, observer: observer, cancel: cancel) + let subscription = _source.subscribe(sink) + return (sink: sink, subscription: subscription) } } diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Using.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Using.swift index edf80664..f0a860a7 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Using.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Using.swift @@ -1,6 +1,6 @@ // // Using.swift -// Rx +// RxSwift // // Created by Yury Korolev on 10/15/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -15,9 +15,9 @@ class UsingSink : Sink private let _parent: Parent - init(parent: Parent, observer: O) { + init(parent: Parent, observer: O, cancel: Cancelable) { _parent = parent - super.init(observer: observer) + super.init(observer: observer, cancel: cancel) } func run() -> Disposable { @@ -70,9 +70,9 @@ class Using: Producer { _observableFactory = observableFactory } - override func run(_ observer: O) -> Disposable where O.E == E { - let sink = UsingSink(parent: self, observer: observer) - sink.disposable = sink.run() - return sink + override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == E { + let sink = UsingSink(parent: self, observer: observer, cancel: cancel) + let subscription = sink.run() + return (sink: sink, subscription: subscription) } } diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Window.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Window.swift index aeda0139..4ca7ac4f 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Window.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Window.swift @@ -1,6 +1,6 @@ // // Window.swift -// Rx +// RxSwift // // Created by Junior B. on 29/10/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -28,13 +28,13 @@ class WindowTimeCountSink private let _refCountDisposable: RefCountDisposable private let _groupDisposable = CompositeDisposable() - init(parent: Parent, observer: O) { + init(parent: Parent, observer: O, cancel: Cancelable) { _parent = parent let _ = _groupDisposable.insert(_timerD) _refCountDisposable = RefCountDisposable(disposable: _groupDisposable) - super.init(observer: observer) + super.init(observer: observer, cancel: cancel) } func run() -> Disposable { @@ -108,7 +108,7 @@ class WindowTimeCountSink _timerD.disposable = nextTimer - nextTimer.disposable = _parent._scheduler.scheduleRelative(windowId, dueTime: _parent._timeSpan) { previousWindowId in + let scheduledRelative = _parent._scheduler.scheduleRelative(windowId, dueTime: _parent._timeSpan) { previousWindowId in var newId = 0 @@ -127,6 +127,8 @@ class WindowTimeCountSink return Disposables.create() } + + nextTimer.setDisposable(scheduledRelative) } } @@ -144,9 +146,9 @@ class WindowTimeCount : Producer> { _scheduler = scheduler } - override func run(_ observer: O) -> Disposable where O.E == Observable { - let sink = WindowTimeCountSink(parent: self, observer: observer) - sink.disposable = sink.run() - return sink + override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Observable { + let sink = WindowTimeCountSink(parent: self, observer: observer, cancel: cancel) + let subscription = sink.run() + return (sink: sink, subscription: subscription) } } diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/WithLatestFrom.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/WithLatestFrom.swift index e964e9c2..53cf2d94 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/WithLatestFrom.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/WithLatestFrom.swift @@ -1,6 +1,6 @@ // // WithLatestFrom.swift -// RxExample +// RxSwift // // Created by Yury Korolev on 10/19/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -22,19 +22,19 @@ class WithLatestFromSink var _lock = NSRecursiveLock() fileprivate var _latest: SecondType? - init(parent: Parent, observer: O) { + init(parent: Parent, observer: O, cancel: Cancelable) { _parent = parent - super.init(observer: observer) + super.init(observer: observer, cancel: cancel) } func run() -> Disposable { let sndSubscription = SingleAssignmentDisposable() let sndO = WithLatestFromSecond(parent: self, disposable: sndSubscription) - sndSubscription.disposable = _parent._second.subscribe(sndO) + sndSubscription.setDisposable(_parent._second.subscribe(sndO)) let fstSubscription = _parent._first.subscribe(self) - + return Disposables.create(fstSubscription, sndSubscription) } @@ -114,9 +114,9 @@ class WithLatestFrom: Producer { _resultSelector = resultSelector } - override func run(_ observer: O) -> Disposable where O.E == ResultType { - let sink = WithLatestFromSink(parent: self, observer: observer) - sink.disposable = sink.run() - return sink + override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == ResultType { + let sink = WithLatestFromSink(parent: self, observer: observer, cancel: cancel) + let subscription = sink.run() + return (sink: sink, subscription: subscription) } } diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Zip+CollectionType.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Zip+Collection.swift similarity index 89% rename from Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Zip+CollectionType.swift rename to Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Zip+Collection.swift index 1ccb1f87..fcd79787 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Zip+CollectionType.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Zip+Collection.swift @@ -1,6 +1,6 @@ // // Zip+Collection.swift -// Rx +// RxSwift // // Created by Krunoslav Zaher on 8/30/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -24,7 +24,7 @@ class ZipCollectionTypeSink private var _numberOfDone = 0 private var _subscriptions: [SingleAssignmentDisposable] - init(parent: Parent, observer: O) { + init(parent: Parent, observer: O, cancel: Cancelable) { _parent = parent _values = [Queue](repeating: Queue(capacity: 4), count: parent.count) _isDone = [Bool](repeating: false, count: parent.count) @@ -35,7 +35,7 @@ class ZipCollectionTypeSink _subscriptions.append(SingleAssignmentDisposable()) } - super.init(observer: observer) + super.init(observer: observer, cancel: cancel) } func on(_ event: Event, atIndex: Int) { @@ -106,9 +106,11 @@ class ZipCollectionTypeSink for i in _parent.sources { let index = j let source = i.asObservable() - _subscriptions[j].disposable = source.subscribe(AnyObserver { event in + + let disposable = source.subscribe(AnyObserver { event in self.on(event, atIndex: index) }) + _subscriptions[j].setDisposable(disposable) j += 1 } @@ -129,9 +131,9 @@ class ZipCollectionType : Producer where C.Iterator.Element self.count = Int(self.sources.count.toIntMax()) } - override func run(_ observer: O) -> Disposable where O.E == R { - let sink = ZipCollectionTypeSink(parent: self, observer: observer) - sink.disposable = sink.run() - return sink + override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == R { + let sink = ZipCollectionTypeSink(parent: self, observer: observer, cancel: cancel) + let subscription = sink.run() + return (sink: sink, subscription: subscription) } } diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Zip+arity.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Zip+arity.swift index 0600586b..b74464fc 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Zip+arity.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Zip+arity.swift @@ -1,4 +1,4 @@ -// This file is autogenerated. Take a look at `Preprocessor` target in RxSwift project +// This file is autogenerated. Take a look at `Preprocessor` target in RxSwift project // // Zip+arity.swift // RxSwift @@ -22,7 +22,6 @@ extension Observable { - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources. - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public static func zip (_ source1: O1, _ source2: O2, resultSelector: @escaping (O1.E, O2.E) throws -> E) -> Observable { @@ -42,9 +41,9 @@ class ZipSink2_ : ZipSink { var _values1: Queue = Queue(capacity: 2) var _values2: Queue = Queue(capacity: 2) - init(parent: Parent, observer: O) { + init(parent: Parent, observer: O, cancel: Cancelable) { _parent = parent - super.init(arity: 2, observer: observer) + super.init(arity: 2, observer: observer, cancel: cancel) } override func hasElements(_ index: Int) -> Bool { @@ -66,8 +65,8 @@ class ZipSink2_ : ZipSink { let observer1 = ZipObserver(lock: _lock, parent: self, index: 0, setNextValue: { self._values1.enqueue($0) }, this: subscription1) let observer2 = ZipObserver(lock: _lock, parent: self, index: 1, setNextValue: { self._values2.enqueue($0) }, this: subscription2) - subscription1.disposable = _parent.source1.subscribe(observer1) - subscription2.disposable = _parent.source2.subscribe(observer2) + subscription1.setDisposable(_parent.source1.subscribe(observer1)) + subscription2.setDisposable(_parent.source2.subscribe(observer2)) return Disposables.create([ subscription1, @@ -95,10 +94,10 @@ class Zip2 : Producer { _resultSelector = resultSelector } - override func run(_ observer: O) -> Disposable where O.E == R { - let sink = ZipSink2_(parent: self, observer: observer) - sink.disposable = sink.run() - return sink + override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == R { + let sink = ZipSink2_(parent: self, observer: observer, cancel: cancel) + let subscription = sink.run() + return (sink: sink, subscription: subscription) } } @@ -115,7 +114,6 @@ extension Observable { - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources. - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public static func zip (_ source1: O1, _ source2: O2, _ source3: O3, resultSelector: @escaping (O1.E, O2.E, O3.E) throws -> E) -> Observable { @@ -136,9 +134,9 @@ class ZipSink3_ : ZipSink { var _values2: Queue = Queue(capacity: 2) var _values3: Queue = Queue(capacity: 2) - init(parent: Parent, observer: O) { + init(parent: Parent, observer: O, cancel: Cancelable) { _parent = parent - super.init(arity: 3, observer: observer) + super.init(arity: 3, observer: observer, cancel: cancel) } override func hasElements(_ index: Int) -> Bool { @@ -163,9 +161,9 @@ class ZipSink3_ : ZipSink { let observer2 = ZipObserver(lock: _lock, parent: self, index: 1, setNextValue: { self._values2.enqueue($0) }, this: subscription2) let observer3 = ZipObserver(lock: _lock, parent: self, index: 2, setNextValue: { self._values3.enqueue($0) }, this: subscription3) - subscription1.disposable = _parent.source1.subscribe(observer1) - subscription2.disposable = _parent.source2.subscribe(observer2) - subscription3.disposable = _parent.source3.subscribe(observer3) + subscription1.setDisposable(_parent.source1.subscribe(observer1)) + subscription2.setDisposable(_parent.source2.subscribe(observer2)) + subscription3.setDisposable(_parent.source3.subscribe(observer3)) return Disposables.create([ subscription1, @@ -196,10 +194,10 @@ class Zip3 : Producer { _resultSelector = resultSelector } - override func run(_ observer: O) -> Disposable where O.E == R { - let sink = ZipSink3_(parent: self, observer: observer) - sink.disposable = sink.run() - return sink + override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == R { + let sink = ZipSink3_(parent: self, observer: observer, cancel: cancel) + let subscription = sink.run() + return (sink: sink, subscription: subscription) } } @@ -216,7 +214,6 @@ extension Observable { - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources. - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public static func zip (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, resultSelector: @escaping (O1.E, O2.E, O3.E, O4.E) throws -> E) -> Observable { @@ -238,9 +235,9 @@ class ZipSink4_ : ZipSink { var _values3: Queue = Queue(capacity: 2) var _values4: Queue = Queue(capacity: 2) - init(parent: Parent, observer: O) { + init(parent: Parent, observer: O, cancel: Cancelable) { _parent = parent - super.init(arity: 4, observer: observer) + super.init(arity: 4, observer: observer, cancel: cancel) } override func hasElements(_ index: Int) -> Bool { @@ -268,10 +265,10 @@ class ZipSink4_ : ZipSink { let observer3 = ZipObserver(lock: _lock, parent: self, index: 2, setNextValue: { self._values3.enqueue($0) }, this: subscription3) let observer4 = ZipObserver(lock: _lock, parent: self, index: 3, setNextValue: { self._values4.enqueue($0) }, this: subscription4) - subscription1.disposable = _parent.source1.subscribe(observer1) - subscription2.disposable = _parent.source2.subscribe(observer2) - subscription3.disposable = _parent.source3.subscribe(observer3) - subscription4.disposable = _parent.source4.subscribe(observer4) + subscription1.setDisposable(_parent.source1.subscribe(observer1)) + subscription2.setDisposable(_parent.source2.subscribe(observer2)) + subscription3.setDisposable(_parent.source3.subscribe(observer3)) + subscription4.setDisposable(_parent.source4.subscribe(observer4)) return Disposables.create([ subscription1, @@ -305,10 +302,10 @@ class Zip4 : Producer { _resultSelector = resultSelector } - override func run(_ observer: O) -> Disposable where O.E == R { - let sink = ZipSink4_(parent: self, observer: observer) - sink.disposable = sink.run() - return sink + override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == R { + let sink = ZipSink4_(parent: self, observer: observer, cancel: cancel) + let subscription = sink.run() + return (sink: sink, subscription: subscription) } } @@ -325,7 +322,6 @@ extension Observable { - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources. - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public static func zip (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, resultSelector: @escaping (O1.E, O2.E, O3.E, O4.E, O5.E) throws -> E) -> Observable { @@ -348,9 +344,9 @@ class ZipSink5_ : ZipSink { var _values4: Queue = Queue(capacity: 2) var _values5: Queue = Queue(capacity: 2) - init(parent: Parent, observer: O) { + init(parent: Parent, observer: O, cancel: Cancelable) { _parent = parent - super.init(arity: 5, observer: observer) + super.init(arity: 5, observer: observer, cancel: cancel) } override func hasElements(_ index: Int) -> Bool { @@ -381,11 +377,11 @@ class ZipSink5_ : ZipSink { let observer4 = ZipObserver(lock: _lock, parent: self, index: 3, setNextValue: { self._values4.enqueue($0) }, this: subscription4) let observer5 = ZipObserver(lock: _lock, parent: self, index: 4, setNextValue: { self._values5.enqueue($0) }, this: subscription5) - subscription1.disposable = _parent.source1.subscribe(observer1) - subscription2.disposable = _parent.source2.subscribe(observer2) - subscription3.disposable = _parent.source3.subscribe(observer3) - subscription4.disposable = _parent.source4.subscribe(observer4) - subscription5.disposable = _parent.source5.subscribe(observer5) + subscription1.setDisposable(_parent.source1.subscribe(observer1)) + subscription2.setDisposable(_parent.source2.subscribe(observer2)) + subscription3.setDisposable(_parent.source3.subscribe(observer3)) + subscription4.setDisposable(_parent.source4.subscribe(observer4)) + subscription5.setDisposable(_parent.source5.subscribe(observer5)) return Disposables.create([ subscription1, @@ -422,10 +418,10 @@ class Zip5 : Producer { _resultSelector = resultSelector } - override func run(_ observer: O) -> Disposable where O.E == R { - let sink = ZipSink5_(parent: self, observer: observer) - sink.disposable = sink.run() - return sink + override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == R { + let sink = ZipSink5_(parent: self, observer: observer, cancel: cancel) + let subscription = sink.run() + return (sink: sink, subscription: subscription) } } @@ -442,7 +438,6 @@ extension Observable { - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources. - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public static func zip (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, resultSelector: @escaping (O1.E, O2.E, O3.E, O4.E, O5.E, O6.E) throws -> E) -> Observable { @@ -466,9 +461,9 @@ class ZipSink6_ : ZipSink { var _values5: Queue = Queue(capacity: 2) var _values6: Queue = Queue(capacity: 2) - init(parent: Parent, observer: O) { + init(parent: Parent, observer: O, cancel: Cancelable) { _parent = parent - super.init(arity: 6, observer: observer) + super.init(arity: 6, observer: observer, cancel: cancel) } override func hasElements(_ index: Int) -> Bool { @@ -502,12 +497,12 @@ class ZipSink6_ : ZipSink { let observer5 = ZipObserver(lock: _lock, parent: self, index: 4, setNextValue: { self._values5.enqueue($0) }, this: subscription5) let observer6 = ZipObserver(lock: _lock, parent: self, index: 5, setNextValue: { self._values6.enqueue($0) }, this: subscription6) - subscription1.disposable = _parent.source1.subscribe(observer1) - subscription2.disposable = _parent.source2.subscribe(observer2) - subscription3.disposable = _parent.source3.subscribe(observer3) - subscription4.disposable = _parent.source4.subscribe(observer4) - subscription5.disposable = _parent.source5.subscribe(observer5) - subscription6.disposable = _parent.source6.subscribe(observer6) + subscription1.setDisposable(_parent.source1.subscribe(observer1)) + subscription2.setDisposable(_parent.source2.subscribe(observer2)) + subscription3.setDisposable(_parent.source3.subscribe(observer3)) + subscription4.setDisposable(_parent.source4.subscribe(observer4)) + subscription5.setDisposable(_parent.source5.subscribe(observer5)) + subscription6.setDisposable(_parent.source6.subscribe(observer6)) return Disposables.create([ subscription1, @@ -547,10 +542,10 @@ class Zip6 : Producer { _resultSelector = resultSelector } - override func run(_ observer: O) -> Disposable where O.E == R { - let sink = ZipSink6_(parent: self, observer: observer) - sink.disposable = sink.run() - return sink + override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == R { + let sink = ZipSink6_(parent: self, observer: observer, cancel: cancel) + let subscription = sink.run() + return (sink: sink, subscription: subscription) } } @@ -567,7 +562,6 @@ extension Observable { - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources. - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public static func zip (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, _ source7: O7, resultSelector: @escaping (O1.E, O2.E, O3.E, O4.E, O5.E, O6.E, O7.E) throws -> E) -> Observable { @@ -592,9 +586,9 @@ class ZipSink7_ : ZipSink { var _values6: Queue = Queue(capacity: 2) var _values7: Queue = Queue(capacity: 2) - init(parent: Parent, observer: O) { + init(parent: Parent, observer: O, cancel: Cancelable) { _parent = parent - super.init(arity: 7, observer: observer) + super.init(arity: 7, observer: observer, cancel: cancel) } override func hasElements(_ index: Int) -> Bool { @@ -631,13 +625,13 @@ class ZipSink7_ : ZipSink { let observer6 = ZipObserver(lock: _lock, parent: self, index: 5, setNextValue: { self._values6.enqueue($0) }, this: subscription6) let observer7 = ZipObserver(lock: _lock, parent: self, index: 6, setNextValue: { self._values7.enqueue($0) }, this: subscription7) - subscription1.disposable = _parent.source1.subscribe(observer1) - subscription2.disposable = _parent.source2.subscribe(observer2) - subscription3.disposable = _parent.source3.subscribe(observer3) - subscription4.disposable = _parent.source4.subscribe(observer4) - subscription5.disposable = _parent.source5.subscribe(observer5) - subscription6.disposable = _parent.source6.subscribe(observer6) - subscription7.disposable = _parent.source7.subscribe(observer7) + subscription1.setDisposable(_parent.source1.subscribe(observer1)) + subscription2.setDisposable(_parent.source2.subscribe(observer2)) + subscription3.setDisposable(_parent.source3.subscribe(observer3)) + subscription4.setDisposable(_parent.source4.subscribe(observer4)) + subscription5.setDisposable(_parent.source5.subscribe(observer5)) + subscription6.setDisposable(_parent.source6.subscribe(observer6)) + subscription7.setDisposable(_parent.source7.subscribe(observer7)) return Disposables.create([ subscription1, @@ -680,10 +674,10 @@ class Zip7 : Producer { _resultSelector = resultSelector } - override func run(_ observer: O) -> Disposable where O.E == R { - let sink = ZipSink7_(parent: self, observer: observer) - sink.disposable = sink.run() - return sink + override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == R { + let sink = ZipSink7_(parent: self, observer: observer, cancel: cancel) + let subscription = sink.run() + return (sink: sink, subscription: subscription) } } @@ -700,7 +694,6 @@ extension Observable { - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources. - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public static func zip (_ source1: O1, _ source2: O2, _ source3: O3, _ source4: O4, _ source5: O5, _ source6: O6, _ source7: O7, _ source8: O8, resultSelector: @escaping (O1.E, O2.E, O3.E, O4.E, O5.E, O6.E, O7.E, O8.E) throws -> E) -> Observable { @@ -726,9 +719,9 @@ class ZipSink8_ : ZipSink { var _values7: Queue = Queue(capacity: 2) var _values8: Queue = Queue(capacity: 2) - init(parent: Parent, observer: O) { + init(parent: Parent, observer: O, cancel: Cancelable) { _parent = parent - super.init(arity: 8, observer: observer) + super.init(arity: 8, observer: observer, cancel: cancel) } override func hasElements(_ index: Int) -> Bool { @@ -768,14 +761,14 @@ class ZipSink8_ : ZipSink { let observer7 = ZipObserver(lock: _lock, parent: self, index: 6, setNextValue: { self._values7.enqueue($0) }, this: subscription7) let observer8 = ZipObserver(lock: _lock, parent: self, index: 7, setNextValue: { self._values8.enqueue($0) }, this: subscription8) - subscription1.disposable = _parent.source1.subscribe(observer1) - subscription2.disposable = _parent.source2.subscribe(observer2) - subscription3.disposable = _parent.source3.subscribe(observer3) - subscription4.disposable = _parent.source4.subscribe(observer4) - subscription5.disposable = _parent.source5.subscribe(observer5) - subscription6.disposable = _parent.source6.subscribe(observer6) - subscription7.disposable = _parent.source7.subscribe(observer7) - subscription8.disposable = _parent.source8.subscribe(observer8) + subscription1.setDisposable(_parent.source1.subscribe(observer1)) + subscription2.setDisposable(_parent.source2.subscribe(observer2)) + subscription3.setDisposable(_parent.source3.subscribe(observer3)) + subscription4.setDisposable(_parent.source4.subscribe(observer4)) + subscription5.setDisposable(_parent.source5.subscribe(observer5)) + subscription6.setDisposable(_parent.source6.subscribe(observer6)) + subscription7.setDisposable(_parent.source7.subscribe(observer7)) + subscription8.setDisposable(_parent.source8.subscribe(observer8)) return Disposables.create([ subscription1, @@ -821,10 +814,10 @@ class Zip8 : Producer { _resultSelector = resultSelector } - override func run(_ observer: O) -> Disposable where O.E == R { - let sink = ZipSink8_(parent: self, observer: observer) - sink.disposable = sink.run() - return sink + override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == R { + let sink = ZipSink8_(parent: self, observer: observer, cancel: cancel) + let subscription = sink.run() + return (sink: sink, subscription: subscription) } } diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Zip.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Zip.swift index 0a87f9ee..0cd273c0 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Zip.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Implementations/Zip.swift @@ -25,11 +25,11 @@ class ZipSink : Sink, ZipSinkProtocol { // state private var _isDone: [Bool] - init(arity: Int, observer: O) { + init(arity: Int, observer: O, cancel: Cancelable) { _isDone = [Bool](repeating: false, count: arity) _arity = arity - super.init(observer: observer) + super.init(observer: observer, cancel: cancel) } func getResult() throws -> Element { diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Observable+Aggregate.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Observable+Aggregate.swift index b56be33f..8e7a29d6 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Observable+Aggregate.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Observable+Aggregate.swift @@ -1,6 +1,6 @@ // // Observable+Aggregate.swift -// Rx +// RxSwift // // Created by Krunoslav Zaher on 3/22/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -24,7 +24,6 @@ extension ObservableType { - parameter mapResult: A function to transform the final accumulator value into the result value. - returns: An observable sequence containing a single element with the final accumulator value. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public func reduce(_ seed: A, accumulator: @escaping (A, E) throws -> A, mapResult: @escaping (A) throws -> R) -> Observable { return Reduce(source: self.asObservable(), seed: seed, accumulator: accumulator, mapResult: mapResult) @@ -41,7 +40,6 @@ extension ObservableType { - parameter accumulator: A accumulator function to be invoked on each element. - returns: An observable sequence containing a single element with the final accumulator value. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public func reduce
(_ seed: A, accumulator: @escaping (A, E) throws -> A) -> Observable { return Reduce(source: self.asObservable(), seed: seed, accumulator: accumulator, mapResult: { $0 }) @@ -56,7 +54,6 @@ extension ObservableType { - returns: An observable sequence containing all the emitted elements as array. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public func toArray() -> Observable<[E]> { return ToArray(source: self.asObservable()) diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Observable+Binding.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Observable+Binding.swift index 95f6e53c..dd4a75ea 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Observable+Binding.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Observable+Binding.swift @@ -1,6 +1,6 @@ // // Observable+Binding.swift -// Rx +// RxSwift // // Created by Krunoslav Zaher on 3/1/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -24,7 +24,6 @@ extension ObservableType { - parameter subject: Subject to push source elements into. - returns: A connectable observable sequence that upon connection causes the source sequence to push results into the specified subject. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public func multicast(_ subject: S) -> ConnectableObservable where S.SubjectObserverType.E == E { return ConnectableObservableAdapter(source: self.asObservable(), subject: subject) @@ -43,7 +42,6 @@ extension ObservableType { - parameter selector: Selector function which can use the multicasted source sequence subject to the policies enforced by the created subject. - returns: An observable sequence that contains the elements of a sequence produced by multicasting the source sequence within a selector function. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public func multicast(_ subjectSelector: @escaping () throws -> S, selector: @escaping (Observable) throws -> Observable) -> Observable where S.SubjectObserverType.E == E { return Multicast( @@ -67,7 +65,6 @@ extension ObservableType { - returns: A connectable observable sequence that shares a single subscription to the underlying sequence. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public func publish() -> ConnectableObservable { return self.multicast(PublishSubject()) } @@ -87,7 +84,6 @@ extension ObservableType { - parameter bufferSize: Maximum element count of the replay buffer. - returns: A connectable observable sequence that shares a single subscription to the underlying sequence. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public func replay(_ bufferSize: Int) -> ConnectableObservable { return self.multicast(ReplaySubject.create(bufferSize: bufferSize)) @@ -102,7 +98,6 @@ extension ObservableType { - returns: A connectable observable sequence that shares a single subscription to the underlying sequence. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public func replayAll() -> ConnectableObservable { return self.multicast(ReplaySubject.createUnbounded()) @@ -120,7 +115,6 @@ extension ConnectableObservableType { - returns: An observable sequence that stays connected to the source as long as there is at least one subscription to the observable sequence. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public func refCount() -> Observable { return RefCount(source: self) } @@ -139,7 +133,6 @@ extension ObservableType { - returns: An observable sequence that contains the elements of a sequence produced by multicasting the source sequence. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public func share() -> Observable { return self.publish().refCount() } @@ -159,7 +152,6 @@ extension ObservableType { - parameter bufferSize: Maximum element count of the replay buffer. - returns: An observable sequence that contains the elements of a sequence produced by multicasting the source sequence. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public func shareReplay(_ bufferSize: Int) -> Observable { if bufferSize == 1 { @@ -182,7 +174,6 @@ extension ObservableType { - returns: An observable sequence that contains the elements of a sequence produced by multicasting the source sequence. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public func shareReplayLatestWhileConnected() -> Observable { return ShareReplay1WhileConnected(source: self.asObservable()) diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Observable+Concurrency.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Observable+Concurrency.swift index 1ece7d82..ce66ae9d 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Observable+Concurrency.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Observable+Concurrency.swift @@ -1,6 +1,6 @@ // // Observable+Concurrency.swift -// Rx +// RxSwift // // Created by Krunoslav Zaher on 3/15/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -23,7 +23,6 @@ extension ObservableType { - parameter scheduler: Scheduler to notify observers on. - returns: The source sequence whose observations happen on the specified scheduler. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public func observeOn(_ scheduler: ImmediateSchedulerType) -> Observable { if let scheduler = scheduler as? SerialDispatchQueueScheduler { @@ -54,7 +53,6 @@ extension ObservableType { - parameter scheduler: Scheduler to perform subscription and unsubscription actions on. - returns: The source sequence whose subscriptions and unsubscriptions happen on the specified scheduler. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public func subscribeOn(_ scheduler: ImmediateSchedulerType) -> Observable { return SubscribeOn(source: self, scheduler: scheduler) diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Observable+Creation.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Observable+Creation.swift index c42b0191..87de7fff 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Observable+Creation.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Observable+Creation.swift @@ -1,6 +1,6 @@ // // Observable+Creation.swift -// Rx +// RxSwift // // Created by Krunoslav Zaher on 3/21/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -19,7 +19,6 @@ extension Observable { - parameter subscribe: Implementation of the resulting observable sequence's `subscribe` method. - returns: The observable sequence with the specified implementation for the `subscribe` method. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public static func create(_ subscribe: @escaping (AnyObserver) -> Disposable) -> Observable { return AnonymousObservable(subscribe) } @@ -33,7 +32,6 @@ extension Observable { - returns: An observable sequence with no elements. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public static func empty() -> Observable { return Empty() } @@ -47,7 +45,6 @@ extension Observable { - returns: An observable sequence whose observers will never get called. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public static func never() -> Observable { return Never() } @@ -60,17 +57,23 @@ extension Observable { - seealso: [just operator on reactivex.io](http://reactivex.io/documentation/operators/just.html) - parameter element: Single element in the resulting observable sequence. - - parameter: Scheduler to send the single element on. - returns: An observable sequence containing the single specified element. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") - public static func just(_ element: E, scheduler: ImmediateSchedulerType? = nil) -> Observable { - if let scheduler = scheduler { - return JustScheduled(element: element, scheduler: scheduler) - } - else { - return Just(element: element) - } + public static func just(_ element: E) -> Observable { + return Just(element: element) + } + + /** + Returns an observable sequence that contains a single element. + + - seealso: [just operator on reactivex.io](http://reactivex.io/documentation/operators/just.html) + + - parameter element: Single element in the resulting observable sequence. + - parameter: Scheduler to send the single element on. + - returns: An observable sequence containing the single specified element. + */ + public static func just(_ element: E, scheduler: ImmediateSchedulerType) -> Observable { + return JustScheduled(element: element, scheduler: scheduler) } // MARK: fail @@ -82,7 +85,6 @@ extension Observable { - returns: The observable sequence that terminates with specified error. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public static func error(_ error: Swift.Error) -> Observable { return Error(error: error) } @@ -98,7 +100,6 @@ extension Observable { - parameter scheduler: Scheduler to send elements on. If `nil`, elements are sent immediatelly on subscription. - returns: The observable sequence whose elements are pulled from the given arguments. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public static func of(_ elements: E ..., scheduler: ImmediateSchedulerType = CurrentThreadScheduler.instance) -> Observable { return ObservableSequence(elements: elements, scheduler: scheduler) } @@ -113,7 +114,6 @@ extension Observable { - parameter observableFactory: Observable factory function to invoke for each observer that subscribes to the resulting sequence. - returns: An observable sequence whose observers trigger an invocation of the given observable factory function. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public static func deferred(_ observableFactory: @escaping () throws -> Observable) -> Observable { return Deferred(observableFactory: observableFactory) @@ -131,7 +131,6 @@ extension Observable { - parameter scheduler: Scheduler on which to run the generator loop. - returns: The generated sequence. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public static func generate(initialState: E, condition: @escaping (E) throws -> Bool, scheduler: ImmediateSchedulerType = CurrentThreadScheduler.instance, iterate: @escaping (E) throws -> E) -> Observable { return Generate(initialState: initialState, condition: condition, iterate: iterate, resultSelector: { $0 }, scheduler: scheduler) } @@ -145,7 +144,6 @@ extension Observable { - parameter scheduler: Scheduler to run the producer loop on. - returns: An observable sequence that repeats the given element infinitely. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public static func repeatElement(_ element: E, scheduler: ImmediateSchedulerType = CurrentThreadScheduler.instance) -> Observable { return RepeatElement(element: element, scheduler: scheduler) } @@ -159,7 +157,6 @@ extension Observable { - parameter observableFactory: Factory function to obtain an observable sequence that depends on the obtained resource. - returns: An observable sequence whose lifetime controls the lifetime of the dependent resource object. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public static func using(_ resourceFactory: @escaping () throws -> R, observableFactory: @escaping (R) throws -> Observable) -> Observable { return Using(resourceFactory: resourceFactory, observableFactory: observableFactory) } @@ -176,42 +173,11 @@ extension Observable where Element : SignedInteger { - parameter scheduler: Scheduler to run the generator loop on. - returns: An observable sequence that contains a range of sequential integral numbers. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public static func range(start: E, count: E, scheduler: ImmediateSchedulerType = CurrentThreadScheduler.instance) -> Observable { return RangeProducer(start: start, count: count, scheduler: scheduler) } } -extension Sequence { - /** - Converts a sequence to an observable sequence. - - - seealso: [from operator on reactivex.io](http://reactivex.io/documentation/operators/from.html) - - - returns: The observable sequence whose elements are pulled from the given enumerable sequence. - */ - // @warn_unused_result(message:"http://git.io/rxs.uo") - @available(*, deprecated, renamed: "Observable.from()") - public func toObservable(_ scheduler: ImmediateSchedulerType = CurrentThreadScheduler.instance) -> Observable { - return ObservableSequence(elements: Array(self), scheduler: scheduler) - } -} - -extension Array { - /** - Converts a sequence to an observable sequence. - - - seealso: [from operator on reactivex.io](http://reactivex.io/documentation/operators/from.html) - - - returns: The observable sequence whose elements are pulled from the given enumerable sequence. - */ - // @warn_unused_result(message:"http://git.io/rxs.uo") - @available(*, deprecated, renamed: "Observable.from()") - public func toObservable(_ scheduler: ImmediateSchedulerType = CurrentThreadScheduler.instance) -> Observable { - return ObservableSequence(elements: self, scheduler: scheduler) - } -} - extension Observable { /** Converts an array to an observable sequence. diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Observable+Debug.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Observable+Debug.swift index c5799e09..e0f1c711 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Observable+Debug.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Observable+Debug.swift @@ -18,11 +18,11 @@ extension ObservableType { - seealso: [do operator on reactivex.io](http://reactivex.io/documentation/operators/do.html) - parameter identifier: Identifier that is printed together with event description to standard output. + - parameter trimOutput: Should output be trimmed to max 40 characters. - returns: An observable sequence whose events are printed to standard output. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") - public func debug(_ identifier: String? = nil, file: String = #file, line: UInt = #line, function: String = #function) + public func debug(_ identifier: String? = nil, trimOutput: Bool = false, file: String = #file, line: UInt = #line, function: String = #function) -> Observable { - return Debug(source: self, identifier: identifier, file: file, line: line, function: function) + return Debug(source: self, identifier: identifier, trimOutput: trimOutput, file: file, line: line, function: function) } } diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Observable+Multiple.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Observable+Multiple.swift index 7f8f0cec..c679683a 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Observable+Multiple.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Observable+Multiple.swift @@ -1,6 +1,6 @@ // // Observable+Multiple.swift -// Rx +// RxSwift // // Created by Krunoslav Zaher on 3/12/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -10,37 +10,35 @@ import Foundation // MARK: combineLatest -extension Collection where Iterator.Element : ObservableType { - +extension Observable { /** - Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element. + Merges the specified observable sequences into one observable sequence by using the selector function whenever any of the observable sequences produces an element. - - seealso: [combinelatest operator on reactivex.io](http://reactivex.io/documentation/operators/combinelatest.html) - - - parameter resultSelector: Function to invoke whenever any of the sources produces an element. - - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function. - */ - // @warn_unused_result(message:"http://git.io/rxs.uo") - public func combineLatest(_ resultSelector: @escaping ([Generator.Element.E]) throws -> R) -> Observable { - return CombineLatestCollectionType(sources: self, resultSelector: resultSelector) + - seealso: [combinelatest operator on reactivex.io](http://reactivex.io/documentation/operators/combinelatest.html) + + - parameter resultSelector: Function to invoke whenever any of the sources produces an element. + - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function. + */ + public static func combineLatest(_ collection: C, _ resultSelector: @escaping ([C.Iterator.Element.E]) throws -> Element) -> Observable + where C.Iterator.Element: ObservableType { + return CombineLatestCollectionType(sources: collection, resultSelector: resultSelector) } } // MARK: zip -extension Collection where Iterator.Element : ObservableType { - +extension Observable { /** - Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index. + Merges the specified observable sequences into one observable sequence by using the selector function whenever all of the observable sequences have produced an element at a corresponding index. - - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html) - - - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources. - - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function. - */ - // @warn_unused_result(message:"http://git.io/rxs.uo") - public func zip(_ resultSelector: @escaping ([Generator.Element.E]) throws -> R) -> Observable { - return ZipCollectionType(sources: self, resultSelector: resultSelector) + - seealso: [zip operator on reactivex.io](http://reactivex.io/documentation/operators/zip.html) + + - parameter resultSelector: Function to invoke for each series of elements at corresponding indexes in the sources. + - returns: An observable sequence containing the result of combining elements of the sources using the specified result selector function. + */ + public static func zip(_ collection: C, _ resultSelector: @escaping ([C.Iterator.Element.E]) throws -> Element) -> Observable + where C.Iterator.Element: ObservableType { + return ZipCollectionType(sources: collection, resultSelector: resultSelector) } } @@ -59,7 +57,6 @@ extension ObservableType where E : ObservableConvertibleType { - returns: The observable sequence that at any point in time produces the elements of the most recent inner observable sequence that has been received. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public func switchLatest() -> Observable { return Switch(source: asObservable()) } @@ -77,54 +74,46 @@ extension ObservableType { - parameter second: Second observable sequence. - returns: An observable sequence that contains the elements of `self`, followed by those of the second sequence. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public func concat(_ second: O) -> Observable where O.E == E { - return [self.asObservable(), second.asObservable()].concat() + return Observable.concat([self.asObservable(), second.asObservable()]) } } -extension Sequence where Iterator.Element : ObservableType { - +extension Observable { /** - Concatenates all observable sequences in the given sequence, as long as the previous observable sequence terminated successfully. - - This operator has tail recursive optimizations that will prevent stack overflow. - - Optimizations will be performed in cases equivalent to following: - - [1, [2, [3, .....].concat()].concat].concat() + Concatenates all observable sequences in the given sequence, as long as the previous observable sequence terminated successfully. - - seealso: [concat operator on reactivex.io](http://reactivex.io/documentation/operators/concat.html) + This operator has tail recursive optimizations that will prevent stack overflow. - - returns: An observable sequence that contains the elements of each given sequence, in sequential order. - */ - // @warn_unused_result(message:"http://git.io/rxs.uo") - public func concat() - -> Observable { - return Concat(sources: self, count: nil) + Optimizations will be performed in cases equivalent to following: + + [1, [2, [3, .....].concat()].concat].concat() + + - seealso: [concat operator on reactivex.io](http://reactivex.io/documentation/operators/concat.html) + + - returns: An observable sequence that contains the elements of each given sequence, in sequential order. + */ + public static func concat(_ sequence: S) -> Observable + where S.Iterator.Element == Observable { + return Concat(sources: sequence, count: nil) } -} -extension Collection where Iterator.Element : ObservableType { - /** - Concatenates all observable sequences in the given sequence, as long as the previous observable sequence terminated successfully. + Concatenates all observable sequences in the given collection, as long as the previous observable sequence terminated successfully. - This operator has tail recursive optimizations that will prevent stack overflow and enable generating - infinite observable sequences while using limited amount of memory during generation. + This operator has tail recursive optimizations that will prevent stack overflow. - Optimizations will be performed in cases equivalent to following: - - [1, [2, [3, .....].concat()].concat].concat() + Optimizations will be performed in cases equivalent to following: - - seealso: [concat operator on reactivex.io](http://reactivex.io/documentation/operators/concat.html) - - - returns: An observable sequence that contains the elements of each given sequence, in sequential order. - */ - // @warn_unused_result(message:"http://git.io/rxs.uo") - public func concat() - -> Observable { - return Concat(sources: self, count: self.count.toIntMax()) + [1, [2, [3, .....].concat()].concat].concat() + + - seealso: [concat operator on reactivex.io](http://reactivex.io/documentation/operators/concat.html) + + - returns: An observable sequence that contains the elements of each given sequence, in sequential order. + */ + public static func concat(_ collection: S) -> Observable + where S.Iterator.Element == Observable { + return Concat(sources: collection, count: collection.count.toIntMax()) } } @@ -137,7 +126,6 @@ extension ObservableType where E : ObservableConvertibleType { - returns: An observable sequence that contains the elements of each observed inner sequence, in sequential order. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public func concat() -> Observable { return merge(maxConcurrent: 1) } @@ -154,7 +142,6 @@ extension ObservableType where E : ObservableConvertibleType { - returns: The observable sequence that merges the elements of the observable sequences. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public func merge() -> Observable { return Merge(source: asObservable()) } @@ -167,7 +154,6 @@ extension ObservableType where E : ObservableConvertibleType { - parameter maxConcurrent: Maximum number of inner observable sequences being subscribed to concurrently. - returns: The observable sequence that merges the elements of the inner sequences. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public func merge(maxConcurrent: Int) -> Observable { return MergeLimited(source: asObservable(), maxConcurrent: maxConcurrent) @@ -186,7 +172,6 @@ extension ObservableType { - parameter handler: Error handler function, producing another observable sequence. - returns: An observable sequence containing the source sequence's elements, followed by the elements produced by the handler's resulting observable sequence in case an error occurred. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public func catchError(_ handler: @escaping (Swift.Error) throws -> Observable) -> Observable { return Catch(source: asObservable(), handler: handler) @@ -200,7 +185,6 @@ extension ObservableType { - parameter element: Last element in an observable sequence in case error occurs. - returns: An observable sequence containing the source sequence's elements, followed by the `element` in case an error occurred. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public func catchErrorJustReturn(_ element: E) -> Observable { return Catch(source: asObservable(), handler: { _ in Observable.just(element) }) @@ -208,18 +192,17 @@ extension ObservableType { } -extension Sequence where Iterator.Element : ObservableType { +extension Observable { /** - Continues an observable sequence that is terminated by an error with the next observable sequence. + Continues an observable sequence that is terminated by an error with the next observable sequence. - - seealso: [catch operator on reactivex.io](http://reactivex.io/documentation/operators/catch.html) - - - returns: An observable sequence containing elements from consecutive source sequences until a source sequence terminates successfully. - */ - // @warn_unused_result(message:"http://git.io/rxs.uo") - public func catchError() - -> Observable { - return CatchSequence(sources: self) + - seealso: [catch operator on reactivex.io](http://reactivex.io/documentation/operators/catch.html) + + - returns: An observable sequence containing elements from consecutive source sequences until a source sequence terminates successfully. + */ + public static func catchError(_ sequence: S) -> Observable + where S.Iterator.Element == Observable { + return CatchSequence(sources: sequence) } } @@ -235,7 +218,6 @@ extension ObservableType { - parameter other: Observable sequence that terminates propagation of elements of the source sequence. - returns: An observable sequence containing the elements of the source sequence up to the point the other sequence interrupted further propagation. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public func takeUntil(_ other: O) -> Observable { return TakeUntil(source: asObservable(), other: other.asObservable()) @@ -254,7 +236,6 @@ extension ObservableType { - parameter other: Observable sequence that starts propagation of elements of the source sequence. - returns: An observable sequence containing the elements of the source sequence that are emitted after the other sequence emits an item. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public func skipUntil(_ other: O) -> Observable { return SkipUntil(source: asObservable(), other: other.asObservable()) @@ -273,7 +254,6 @@ extension ObservableType { - parameter right: Second observable sequence. - returns: An observable sequence that surfaces either of the given sequences, whichever reacted first. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public func amb (_ right: O2) -> Observable where O2.E == E { @@ -281,19 +261,17 @@ extension ObservableType { } } -extension Sequence where Iterator.Element : ObservableType { - +extension Observable { /** - Propagates the observable sequence that reacts first. + Propagates the observable sequence that reacts first. - - seealso: [amb operator on reactivex.io](http://reactivex.io/documentation/operators/amb.html) - - - returns: An observable sequence that surfaces any of the given sequences, whichever reacted first. - */ - // @warn_unused_result(message:"http://git.io/rxs.uo") - public func amb() - -> Observable { - return self.reduce(Observable.never()) { a, o in + - seealso: [amb operator on reactivex.io](http://reactivex.io/documentation/operators/amb.html) + + - returns: An observable sequence that surfaces any of the given sequences, whichever reacted first. + */ + public static func amb(_ sequence: S) -> Observable + where S.Iterator.Element == Observable { + return sequence.reduce(Observable.never()) { a, o in return a.amb(o.asObservable()) } } diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Observable+Single.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Observable+Single.swift index 17aa334e..d0e38bbe 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Observable+Single.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Observable+Single.swift @@ -1,6 +1,6 @@ // // Observable+Single.swift -// Rx +// RxSwift // // Created by Krunoslav Zaher on 2/14/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -19,7 +19,6 @@ extension ObservableType where E: Equatable { - returns: An observable sequence only containing the distinct contiguous elements, based on equality operator, from the source sequence. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public func distinctUntilChanged() -> Observable { return self.distinctUntilChanged({ $0 }, comparer: { ($0 == $1) }) @@ -35,7 +34,6 @@ extension ObservableType { - parameter keySelector: A function to compute the comparison key for each element. - returns: An observable sequence only containing the distinct contiguous elements, based on a computed key value, from the source sequence. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public func distinctUntilChanged(_ keySelector: @escaping (E) throws -> K) -> Observable { return self.distinctUntilChanged(keySelector, comparer: { $0 == $1 }) @@ -49,7 +47,6 @@ extension ObservableType { - parameter comparer: Equality comparer for computed key values. - returns: An observable sequence only containing the distinct contiguous elements, based on `comparer`, from the source sequence. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public func distinctUntilChanged(_ comparer: @escaping (E, E) throws -> Bool) -> Observable { return self.distinctUntilChanged({ $0 }, comparer: comparer) @@ -64,7 +61,6 @@ extension ObservableType { - parameter comparer: Equality comparer for computed key values. - returns: An observable sequence only containing the distinct contiguous elements, based on a computed key value and the comparer, from the source sequence. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public func distinctUntilChanged(_ keySelector: @escaping (E) throws -> K, comparer: @escaping (K, K) throws -> Bool) -> Observable { return DistinctUntilChanged(source: self.asObservable(), selector: keySelector, comparer: comparer) @@ -74,91 +70,6 @@ extension ObservableType { // MARK: doOn extension ObservableType { - - /** - Invokes an action for each event in the observable sequence, and propagates all observer messages through the result sequence. - - - seealso: [do operator on reactivex.io](http://reactivex.io/documentation/operators/do.html) - - - parameter eventHandler: Action to invoke for each event in the observable sequence. - - returns: The source sequence with the side-effecting behavior applied. - */ - // @warn_unused_result(message:"http://git.io/rxs.uo") - @available(*, deprecated, renamed: "do(onNext:onError:onCompleted:)") - public func doOn(_ eventHandler: @escaping (Event) throws -> Void) - -> Observable { - return Do(source: self.asObservable(), eventHandler: eventHandler, onSubscribe: nil, onDispose: nil) - } - - /** - Invokes an action for each event in the observable sequence, and propagates all observer messages through the result sequence. - - - seealso: [do operator on reactivex.io](http://reactivex.io/documentation/operators/do.html) - - - parameter onNext: Action to invoke for each element in the observable sequence. - - parameter onError: Action to invoke upon errored termination of the observable sequence. - - parameter onCompleted: Action to invoke upon graceful termination of the observable sequence. - - parameter onSubscribe: Action to invoke before subscribing to source observable sequence. - - parameter onDispose: Action to invoke after subscription to source observable has been disposed for any reason. It can be either because sequence terminates for some reason or observer subscription being disposed. - - returns: The source sequence with the side-effecting behavior applied. - */ - // @warn_unused_result(message:"http://git.io/rxs.uo") - @available(*, deprecated, renamed: "do(onNext:onError:onCompleted:)") - public func doOn(onNext: ((E) throws -> Void)? = nil, onError: ((Swift.Error) throws -> Void)? = nil, onCompleted: (() throws -> Void)? = nil) - -> Observable { - return Do(source: self.asObservable(), eventHandler: { e in - switch e { - case .next(let element): - try onNext?(element) - case .error(let e): - try onError?(e) - case .completed: - try onCompleted?() - } - }, - onSubscribe: nil, - onDispose: nil) - } - - /** - Invokes an action for each Next event in the observable sequence, and propagates all observer messages through the result sequence. - - - parameter onNext: Action to invoke for each element in the observable sequence. - - returns: The source sequence with the side-effecting behavior applied. - */ - // @warn_unused_result(message:"http://git.io/rxs.uo") - @available(*, deprecated, renamed: "do(onNext:)") - public func doOnNext(onNext: @escaping (E) throws -> Void) - -> Observable { - return self.do(onNext: onNext) - } - - /** - Invokes an action for the Error event in the observable sequence, and propagates all observer messages through the result sequence. - - - parameter onError: Action to invoke upon errored termination of the observable sequence. - - returns: The source sequence with the side-effecting behavior applied. - */ - // @warn_unused_result(message:"http://git.io/rxs.uo") - @available(*, deprecated, renamed: "do(onError:)") - public func doOnError(onError: @escaping (Swift.Error) throws -> Void) - -> Observable { - return self.do(onError: onError) - } - - /** - Invokes an action for the Completed event in the observable sequence, and propagates all observer messages through the result sequence. - - - parameter onCompleted: Action to invoke upon graceful termination of the observable sequence. - - returns: The source sequence with the side-effecting behavior applied. - */ - // @warn_unused_result(message:"http://git.io/rxs.uo") - @available(*, deprecated, renamed: "do(onCompleted:)") - public func doOnCompleted(onCompleted: @escaping () throws -> Void) - -> Observable { - return self.do(onCompleted: onCompleted) - } - /** Invokes an action for each event in the observable sequence, and propagates all observer messages through the result sequence. @@ -171,7 +82,6 @@ extension ObservableType { - parameter onDispose: Action to invoke after subscription to source observable has been disposed for any reason. It can be either because sequence terminates for some reason or observer subscription being disposed. - returns: The source sequence with the side-effecting behavior applied. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public func `do`(onNext: ((E) throws -> Void)? = nil, onError: ((Swift.Error) throws -> Void)? = nil, onCompleted: (() throws -> Void)? = nil, onSubscribe: (() -> ())? = nil, onDispose: (() -> ())? = nil) -> Observable { return Do(source: self.asObservable(), eventHandler: { e in @@ -199,7 +109,6 @@ extension ObservableType { - parameter elements: Elements to prepend to the specified sequence. - returns: The source sequence prepended with the specified values. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public func startWith(_ elements: E ...) -> Observable { return StartWith(source: self.asObservable(), elements: elements) @@ -219,7 +128,6 @@ extension ObservableType { - returns: Observable sequence to repeat until it successfully terminates. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public func retry() -> Observable { return CatchSequence(sources: InfiniteSequence(repeatedValue: self.asObservable())) } @@ -234,7 +142,6 @@ extension ObservableType { - parameter maxAttemptCount: Maximum number of times to repeat the sequence. - returns: An observable sequence producing the elements of the given sequence repeatedly until it terminates successfully. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public func retry(_ maxAttemptCount: Int) -> Observable { return CatchSequence(sources: repeatElement(self.asObservable(), count: maxAttemptCount)) @@ -249,7 +156,6 @@ extension ObservableType { - parameter notificationHandler: A handler that is passed an observable sequence of errors raised by the source observable and returns and observable that either continues, completes or errors. This behavior is then applied to the source observable. - returns: An observable sequence producing the elements of the given sequence repeatedly until it terminates successfully or is notified to error or complete. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public func retryWhen(_ notificationHandler: @escaping (Observable) -> TriggerObservable) -> Observable { return RetryWhenSequence(sources: InfiniteSequence(repeatedValue: self.asObservable()), notificationHandler: notificationHandler) @@ -264,7 +170,6 @@ extension ObservableType { - parameter notificationHandler: A handler that is passed an observable sequence of errors raised by the source observable and returns and observable that either continues, completes or errors. This behavior is then applied to the source observable. - returns: An observable sequence producing the elements of the given sequence repeatedly until it terminates successfully or is notified to error or complete. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public func retryWhen(_ notificationHandler: @escaping (Observable) -> TriggerObservable) -> Observable { return RetryWhenSequence(sources: InfiniteSequence(repeatedValue: self.asObservable()), notificationHandler: notificationHandler) @@ -286,7 +191,6 @@ extension ObservableType { - parameter accumulator: An accumulator function to be invoked on each element. - returns: An observable sequence containing the accumulated values. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public func scan(_ seed: A, accumulator: @escaping (A, E) throws -> A) -> Observable { return Scan(source: self.asObservable(), seed: seed, accumulator: accumulator) diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Observable+StandardSequenceOperators.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Observable+StandardSequenceOperators.swift index 6c5db5f1..4dd53f8e 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Observable+StandardSequenceOperators.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Observable+StandardSequenceOperators.swift @@ -1,6 +1,6 @@ // // Observable+StandardSequenceOperators.swift -// Rx +// RxSwift // // Created by Krunoslav Zaher on 2/17/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -20,7 +20,6 @@ extension ObservableType { - parameter predicate: A function to test each source element for a condition. - returns: An observable sequence that contains elements from the input sequence that satisfy the condition. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public func filter(_ predicate: @escaping (E) throws -> Bool) -> Observable { return Filter(source: asObservable(), predicate: predicate) @@ -39,7 +38,6 @@ extension ObservableType { - parameter predicate: A function to test each element for a condition. - returns: An observable sequence that contains the elements from the input sequence that occur before the element at which the test no longer passes. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public func takeWhile(_ predicate: @escaping (E) throws -> Bool) -> Observable { return TakeWhile(source: asObservable(), predicate: predicate) @@ -55,7 +53,6 @@ extension ObservableType { - parameter predicate: A function to test each element for a condition; the second parameter of the function represents the index of the source element. - returns: An observable sequence that contains the elements from the input sequence that occur before the element at which the test no longer passes. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public func takeWhileWithIndex(_ predicate: @escaping (E, Int) throws -> Bool) -> Observable { return TakeWhile(source: asObservable(), predicate: predicate) @@ -74,7 +71,6 @@ extension ObservableType { - parameter count: The number of elements to return. - returns: An observable sequence that contains the specified number of elements from the start of the input sequence. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public func take(_ count: Int) -> Observable { if count == 0 { @@ -100,7 +96,6 @@ extension ObservableType { - parameter count: Number of elements to take from the end of the source sequence. - returns: An observable sequence containing the specified number of elements from the end of the source sequence. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public func takeLast(_ count: Int) -> Observable { return TakeLast(source: asObservable(), count: count) @@ -120,7 +115,6 @@ extension ObservableType { - parameter count: The number of elements to skip before returning the remaining elements. - returns: An observable sequence that contains the elements that occur after the specified index in the input sequence. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public func skip(_ count: Int) -> Observable { return SkipCount(source: asObservable(), count: count) @@ -139,7 +133,6 @@ extension ObservableType { - parameter predicate: A function to test each element for a condition. - returns: An observable sequence that contains the elements from the input sequence starting at the first element in the linear series that does not pass the test specified by predicate. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public func skipWhile(_ predicate: @escaping (E) throws -> Bool) -> Observable { return SkipWhile(source: asObservable(), predicate: predicate) } @@ -153,7 +146,6 @@ extension ObservableType { - parameter predicate: A function to test each element for a condition; the second parameter of the function represents the index of the source element. - returns: An observable sequence that contains the elements from the input sequence starting at the first element in the linear series that does not pass the test specified by predicate. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public func skipWhileWithIndex(_ predicate: @escaping (E, Int) throws -> Bool) -> Observable { return SkipWhile(source: asObservable(), predicate: predicate) } @@ -168,14 +160,13 @@ extension ObservableType { - seealso: [map operator on reactivex.io](http://reactivex.io/documentation/operators/map.html) - - parameter selector: A transform function to apply to each source element. + - parameter transform: A transform function to apply to each source element. - returns: An observable sequence whose elements are the result of invoking the transform function on each element of source. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") - public func map(_ selector: @escaping (E) throws -> R) + public func map(_ transform: @escaping (E) throws -> R) -> Observable { - return self.asObservable().composeMap(selector) + return self.asObservable().composeMap(transform) } /** @@ -186,7 +177,6 @@ extension ObservableType { - parameter selector: A transform function to apply to each source element; the second parameter of the function represents the index of the source element. - returns: An observable sequence whose elements are the result of invoking the transform function on each element of source. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public func mapWithIndex(_ selector: @escaping (E, Int) throws -> R) -> Observable { return MapWithIndex(source: asObservable(), selector: selector) @@ -205,7 +195,6 @@ extension ObservableType { - parameter selector: A transform function to apply to each element. - returns: An observable sequence whose elements are the result of invoking the one-to-many transform function on each element of the input sequence. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public func flatMap(_ selector: @escaping (E) throws -> O) -> Observable { return FlatMap(source: asObservable(), selector: selector) @@ -219,7 +208,6 @@ extension ObservableType { - parameter selector: A transform function to apply to each element; the second parameter of the function represents the index of the source element. - returns: An observable sequence whose elements are the result of invoking the one-to-many transform function on each element of the input sequence. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public func flatMapWithIndex(_ selector: @escaping (E, Int) throws -> O) -> Observable { return FlatMapWithIndex(source: asObservable(), selector: selector) @@ -239,7 +227,6 @@ extension ObservableType { - parameter selector: A transform function to apply to element that was observed while no observable is executing in parallel. - returns: An observable sequence whose elements are the result of invoking the one-to-many transform function on each element of the input sequence that was received while no other sequence was being calculated. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public func flatMapFirst(_ selector: @escaping (E) throws -> O) -> Observable { return FlatMapFirst(source: asObservable(), selector: selector) @@ -261,7 +248,6 @@ extension ObservableType { - returns: An observable sequence whose elements are the result of invoking the transform function on each element of source producing an Observable of Observable sequences and that at any point in time produces the elements of the most recent inner observable sequence that has been received. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public func flatMapLatest(_ selector: @escaping (E) throws -> O) -> Observable { return FlatMapLatest(source: asObservable(), selector: selector) @@ -280,7 +266,6 @@ extension ObservableType { - parameter index: The index of the required item (starting from 0). - returns: An observable sequence that emits the desired item as its own sole emission. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public func elementAt(_ index: Int) -> Observable { return ElementAt(source: asObservable(), index: index, throwOnEmpty: true) @@ -299,7 +284,6 @@ extension ObservableType { - returns: An observable sequence that emits a single item or throws an exception if more (or none) of them are emitted. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public func single() -> Observable { return SingleAsync(source: asObservable()) @@ -314,7 +298,6 @@ extension ObservableType { - parameter predicate: A function to test each source element for a condition. - returns: An observable sequence that emits a single item or throws an exception if more (or none) of them are emitted. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public func single(_ predicate: @escaping (E) throws -> Bool) -> Observable { return SingleAsync(source: asObservable(), predicate: predicate) diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Observable+Time.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Observable+Time.swift index a3790ac8..7eb9232b 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Observable+Time.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observables/Observable+Time.swift @@ -1,6 +1,6 @@ // // Observable+Time.swift -// Rx +// RxSwift // // Created by Krunoslav Zaher on 3/22/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -23,7 +23,6 @@ extension ObservableType { - parameter scheduler: Scheduler to run the throttle timers and send events on. - returns: The throttled sequence. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public func throttle(_ dueTime: RxTimeInterval, latest: Bool = true, scheduler: SchedulerType) -> Observable { return Throttle(source: self.asObservable(), dueTime: dueTime, latest: latest, scheduler: scheduler) @@ -38,7 +37,6 @@ extension ObservableType { - parameter scheduler: Scheduler to run the throttle timers and send events on. - returns: The throttled sequence. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public func debounce(_ dueTime: RxTimeInterval, scheduler: SchedulerType) -> Observable { return Debounce(source: self.asObservable(), dueTime: dueTime, scheduler: scheduler) @@ -50,7 +48,7 @@ extension ObservableType { extension ObservableType { /** - Samples the source observable sequence using a samper observable sequence producing sampling ticks. + Samples the source observable sequence using a sampler observable sequence producing sampling ticks. Upon each sampling tick, the latest element (if any) in the source sequence during the last sampling interval is sent to the resulting sequence. @@ -61,7 +59,6 @@ extension ObservableType { - parameter sampler: Sampling tick sequence. - returns: Sampled observable sequence. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public func sample(_ sampler: O) -> Observable { return Sample(source: self.asObservable(), sampler: sampler.asObservable(), onlyNew: true) @@ -78,7 +75,6 @@ extension Observable where Element : SignedInteger { - parameter scheduler: Scheduler to run the timer on. - returns: An observable sequence that produces a value after each period. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public static func interval(_ period: RxTimeInterval, scheduler: SchedulerType) -> Observable { return Timer(dueTime: period, @@ -101,7 +97,6 @@ extension Observable where Element: SignedInteger { - parameter scheduler: Scheduler to run timers on. - returns: An observable sequence that produces a value after due time has elapsed and then each period. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public static func timer(_ dueTime: RxTimeInterval, period: RxTimeInterval? = nil, scheduler: SchedulerType) -> Observable { return Timer( @@ -125,7 +120,6 @@ extension ObservableType { - parameter scheduler: Scheduler to run the timer on. - returns: An observable sequence with the elements taken during the specified duration from the start of the source sequence. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public func take(_ duration: RxTimeInterval, scheduler: SchedulerType) -> Observable { return TakeTime(source: self.asObservable(), duration: duration, scheduler: scheduler) @@ -145,7 +139,6 @@ extension ObservableType { - parameter scheduler: Scheduler to run the timer on. - returns: An observable sequence with the elements skipped during the specified duration from the start of the source sequence. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public func skip(_ duration: RxTimeInterval, scheduler: SchedulerType) -> Observable { return SkipTime(source: self.asObservable(), duration: duration, scheduler: scheduler) @@ -163,7 +156,6 @@ extension ObservableType { - returns: An observable sequence that skips all elements of the source sequence. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public func ignoreElements() -> Observable { return filter { _ -> Bool in @@ -185,7 +177,6 @@ extension ObservableType { - parameter scheduler: Scheduler to run the subscription delay timer on. - returns: Time-shifted sequence. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public func delaySubscription(_ dueTime: RxTimeInterval, scheduler: SchedulerType) -> Observable { return DelaySubscription(source: self.asObservable(), dueTime: dueTime, scheduler: scheduler) @@ -208,7 +199,6 @@ extension ObservableType { - parameter scheduler: Scheduler to run buffering timers on. - returns: An observable sequence of buffers. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public func buffer(timeSpan: RxTimeInterval, count: Int, scheduler: SchedulerType) -> Observable<[E]> { return BufferTimeCount(source: self.asObservable(), timeSpan: timeSpan, count: count, scheduler: scheduler) @@ -229,7 +219,6 @@ extension ObservableType { - parameter scheduler: Scheduler to run windowing timers on. - returns: An observable sequence of windows (instances of `Observable`). */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public func window(timeSpan: RxTimeInterval, count: Int, scheduler: SchedulerType) -> Observable> { return WindowTimeCount(source: self.asObservable(), timeSpan: timeSpan, count: count, scheduler: scheduler) @@ -249,7 +238,6 @@ extension ObservableType { - parameter scheduler: Scheduler to run the timeout timer on. - returns: An observable sequence with a TimeoutError in case of a timeout. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public func timeout(_ dueTime: RxTimeInterval, scheduler: SchedulerType) -> Observable { return Timeout(source: self.asObservable(), dueTime: dueTime, other: Observable.error(RxError.timeout), scheduler: scheduler) @@ -265,7 +253,6 @@ extension ObservableType { - parameter scheduler: Scheduler to run the timeout timer on. - returns: The source sequence switching to the other sequence in case of a timeout. */ - // @warn_unused_result(message:"http://git.io/rxs.uo") public func timeout(_ dueTime: RxTimeInterval, other: O, scheduler: SchedulerType) -> Observable where E == O.E { return Timeout(source: self.asObservable(), dueTime: dueTime, other: other.asObservable(), scheduler: scheduler) @@ -285,7 +272,6 @@ extension ObservableType { - parameter scheduler: Scheduler to run the subscription delay timer on. - returns: the source Observable shifted in time by the specified delay. */ - // @warn_unused_result(message="http://git.io/rxs.uo") public func delay(_ dueTime: RxTimeInterval, scheduler: SchedulerType) -> Observable { return Delay(source: self.asObservable(), dueTime: dueTime, scheduler: scheduler) diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/ObserverType.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/ObserverType.swift index b604e636..3447e5ec 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/ObserverType.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/ObserverType.swift @@ -1,6 +1,6 @@ // // ObserverType.swift -// Rx +// RxSwift // // Created by Krunoslav Zaher on 2/8/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -8,49 +8,35 @@ import Foundation -/** -Supports push-style iteration over an observable sequence. -*/ +/// Supports push-style iteration over an observable sequence. public protocol ObserverType { - /** - The type of elements in sequence that observer can observe. - */ + /// The type of elements in sequence that observer can observe. associatedtype E - /** - Notify observer about sequence event. - - - parameter event: Event that occured. - */ + /// Notify observer about sequence event. + /// + /// - parameter event: Event that occured. func on(_ event: Event) } -/** -Convenience API extensions to provide alternate next, error, completed events -*/ -public extension ObserverType { - - /** - Convenience method equivalent to `on(.next(element: E))` +/// Convenience API extensions to provide alternate next, error, completed events +extension ObserverType { - - parameter element: Next element to send to observer(s) - */ - final func onNext(_ element: E) { + /// Convenience method equivalent to `on(.next(element: E))` + /// + /// - parameter element: Next element to send to observer(s) + public final func onNext(_ element: E) { on(.next(element)) } - /** - Convenience method equivalent to `on(.completed)` - */ - final func onCompleted() { + /// Convenience method equivalent to `on(.completed)` + public final func onCompleted() { on(.completed) } - /** - Convenience method equivalent to `on(.error(Swift.Error))` - - parameter error: Swift.Error to send to observer(s) - */ - final func onError(_ error: Swift.Error) { + /// Convenience method equivalent to `on(.error(Swift.Error))` + /// - parameter error: Swift.Error to send to observer(s) + public final func onError(_ error: Swift.Error) { on(.error(error)) } } diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observers/AnonymousObserver.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observers/AnonymousObserver.swift index 72376e4a..4abc8160 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observers/AnonymousObserver.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observers/AnonymousObserver.swift @@ -1,6 +1,6 @@ // // AnonymousObserver.swift -// Rx +// RxSwift // // Created by Krunoslav Zaher on 2/8/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -17,7 +17,7 @@ class AnonymousObserver : ObserverBase { init(_ eventHandler: @escaping EventHandler) { #if TRACE_RESOURCES - let _ = AtomicIncrement(&resourceCount) + let _ = Resources.incrementTotal() #endif _eventHandler = eventHandler } @@ -28,7 +28,7 @@ class AnonymousObserver : ObserverBase { #if TRACE_RESOURCES deinit { - let _ = AtomicDecrement(&resourceCount) + let _ = Resources.decrementTotal() } #endif } diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observers/ObserverBase.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observers/ObserverBase.swift index 4ff3fe0c..7a6ebe60 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observers/ObserverBase.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observers/ObserverBase.swift @@ -1,6 +1,6 @@ // // ObserverBase.swift -// Rx +// RxSwift // // Created by Krunoslav Zaher on 2/15/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -34,6 +34,6 @@ class ObserverBase : Disposable, ObserverType { } func dispose() { - _isStopped = 1 + _ = AtomicCompareAndSwap(0, 1, &_isStopped) } } diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observers/TailRecursiveSink.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observers/TailRecursiveSink.swift index 1d1c8bc2..2f9464d4 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observers/TailRecursiveSink.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Observers/TailRecursiveSink.swift @@ -1,6 +1,6 @@ // // TailRecursiveSink.swift -// Rx +// RxSwift // // Created by Krunoslav Zaher on 3/21/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -32,8 +32,8 @@ class TailRecursiveSink // this is thread safe object var _gate = AsyncLock>>() - override init(observer: O) { - super.init(observer: observer) + override init(observer: O, cancel: Cancelable) { + super.init(observer: observer, cancel: cancel) } func run(_ sources: SequenceGenerator) -> Disposable { @@ -129,7 +129,7 @@ class TailRecursiveSink let disposable = SingleAssignmentDisposable() _subscription.disposable = disposable - disposable.disposable = subscribeToNext(next!) + disposable.setDisposable(subscribeToNext(next!)) } func subscribeToNext(_ source: Observable) -> Disposable { diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Platform/Platform.Linux.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Platform/Platform.Linux.swift deleted file mode 100644 index ff7c0434..00000000 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Platform/Platform.Linux.swift +++ /dev/null @@ -1,222 +0,0 @@ -// -// Platform.Linux.swift -// Rx -// -// Created by Krunoslav Zaher on 12/29/15. -// Copyright © 2015 Krunoslav Zaher. All rights reserved. -// - -#if os(Linux) - //////////////////////////////////////////////////////////////////////////////// - // This is not the greatest API in the world, this is just a tribute. - // !!! Proof of concept until libdispatch becomes operational. !!! - //////////////////////////////////////////////////////////////////////////////// - - import Foundation - import XCTest - import Glibc - import SwiftShims - - // MARK: CoreFoundation run loop mock - - public typealias CFRunLoopRef = Int - public let kCFRunLoopDefaultMode = "CFRunLoopDefaultMode" - - typealias Action = () -> () - - var queue = Queue(capacity: 100) - - var runLoopCounter = 0 - - extension NSThread { - public var isMainThread: Bool { - return true - } - } - - public func CFRunLoopWakeUp(_ runLoop: CFRunLoopRef) { - } - - public func CFRunLoopStop(_ runLoop: CFRunLoopRef) { - runLoopCounter -= 1 - } - - public func CFRunLoopPerformBlock(_ runLoop: CFRunLoopRef, _ mode: String, _ action: () -> ()) { - queue.enqueue(element: action) - } - - public func CFRunLoopRun() { - runLoopCounter += 1 - let currentValueOfCounter = runLoopCounter - while let front = queue.dequeue() { - front() - if runLoopCounter < currentValueOfCounter - 1 { - fatalError("called stop twice") - } - - if runLoopCounter == currentValueOfCounter - 1 { - break - } - } - } - - public func CFRunLoopGetCurrent() -> CFRunLoopRef { - return 0 - } - - // MARK: Atomic, just something that works for single thread case - - #if TRACE_RESOURCES - public typealias AtomicInt = Int64 - #else - typealias AtomicInt = Int64 - #endif - - func AtomicIncrement(_ increment: UnsafeMutablePointer) -> AtomicInt { - increment.memory = increment.memory + 1 - return increment.memory - } - - func AtomicDecrement(_ increment: UnsafeMutablePointer) -> AtomicInt { - increment.memory = increment.memory - 1 - return increment.memory - } - - func AtomicCompareAndSwap(_ l: AtomicInt, _ r: AtomicInt, _ target: UnsafeMutablePointer) -> Bool { - //return __sync_val_compare_and_swap(target, l, r) - if target.memory == l { - target.memory = r - return true - } - - return false - } - - extension NSThread { - static func setThreadLocalStorageValue(value: T?, forKey key: String) { - let currentThread = NSThread.currentThread() - var threadDictionary = currentThread.threadDictionary - - if let newValue = value { - threadDictionary[key] = newValue - } - else { - threadDictionary[key] = nil - } - - currentThread.threadDictionary = threadDictionary - } - - static func getThreadLocalStorageValueForKey(key: String) -> T? { - let currentThread = NSThread.currentThread() - let threadDictionary = currentThread.threadDictionary - - return threadDictionary[key] as? T - } - } - - // - - // MARK: objc mock - - public func objc_sync_enter(_ lock: AnyObject) { - } - - public func objc_sync_exit(_ lock: AnyObject) { - - } - - - // MARK: libdispatch - - public typealias dispatch_time_t = Int - public typealias dispatch_source_t = Int - public typealias dispatch_source_type_t = Int - public typealias dispatch_queue_t = Int - public typealias dispatch_object_t = Int - public typealias dispatch_block_t = () -> () - public typealias dispatch_queue_attr_t = Int - public typealias qos_class_t = Int - - public let DISPATCH_QUEUE_SERIAL = 0 - - public let DISPATCH_QUEUE_PRIORITY_HIGH = 1 - public let DISPATCH_QUEUE_PRIORITY_DEFAULT = 2 - public let DISPATCH_QUEUE_PRIORITY_LOW = 3 - - public let QOS_CLASS_USER_INTERACTIVE = 0 - public let QOS_CLASS_USER_INITIATED = 1 - public let QOS_CLASS_DEFAULT = 2 - public let QOS_CLASS_UTILITY = 3 - public let QOS_CLASS_BACKGROUND = 4 - - public let DISPATCH_SOURCE_TYPE_TIMER = 0 - public let DISPATCH_TIME_FOREVER = 1 as UInt64 - public let NSEC_PER_SEC = 1 - - public let DISPATCH_TIME_NOW = -1 - - public func dispatch_time(_ when: dispatch_time_t, _ delta: Int64) -> dispatch_time_t { - return when + Int(delta) - } - - public func dispatch_queue_create(_ label: UnsafePointer, _ attr: dispatch_queue_attr_t!) -> dispatch_queue_t! { - return 0 - } - - public func dispatch_set_target_queue(_ object: dispatch_object_t!, _ queue: dispatch_queue_t!) { - } - - public func dispatch_async(_ queue2: dispatch_queue_t, _ block: dispatch_block_t) { - queue.enqueue(block) - } - - public func dispatch_source_create(_ type: dispatch_source_type_t, _ handle: UInt, _ mask: UInt, _ queue: dispatch_queue_t!) -> dispatch_source_t! { - return 0 - } - - public func dispatch_source_set_timer(_ source: dispatch_source_t, _ start: dispatch_time_t, _ interval: UInt64, _ leeway: UInt64) { - - } - - public func dispatch_source_set_event_handler(_ source: dispatch_source_t, _ handler: dispatch_block_t!) { - queue.enqueue(handler) - } - - public func dispatch_resume(_ object: dispatch_object_t) { - } - - public func dispatch_source_cancel(_ source: dispatch_source_t) { - } - - public func dispatch_get_global_queue(_ identifier: Int, _ flags: UInt) -> dispatch_queue_t! { - return 0 - } - - public func dispatch_get_main_queue() -> dispatch_queue_t! { - return 0 - } - - // MARK: XCTest - - public class Expectation { - public func fulfill() { - } - } - - extension XCTestCase { - public func setUp() { - } - - public func tearDown() { - } - - public func expectationWithDescription(description: String) -> Expectation { - return Expectation() - } - - public func waitForExpectationsWithTimeout(time: NSTimeInterval, action: Swift.Error? -> Void) { - } - } - -#endif diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Reactive.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Reactive.swift new file mode 100644 index 00000000..57ecab73 --- /dev/null +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Reactive.swift @@ -0,0 +1,74 @@ +// +// Reactive.swift +// RxSwift +// +// Created by Yury Korolev on 5/2/16. +// Copyright © 2016 Krunoslav Zaher. All rights reserved. +// + +/** + Use `Reactive` proxy as customization point for constrained protocol extensions. + + General pattern would be: + + // 1. Extend Reactive protocol with constrain on Base + // Read as: Reactive Extension where Base is a SomeType + extension Reactive where Base: SomeType { + // 2. Put any specific reactive extension for SomeType here + } + + With this approach we can have more specialized methods and properties using + `Base` and not just specialized on common base type. + + */ + +public struct Reactive { + /// Base object to extend. + public let base: Base + + /// Creates extensions with base object. + /// + /// - parameter base: Base object. + public init(_ base: Base) { + self.base = base + } +} + +/// A type that has reactive extensions. +public protocol ReactiveCompatible { + /// Extended type + associatedtype CompatibleType + + /// Reactive extensions. + static var rx: Reactive.Type { get set } + + /// Reactive extensions. + var rx: Reactive { get set } +} + +extension ReactiveCompatible { + /// Reactive extensions. + public static var rx: Reactive.Type { + get { + return Reactive.self + } + set { + // this enables using Reactive to "mutate" base type + } + } + + /// Reactive extensions. + public var rx: Reactive { + get { + return Reactive(self) + } + set { + // this enables using Reactive to "mutate" base object + } + } +} + +import Foundation + +/// Extend NSObject with `rx` proxy. +extension NSObject: ReactiveCompatible { } diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Rx.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Rx.swift index 1b11ffd7..18a99b1a 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Rx.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Rx.swift @@ -1,6 +1,6 @@ // // Rx.swift -// Rx +// RxSwift // // Created by Krunoslav Zaher on 2/14/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -9,8 +9,29 @@ import Foundation #if TRACE_RESOURCES -/// Counts internal Rx resource allocations (Observables, Observers, Disposables, etc.). This provides a simple way to detect leaks during development. -public var resourceCount: AtomicInt = 0 + fileprivate var resourceCount: AtomicInt = 0 + + /// Resource utilization information + public struct Resources { + /// Counts internal Rx resource allocations (Observables, Observers, Disposables, etc.). This provides a simple way to detect leaks during development. + public static var total: Int32 { + return resourceCount.valueSnapshot() + } + + /// Increments `Resources.total` resource count. + /// + /// - returns: New resource count + public static func incrementTotal() -> Int32 { + return AtomicIncrement(&resourceCount) + } + + /// Decrements `Resources.total` resource count + /// + /// - returns: New resource count + public static func decrementTotal() -> Int32 { + return AtomicDecrement(&resourceCount) + } + } #endif /// Swift does not implement abstract methods. This method is used as a runtime check to ensure that methods which intended to be abstract (i.e., they should be implemented in subclasses) are not called directly on the superclass. @@ -27,16 +48,14 @@ func incrementChecked(_ i: inout Int) throws -> Int { if i == Int.max { throw RxError.overflow } - let result = i - i += 1 - return result + defer { i += 1 } + return i } func decrementChecked(_ i: inout Int) throws -> Int { if i == Int.min { throw RxError.overflow } - let result = i - i -= 1 - return result + defer { i -= 1 } + return i } diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/RxMutableBox.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/RxMutableBox.swift index 83ff9f7e..7606b99e 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/RxMutableBox.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/RxMutableBox.swift @@ -8,29 +8,21 @@ import Foundation -/** -Creates mutable reference wrapper for any type. -*/ +/// Creates mutable reference wrapper for any type. class RxMutableBox : CustomDebugStringConvertible { - /** - Wrapped value - */ + /// Wrapped value var value : T - /** - Creates reference wrapper for `value`. - - - parameter value: Value to wrap. - */ + /// Creates reference wrapper for `value`. + /// + /// - parameter value: Value to wrap. init (_ value: T) { self.value = value } } extension RxMutableBox { - /** - - returns: Box description. - */ + /// - returns: Box description. var debugDescription: String { return "MutatingBox(\(self.value))" } diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/SchedulerType.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/SchedulerType.swift index ba92ff1e..3c329bab 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/SchedulerType.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/SchedulerType.swift @@ -1,6 +1,6 @@ // // SchedulerType.swift -// Rx +// RxSwift // // Created by Krunoslav Zaher on 2/8/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -8,24 +8,16 @@ import Foundation -/** -Type that represents time interval in the context of RxSwift. -*/ +// Type that represents time interval in the context of RxSwift. public typealias RxTimeInterval = TimeInterval -/** -Type that represents absolute time in the context of RxSwift. -*/ +/// Type that represents absolute time in the context of RxSwift. public typealias RxTime = Date -/** -Represents an object that schedules units of work. -*/ +/// Represents an object that schedules units of work. public protocol SchedulerType: ImmediateSchedulerType { - /** - - returns: Current time. - */ + /// - returns: Current time. var now : RxTime { get } diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Schedulers/ConcurrentDispatchQueueScheduler.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Schedulers/ConcurrentDispatchQueueScheduler.swift index 56da6e0b..f4c202b1 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Schedulers/ConcurrentDispatchQueueScheduler.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Schedulers/ConcurrentDispatchQueueScheduler.swift @@ -7,12 +7,11 @@ // import Foundation +import Dispatch -/** -Abstracts the work that needs to be performed on a specific `dispatch_queue_t`. You can also pass a serial dispatch queue, it shouldn't cause any problems. - -This scheduler is suitable when some work needs to be performed in background. -*/ +/// Abstracts the work that needs to be performed on a specific `dispatch_queue_t`. You can also pass a serial dispatch queue, it shouldn't cause any problems. +/// +/// This scheduler is suitable when some work needs to be performed in background. public class ConcurrentDispatchQueueScheduler: SchedulerType { public typealias TimeInterval = Foundation.TimeInterval public typealias Time = Date @@ -23,26 +22,21 @@ public class ConcurrentDispatchQueueScheduler: SchedulerType { let configuration: DispatchQueueConfiguration - /** - Constructs new `ConcurrentDispatchQueueScheduler` that wraps `queue`. - - - parameter queue: Target dispatch queue. - */ + /// Constructs new `ConcurrentDispatchQueueScheduler` that wraps `queue`. + /// + /// - parameter queue: Target dispatch queue. public init(queue: DispatchQueue, leeway: DispatchTimeInterval = DispatchTimeInterval.nanoseconds(0)) { configuration = DispatchQueueConfiguration(queue: queue, leeway: leeway) } - /** - Convenience init for scheduler that wraps one of the global concurrent dispatch queues. - - - parameter globalConcurrentQueueQOS: Target global dispatch queue, by quality of service class. - */ + /// Convenience init for scheduler that wraps one of the global concurrent dispatch queues. + /// + /// - parameter qos: Target global dispatch queue, by quality of service class. @available(iOS 8, OSX 10.10, *) - public convenience init(globalConcurrentQueueQOS: DispatchQueueSchedulerQOS, leeway: DispatchTimeInterval = DispatchTimeInterval.nanoseconds(0)) { - let priority = globalConcurrentQueueQOS.qos + public convenience init(qos: DispatchQoS, leeway: DispatchTimeInterval = DispatchTimeInterval.nanoseconds(0)) { self.init(queue: DispatchQueue( - label: "rxswift.queue.\(globalConcurrentQueueQOS)", - qos: priority, + label: "rxswift.queue.\(qos)", + qos: qos, attributes: [DispatchQueue.Attributes.concurrent], target: nil), leeway: leeway diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Schedulers/ConcurrentMainScheduler.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Schedulers/ConcurrentMainScheduler.swift index 04a5e0fa..6feaedd8 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Schedulers/ConcurrentMainScheduler.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Schedulers/ConcurrentMainScheduler.swift @@ -1,12 +1,13 @@ // // ConcurrentMainScheduler.swift -// Rx +// RxSwift // // Created by Krunoslav Zaher on 10/17/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. // import Foundation +import Dispatch /** Abstracts work that needs to be performed on `MainThread`. In case `schedule` methods are called from main thread, it will perform action immediately without scheduling. @@ -21,9 +22,7 @@ public final class ConcurrentMainScheduler : SchedulerType { private let _mainScheduler: MainScheduler private let _mainQueue: DispatchQueue - /** - - returns: Current time. - */ + /// - returns: Current time. public var now : Date { return _mainScheduler.now as Date } @@ -33,9 +32,7 @@ public final class ConcurrentMainScheduler : SchedulerType { _mainScheduler = mainScheduler } - /** - Singleton instance of `ConcurrentMainScheduler` - */ + /// Singleton instance of `ConcurrentMainScheduler` public static let instance = ConcurrentMainScheduler(mainScheduler: MainScheduler.instance) /** @@ -46,7 +43,7 @@ public final class ConcurrentMainScheduler : SchedulerType { - returns: The disposable object used to cancel the scheduled action (best effort). */ public func schedule(_ state: StateType, action: @escaping (StateType) -> Disposable) -> Disposable { - if Thread.current.isMainThread { + if DispatchQueue.isMain { return action(state) } @@ -57,7 +54,7 @@ public final class ConcurrentMainScheduler : SchedulerType { return } - cancel.disposable = action(state) + cancel.setDisposable(action(state)) } return cancel diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Schedulers/CurrentThreadScheduler.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Schedulers/CurrentThreadScheduler.swift index 87936aa1..8a49ce0b 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Schedulers/CurrentThreadScheduler.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Schedulers/CurrentThreadScheduler.swift @@ -1,96 +1,49 @@ // // CurrentThreadScheduler.swift -// Rx +// RxSwift // // Created by Krunoslav Zaher on 8/30/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. // import Foundation +import Dispatch -#if os(Linux) - let CurrentThreadSchedulerKeyInstance = "RxSwift.CurrentThreadScheduler.SchedulerKey" - let CurrentThreadSchedulerQueueKeyInstance = "RxSwift.CurrentThreadScheduler.Queue" +let CurrentThreadSchedulerKeyInstance = "RxSwift.CurrentThreadScheduler.SchedulerKey" +let CurrentThreadSchedulerQueueKeyInstance = "RxSwift.CurrentThreadScheduler.Queue" - typealias CurrentThreadSchedulerValue = NSString - let CurrentThreadSchedulerValueInstance = "RxSwift.CurrentThreadScheduler.SchedulerKey" as NSString -#else - // temporary workaround +typealias CurrentThreadSchedulerValue = NSString +let CurrentThreadSchedulerValueInstance = "RxSwift.CurrentThreadScheduler.SchedulerKey" as NSString - let CurrentThreadSchedulerKeyInstance = "RxSwift.CurrentThreadScheduler.SchedulerKey" - let CurrentThreadSchedulerQueueKeyInstance = "RxSwift.CurrentThreadScheduler.Queue" - typealias CurrentThreadSchedulerValue = NSString - let CurrentThreadSchedulerValueInstance = "RxSwift.CurrentThreadScheduler.SchedulerKey" as NSString - - /* - let CurrentThreadSchedulerKeyInstance = CurrentThreadSchedulerKey() - let CurrentThreadSchedulerQueueKeyInstance = CurrentThreadSchedulerQueueKey() - - typealias CurrentThreadSchedulerValue = CurrentThreadSchedulerKey - let CurrentThreadSchedulerValueInstance = CurrentThreadSchedulerKeyInstance - - @objc class CurrentThreadSchedulerKey : NSObject, NSCopying { - override func isEqual(_ object: AnyObject?) -> Bool { - return object === CurrentThreadSchedulerKeyInstance - } - - override var hash: Int { return -904739208 } - - //func copy(with zone: NSZone? = nil) -> AnyObject { - func copyWithZone(zone: NSZone) -> AnyObject { - return CurrentThreadSchedulerKeyInstance - } - } - - @objc class CurrentThreadSchedulerQueueKey : NSObject, NSCopying { - override func isEqual(_ object: AnyObject?) -> Bool { - return object === CurrentThreadSchedulerQueueKeyInstance - } - - override var hash: Int { return -904739207 } - - //func copy(with: NSZone?) -> AnyObject { - func copyWithZone(zone: NSZone) -> AnyObject { - return CurrentThreadSchedulerQueueKeyInstance - } - }*/ -#endif - -/** -Represents an object that schedules units of work on the current thread. - -This is the default scheduler for operators that generate elements. - -This scheduler is also sometimes called `trampoline scheduler`. -*/ +/// Represents an object that schedules units of work on the current thread. +/// +/// This is the default scheduler for operators that generate elements. +/// +/// This scheduler is also sometimes called `trampoline scheduler`. public class CurrentThreadScheduler : ImmediateSchedulerType { typealias ScheduleQueue = RxMutableBox> - /** - The singleton instance of the current thread scheduler. - */ + /// The singleton instance of the current thread scheduler. public static let instance = CurrentThreadScheduler() static var queue : ScheduleQueue? { get { - return Thread.getThreadLocalStorageValueForKey(CurrentThreadSchedulerQueueKeyInstance as NSString) + return Thread.getThreadLocalStorageValueForKey(CurrentThreadSchedulerQueueKeyInstance) } set { - Thread.setThreadLocalStorageValue(newValue, forKey: CurrentThreadSchedulerQueueKeyInstance as NSString) + Thread.setThreadLocalStorageValue(newValue, forKey: CurrentThreadSchedulerQueueKeyInstance) } } - /** - Gets a value that indicates whether the caller must call a `schedule` method. - */ + /// Gets a value that indicates whether the caller must call a `schedule` method. public static fileprivate(set) var isScheduleRequired: Bool { get { - let value: CurrentThreadSchedulerValue? = Thread.getThreadLocalStorageValueForKey(CurrentThreadSchedulerKeyInstance as NSString) + let value: CurrentThreadSchedulerValue? = Thread.getThreadLocalStorageValueForKey(CurrentThreadSchedulerKeyInstance) return value == nil } set(isScheduleRequired) { - Thread.setThreadLocalStorageValue(isScheduleRequired ? nil : CurrentThreadSchedulerValueInstance, forKey: CurrentThreadSchedulerKeyInstance as NSString) + Thread.setThreadLocalStorageValue(isScheduleRequired ? nil : CurrentThreadSchedulerValueInstance, forKey: CurrentThreadSchedulerKeyInstance) } } @@ -142,9 +95,7 @@ public class CurrentThreadScheduler : ImmediateSchedulerType { let scheduledItem = ScheduledItem(action: action, state: state) queue.value.enqueue(scheduledItem) - - // In Xcode 7.3, `return scheduledItem` causes segmentation fault 11 on release build. - // To workaround this compiler issue, returns AnonymousDisposable that disposes scheduledItem. - return Disposables.create(with: scheduledItem.dispose) + + return scheduledItem } } diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Schedulers/DispatchQueueSchedulerQOS.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Schedulers/DispatchQueueSchedulerQOS.swift deleted file mode 100644 index a8164962..00000000 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Schedulers/DispatchQueueSchedulerQOS.swift +++ /dev/null @@ -1,54 +0,0 @@ -// -// DispatchQueueSchedulerQOS.swift -// RxSwift -// -// Created by John C. "Hsoi" Daub on 12/30/15. -// Copyright © 2015 Krunoslav Zaher. All rights reserved. -// - -import Foundation - -/** -Identifies one of the global concurrent dispatch queues with specified quality of service class. -*/ -public enum DispatchQueueSchedulerQOS { - - /** - Identifies global dispatch queue with `QOS_CLASS_USER_INTERACTIVE` - */ - case userInteractive - - /** - Identifies global dispatch queue with `QOS_CLASS_USER_INITIATED` - */ - case userInitiated - - /** - Identifies global dispatch queue with `QOS_CLASS_DEFAULT` - */ - case `default` - - /** - Identifies global dispatch queue with `QOS_CLASS_UTILITY` - */ - case utility - - /** - Identifies global dispatch queue with `QOS_CLASS_BACKGROUND` - */ - case background -} - - -@available(iOS 8, OSX 10.10, *) -extension DispatchQueueSchedulerQOS { - var qos: DispatchQoS { - switch self { - case .userInteractive: return .userInteractive - case .userInitiated: return .userInitiated - case .default: return .default - case .utility: return .utility - case .background: return .background - } - } -} diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Schedulers/HistoricalScheduler.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Schedulers/HistoricalScheduler.swift index 35452444..fede60e6 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Schedulers/HistoricalScheduler.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Schedulers/HistoricalScheduler.swift @@ -1,6 +1,6 @@ // // HistoricalScheduler.swift -// Rx +// RxSwift // // Created by Krunoslav Zaher on 12/27/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -8,9 +8,7 @@ import Foundation -/** - Provides a virtual time scheduler that uses `NSDate` for absolute time and `NSTimeInterval` for relative time. -*/ +/// Provides a virtual time scheduler that uses `Date` for absolute time and `NSTimeInterval` for relative time. public class HistoricalScheduler : VirtualTimeScheduler { /** @@ -21,5 +19,4 @@ public class HistoricalScheduler : VirtualTimeScheduler RxTime { return virtualTime } - /** - Returns identical value of argument passed because historical virtual time is equal to real time, just - decoupled from local machine clock. - */ + /// Returns identical value of argument passed because historical virtual time is equal to real time, just + /// decoupled from local machine clock. public func convertToVirtualTime(_ time: RxTime) -> VirtualTimeUnit { return time } - /** - Returns identical value of argument passed because historical virtual time is equal to real time, just - decoupled from local machine clock. - */ + /// Returns identical value of argument passed because historical virtual time is equal to real time, just + /// decoupled from local machine clock. public func convertFromVirtualTimeInterval(_ virtualTimeInterval: VirtualTimeIntervalUnit) -> RxTimeInterval { return virtualTimeInterval } - /** - Returns identical value of argument passed because historical virtual time is equal to real time, just - decoupled from local machine clock. - */ + /// Returns identical value of argument passed because historical virtual time is equal to real time, just + /// decoupled from local machine clock. public func convertToVirtualTimeInterval(_ timeInterval: RxTimeInterval) -> VirtualTimeIntervalUnit { return timeInterval } /** - Offsets `NSDate` by time interval. + Offsets `Date` by time interval. - parameter time: Time. - parameter timeInterval: Time interval offset. @@ -67,9 +53,7 @@ public struct HistoricalSchedulerTimeConverter : VirtualTimeConverterType { return time.addingTimeInterval(offset) } - /** - Compares two `NSDate`s. - */ + /// Compares two `Date`s. public func compareVirtualTime(_ lhs: VirtualTimeUnit, _ rhs: VirtualTimeUnit) -> VirtualTimeComparison { switch lhs.compare(rhs as Date) { case .orderedAscending: diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Schedulers/ImmediateScheduler.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Schedulers/ImmediateScheduler.swift index 0dc7a035..f3e16351 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Schedulers/ImmediateScheduler.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Schedulers/ImmediateScheduler.swift @@ -1,6 +1,6 @@ // // ImmediateScheduler.swift -// Rx +// RxSwift // // Created by Krunoslav Zaher on 10/17/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -8,9 +8,7 @@ import Foundation -/** -Represents an object that schedules units of work to run immediately on the current thread. -*/ +/// Represents an object that schedules units of work to run immediately on the current thread. private class ImmediateScheduler : ImmediateSchedulerType { private let _asyncLock = AsyncLock() @@ -31,7 +29,7 @@ private class ImmediateScheduler : ImmediateSchedulerType { if disposable.isDisposed { return } - disposable.disposable = action(state) + disposable.setDisposable(action(state)) }) return disposable diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Schedulers/Internal/AnonymousInvocable.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Schedulers/Internal/AnonymousInvocable.swift index e74d8811..b3a19af4 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Schedulers/Internal/AnonymousInvocable.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Schedulers/Internal/AnonymousInvocable.swift @@ -1,6 +1,6 @@ // // AnonymousInvocable.swift -// Rx +// RxSwift // // Created by Krunoslav Zaher on 11/7/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Schedulers/Internal/DispatchQueueConfiguration.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Schedulers/Internal/DispatchQueueConfiguration.swift index c90447d6..be7040c7 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Schedulers/Internal/DispatchQueueConfiguration.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Schedulers/Internal/DispatchQueueConfiguration.swift @@ -1,12 +1,13 @@ // // DispatchQueueConfiguration.swift -// Rx +// RxSwift // // Created by Krunoslav Zaher on 7/23/16. // Copyright © 2016 Krunoslav Zaher. All rights reserved. // import Foundation +import Dispatch struct DispatchQueueConfiguration { let queue: DispatchQueue @@ -30,7 +31,7 @@ extension DispatchQueueConfiguration { } - cancel.disposable = action(state) + cancel.setDisposable(action(state)) } return cancel diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Schedulers/Internal/InvocableScheduledItem.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Schedulers/Internal/InvocableScheduledItem.swift index 7f2676b3..54c7f191 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Schedulers/Internal/InvocableScheduledItem.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Schedulers/Internal/InvocableScheduledItem.swift @@ -1,6 +1,6 @@ // // InvocableScheduledItem.swift -// Rx +// RxSwift // // Created by Krunoslav Zaher on 11/7/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Schedulers/Internal/InvocableType.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Schedulers/Internal/InvocableType.swift index 6a7de265..1f95c66d 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Schedulers/Internal/InvocableType.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Schedulers/Internal/InvocableType.swift @@ -1,6 +1,6 @@ // // InvocableType.swift -// Rx +// RxSwift // // Created by Krunoslav Zaher on 11/7/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Schedulers/Internal/ScheduledItem.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Schedulers/Internal/ScheduledItem.swift index ba23e12b..c03b2eb7 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Schedulers/Internal/ScheduledItem.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Schedulers/Internal/ScheduledItem.swift @@ -1,6 +1,6 @@ // // ScheduledItem.swift -// Rx +// RxSwift // // Created by Krunoslav Zaher on 9/2/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -28,7 +28,7 @@ struct ScheduledItem } func invoke() { - _disposable.disposable = _action(_state) + _disposable.setDisposable(_action(_state)) } func dispose() { diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Schedulers/Internal/ScheduledItemType.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Schedulers/Internal/ScheduledItemType.swift index 2a1eca27..a5f0b0b3 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Schedulers/Internal/ScheduledItemType.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Schedulers/Internal/ScheduledItemType.swift @@ -1,6 +1,6 @@ // // ScheduledItemType.swift -// Rx +// RxSwift // // Created by Krunoslav Zaher on 11/7/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Schedulers/MainScheduler.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Schedulers/MainScheduler.swift index be4ec6a8..5adfa780 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Schedulers/MainScheduler.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Schedulers/MainScheduler.swift @@ -1,15 +1,16 @@ // // MainScheduler.swift -// Rx +// RxSwift // // Created by Krunoslav Zaher on 2/8/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. // import Foundation +import Dispatch /** -Abstracts work that needs to be performed on `MainThread`. In case `schedule` methods are called from main thread, it will perform action immediately without scheduling. +Abstracts work that needs to be performed on `DispatchQueue.main`. In case `schedule` methods are called from `DispatchQueue.main`, it will perform action immediately without scheduling. This scheduler is usually used to perform UI work. @@ -24,27 +25,22 @@ public final class MainScheduler : SerialDispatchQueueScheduler { var numberEnqueued: AtomicInt = 0 - private init() { + /// Initializes new instance of `MainScheduler`. + public init() { _mainQueue = DispatchQueue.main super.init(serialQueue: _mainQueue) } - /** - Singleton instance of `MainScheduler` - */ + /// Singleton instance of `MainScheduler` public static let instance = MainScheduler() - /** - Singleton instance of `MainScheduler` that always schedules work asynchronously - and doesn't perform optimizations for calls scheduled from main thread. - */ + /// Singleton instance of `MainScheduler` that always schedules work asynchronously + /// and doesn't perform optimizations for calls scheduled from main queue. public static let asyncInstance = SerialDispatchQueueScheduler(serialQueue: DispatchQueue.main) - /** - In case this method is called on a background thread it will throw an exception. - */ + /// In case this method is called on a background thread it will throw an exception. public class func ensureExecutingOnScheduler(errorMessage: String? = nil) { - if !Thread.current.isMainThread { + if !DispatchQueue.isMain { rxFatalError(errorMessage ?? "Executing on backgound thread. Please use `MainScheduler.instance.schedule` to schedule work on main thread.") } } @@ -52,7 +48,7 @@ public final class MainScheduler : SerialDispatchQueueScheduler { override func scheduleInternal(_ state: StateType, action: @escaping (StateType) -> Disposable) -> Disposable { let currentNumberEnqueued = AtomicIncrement(&numberEnqueued) - if Thread.current.isMainThread && currentNumberEnqueued == 1 { + if DispatchQueue.isMain && currentNumberEnqueued == 1 { let disposable = action(state) _ = AtomicDecrement(&numberEnqueued) return disposable diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Schedulers/OperationQueueScheduler.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Schedulers/OperationQueueScheduler.swift index 38d49220..957f053f 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Schedulers/OperationQueueScheduler.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Schedulers/OperationQueueScheduler.swift @@ -1,6 +1,6 @@ // // OperationQueueScheduler.swift -// Rx +// RxSwift // // Created by Krunoslav Zaher on 4/4/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -8,19 +8,15 @@ import Foundation -/** -Abstracts the work that needs to be performed on a specific `NSOperationQueue`. - -This scheduler is suitable for cases when there is some bigger chunk of work that needs to be performed in background and you want to fine tune concurrent processing using `maxConcurrentOperationCount`. -*/ +/// Abstracts the work that needs to be performed on a specific `NSOperationQueue`. +/// +/// This scheduler is suitable for cases when there is some bigger chunk of work that needs to be performed in background and you want to fine tune concurrent processing using `maxConcurrentOperationCount`. public class OperationQueueScheduler: ImmediateSchedulerType { public let operationQueue: OperationQueue - /** - Constructs new instance of `OperationQueueScheduler` that performs work on `operationQueue`. - - - parameter operationQueue: Operation queue targeted to perform work on. - */ + /// Constructs new instance of `OperationQueueScheduler` that performs work on `operationQueue`. + /// + /// - parameter operationQueue: Operation queue targeted to perform work on. public init(operationQueue: OperationQueue) { self.operationQueue = operationQueue } @@ -33,25 +29,20 @@ public class OperationQueueScheduler: ImmediateSchedulerType { - returns: The disposable object used to cancel the scheduled action (best effort). */ public func schedule(_ state: StateType, action: @escaping (StateType) -> Disposable) -> Disposable { - - let compositeDisposable = CompositeDisposable() - - weak var compositeDisposableWeak = compositeDisposable - + let cancel = SingleAssignmentDisposable() + let operation = BlockOperation { - if compositeDisposableWeak?.isDisposed ?? false { + if cancel.isDisposed { return } - - let disposable = action(state) - let _ = compositeDisposableWeak?.insert(disposable) + + + cancel.setDisposable(action(state)) } self.operationQueue.addOperation(operation) - let _ = compositeDisposable.insert(Disposables.create(with: operation.cancel)) - - return compositeDisposable + return cancel } } diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Schedulers/RecursiveScheduler.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Schedulers/RecursiveScheduler.swift index 6ad5456f..6ff0f2bd 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Schedulers/RecursiveScheduler.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Schedulers/RecursiveScheduler.swift @@ -8,9 +8,7 @@ import Foundation -/** -Type erased recursive scheduler. -*/ +/// Type erased recursive scheduler. class AnyRecursiveScheduler { typealias Action = (State, AnyRecursiveScheduler) -> Void @@ -71,11 +69,9 @@ class AnyRecursiveScheduler { } } - /** - Schedules an action to be executed recursively. - - - parameter state: State passed to the action to be executed. - */ + /// Schedules an action to be executed recursively. + /// + /// - parameter state: State passed to the action to be executed. func schedule(_ state: State) { var isAdded = false @@ -122,9 +118,7 @@ class AnyRecursiveScheduler { } } -/** -Type erased recursive scheduler. -*/ +/// Type erased recursive scheduler. class RecursiveImmediateScheduler { typealias Action = (_ state: State, _ recurse: (State) -> Void) -> Void @@ -141,13 +135,11 @@ class RecursiveImmediateScheduler { // immediate scheduling - /** - Schedules an action to be executed recursively. - - - parameter state: State passed to the action to be executed. - */ + /// Schedules an action to be executed recursively. + /// + /// - parameter state: State passed to the action to be executed. func schedule(_ state: State) { - + var isAdded = false var isDone = false diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Schedulers/SerialDispatchQueueScheduler.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Schedulers/SerialDispatchQueueScheduler.swift index 01733b01..fab8cbe6 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Schedulers/SerialDispatchQueueScheduler.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Schedulers/SerialDispatchQueueScheduler.swift @@ -1,12 +1,13 @@ // // SerialDispatchQueueScheduler.swift -// Rx +// RxSwift // // Created by Krunoslav Zaher on 2/8/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. // import Foundation +import Dispatch /** Abstracts the work that needs to be performed on a specific `dispatch_queue_t`. It will make sure @@ -29,9 +30,7 @@ public class SerialDispatchQueueScheduler : SchedulerType { public typealias TimeInterval = Foundation.TimeInterval public typealias Time = Date - /** - - returns: Current time. - */ + /// - returns: Current time. public var now : Date { return Date() } @@ -73,13 +72,12 @@ public class SerialDispatchQueueScheduler : SchedulerType { /** Constructs new `SerialDispatchQueueScheduler` that wraps on of the global concurrent dispatch queues. - - parameter globalConcurrentQueueQOS: Identifier for global dispatch queue with specified quality of service class. + - parameter qos: Identifier for global dispatch queue with specified quality of service class. - parameter internalSerialQueueName: Custom name for internal serial dispatch queue proxy. */ @available(iOS 8, OSX 10.10, *) - public convenience init(globalConcurrentQueueQOS: DispatchQueueSchedulerQOS, internalSerialQueueName: String = "rx.global_dispatch_queue.serial", leeway: DispatchTimeInterval = DispatchTimeInterval.nanoseconds(0)) { - let priority = globalConcurrentQueueQOS.qos - self.init(queue: DispatchQueue.global(qos: priority.qosClass), internalSerialQueueName: internalSerialQueueName, leeway: leeway) + public convenience init(qos: DispatchQoS, internalSerialQueueName: String = "rx.global_dispatch_queue.serial", leeway: DispatchTimeInterval = DispatchTimeInterval.nanoseconds(0)) { + self.init(queue: DispatchQueue.global(qos: qos.qosClass), internalSerialQueueName: internalSerialQueueName, leeway: leeway) } /** diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Schedulers/VirtualTimeConverterType.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Schedulers/VirtualTimeConverterType.swift index c5476a03..f7aa87aa 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Schedulers/VirtualTimeConverterType.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Schedulers/VirtualTimeConverterType.swift @@ -1,6 +1,6 @@ // // VirtualTimeConverterType.swift -// Rx +// RxSwift // // Created by Krunoslav Zaher on 12/23/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -8,33 +8,27 @@ import Foundation -/** -Parametrization for virtual time used by `VirtualTimeScheduler`s. -*/ +/// Parametrization for virtual time used by `VirtualTimeScheduler`s. public protocol VirtualTimeConverterType { - /** - Virtual time unit used that represents ticks of virtual clock. - */ + /// Virtual time unit used that represents ticks of virtual clock. associatedtype VirtualTimeUnit - /** - Virtual time unit used to represent differences of virtual times. - */ + /// Virtual time unit used to represent differences of virtual times. associatedtype VirtualTimeIntervalUnit /** Converts virtual time to real time. - - parameter virtualTime: Virtual time to convert to `NSDate`. - - returns: `NSDate` corresponding to virtual time. + - parameter virtualTime: Virtual time to convert to `Date`. + - returns: `Date` corresponding to virtual time. */ func convertFromVirtualTime(_ virtualTime: VirtualTimeUnit) -> RxTime /** Converts real time to virtual time. - - parameter time: `NSDate` to convert to virtual time. - - returns: Virtual time corresponding to `NSDate`. + - parameter time: `Date` to convert to virtual time. + - returns: Virtual time corresponding to `Date`. */ func convertToVirtualTime(_ time: RxTime) -> VirtualTimeUnit @@ -64,8 +58,8 @@ public protocol VirtualTimeConverterType { func offsetVirtualTime(_ time: VirtualTimeUnit, offset: VirtualTimeIntervalUnit) -> VirtualTimeUnit /** - This is aditional abstraction because `NSDate` is unfortunately not comparable. - Extending `NSDate` with `Comparable` would be too risky because of possible collisions with other libraries. + This is aditional abstraction because `Date` is unfortunately not comparable. + Extending `Date` with `Comparable` would be too risky because of possible collisions with other libraries. */ func compareVirtualTime(_ lhs: VirtualTimeUnit, _ rhs: VirtualTimeUnit) -> VirtualTimeComparison } @@ -73,42 +67,30 @@ public protocol VirtualTimeConverterType { /** Virtual time comparison result. - This is aditional abstraction because `NSDate` is unfortunately not comparable. - Extending `NSDate` with `Comparable` would be too risky because of possible collisions with other libraries. + This is aditional abstraction because `Date` is unfortunately not comparable. + Extending `Date` with `Comparable` would be too risky because of possible collisions with other libraries. */ public enum VirtualTimeComparison { - /** - lhs < rhs. - */ + /// lhs < rhs. case lessThan - /** - lhs == rhs. - */ + /// lhs == rhs. case equal - /** - lhs > rhs. - */ + /// lhs > rhs. case greaterThan } extension VirtualTimeComparison { - /** - lhs < rhs. - */ + /// lhs < rhs. var lessThen: Bool { return self == .lessThan } - /** - lhs > rhs - */ + /// lhs > rhs var greaterThan: Bool { return self == .greaterThan } - /** - lhs == rhs - */ + /// lhs == rhs var equal: Bool { return self == .equal } diff --git a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Schedulers/VirtualTimeScheduler.swift b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Schedulers/VirtualTimeScheduler.swift index 5e9eaaa6..2956c4b4 100644 --- a/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Schedulers/VirtualTimeScheduler.swift +++ b/Project 07 - PokedexGo/Pods/RxSwift/RxSwift/Schedulers/VirtualTimeScheduler.swift @@ -1,6 +1,6 @@ // // VirtualTimeScheduler.swift -// Rx +// RxSwift // // Created by Krunoslav Zaher on 2/14/15. // Copyright © 2015 Krunoslav Zaher. All rights reserved. @@ -8,12 +8,9 @@ import Foundation -/** -Base class for virtual time schedulers using a priority queue for scheduled items. -*/ +/// Base class for virtual time schedulers using a priority queue for scheduled items. open class VirtualTimeScheduler - : SchedulerType - , CustomDebugStringConvertible { + : SchedulerType { public typealias VirtualTime = Converter.VirtualTimeUnit public typealias VirtualTimeInterval = Converter.VirtualTimeIntervalUnit @@ -27,25 +24,19 @@ open class VirtualTimeScheduler private var _nextId = 0 - /** - - returns: Current time. - */ + /// - returns: Current time. public var now: RxTime { return _converter.convertFromVirtualTime(clock) } - /** - - returns: Scheduler's absolute time clock value. - */ + /// - returns: Scheduler's absolute time clock value. public var clock: VirtualTime { return _clock } - /** - Creates a new virtual time scheduler. - - - parameter initialClock: Initial value for the clock. - */ + /// Creates a new virtual time scheduler. + /// + /// - parameter initialClock: Initial value for the clock. public init(initialClock: VirtualTime, converter: Converter) { _clock = initialClock _running = false @@ -59,9 +50,9 @@ open class VirtualTimeScheduler case .greaterThan: return false } - }) + }, isEqual: { $0 === $1 }) #if TRACE_RESOURCES - let _ = AtomicIncrement(&resourceCount) + let _ = Resources.incrementTotal() #endif } @@ -133,16 +124,12 @@ open class VirtualTimeScheduler return compositeDisposable } - /** - Adjusts time of scheduling before adding item to schedule queue. - */ + /// Adjusts time of scheduling before adding item to schedule queue. open func adjustScheduledTime(_ time: Converter.VirtualTimeUnit) -> Converter.VirtualTimeUnit { return time } - /** - Starts the virtual time scheduler. - */ + /// Starts the virtual time scheduler. public func start() { MainScheduler.ensureExecutingOnScheduler() @@ -180,11 +167,9 @@ open class VirtualTimeScheduler return nil } - /** - Advances the scheduler's clock to the specified time, running all work till that point. - - - parameter virtualTime: Absolute time to advance the scheduler's clock to. - */ + /// Advances the scheduler's clock to the specified time, running all work till that point. + /// + /// - parameter virtualTime: Absolute time to advance the scheduler's clock to. public func advanceTo(_ virtualTime: VirtualTime) { MainScheduler.ensureExecutingOnScheduler() @@ -214,9 +199,7 @@ open class VirtualTimeScheduler _running = false } - /** - Advances the scheduler's clock by the specified relative time. - */ + /// Advances the scheduler's clock by the specified relative time. public func sleep(_ virtualInterval: VirtualTimeInterval) { MainScheduler.ensureExecutingOnScheduler() @@ -228,9 +211,7 @@ open class VirtualTimeScheduler _clock = sleepTo } - /** - Stops the virtual time scheduler. - */ + /// Stops the virtual time scheduler. public func stop() { MainScheduler.ensureExecutingOnScheduler() @@ -239,17 +220,15 @@ open class VirtualTimeScheduler #if TRACE_RESOURCES deinit { - _ = AtomicDecrement(&resourceCount) + _ = Resources.decrementTotal() } #endif } // MARK: description -extension VirtualTimeScheduler { - /** - A textual representation of `self`, suitable for debugging. - */ +extension VirtualTimeScheduler: CustomDebugStringConvertible { + /// A textual representation of `self`, suitable for debugging. public var debugDescription: String { return self._schedulerQueue.debugDescription } @@ -276,7 +255,7 @@ class VirtualSchedulerItem
- +
@@ -199,7 +200,7 @@ - + @@ -207,7 +208,7 @@ - + diff --git a/Project 09 - PhotoScroll/PhotoScroll/PhotoCommentViewController.swift b/Project 09 - PhotoScroll/PhotoScroll/PhotoCommentViewController.swift index d29eca80..20ccae5e 100644 --- a/Project 09 - PhotoScroll/PhotoScroll/PhotoCommentViewController.swift +++ b/Project 09 - PhotoScroll/PhotoScroll/PhotoCommentViewController.swift @@ -31,13 +31,13 @@ class PhotoCommentViewController: UIViewController { NotificationCenter.default.addObserver( self, selector: Selector.keyboardWillShowHandler, - name: NSNotification.Name.UIKeyboardWillShow, + name: UIResponder.keyboardWillShowNotification, object: nil ) NotificationCenter.default.addObserver( self, selector: Selector.keyboardWillHideHandler, - name: NSNotification.Name.UIKeyboardWillHide, + name: UIResponder.keyboardWillHideNotification, object: nil ) } @@ -47,7 +47,7 @@ class PhotoCommentViewController: UIViewController { } fileprivate func adjustInsetForKeyboard(isShow: Bool, notification: Notification) { - guard let value = notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue else { + guard let value = notification.userInfo?[UIResponder.keyboardFrameBeginUserInfoKey] as? NSValue else { return } let keyboardFrame = value.cgRectValue @@ -56,19 +56,19 @@ class PhotoCommentViewController: UIViewController { scrollView.scrollIndicatorInsets.bottom += adjustmentHeight } - func dismissKeyboard() { + @objc func dismissKeyboard() { view.endEditing(true) } - func keyboardWillShow(notification: Notification) { + @objc func keyboardWillShow(notification: Notification) { adjustInsetForKeyboard(isShow: true, notification: notification) } - func keyboardWillHide(notification: Notification) { + @objc func keyboardWillHide(notification: Notification) { adjustInsetForKeyboard(isShow: false, notification: notification) } - func openZoomingController(sender: AnyObject) { + @objc func openZoomingController(sender: AnyObject) { performSegue(withIdentifier: "zooming", sender: nil) } diff --git a/Project 10 - Interests/Interests.xcodeproj/project.pbxproj b/Project 10 - Interests/Interests.xcodeproj/project.pbxproj index f5f7a05f..f4de9dab 100644 --- a/Project 10 - Interests/Interests.xcodeproj/project.pbxproj +++ b/Project 10 - Interests/Interests.xcodeproj/project.pbxproj @@ -121,18 +121,18 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0730; - LastUpgradeCheck = 0820; + LastUpgradeCheck = 1020; ORGANIZATIONNAME = YiGu; TargetAttributes = { 192BA0C61CD19B2000117FF6 = { CreatedOnToolsVersion = 7.3; - LastSwiftMigration = 0800; + LastSwiftMigration = 1020; }; }; }; buildConfigurationList = 192BA0C21CD19B2000117FF6 /* Build configuration list for PBXProject "Interests" */; compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; + developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, @@ -199,19 +199,28 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -234,11 +243,12 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.3; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_SWIFT3_OBJC_INFERENCE = Default; }; name = Debug; }; @@ -246,19 +256,28 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -275,10 +294,11 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.3; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_SWIFT3_OBJC_INFERENCE = Default; VALIDATE_PRODUCT = YES; }; name = Release; @@ -291,7 +311,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.yigu.Interests; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; }; name = Debug; }; @@ -303,7 +323,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.yigu.Interests; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; }; name = Release; }; diff --git a/Project 10 - Interests/Interests.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Project 10 - Interests/Interests.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/Project 10 - Interests/Interests.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Project 10 - Interests/Interests.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/Interests.xcscheme b/Project 10 - Interests/Interests.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/Interests.xcscheme index 864f9623..80a37b51 100644 --- a/Project 10 - Interests/Interests.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/Interests.xcscheme +++ b/Project 10 - Interests/Interests.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/Interests.xcscheme @@ -1,6 +1,6 @@ Bool { + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch. return true } diff --git a/Project 10 - Interests/Interests/Base.lproj/Main.storyboard b/Project 10 - Interests/Interests/Base.lproj/Main.storyboard index a84bd138..adcd2f9c 100644 --- a/Project 10 - Interests/Interests/Base.lproj/Main.storyboard +++ b/Project 10 - Interests/Interests/Base.lproj/Main.storyboard @@ -1,8 +1,12 @@ - - + + + + + - + + @@ -14,21 +18,22 @@ - + - + - + - + - + + @@ -55,7 +60,7 @@ @@ -72,7 +77,6 @@ - @@ -99,7 +103,7 @@ - + diff --git a/Project 11 - Animations/Animations.xcodeproj/project.pbxproj b/Project 11 - Animations/Animations.xcodeproj/project.pbxproj index ba03fc10..334fb7ae 100644 --- a/Project 11 - Animations/Animations.xcodeproj/project.pbxproj +++ b/Project 11 - Animations/Animations.xcodeproj/project.pbxproj @@ -194,28 +194,28 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0730; - LastUpgradeCheck = 0820; + LastUpgradeCheck = 1020; ORGANIZATIONNAME = YiGu; TargetAttributes = { 192BA1161CD332C500117FF6 = { CreatedOnToolsVersion = 7.3; - LastSwiftMigration = 0800; + LastSwiftMigration = 1020; }; 192BA12A1CD332C500117FF6 = { CreatedOnToolsVersion = 7.3; - LastSwiftMigration = 0800; + LastSwiftMigration = 1020; TestTargetID = 192BA1161CD332C500117FF6; }; 192BA1351CD332C500117FF6 = { CreatedOnToolsVersion = 7.3; - LastSwiftMigration = 0800; + LastSwiftMigration = 1020; TestTargetID = 192BA1161CD332C500117FF6; }; }; }; buildConfigurationList = 192BA1121CD332C500117FF6 /* Build configuration list for PBXProject "Animations" */; compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; + developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, @@ -327,19 +327,28 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -362,7 +371,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.3; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -374,19 +383,28 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -403,7 +421,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.3; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; @@ -419,7 +437,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.yigu.Animations; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; }; name = Debug; }; @@ -431,7 +449,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.yigu.Animations; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; }; name = Release; }; @@ -443,7 +461,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.yigu.AnimationsTests; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Animations.app/Animations"; }; name = Debug; @@ -456,7 +474,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.yigu.AnimationsTests; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Animations.app/Animations"; }; name = Release; @@ -468,7 +486,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.yigu.AnimationsUITests; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; TEST_TARGET_NAME = Animations; }; name = Debug; @@ -480,7 +498,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.yigu.AnimationsUITests; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; TEST_TARGET_NAME = Animations; }; name = Release; diff --git a/Project 11 - Animations/Animations.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Project 11 - Animations/Animations.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/Project 11 - Animations/Animations.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Project 11 - Animations/Animations.xcodeproj/xcuserdata/Yi.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/Project 11 - Animations/Animations.xcodeproj/xcuserdata/Yi.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist deleted file mode 100644 index fe2b4541..00000000 --- a/Project 11 - Animations/Animations.xcodeproj/xcuserdata/Yi.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/Project 11 - Animations/Animations.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/xcschememanagement.plist b/Project 11 - Animations/Animations.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/xcschememanagement.plist deleted file mode 100644 index 15aa1d50..00000000 --- a/Project 11 - Animations/Animations.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/xcschememanagement.plist +++ /dev/null @@ -1,32 +0,0 @@ - - - - - SchemeUserState - - Animations.xcscheme - - orderHint - 0 - - - SuppressBuildableAutocreation - - 192BA1161CD332C500117FF6 - - primary - - - 192BA12A1CD332C500117FF6 - - primary - - - 192BA1351CD332C500117FF6 - - primary - - - - - diff --git a/Project 11 - Animations/Animations/AppDelegate.swift b/Project 11 - Animations/Animations/AppDelegate.swift index 4557c6e0..6de85fe1 100644 --- a/Project 11 - Animations/Animations/AppDelegate.swift +++ b/Project 11 - Animations/Animations/AppDelegate.swift @@ -14,7 +14,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? - func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch. return true } diff --git a/Project 11 - Animations/Animations/Base.lproj/Main.storyboard b/Project 11 - Animations/Animations/Base.lproj/Main.storyboard index 27f9cf53..92026155 100644 --- a/Project 11 - Animations/Animations/Base.lproj/Main.storyboard +++ b/Project 11 - Animations/Animations/Base.lproj/Main.storyboard @@ -1,8 +1,12 @@ - - + + + + + - + + @@ -19,17 +23,17 @@ - + - + - + @@ -39,7 +43,7 @@ - + @@ -48,7 +52,6 @@ - @@ -70,7 +73,7 @@ - + - - + - - + diff --git a/Project 11 - Animations/Animations/Common.swift b/Project 11 - Animations/Animations/Common.swift index 4dcfa09c..8b31525b 100644 --- a/Project 11 - Animations/Animations/Common.swift +++ b/Project 11 - Animations/Animations/Common.swift @@ -21,7 +21,7 @@ func drawRectView(_ color: UIColor, frame: CGRect, center: CGPoint) -> UIView { } func drawCircleView() -> UIView { - let circlePath = UIBezierPath(arcCenter: CGPoint(x: 100,y: screenRect.midY - 50), radius: CGFloat(20), startAngle: CGFloat(0), endAngle:CGFloat(M_PI * 2), clockwise: true) + let circlePath = UIBezierPath(arcCenter: CGPoint(x: 100,y: screenRect.midY - 50), radius: CGFloat(20), startAngle: CGFloat(0), endAngle:CGFloat(Double.pi * 2), clockwise: true) let shapeLayer = CAShapeLayer() shapeLayer.path = circlePath.cgPath @@ -37,8 +37,8 @@ func drawCircleView() -> UIView { } func makeAlert(_ title: String, message: String, actionTitle: String) -> UIAlertController { - let alert = UIAlertController(title: title, message: message, preferredStyle: UIAlertControllerStyle.alert) - alert.addAction(UIAlertAction(title: actionTitle, style: UIAlertActionStyle.default, handler: nil)) + let alert = UIAlertController(title: title, message: message, preferredStyle: UIAlertController.Style.alert) + alert.addAction(UIAlertAction(title: actionTitle, style: UIAlertAction.Style.default, handler: nil)) return alert } diff --git a/Project 11 - Animations/Animations/DetailViewController.swift b/Project 11 - Animations/Animations/DetailViewController.swift index 4d5c9cd1..9f825439 100644 --- a/Project 11 - Animations/Animations/DetailViewController.swift +++ b/Project 11 - Animations/Animations/DetailViewController.swift @@ -49,7 +49,7 @@ class DetailViewController: UIViewController { changeColor(UIColor.green) case "Simple 2D Rotation": - rotateView(M_PI) + rotateView(Double.pi) case "Multicolor": multiColor(UIColor.green, UIColor.blue) @@ -102,17 +102,17 @@ class DetailViewController: UIViewController { }) } - fileprivate func simplePosition(_ pos: CGPoint) { - UIView.animate(withDuration: self.duration, animations: { - self.animateView.frame.origin = pos - }, completion: nil) - } - fileprivate func multiPosition(_ firstPos: CGPoint, _ secondPos: CGPoint) { + func simplePosition(_ pos: CGPoint) { + UIView.animate(withDuration: self.duration, animations: { + self.animateView.frame.origin = pos + }, completion: nil) + } + UIView.animate(withDuration: self.duration, animations: { self.animateView.frame.origin = firstPos }, completion: { finished in - self.simplePosition(secondPos) + simplePosition(secondPos) }) } diff --git a/Project 11 - Animations/Animations/ViewController.swift b/Project 11 - Animations/Animations/ViewController.swift index 05e8211a..f97389c1 100644 --- a/Project 11 - Animations/Animations/ViewController.swift +++ b/Project 11 - Animations/Animations/ViewController.swift @@ -2,7 +2,6 @@ // ViewController.swift // Animations // -// Created by Yi Gu on 4/28/16. // Copyright © 2016 YiGu. All rights reserved. // diff --git a/Project 12 - Tumblr/Tumblr.xcodeproj/project.pbxproj b/Project 12 - Tumblr/Tumblr.xcodeproj/project.pbxproj index fabb7715..8e6035c5 100644 --- a/Project 12 - Tumblr/Tumblr.xcodeproj/project.pbxproj +++ b/Project 12 - Tumblr/Tumblr.xcodeproj/project.pbxproj @@ -97,18 +97,18 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0730; - LastUpgradeCheck = 0820; + LastUpgradeCheck = 1020; ORGANIZATIONNAME = yigu; TargetAttributes = { 1902A7CD1D03495A000884E5 = { CreatedOnToolsVersion = 7.3.1; - LastSwiftMigration = 0800; + LastSwiftMigration = 1020; }; }; }; buildConfigurationList = 1902A7C91D03495A000884E5 /* Build configuration list for PBXProject "Tumblr" */; compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; + developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, @@ -175,19 +175,28 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -210,7 +219,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.3; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -222,19 +231,28 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -251,7 +269,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.3; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; @@ -267,7 +285,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.yigu.Tumblr; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; }; name = Debug; }; @@ -279,7 +297,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.yigu.Tumblr; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; }; name = Release; }; diff --git a/Project 12 - Tumblr/Tumblr.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Project 12 - Tumblr/Tumblr.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/Project 12 - Tumblr/Tumblr.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Project 12 - Tumblr/Tumblr.xcodeproj/project.xcworkspace/xcuserdata/Yi.xcuserdatad/UserInterfaceState.xcuserstate b/Project 12 - Tumblr/Tumblr.xcodeproj/project.xcworkspace/xcuserdata/Yi.xcuserdatad/UserInterfaceState.xcuserstate deleted file mode 100644 index df9bb5c4..00000000 Binary files a/Project 12 - Tumblr/Tumblr.xcodeproj/project.xcworkspace/xcuserdata/Yi.xcuserdatad/UserInterfaceState.xcuserstate and /dev/null differ diff --git a/Project 12 - Tumblr/Tumblr.xcodeproj/xcuserdata/Yi.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/Project 12 - Tumblr/Tumblr.xcodeproj/xcuserdata/Yi.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist deleted file mode 100644 index fe2b4541..00000000 --- a/Project 12 - Tumblr/Tumblr.xcodeproj/xcuserdata/Yi.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/Project 12 - Tumblr/Tumblr.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/Tumblr.xcscheme b/Project 12 - Tumblr/Tumblr.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/Tumblr.xcscheme deleted file mode 100644 index 0963be28..00000000 --- a/Project 12 - Tumblr/Tumblr.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/Tumblr.xcscheme +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Project 12 - Tumblr/Tumblr.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/xcschememanagement.plist b/Project 12 - Tumblr/Tumblr.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/xcschememanagement.plist deleted file mode 100644 index b327a7b7..00000000 --- a/Project 12 - Tumblr/Tumblr.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/xcschememanagement.plist +++ /dev/null @@ -1,22 +0,0 @@ - - - - - SchemeUserState - - Tumblr.xcscheme - - orderHint - 0 - - - SuppressBuildableAutocreation - - 1902A7CD1D03495A000884E5 - - primary - - - - - diff --git a/Project 12 - Tumblr/Tumblr/AppDelegate.swift b/Project 12 - Tumblr/Tumblr/AppDelegate.swift index b8cecc76..a7f8b9e6 100644 --- a/Project 12 - Tumblr/Tumblr/AppDelegate.swift +++ b/Project 12 - Tumblr/Tumblr/AppDelegate.swift @@ -14,7 +14,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? - func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch. return true } diff --git a/Project 13 - TwitterBird/TwitterBird.xcodeproj/project.pbxproj b/Project 13 - TwitterBird/TwitterBird.xcodeproj/project.pbxproj index 6ece908e..21a62078 100644 --- a/Project 13 - TwitterBird/TwitterBird.xcodeproj/project.pbxproj +++ b/Project 13 - TwitterBird/TwitterBird.xcodeproj/project.pbxproj @@ -9,7 +9,6 @@ /* Begin PBXBuildFile section */ 1907F6DE1D5EE14F000F9826 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1907F6DD1D5EE14F000F9826 /* AppDelegate.swift */; }; 1907F6E51D5EE14F000F9826 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 1907F6E41D5EE14F000F9826 /* Assets.xcassets */; }; - 1907F6F01D5EE921000F9826 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 1907F6EF1D5EE921000F9826 /* Default-568h@2x.png */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -17,7 +16,6 @@ 1907F6DD1D5EE14F000F9826 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 1907F6E41D5EE14F000F9826 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 1907F6E91D5EE14F000F9826 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 1907F6EF1D5EE921000F9826 /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -34,7 +32,6 @@ 1907F6D11D5EE14F000F9826 = { isa = PBXGroup; children = ( - 1907F6EF1D5EE921000F9826 /* Default-568h@2x.png */, 1907F6DC1D5EE14F000F9826 /* TwitterBird */, 1907F6DB1D5EE14F000F9826 /* Products */, ); @@ -85,18 +82,18 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0730; - LastUpgradeCheck = 0820; + LastUpgradeCheck = 1020; ORGANIZATIONNAME = yigu; TargetAttributes = { 1907F6D91D5EE14F000F9826 = { CreatedOnToolsVersion = 7.3.1; - LastSwiftMigration = 0820; + LastSwiftMigration = 1020; }; }; }; buildConfigurationList = 1907F6D51D5EE14F000F9826 /* Build configuration list for PBXProject "TwitterBird" */; compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; + developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, @@ -118,7 +115,6 @@ buildActionMask = 2147483647; files = ( 1907F6E51D5EE14F000F9826 /* Assets.xcassets in Resources */, - 1907F6F01D5EE921000F9826 /* Default-568h@2x.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -140,19 +136,28 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -175,7 +180,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.3; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -188,19 +193,28 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -217,7 +231,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.3; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; @@ -230,11 +244,12 @@ isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; INFOPLIST_FILE = TwitterBird/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.yigu.TwitterBird; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; }; name = Debug; }; @@ -242,11 +257,12 @@ isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; INFOPLIST_FILE = TwitterBird/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.yigu.TwitterBird; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; }; name = Release; }; diff --git a/Project 13 - TwitterBird/TwitterBird.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Project 13 - TwitterBird/TwitterBird.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/Project 13 - TwitterBird/TwitterBird.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Project 13 - TwitterBird/TwitterBird.xcodeproj/project.xcworkspace/xcuserdata/Yi.xcuserdatad/UserInterfaceState.xcuserstate b/Project 13 - TwitterBird/TwitterBird.xcodeproj/project.xcworkspace/xcuserdata/Yi.xcuserdatad/UserInterfaceState.xcuserstate index 38a7af91..98dac9e6 100644 Binary files a/Project 13 - TwitterBird/TwitterBird.xcodeproj/project.xcworkspace/xcuserdata/Yi.xcuserdatad/UserInterfaceState.xcuserstate and b/Project 13 - TwitterBird/TwitterBird.xcodeproj/project.xcworkspace/xcuserdata/Yi.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/Project 13 - TwitterBird/TwitterBird.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/TwitterBird.xcscheme b/Project 13 - TwitterBird/TwitterBird.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/TwitterBird.xcscheme index b27644f9..3514beab 100644 --- a/Project 13 - TwitterBird/TwitterBird.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/TwitterBird.xcscheme +++ b/Project 13 - TwitterBird/TwitterBird.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/TwitterBird.xcscheme @@ -1,6 +1,6 @@ Bool { + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { window = UIWindow(frame: UIScreen.main.bounds) if let window = window { @@ -38,8 +38,6 @@ class AppDelegate: UIResponder, UIApplicationDelegate, CAAnimationDelegate { window.makeKeyAndVisible() } - // hide the status bar - UIApplication.shared.isStatusBarHidden = true return true } @@ -60,7 +58,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate, CAAnimationDelegate { keyFrameAnimation.keyTimes = [0, 0.3, 1] // add animation to current view - keyFrameAnimation.timingFunctions = [CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut), CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseOut)] + keyFrameAnimation.timingFunctions = [CAMediaTimingFunction(name: CAMediaTimingFunctionName.easeInEaseOut), CAMediaTimingFunction(name: CAMediaTimingFunctionName.easeOut)] mask!.add(keyFrameAnimation, forKey: "bounds") } diff --git a/Project 13 - TwitterBird/TwitterBird/Assets.xcassets/AppIcon.appiconset/Contents.json b/Project 13 - TwitterBird/TwitterBird/Assets.xcassets/AppIcon.appiconset/Contents.json index eeea76c2..d8db8d65 100644 --- a/Project 13 - TwitterBird/TwitterBird/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/Project 13 - TwitterBird/TwitterBird/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -1,5 +1,15 @@ { "images" : [ + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "3x" + }, { "idiom" : "iphone", "size" : "29x29", @@ -30,6 +40,16 @@ "size" : "60x60", "scale" : "3x" }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "2x" + }, { "idiom" : "ipad", "size" : "29x29", @@ -64,6 +84,11 @@ "idiom" : "ipad", "size" : "83.5x83.5", "scale" : "2x" + }, + { + "idiom" : "ios-marketing", + "size" : "1024x1024", + "scale" : "1x" } ], "info" : { diff --git a/Project 13 - TwitterBird/TwitterBird/Assets.xcassets/LaunchImage.launchimage/Contents.json b/Project 13 - TwitterBird/TwitterBird/Assets.xcassets/LaunchImage.launchimage/Contents.json new file mode 100644 index 00000000..51a07798 --- /dev/null +++ b/Project 13 - TwitterBird/TwitterBird/Assets.xcassets/LaunchImage.launchimage/Contents.json @@ -0,0 +1,190 @@ +{ + "images" : [ + { + "orientation" : "portrait", + "idiom" : "iphone", + "extent" : "full-screen", + "minimum-system-version" : "12.0", + "subtype" : "2688h", + "scale" : "3x" + }, + { + "orientation" : "landscape", + "idiom" : "iphone", + "extent" : "full-screen", + "minimum-system-version" : "12.0", + "subtype" : "2688h", + "scale" : "3x" + }, + { + "orientation" : "portrait", + "idiom" : "iphone", + "extent" : "full-screen", + "minimum-system-version" : "12.0", + "subtype" : "1792h", + "scale" : "2x" + }, + { + "orientation" : "landscape", + "idiom" : "iphone", + "extent" : "full-screen", + "minimum-system-version" : "12.0", + "subtype" : "1792h", + "scale" : "2x" + }, + { + "orientation" : "portrait", + "idiom" : "iphone", + "extent" : "full-screen", + "minimum-system-version" : "11.0", + "subtype" : "2436h", + "scale" : "3x" + }, + { + "orientation" : "landscape", + "idiom" : "iphone", + "extent" : "full-screen", + "minimum-system-version" : "11.0", + "subtype" : "2436h", + "scale" : "3x" + }, + { + "orientation" : "portrait", + "idiom" : "iphone", + "extent" : "full-screen", + "minimum-system-version" : "8.0", + "subtype" : "736h", + "scale" : "3x" + }, + { + "orientation" : "landscape", + "idiom" : "iphone", + "extent" : "full-screen", + "minimum-system-version" : "8.0", + "subtype" : "736h", + "scale" : "3x" + }, + { + "orientation" : "portrait", + "idiom" : "iphone", + "extent" : "full-screen", + "minimum-system-version" : "8.0", + "subtype" : "667h", + "scale" : "2x" + }, + { + "orientation" : "portrait", + "idiom" : "iphone", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "scale" : "2x" + }, + { + "orientation" : "portrait", + "idiom" : "iphone", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "subtype" : "retina4", + "scale" : "2x" + }, + { + "orientation" : "portrait", + "idiom" : "ipad", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "scale" : "1x" + }, + { + "orientation" : "landscape", + "idiom" : "ipad", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "scale" : "1x" + }, + { + "orientation" : "portrait", + "idiom" : "ipad", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "scale" : "2x" + }, + { + "orientation" : "landscape", + "idiom" : "ipad", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "scale" : "2x" + }, + { + "orientation" : "portrait", + "idiom" : "iphone", + "extent" : "full-screen", + "scale" : "1x" + }, + { + "orientation" : "portrait", + "idiom" : "iphone", + "extent" : "full-screen", + "scale" : "2x" + }, + { + "orientation" : "portrait", + "idiom" : "iphone", + "extent" : "full-screen", + "subtype" : "retina4", + "scale" : "2x" + }, + { + "orientation" : "portrait", + "idiom" : "ipad", + "extent" : "to-status-bar", + "scale" : "1x" + }, + { + "orientation" : "portrait", + "idiom" : "ipad", + "extent" : "full-screen", + "scale" : "1x" + }, + { + "orientation" : "landscape", + "idiom" : "ipad", + "extent" : "to-status-bar", + "scale" : "1x" + }, + { + "orientation" : "landscape", + "idiom" : "ipad", + "extent" : "full-screen", + "scale" : "1x" + }, + { + "orientation" : "portrait", + "idiom" : "ipad", + "extent" : "to-status-bar", + "scale" : "2x" + }, + { + "orientation" : "portrait", + "idiom" : "ipad", + "extent" : "full-screen", + "scale" : "2x" + }, + { + "orientation" : "landscape", + "idiom" : "ipad", + "extent" : "to-status-bar", + "scale" : "2x" + }, + { + "orientation" : "landscape", + "idiom" : "ipad", + "extent" : "full-screen", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Project 13 - TwitterBird/TwitterBird/Assets.xcassets/twitterScreen.imageset/Contents.json b/Project 13 - TwitterBird/TwitterBird/Assets.xcassets/twitterScreen.imageset/Contents.json index 181df8b6..f3ed0da5 100644 --- a/Project 13 - TwitterBird/TwitterBird/Assets.xcassets/twitterScreen.imageset/Contents.json +++ b/Project 13 - TwitterBird/TwitterBird/Assets.xcassets/twitterScreen.imageset/Contents.json @@ -2,15 +2,17 @@ "images" : [ { "idiom" : "universal", - "filename" : "IMG_8573.jpg", + "filename" : "IMG_291473DCAF73-1.jpeg", "scale" : "1x" }, { "idiom" : "universal", + "filename" : "IMG_291473DCAF73-2.jpeg", "scale" : "2x" }, { "idiom" : "universal", + "filename" : "IMG_291473DCAF73-3.jpeg", "scale" : "3x" } ], diff --git a/Project 13 - TwitterBird/TwitterBird/Assets.xcassets/twitterScreen.imageset/IMG_291473DCAF73-1.jpeg b/Project 13 - TwitterBird/TwitterBird/Assets.xcassets/twitterScreen.imageset/IMG_291473DCAF73-1.jpeg new file mode 100644 index 00000000..2666d985 Binary files /dev/null and b/Project 13 - TwitterBird/TwitterBird/Assets.xcassets/twitterScreen.imageset/IMG_291473DCAF73-1.jpeg differ diff --git a/Project 13 - TwitterBird/TwitterBird/Assets.xcassets/twitterScreen.imageset/IMG_291473DCAF73-2.jpeg b/Project 13 - TwitterBird/TwitterBird/Assets.xcassets/twitterScreen.imageset/IMG_291473DCAF73-2.jpeg new file mode 100644 index 00000000..2666d985 Binary files /dev/null and b/Project 13 - TwitterBird/TwitterBird/Assets.xcassets/twitterScreen.imageset/IMG_291473DCAF73-2.jpeg differ diff --git a/Project 13 - TwitterBird/TwitterBird/Assets.xcassets/twitterScreen.imageset/IMG_291473DCAF73-3.jpeg b/Project 13 - TwitterBird/TwitterBird/Assets.xcassets/twitterScreen.imageset/IMG_291473DCAF73-3.jpeg new file mode 100644 index 00000000..2666d985 Binary files /dev/null and b/Project 13 - TwitterBird/TwitterBird/Assets.xcassets/twitterScreen.imageset/IMG_291473DCAF73-3.jpeg differ diff --git a/Project 13 - TwitterBird/TwitterBird/Assets.xcassets/twitterScreen.imageset/IMG_8573.jpg b/Project 13 - TwitterBird/TwitterBird/Assets.xcassets/twitterScreen.imageset/IMG_8573.jpg deleted file mode 100644 index 1df41ed1..00000000 Binary files a/Project 13 - TwitterBird/TwitterBird/Assets.xcassets/twitterScreen.imageset/IMG_8573.jpg and /dev/null differ diff --git a/Project 14 - QuoraDots/QuoraDots.xcodeproj/project.pbxproj b/Project 14 - QuoraDots/QuoraDots.xcodeproj/project.pbxproj index 0accdbbd..d4224404 100644 --- a/Project 14 - QuoraDots/QuoraDots.xcodeproj/project.pbxproj +++ b/Project 14 - QuoraDots/QuoraDots.xcodeproj/project.pbxproj @@ -91,18 +91,18 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0730; - LastUpgradeCheck = 0820; + LastUpgradeCheck = 1020; ORGANIZATIONNAME = yigu; TargetAttributes = { 199BEF681D6D74B600B2A4CC = { CreatedOnToolsVersion = 7.3.1; - LastSwiftMigration = 0820; + LastSwiftMigration = 1020; }; }; }; buildConfigurationList = 199BEF641D6D74B600B2A4CC /* Build configuration list for PBXProject "QuoraDots" */; compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; + developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, @@ -167,19 +167,28 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -202,7 +211,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.3; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -215,19 +224,28 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -244,7 +262,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.3; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; @@ -261,7 +279,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.yigu.QuoraDots; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; }; name = Debug; }; @@ -273,7 +291,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.yigu.QuoraDots; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; }; name = Release; }; diff --git a/Project 14 - QuoraDots/QuoraDots.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Project 14 - QuoraDots/QuoraDots.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/Project 14 - QuoraDots/QuoraDots.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Project 14 - QuoraDots/QuoraDots.xcodeproj/project.xcworkspace/xcuserdata/Yi.xcuserdatad/UserInterfaceState.xcuserstate b/Project 14 - QuoraDots/QuoraDots.xcodeproj/project.xcworkspace/xcuserdata/Yi.xcuserdatad/UserInterfaceState.xcuserstate index 6734a509..6aaebaec 100644 Binary files a/Project 14 - QuoraDots/QuoraDots.xcodeproj/project.xcworkspace/xcuserdata/Yi.xcuserdatad/UserInterfaceState.xcuserstate and b/Project 14 - QuoraDots/QuoraDots.xcodeproj/project.xcworkspace/xcuserdata/Yi.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/Project 14 - QuoraDots/QuoraDots.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/QuoraDots.xcscheme b/Project 14 - QuoraDots/QuoraDots.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/QuoraDots.xcscheme index 0841351f..cced453f 100644 --- a/Project 14 - QuoraDots/QuoraDots.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/QuoraDots.xcscheme +++ b/Project 14 - QuoraDots/QuoraDots.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/QuoraDots.xcscheme @@ -1,6 +1,6 @@ Bool { - // Override point for customization after application launch. + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { + return true } - - func applicationWillResignActive(_ application: UIApplication) { - // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. - // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. - } - - func applicationDidEnterBackground(_ application: UIApplication) { - // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. - // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. - } - - func applicationWillEnterForeground(_ application: UIApplication) { - // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. - } - - func applicationDidBecomeActive(_ application: UIApplication) { - // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. - } - - func applicationWillTerminate(_ application: UIApplication) { - // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. - } - - } diff --git a/Project 14 - QuoraDots/QuoraDots/Base.lproj/Main.storyboard b/Project 14 - QuoraDots/QuoraDots/Base.lproj/Main.storyboard index 74467e6d..e5b88120 100644 --- a/Project 14 - QuoraDots/QuoraDots/Base.lproj/Main.storyboard +++ b/Project 14 - QuoraDots/QuoraDots/Base.lproj/Main.storyboard @@ -1,12 +1,12 @@ - + - - + + @@ -14,38 +14,35 @@ - - - - - + - + + - + - + - + - + - + - + @@ -54,14 +51,14 @@ - + - - - + + + diff --git a/Project 15 - SnapchatMenu/SnapchatMenu.xcodeproj/project.pbxproj b/Project 15 - SnapchatMenu/SnapchatMenu.xcodeproj/project.pbxproj index c609e302..337a00ab 100644 --- a/Project 15 - SnapchatMenu/SnapchatMenu.xcodeproj/project.pbxproj +++ b/Project 15 - SnapchatMenu/SnapchatMenu.xcodeproj/project.pbxproj @@ -133,19 +133,20 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0820; - LastUpgradeCheck = 0820; + LastUpgradeCheck = 1020; ORGANIZATIONNAME = "Yi Gu"; TargetAttributes = { 198BAEA11E18DBE700D3616F = { CreatedOnToolsVersion = 8.2.1; DevelopmentTeam = 44JDRP3T56; + LastSwiftMigration = 1020; ProvisioningStyle = Automatic; }; }; }; buildConfigurationList = 198BAE9D1E18DBE700D3616F /* Build configuration list for PBXProject "SnapchatMenu" */; compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; + developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, @@ -216,20 +217,29 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -266,20 +276,29 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -315,7 +334,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = yigu.SnapchatMenu; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; }; name = Debug; }; @@ -329,7 +348,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = yigu.SnapchatMenu; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; }; name = Release; }; diff --git a/Project 15 - SnapchatMenu/SnapchatMenu.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Project 15 - SnapchatMenu/SnapchatMenu.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/Project 15 - SnapchatMenu/SnapchatMenu.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Project 15 - SnapchatMenu/SnapchatMenu.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/SnapchatMenu.xcscheme b/Project 15 - SnapchatMenu/SnapchatMenu.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/SnapchatMenu.xcscheme index 6f5c0a80..1298103d 100644 --- a/Project 15 - SnapchatMenu/SnapchatMenu.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/SnapchatMenu.xcscheme +++ b/Project 15 - SnapchatMenu/SnapchatMenu.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/SnapchatMenu.xcscheme @@ -1,6 +1,6 @@ Bool { + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch. return true } diff --git a/Project 15 - SnapchatMenu/SnapchatMenu/Assets.xcassets/AppIcon.appiconset/Contents.json b/Project 15 - SnapchatMenu/SnapchatMenu/Assets.xcassets/AppIcon.appiconset/Contents.json index d8dd18b0..6da4ad7a 100644 --- a/Project 15 - SnapchatMenu/SnapchatMenu/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/Project 15 - SnapchatMenu/SnapchatMenu/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -95,6 +95,11 @@ "size" : "83.5x83.5", "scale" : "2x" }, + { + "idiom" : "ios-marketing", + "size" : "1024x1024", + "scale" : "1x" + }, { "size" : "60x60", "idiom" : "car", @@ -142,6 +147,20 @@ "role" : "appLauncher", "subtype" : "38mm" }, + { + "size" : "44x44", + "idiom" : "watch", + "scale" : "2x", + "role" : "appLauncher", + "subtype" : "40mm" + }, + { + "size" : "50x50", + "idiom" : "watch", + "scale" : "2x", + "role" : "appLauncher", + "subtype" : "44mm" + }, { "size" : "86x86", "idiom" : "watch", @@ -155,6 +174,18 @@ "scale" : "2x", "role" : "quickLook", "subtype" : "42mm" + }, + { + "size" : "108x108", + "idiom" : "watch", + "scale" : "2x", + "role" : "quickLook", + "subtype" : "44mm" + }, + { + "idiom" : "watch-marketing", + "size" : "1024x1024", + "scale" : "1x" } ], "info" : { diff --git a/Project 15 - SnapchatMenu/SnapchatMenu/ChatViewController.xib b/Project 15 - SnapchatMenu/SnapchatMenu/ChatViewController.xib index 34ab5476..95a9c093 100644 --- a/Project 15 - SnapchatMenu/SnapchatMenu/ChatViewController.xib +++ b/Project 15 - SnapchatMenu/SnapchatMenu/ChatViewController.xib @@ -1,10 +1,11 @@ - + - + + diff --git a/Project 15 - SnapchatMenu/SnapchatMenu/DiscoverViewController.xib b/Project 15 - SnapchatMenu/SnapchatMenu/DiscoverViewController.xib index 5004e1f6..e2da1b61 100644 --- a/Project 15 - SnapchatMenu/SnapchatMenu/DiscoverViewController.xib +++ b/Project 15 - SnapchatMenu/SnapchatMenu/DiscoverViewController.xib @@ -1,10 +1,11 @@ - + - + + @@ -19,7 +20,7 @@ - + diff --git a/Project 15 - SnapchatMenu/SnapchatMenu/StoriesViewController.xib b/Project 15 - SnapchatMenu/SnapchatMenu/StoriesViewController.xib index 23877ff1..08ece292 100644 --- a/Project 15 - SnapchatMenu/SnapchatMenu/StoriesViewController.xib +++ b/Project 15 - SnapchatMenu/SnapchatMenu/StoriesViewController.xib @@ -1,10 +1,11 @@ - + - + + @@ -19,7 +20,7 @@ - + diff --git a/Project 15 - SnapchatMenu/SnapchatMenu/ViewController.swift b/Project 15 - SnapchatMenu/SnapchatMenu/ViewController.swift index b392e06f..e103f091 100644 --- a/Project 15 - SnapchatMenu/SnapchatMenu/ViewController.swift +++ b/Project 15 - SnapchatMenu/SnapchatMenu/ViewController.swift @@ -53,8 +53,8 @@ class ViewController: UIViewController { } fileprivate func add(childViewController: UIViewController, toParentViewController parentViewController: UIViewController) { - addChildViewController(childViewController) + addChild(childViewController) scrollView.addSubview(childViewController.view) - childViewController.didMove(toParentViewController: parentViewController) + childViewController.didMove(toParent: parentViewController) } } diff --git a/Project 16 - SpotifySignIn/SpotifySignIn.xcodeproj/project.pbxproj b/Project 16 - SpotifySignIn/SpotifySignIn.xcodeproj/project.pbxproj index 76181d7f..07ed12e9 100644 --- a/Project 16 - SpotifySignIn/SpotifySignIn.xcodeproj/project.pbxproj +++ b/Project 16 - SpotifySignIn/SpotifySignIn.xcodeproj/project.pbxproj @@ -124,18 +124,18 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0730; - LastUpgradeCheck = 0820; + LastUpgradeCheck = 1020; ORGANIZATIONNAME = YiGu; TargetAttributes = { 192BA0F01CD3293100117FF6 = { CreatedOnToolsVersion = 7.3; - LastSwiftMigration = 0820; + LastSwiftMigration = 1020; }; }; }; buildConfigurationList = 192BA0EC1CD3293100117FF6 /* Build configuration list for PBXProject "SpotifySignIn" */; compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; + developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, @@ -203,19 +203,28 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -238,7 +247,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.3; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -250,19 +259,28 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -279,7 +297,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.3; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; @@ -296,7 +314,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.yigu.SpotifySignIn; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; }; name = Debug; }; @@ -309,7 +327,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.yigu.SpotifySignIn; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; }; name = Release; }; diff --git a/Project 16 - SpotifySignIn/SpotifySignIn.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Project 16 - SpotifySignIn/SpotifySignIn.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/Project 16 - SpotifySignIn/SpotifySignIn.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Project 16 - SpotifySignIn/SpotifySignIn.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/SpotifySignIn.xcscheme b/Project 16 - SpotifySignIn/SpotifySignIn.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/SpotifySignIn.xcscheme index a9f8ccee..ad9ada79 100644 --- a/Project 16 - SpotifySignIn/SpotifySignIn.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/SpotifySignIn.xcscheme +++ b/Project 16 - SpotifySignIn/SpotifySignIn.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/SpotifySignIn.xcscheme @@ -1,6 +1,6 @@ Bool { + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch. return true } - - func applicationWillResignActive(_ application: UIApplication) { - // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. - // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. - } - - func applicationDidEnterBackground(_ application: UIApplication) { - // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. - // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. - } - - func applicationWillEnterForeground(_ application: UIApplication) { - // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. - } - - func applicationDidBecomeActive(_ application: UIApplication) { - // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. - } - - func applicationWillTerminate(_ application: UIApplication) { - // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. - } - - } diff --git a/Project 16 - SpotifySignIn/SpotifySignIn/Base.lproj/Main.storyboard b/Project 16 - SpotifySignIn/SpotifySignIn/Base.lproj/Main.storyboard index 23e9a9cf..4d426cf0 100644 --- a/Project 16 - SpotifySignIn/SpotifySignIn/Base.lproj/Main.storyboard +++ b/Project 16 - SpotifySignIn/SpotifySignIn/Base.lproj/Main.storyboard @@ -1,7 +1,12 @@ - - + + + + + - + + + @@ -24,26 +29,26 @@ - + - - + + - - + diff --git a/Project 16 - SpotifySignIn/VideoCutter.swift b/Project 16 - SpotifySignIn/VideoCutter.swift index 9d34ce52..42f3ed1a 100644 --- a/Project 16 - SpotifySignIn/VideoCutter.swift +++ b/Project 16 - SpotifySignIn/VideoCutter.swift @@ -42,19 +42,19 @@ open class VideoCutter: NSObject { if let exportSession = exportSession as AVAssetExportSession? { exportSession.outputURL = URL(fileURLWithPath: outputURL) exportSession.shouldOptimizeForNetworkUse = true - exportSession.outputFileType = AVFileTypeMPEG4 - let start = CMTimeMakeWithSeconds(Float64(startTime), 600) - let duration = CMTimeMakeWithSeconds(Float64(duration), 600) - let range = CMTimeRangeMake(start, duration) + exportSession.outputFileType = AVFileType.mp4 + let start = CMTimeMakeWithSeconds(Float64(startTime), preferredTimescale: 600) + let duration = CMTimeMakeWithSeconds(Float64(duration), preferredTimescale: 600) + let range = CMTimeRangeMake(start: start, duration: duration) exportSession.timeRange = range exportSession.exportAsynchronously { () -> Void in switch exportSession.status { case AVAssetExportSessionStatus.completed: completion?(exportSession.outputURL, nil) case AVAssetExportSessionStatus.failed: - print("Failed: \(exportSession.error)") + print("Failed: \(String(describing: exportSession.error))") case AVAssetExportSessionStatus.cancelled: - print("Failed: \(exportSession.error)") + print("Failed: \(String(describing: exportSession.error))") default: print("default case") } diff --git a/Project 16 - SpotifySignIn/VideoSplashViewController.swift b/Project 16 - SpotifySignIn/VideoSplashViewController.swift index a62302f7..ad337d63 100644 --- a/Project 16 - SpotifySignIn/VideoSplashViewController.swift +++ b/Project 16 - SpotifySignIn/VideoSplashViewController.swift @@ -62,11 +62,11 @@ open class VideoSplashViewController: UIViewController { didSet { switch fillMode { case .resize: - moviePlayer.videoGravity = AVLayerVideoGravityResize + moviePlayer.videoGravity = convertToAVLayerVideoGravity(AVLayerVideoGravity.resize.rawValue) case .resizeAspect: - moviePlayer.videoGravity = AVLayerVideoGravityResizeAspect + moviePlayer.videoGravity = convertToAVLayerVideoGravity(AVLayerVideoGravity.resizeAspect.rawValue) case .resizeAspectFill: - moviePlayer.videoGravity = AVLayerVideoGravityResizeAspectFill + moviePlayer.videoGravity = convertToAVLayerVideoGravity(AVLayerVideoGravity.resizeAspectFill.rawValue) } } } @@ -75,7 +75,7 @@ open class VideoSplashViewController: UIViewController { moviePlayer.view.frame = videoFrame moviePlayer.showsPlaybackControls = false view.addSubview(moviePlayer.view) - view.sendSubview(toBack: moviePlayer.view) + view.sendSubviewToBack(moviePlayer.view) } override open func viewWillDisappear(_ animated: Bool) { @@ -106,8 +106,13 @@ open class VideoSplashViewController: UIViewController { super.didReceiveMemoryWarning() } - func playerItemDidReachEnd() { - moviePlayer.player?.seek(to: kCMTimeZero) + @objc func playerItemDidReachEnd() { + moviePlayer.player?.seek(to: CMTime.zero) moviePlayer.player?.play() } } + +// Helper function inserted by Swift 4.2 migrator. +fileprivate func convertToAVLayerVideoGravity(_ input: String) -> AVLayerVideoGravity { + return AVLayerVideoGravity(rawValue: input) +} diff --git a/Project 17 - BlueLibrarySwift/BlueLibrarySwift.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/BlueLibrarySwift.xcscheme b/Project 17 - BlueLibrarySwift/BlueLibrarySwift.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/BlueLibrarySwift.xcscheme deleted file mode 100644 index a9ababb9..00000000 --- a/Project 17 - BlueLibrarySwift/BlueLibrarySwift.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/BlueLibrarySwift.xcscheme +++ /dev/null @@ -1,101 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Project 17 - BlueLibrarySwift/BlueLibrarySwift.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/xcschememanagement.plist b/Project 17 - BlueLibrarySwift/BlueLibrarySwift.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/xcschememanagement.plist deleted file mode 100644 index f057c471..00000000 --- a/Project 17 - BlueLibrarySwift/BlueLibrarySwift.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/xcschememanagement.plist +++ /dev/null @@ -1,27 +0,0 @@ - - - - - SchemeUserState - - BlueLibrarySwift.xcscheme - - orderHint - 0 - - - SuppressBuildableAutocreation - - 101DD6C41A052EDE00161F0D - - primary - - - 101DD6D91A052EDE00161F0D - - primary - - - - - diff --git a/Project 17 - BlueLibrarySwift/BlueLibrarySwift.xcodeproj/xcuserdata/vincentngo.xcuserdatad/xcschemes/BlueLibrarySwift.xcscheme b/Project 17 - BlueLibrarySwift/BlueLibrarySwift.xcodeproj/xcuserdata/vincentngo.xcuserdatad/xcschemes/BlueLibrarySwift.xcscheme deleted file mode 100644 index 8df6d0cf..00000000 --- a/Project 17 - BlueLibrarySwift/BlueLibrarySwift.xcodeproj/xcuserdata/vincentngo.xcuserdatad/xcschemes/BlueLibrarySwift.xcscheme +++ /dev/null @@ -1,110 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Project 17 - BlueLibrarySwift/BlueLibrarySwift.xcodeproj/xcuserdata/vincentngo.xcuserdatad/xcschemes/xcschememanagement.plist b/Project 17 - BlueLibrarySwift/BlueLibrarySwift.xcodeproj/xcuserdata/vincentngo.xcuserdatad/xcschemes/xcschememanagement.plist deleted file mode 100644 index f057c471..00000000 --- a/Project 17 - BlueLibrarySwift/BlueLibrarySwift.xcodeproj/xcuserdata/vincentngo.xcuserdatad/xcschemes/xcschememanagement.plist +++ /dev/null @@ -1,27 +0,0 @@ - - - - - SchemeUserState - - BlueLibrarySwift.xcscheme - - orderHint - 0 - - - SuppressBuildableAutocreation - - 101DD6C41A052EDE00161F0D - - primary - - - 101DD6D91A052EDE00161F0D - - primary - - - - - diff --git a/Project 17 - BlueLibrarySwift/BlueLibrarySwift.xcodeproj/xcuserdata/yigu.xcuserdatad/xcschemes/BlueLibrarySwift.xcscheme b/Project 17 - BlueLibrarySwift/BlueLibrarySwift.xcodeproj/xcuserdata/yigu.xcuserdatad/xcschemes/BlueLibrarySwift.xcscheme deleted file mode 100644 index fa9f6773..00000000 --- a/Project 17 - BlueLibrarySwift/BlueLibrarySwift.xcodeproj/xcuserdata/yigu.xcuserdatad/xcschemes/BlueLibrarySwift.xcscheme +++ /dev/null @@ -1,101 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Project 17 - BlueLibrarySwift/BlueLibrarySwift.xcodeproj/xcuserdata/yigu.xcuserdatad/xcschemes/xcschememanagement.plist b/Project 17 - BlueLibrarySwift/BlueLibrarySwift.xcodeproj/xcuserdata/yigu.xcuserdatad/xcschemes/xcschememanagement.plist deleted file mode 100644 index f057c471..00000000 --- a/Project 17 - BlueLibrarySwift/BlueLibrarySwift.xcodeproj/xcuserdata/yigu.xcuserdatad/xcschemes/xcschememanagement.plist +++ /dev/null @@ -1,27 +0,0 @@ - - - - - SchemeUserState - - BlueLibrarySwift.xcscheme - - orderHint - 0 - - - SuppressBuildableAutocreation - - 101DD6C41A052EDE00161F0D - - primary - - - 101DD6D91A052EDE00161F0D - - primary - - - - - diff --git a/Project 17 - BlueLibrarySwift/BlueLibrarySwift/Album.swift b/Project 17 - BlueLibrarySwift/BlueLibrarySwift/Album.swift deleted file mode 100644 index 0a68e93c..00000000 --- a/Project 17 - BlueLibrarySwift/BlueLibrarySwift/Album.swift +++ /dev/null @@ -1,57 +0,0 @@ -// -// Album.swift -// BlueLibrarySwift -// -// Created by Yi Gu on 5/6/16. -// Copyright © 2016 Raywenderlich. All rights reserved. -// - -import UIKit - -class Album: NSObject, NSCoding { - var title: String! - var artist: String! - var genre: String! - var coverUrl: String! - var year: String! - - init(title: String, artist: String, genre: String, coverUrl: String, year: String) { - super.init() - - self.title = title - self.artist = artist - self.genre = genre - self.coverUrl = coverUrl - self.year = year - } - - override var description: String { - return "title: \(title)" + - "artist: \(artist)" + - "genre: \(genre)" + - "coverUrl: \(coverUrl)" + - "year: \(year)" - } - - required init(coder decoder: NSCoder) { - super.init() - self.title = decoder.decodeObject(forKey: "title") as! String - self.artist = decoder.decodeObject(forKey: "artist") as! String - self.genre = decoder.decodeObject(forKey: "genre") as! String - self.coverUrl = decoder.decodeObject(forKey: "cover_url") as! String - self.year = decoder.decodeObject(forKey: "year") as! String - } - - // will be called when Album to be achived - func encode(with aCoder: NSCoder) { - aCoder.encode(title, forKey: "title") - aCoder.encode(artist, forKey: "artist") - aCoder.encode(genre, forKey: "genre") - aCoder.encode(coverUrl, forKey: "cover_url") - aCoder.encode(year, forKey: "year") - } - - -} - - diff --git a/Project 17 - BlueLibrarySwift/BlueLibrarySwift/AlbumExtensions.swift b/Project 17 - BlueLibrarySwift/BlueLibrarySwift/AlbumExtensions.swift deleted file mode 100644 index 86313ef1..00000000 --- a/Project 17 - BlueLibrarySwift/BlueLibrarySwift/AlbumExtensions.swift +++ /dev/null @@ -1,15 +0,0 @@ -// -// AlbumExtensions.swift -// BlueLibrarySwift -// -// Created by Yi Gu on 5/6/16. -// Copyright © 2016 Raywenderlich. All rights reserved. -// - -import Foundation - -extension Album { - func ae_tableRepresentation() -> (titles:[String], values:[String]) { - return (["Artist", "Album", "Genre", "Year"], [artist, title, genre, year]) - } -} diff --git a/Project 17 - BlueLibrarySwift/BlueLibrarySwift/AlbumView.swift b/Project 17 - BlueLibrarySwift/BlueLibrarySwift/AlbumView.swift deleted file mode 100644 index c12457b2..00000000 --- a/Project 17 - BlueLibrarySwift/BlueLibrarySwift/AlbumView.swift +++ /dev/null @@ -1,68 +0,0 @@ -// -// AlbumView.swift -// BlueLibrarySwift -// -// Created by Yi Gu on 5/6/16. -// Copyright © 2016 Raywenderlich. All rights reserved. -// - -import UIKit - -class AlbumView: UIView { - fileprivate var coverImage: UIImageView! - fileprivate var indicator: UIActivityIndicatorView! - - required init(coder aDecoder: NSCoder) { - super.init(coder: aDecoder)! - commonInit() - } - - init(frame: CGRect, albumCover: String) { - super.init(frame: frame) - commonInit() - setupNotification(albumCover) - } - - deinit { - coverImage.removeObserver(self, forKeyPath: "image") - } - - func commonInit() { - setupUI() - setupComponents() - } - - func highlightAlbum(_ didHightlightView: Bool) { - if didHightlightView { - backgroundColor = UIColor.white - } else { - backgroundColor = UIColor.black - } - } - - fileprivate func setupUI() { - backgroundColor = UIColor.blue - } - - fileprivate func setupComponents() { - coverImage = UIImageView(frame: CGRect(x: 5, y: 5, width: frame.size.width - 10, height: frame.size.height - 10)) - addSubview(coverImage) - - indicator = UIActivityIndicatorView() - indicator.center = center - indicator.activityIndicatorViewStyle = .whiteLarge - indicator.startAnimating() - addSubview(indicator) - coverImage.addObserver(self, forKeyPath: "image", options: [], context: nil) - } - - fileprivate func setupNotification(_ albumCover: String) { - NotificationCenter.default.post(name: Notification.Name(rawValue: downloadImageNotification), object: self, userInfo: ["imageView":coverImage, "coverUrl" : albumCover]) - } - - override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { - if keyPath == "image" { - indicator.stopAnimating() - } - } -} diff --git a/Project 17 - BlueLibrarySwift/BlueLibrarySwift/AppDelegate.swift b/Project 17 - BlueLibrarySwift/BlueLibrarySwift/AppDelegate.swift deleted file mode 100644 index ebf3d3de..00000000 --- a/Project 17 - BlueLibrarySwift/BlueLibrarySwift/AppDelegate.swift +++ /dev/null @@ -1,60 +0,0 @@ -/* -* Copyright (c) 2014 Razeware LLC -* -* Permission is hereby granted, free of charge, to any person obtaining a copy -* of this software and associated documentation files (the "Software"), to deal -* in the Software without restriction, including without limitation the rights -* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -* copies of the Software, and to permit persons to whom the Software is -* furnished to do so, subject to the following conditions: -* -* The above copyright notice and this permission notice shall be included in -* all copies or substantial portions of the Software. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -* THE SOFTWARE. -*/ - -import UIKit - -@UIApplicationMain -class AppDelegate: UIResponder, UIApplicationDelegate { - - var window: UIWindow? - - - func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { - // Override point for customization after application launch. - return true - } - - func applicationWillResignActive(_ application: UIApplication) { - // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. - // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. - } - - func applicationDidEnterBackground(_ application: UIApplication) { - // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. - // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. - } - - func applicationWillEnterForeground(_ application: UIApplication) { - // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. - } - - func applicationDidBecomeActive(_ application: UIApplication) { - // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. - } - - func applicationWillTerminate(_ application: UIApplication) { - // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. - } - - -} - diff --git a/Project 17 - BlueLibrarySwift/BlueLibrarySwift/HorizontalScroller.swift b/Project 17 - BlueLibrarySwift/BlueLibrarySwift/HorizontalScroller.swift deleted file mode 100644 index c869af2c..00000000 --- a/Project 17 - BlueLibrarySwift/BlueLibrarySwift/HorizontalScroller.swift +++ /dev/null @@ -1,155 +0,0 @@ -// -// HorizontalScroller.swift -// BlueLibrarySwift -// -// Created by Yi Gu on 5/8/16. -// Copyright © 2016 Raywenderlich. All rights reserved. -// - -import UIKit - -// Use Delegate and Protocol to implement Adapter Pattern -@objc protocol HorizontalScrollerDelegate { - // num of views to present inside the horizontal scroller - func numberOfViewsForHorizontalScroller(_ scroller: HorizontalScroller) -> Int - - // return the view that should appear at - func horizontalScrollerViewAtIndex(_ scroller: HorizontalScroller, index:Int) -> UIView - - // inform the delegate what the view at has been clicked - func horizontalScrollerClickedViewAtIndex(_ scroller: HorizontalScroller, index:Int) - - // return the index of the initial view to display. this method is optional - // and defaults to 0 if it's not implemented by the delegate - @objc optional func initialViewIndex(_ scroller: HorizontalScroller) -> Int -} - -class HorizontalScroller: UIView { - weak var delegate: HorizontalScrollerDelegate? - - // MARK: - Variables - fileprivate let VIEW_PADDING = 10 - fileprivate let VIEW_DIMENSIONS = 100 - fileprivate let VIEWS_OFFSET = 100 - - fileprivate var scroller : UIScrollView! - - var viewArray = [UIView]() - - // MARK: - Lifecycle - override init(frame: CGRect) { - super.init(frame: frame) - initializeScrollView() - } - - required init(coder aDecoder: NSCoder) { - super.init(coder: aDecoder)! - initializeScrollView() - } - - func initializeScrollView() { - scroller = UIScrollView() - scroller.delegate = self - addSubview(scroller) - - scroller.translatesAutoresizingMaskIntoConstraints = false - - // apply constraints - self.addConstraint(NSLayoutConstraint(item: scroller, attribute: .leading, relatedBy: .equal, toItem: self, attribute: .leading, multiplier: 1.0, constant: 0.0)) - self.addConstraint(NSLayoutConstraint(item: scroller, attribute: .trailing, relatedBy: .equal, toItem: self, attribute: .trailing, multiplier: 1.0, constant: 0.0)) - self.addConstraint(NSLayoutConstraint(item: scroller, attribute: .top, relatedBy: .equal, toItem: self, attribute: .top, multiplier: 1.0, constant: 0.0)) - self.addConstraint(NSLayoutConstraint(item: scroller, attribute: .bottom, relatedBy: .equal, toItem: self, attribute: .bottom, multiplier: 1.0, constant: 0.0)) - - // add tap recognizer - let tapRecognizer = UITapGestureRecognizer(target: self, action:#selector(HorizontalScroller.scrollerTapped(_:))) - scroller.addGestureRecognizer(tapRecognizer) - } - - // call reload when added to another view - override func didMoveToSuperview() { - reload() - } - - // MARK: - Public Functions - func scrollerTapped(_ gesture: UITapGestureRecognizer) { - let location = gesture.location(in: gesture.view) - - guard let delegate = delegate else { - return - } - - for index in 0 ..< delegate.numberOfViewsForHorizontalScroller(self) { - let view = scroller.subviews[index] - - if view.frame.contains(location) { - delegate.horizontalScrollerClickedViewAtIndex(self, index: index) - - // center the tapped view in the scroll view - scroller.setContentOffset(CGPoint(x: view.frame.origin.x - self.frame.size.width / 2 + view.frame.size.width / 2, y: 0), animated:true) - - break - } - } - } - - func viewAtIndex(_ index :Int) -> UIView { - return viewArray[index] - } - - func reload() { - // check if there is a delegate, if not there is nothing to load. - if let delegate = delegate { - // reset viewArray - viewArray = [] - - // remove all subviews - let views: NSArray = scroller.subviews as NSArray - for view in views { - (view as AnyObject).removeFromSuperview() - } - - // xValue is the starting point of the views inside the scroller - var xValue = VIEWS_OFFSET - for index in 0 ..< delegate.numberOfViewsForHorizontalScroller(self) { - // add a view at the right position - xValue += VIEW_PADDING - let view = delegate.horizontalScrollerViewAtIndex(self, index: index) - view.frame = CGRect(x: CGFloat(xValue), y: CGFloat(VIEW_PADDING), width: CGFloat(VIEW_DIMENSIONS), height: CGFloat(VIEW_DIMENSIONS)) - scroller.addSubview(view) - xValue += VIEW_DIMENSIONS + VIEW_PADDING - - // store the view to viewArray - viewArray.append(view) - } - - scroller.contentSize = CGSize(width: CGFloat(xValue + VIEWS_OFFSET), height: frame.size.height) - - // if an initial view is defined, center the scroller on it - if let initialView = delegate.initialViewIndex?(self) { - scroller.setContentOffset(CGPoint(x: CGFloat(initialView) * CGFloat((VIEW_DIMENSIONS + (2 * VIEW_PADDING))), y: 0), animated: true) - } - } - } - - func centerCurrentView() { - var xFinal = Int(scroller.contentOffset.x) + (VIEWS_OFFSET / 2) + VIEW_PADDING - let viewIndex = xFinal / (VIEW_DIMENSIONS + (2 * VIEW_PADDING)) - xFinal = viewIndex * (VIEW_DIMENSIONS + (2 * VIEW_PADDING)) - scroller.setContentOffset(CGPoint(x: xFinal, y: 0), animated: true) - if let delegate = delegate { - delegate.horizontalScrollerClickedViewAtIndex(self, index: Int(viewIndex)) - } - } -} - -extension HorizontalScroller: UIScrollViewDelegate { - func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) { - if !decelerate { - centerCurrentView() - } - } - - func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { - centerCurrentView() - } -} diff --git a/Project 17 - BlueLibrarySwift/BlueLibrarySwift/LibraryAPI.swift b/Project 17 - BlueLibrarySwift/BlueLibrarySwift/LibraryAPI.swift deleted file mode 100644 index 519161bd..00000000 --- a/Project 17 - BlueLibrarySwift/BlueLibrarySwift/LibraryAPI.swift +++ /dev/null @@ -1,78 +0,0 @@ -// -// LibraryAPI.swift -// BlueLibrarySwift -// -// Created by Yi Gu on 5/6/16. -// Copyright © 2016 Raywenderlich. All rights reserved. -// - -import UIKit - -class LibraryAPI: NSObject { - // MARK: - Singleton Pattern - static let sharedInstance = LibraryAPI() - - // MARK: - Variables - fileprivate let persistencyManager: PersistencyManager - fileprivate let httpClient: HTTPClient - fileprivate let isOnline: Bool - - fileprivate override init() { - persistencyManager = PersistencyManager() - httpClient = HTTPClient() - isOnline = false - - super.init() - - NotificationCenter.default.addObserver(self, selector:#selector(LibraryAPI.downloadImage(_:)), name: NSNotification.Name(rawValue: downloadImageNotification), object: nil) - } - - deinit { - NotificationCenter.default.removeObserver(self) - } - - // MARK: - Public API - func getAlbums() -> [Album] { - return persistencyManager.getAlbums() - } - - func addAlbum(_ album: Album, index: Int) { - persistencyManager.addAlbum(album, index: index) - if isOnline { - httpClient.postRequest("/api/addAlbum", body: album.description) - } - } - - func deleteAlbum(_ index: Int) { - persistencyManager.deleteAlbumAtIndex(index) - if isOnline { - httpClient.postRequest("/api/deleteAlbum", body: "\(index)") - } - } - - func downloadImage(_ notification: Notification) { - // retrieve info from notification - let userInfo = (notification as NSNotification).userInfo as! [String: AnyObject] - let imageView = userInfo["imageView"] as! UIImageView? - let coverUrl = userInfo["coverUrl"] as! String - - // get image - if let imageViewUnWrapped = imageView { - imageViewUnWrapped.image = persistencyManager.getImage(URL(string: coverUrl)!.lastPathComponent) - if imageViewUnWrapped.image == nil { - - DispatchQueue.global(priority: DispatchQueue.GlobalQueuePriority.default).async(execute: { () -> Void in - let downloadedImage = self.httpClient.downloadImage(coverUrl as String) - DispatchQueue.main.sync(execute: { () -> Void in - imageViewUnWrapped.image = downloadedImage - self.persistencyManager.saveImage(downloadedImage, filename: URL(string: coverUrl)!.lastPathComponent) - }) - }) - } - } - } - - func saveAlbums() { - persistencyManager.saveAlbums() - } -} diff --git a/Project 17 - BlueLibrarySwift/BlueLibrarySwift/PersistencyManager.swift b/Project 17 - BlueLibrarySwift/BlueLibrarySwift/PersistencyManager.swift deleted file mode 100644 index a8d02d29..00000000 --- a/Project 17 - BlueLibrarySwift/BlueLibrarySwift/PersistencyManager.swift +++ /dev/null @@ -1,103 +0,0 @@ -// -// PersistencyManager.swift -// BlueLibrarySwift -// -// Created by Yi Gu on 5/6/16. -// Copyright © 2016 Raywenderlich. All rights reserved. -// - -import UIKit - -class PersistencyManager: NSObject { - fileprivate var albums = [Album]() - - override init() { - super.init() - if let data = try? Data(contentsOf: URL(fileURLWithPath: NSHomeDirectory() + "/Documents/albums.bin")) { - let unarchiveAlbums = NSKeyedUnarchiver.unarchiveObject(with: data) as! [Album]? - if let unwrappedAlbum = unarchiveAlbums { - albums = unwrappedAlbum - } - } else { - createPlaceholderAlbum() - } - } - - func createPlaceholderAlbum() { - //Dummy list of albums - let album1 = Album(title: "Opus 12", - artist: "Jay Chou", - genre: "Pop", - coverUrl: "http://a2.att.hudong.com/88/93/19300001321437135520930453813.jpg", - year: "2012") - - let album2 = Album(title: "Poker Face", - artist: "Lady Gaga", - genre: "Pop", - coverUrl: "https://upload.wikimedia.org/wikipedia/en/3/36/Lady_Gaga_-_Poker_Face.png", - year: "2013") - - let album3 = Album(title: "What do you mean", - artist: "Justin Biber", - genre: "Pop", - coverUrl: "https://consequenceofsound.files.wordpress.com/2015/08/screen-shot-2015-08-28-at-7-10-21-am.png?w=689", - year: "2014") - - let album4 = Album(title: "Staring at the Sun", - artist: "U2", - genre: "Pop", - coverUrl: "http://www.israbox.download/uploads/posts/2011-06/1307606249_u2photo0.jpg", - year: "2010") - - let album5 = Album(title: "Iridescent", - artist: "Linkin Park", - genre: "Pop", - coverUrl: "http://img01.deviantart.net/19e2/i/2011/156/3/1/linkin_park_album_art_2_by_jaylathe1-d3i344s.jpg", - year: "2000") - - albums = [album1, album2, album3, album4, album5] - saveAlbums() - } - - func saveAlbums() { - let filename = NSHomeDirectory() + "/Documents/albums.bin" - let data = NSKeyedArchiver.archivedData(withRootObject: albums) - try? data.write(to: URL(fileURLWithPath: filename), options: [.atomic]) - } - - func getAlbums() -> [Album] { - return albums - } - - func addAlbum(_ album: Album, index: Int) { - if albums.count >= index { - albums.insert(album, at: index) - } else { - albums.append(album) - } - } - - func deleteAlbumAtIndex(_ index: Int) { - albums.remove(at: index) - } - - func saveImage(_ image: UIImage, filename: String) { - let path = NSHomeDirectory() + "/Documents/\(filename)" - guard let data = UIImagePNGRepresentation(image) else { - return - } - try? data.write(to: URL(fileURLWithPath: path), options: [.atomic]) - } - - func getImage(_ filename: String) -> UIImage? { - let path = NSHomeDirectory() + "/Documents/\(filename)" - - do { - let data = try Data(contentsOf: URL(fileURLWithPath: path), options: .uncachedRead) - return UIImage(data: data) - } catch { - return nil - } - } - -} diff --git a/Project 18 - ClassicPhotos/ClassicPhotos.gif b/Project 17 - ClassicPhotos/ClassicPhotos.gif similarity index 100% rename from Project 18 - ClassicPhotos/ClassicPhotos.gif rename to Project 17 - ClassicPhotos/ClassicPhotos.gif diff --git a/Project 18 - ClassicPhotos/ClassicPhotos.xcodeproj/project.pbxproj b/Project 17 - ClassicPhotos/ClassicPhotos.xcodeproj/project.pbxproj similarity index 93% rename from Project 18 - ClassicPhotos/ClassicPhotos.xcodeproj/project.pbxproj rename to Project 17 - ClassicPhotos/ClassicPhotos.xcodeproj/project.pbxproj index c33ef829..d2b56eda 100644 --- a/Project 18 - ClassicPhotos/ClassicPhotos.xcodeproj/project.pbxproj +++ b/Project 17 - ClassicPhotos/ClassicPhotos.xcodeproj/project.pbxproj @@ -184,27 +184,28 @@ 27DF645519657A9300B42725 /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0820; + LastUpgradeCheck = 1020; ORGANIZATIONNAME = raywenderlich; TargetAttributes = { 27DF645C19657A9300B42725 = { CreatedOnToolsVersion = 6.0; DevelopmentTeam = 44JDRP3T56; - LastSwiftMigration = 0820; + LastSwiftMigration = 1020; }; 27DF646919657A9300B42725 = { CreatedOnToolsVersion = 6.0; - LastSwiftMigration = 0820; + LastSwiftMigration = 1020; TestTargetID = 27DF645C19657A9300B42725; }; }; }; buildConfigurationList = 27DF645819657A9300B42725 /* Build configuration list for PBXProject "ClassicPhotos" */; compatibilityVersion = "Xcode 6.3"; - developmentRegion = English; + developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, + Base, ); mainGroup = 27DF645419657A9300B42725; productRefGroup = 27DF645E19657A9300B42725 /* Products */; @@ -270,18 +271,27 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -317,18 +327,27 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -360,10 +379,11 @@ ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; DEVELOPMENT_TEAM = 44JDRP3T56; INFOPLIST_FILE = ClassicPhotos/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "com.raywenderlich.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = 1; }; name = Debug; @@ -375,10 +395,11 @@ ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; DEVELOPMENT_TEAM = 44JDRP3T56; INFOPLIST_FILE = ClassicPhotos/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "com.raywenderlich.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = 1; }; name = Release; @@ -387,10 +408,7 @@ isa = XCBuildConfiguration; buildSettings = { BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/ClassicPhotos.app/ClassicPhotos"; - FRAMEWORK_SEARCH_PATHS = ( - "$(SDKROOT)/Developer/Library/Frameworks", - "$(inherited)", - ); + FRAMEWORK_SEARCH_PATHS = ""; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", "$(inherited)", @@ -400,7 +418,7 @@ METAL_ENABLE_DEBUG_INFO = YES; PRODUCT_BUNDLE_IDENTIFIER = "com.raywenderlich.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; TEST_HOST = "$(BUNDLE_LOADER)"; }; name = Debug; @@ -409,16 +427,13 @@ isa = XCBuildConfiguration; buildSettings = { BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/ClassicPhotos.app/ClassicPhotos"; - FRAMEWORK_SEARCH_PATHS = ( - "$(SDKROOT)/Developer/Library/Frameworks", - "$(inherited)", - ); + FRAMEWORK_SEARCH_PATHS = ""; INFOPLIST_FILE = ClassicPhotosTests/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; METAL_ENABLE_DEBUG_INFO = NO; PRODUCT_BUNDLE_IDENTIFIER = "com.raywenderlich.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; TEST_HOST = "$(BUNDLE_LOADER)"; }; name = Release; diff --git a/Project 18 - ClassicPhotos/ClassicPhotos.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Project 17 - ClassicPhotos/ClassicPhotos.xcodeproj/project.xcworkspace/contents.xcworkspacedata similarity index 100% rename from Project 18 - ClassicPhotos/ClassicPhotos.xcodeproj/project.xcworkspace/contents.xcworkspacedata rename to Project 17 - ClassicPhotos/ClassicPhotos.xcodeproj/project.xcworkspace/contents.xcworkspacedata diff --git a/Project 17 - ClassicPhotos/ClassicPhotos.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Project 17 - ClassicPhotos/ClassicPhotos.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/Project 17 - ClassicPhotos/ClassicPhotos.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Project 18 - ClassicPhotos/ClassicPhotos/AppDelegate.swift b/Project 17 - ClassicPhotos/ClassicPhotos/AppDelegate.swift similarity index 96% rename from Project 18 - ClassicPhotos/ClassicPhotos/AppDelegate.swift rename to Project 17 - ClassicPhotos/ClassicPhotos/AppDelegate.swift index 6bc271c2..9802f64e 100644 --- a/Project 18 - ClassicPhotos/ClassicPhotos/AppDelegate.swift +++ b/Project 17 - ClassicPhotos/ClassicPhotos/AppDelegate.swift @@ -13,7 +13,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? - func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { return true } diff --git a/Project 17 - BlueLibrarySwift/BlueLibrarySwift/Images.xcassets/AppIcon.appiconset/Contents.json b/Project 17 - ClassicPhotos/ClassicPhotos/Images.xcassets/AppIcon.appiconset/Contents.json similarity index 77% rename from Project 17 - BlueLibrarySwift/BlueLibrarySwift/Images.xcassets/AppIcon.appiconset/Contents.json rename to Project 17 - ClassicPhotos/ClassicPhotos/Images.xcassets/AppIcon.appiconset/Contents.json index eeea76c2..1d060ed2 100644 --- a/Project 17 - BlueLibrarySwift/BlueLibrarySwift/Images.xcassets/AppIcon.appiconset/Contents.json +++ b/Project 17 - ClassicPhotos/ClassicPhotos/Images.xcassets/AppIcon.appiconset/Contents.json @@ -1,5 +1,15 @@ { "images" : [ + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "3x" + }, { "idiom" : "iphone", "size" : "29x29", @@ -30,6 +40,16 @@ "size" : "60x60", "scale" : "3x" }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "2x" + }, { "idiom" : "ipad", "size" : "29x29", diff --git a/Project 04 - Todo/Todo/Assets.xcassets/selected/Contents.json b/Project 17 - ClassicPhotos/ClassicPhotos/Images.xcassets/Contents.json similarity index 100% rename from Project 04 - Todo/Todo/Assets.xcassets/selected/Contents.json rename to Project 17 - ClassicPhotos/ClassicPhotos/Images.xcassets/Contents.json diff --git a/Project 18 - ClassicPhotos/ClassicPhotos/Images.xcassets/LaunchImage.launchimage/Contents.json b/Project 17 - ClassicPhotos/ClassicPhotos/Images.xcassets/LaunchImage.launchimage/Contents.json similarity index 100% rename from Project 18 - ClassicPhotos/ClassicPhotos/Images.xcassets/LaunchImage.launchimage/Contents.json rename to Project 17 - ClassicPhotos/ClassicPhotos/Images.xcassets/LaunchImage.launchimage/Contents.json diff --git a/Project 18 - ClassicPhotos/ClassicPhotos/Info.plist b/Project 17 - ClassicPhotos/ClassicPhotos/Info.plist similarity index 100% rename from Project 18 - ClassicPhotos/ClassicPhotos/Info.plist rename to Project 17 - ClassicPhotos/ClassicPhotos/Info.plist diff --git a/Project 18 - ClassicPhotos/ClassicPhotos/ListViewController.swift b/Project 17 - ClassicPhotos/ClassicPhotos/ListViewController.swift similarity index 98% rename from Project 18 - ClassicPhotos/ClassicPhotos/ListViewController.swift rename to Project 17 - ClassicPhotos/ClassicPhotos/ListViewController.swift index d7a7e347..0efa048e 100644 --- a/Project 18 - ClassicPhotos/ClassicPhotos/ListViewController.swift +++ b/Project 17 - ClassicPhotos/ClassicPhotos/ListViewController.swift @@ -114,7 +114,7 @@ class ListViewController: UITableViewController { let cell = tableView.dequeueReusableCell(withIdentifier: "CellIdentifier", for: indexPath) if cell.accessoryView == nil { - let indicator = UIActivityIndicatorView(activityIndicatorStyle: .gray) + let indicator = UIActivityIndicatorView(style: .gray) cell.accessoryView = indicator } let indicator = cell.accessoryView as! UIActivityIndicatorView diff --git a/Project 18 - ClassicPhotos/ClassicPhotos/PhotoOperations.swift b/Project 17 - ClassicPhotos/ClassicPhotos/PhotoOperations.swift similarity index 97% rename from Project 18 - ClassicPhotos/ClassicPhotos/PhotoOperations.swift rename to Project 17 - ClassicPhotos/ClassicPhotos/PhotoOperations.swift index f274bc5b..dc54d294 100644 --- a/Project 18 - ClassicPhotos/ClassicPhotos/PhotoOperations.swift +++ b/Project 17 - ClassicPhotos/ClassicPhotos/PhotoOperations.swift @@ -84,7 +84,7 @@ class ImageFiltration: Operation { } func applySepiaFilter(image: UIImage) -> UIImage? { - let inputImage = CIImage(data: UIImagePNGRepresentation(image)!) + let inputImage = CIImage(data: image.pngData()!) if isCancelled { return nil diff --git a/Project 18 - ClassicPhotos/ClassicPhotos/Storyboard.storyboard b/Project 17 - ClassicPhotos/ClassicPhotos/Storyboard.storyboard similarity index 73% rename from Project 18 - ClassicPhotos/ClassicPhotos/Storyboard.storyboard rename to Project 17 - ClassicPhotos/ClassicPhotos/Storyboard.storyboard index d7545826..fa9a5121 100644 --- a/Project 18 - ClassicPhotos/ClassicPhotos/Storyboard.storyboard +++ b/Project 17 - ClassicPhotos/ClassicPhotos/Storyboard.storyboard @@ -1,24 +1,32 @@ - - + + + + + - + + + - - + + - + - + + + - - - - - diff --git a/Project 18 - ClassicPhotos/ClassicPhotosTests/ClassicPhotosTests.swift b/Project 17 - ClassicPhotos/ClassicPhotosTests/ClassicPhotosTests.swift similarity index 100% rename from Project 18 - ClassicPhotos/ClassicPhotosTests/ClassicPhotosTests.swift rename to Project 17 - ClassicPhotos/ClassicPhotosTests/ClassicPhotosTests.swift diff --git a/Project 18 - ClassicPhotos/ClassicPhotosTests/Info.plist b/Project 17 - ClassicPhotos/ClassicPhotosTests/Info.plist similarity index 100% rename from Project 18 - ClassicPhotos/ClassicPhotosTests/Info.plist rename to Project 17 - ClassicPhotos/ClassicPhotosTests/Info.plist diff --git a/Project 18 - ClassicPhotos/README.md b/Project 17 - ClassicPhotos/README.md similarity index 100% rename from Project 18 - ClassicPhotos/README.md rename to Project 17 - ClassicPhotos/README.md diff --git a/Project 17 - BlueLibrarySwift/BlueLibrarySwift.gif b/Project 18 - BlueLibrarySwift/BlueLibrarySwift.gif similarity index 100% rename from Project 17 - BlueLibrarySwift/BlueLibrarySwift.gif rename to Project 18 - BlueLibrarySwift/BlueLibrarySwift.gif diff --git a/Project 17 - BlueLibrarySwift/BlueLibrarySwift.xcodeproj/project.pbxproj b/Project 18 - BlueLibrarySwift/BlueLibrarySwift.xcodeproj/project.pbxproj similarity index 70% rename from Project 17 - BlueLibrarySwift/BlueLibrarySwift.xcodeproj/project.pbxproj rename to Project 18 - BlueLibrarySwift/BlueLibrarySwift.xcodeproj/project.pbxproj index 16f43c3a..46860e59 100644 --- a/Project 17 - BlueLibrarySwift/BlueLibrarySwift.xcodeproj/project.pbxproj +++ b/Project 18 - BlueLibrarySwift/BlueLibrarySwift.xcodeproj/project.pbxproj @@ -11,34 +11,22 @@ 0B238FD31CDD1DE900000CB5 /* AlbumView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0B238FD21CDD1DE900000CB5 /* AlbumView.swift */; }; 0B238FDD1CDD43CB00000CB5 /* LibraryAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0B238FDC1CDD43CB00000CB5 /* LibraryAPI.swift */; }; 0B238FDF1CDD455A00000CB5 /* PersistencyManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0B238FDE1CDD455A00000CB5 /* PersistencyManager.swift */; }; - 0B238FE11CDD525E00000CB5 /* AlbumExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0B238FE01CDD525E00000CB5 /* AlbumExtensions.swift */; }; 101DD6CB1A052EDE00161F0D /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 101DD6CA1A052EDE00161F0D /* AppDelegate.swift */; }; 101DD6CD1A052EDE00161F0D /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 101DD6CC1A052EDE00161F0D /* ViewController.swift */; }; 101DD6D01A052EDE00161F0D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 101DD6CE1A052EDE00161F0D /* Main.storyboard */; }; 101DD6D21A052EDE00161F0D /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 101DD6D11A052EDE00161F0D /* Images.xcassets */; }; 101DD6D51A052EDE00161F0D /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 101DD6D31A052EDE00161F0D /* LaunchScreen.xib */; }; - 101DD6E11A052EDE00161F0D /* BlueLibrarySwiftTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 101DD6E01A052EDE00161F0D /* BlueLibrarySwiftTests.swift */; }; 101DD6EC1A052F0E00161F0D /* HTTPClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 101DD6EB1A052F0E00161F0D /* HTTPClient.swift */; }; + 1936E3ED209E3D9900BDAD0F /* albums.json in Resources */ = {isa = PBXBuildFile; fileRef = 1936E3EC209E3D9900BDAD0F /* albums.json */; }; 19B5F9151CDFA8BC0067CC4D /* HorizontalScroller.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19B5F9141CDFA8BC0067CC4D /* HorizontalScroller.swift */; }; 19DA519C1CE7929600CE5E80 /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19DA519B1CE7929600CE5E80 /* Constants.swift */; }; /* End PBXBuildFile section */ -/* Begin PBXContainerItemProxy section */ - 101DD6DB1A052EDE00161F0D /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 101DD6BD1A052EDE00161F0D /* Project object */; - proxyType = 1; - remoteGlobalIDString = 101DD6C41A052EDE00161F0D; - remoteInfo = BlueLibrarySwift; - }; -/* End PBXContainerItemProxy section */ - /* Begin PBXFileReference section */ 0B238FCE1CDD1AAB00000CB5 /* Album.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Album.swift; sourceTree = ""; }; 0B238FD21CDD1DE900000CB5 /* AlbumView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AlbumView.swift; sourceTree = ""; }; 0B238FDC1CDD43CB00000CB5 /* LibraryAPI.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LibraryAPI.swift; sourceTree = ""; }; 0B238FDE1CDD455A00000CB5 /* PersistencyManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PersistencyManager.swift; sourceTree = ""; }; - 0B238FE01CDD525E00000CB5 /* AlbumExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AlbumExtensions.swift; sourceTree = ""; }; 101DD6C51A052EDE00161F0D /* BlueLibrarySwift.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = BlueLibrarySwift.app; sourceTree = BUILT_PRODUCTS_DIR; }; 101DD6C91A052EDE00161F0D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 101DD6CA1A052EDE00161F0D /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; @@ -46,10 +34,8 @@ 101DD6CF1A052EDE00161F0D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 101DD6D11A052EDE00161F0D /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 101DD6D41A052EDE00161F0D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; - 101DD6DA1A052EDE00161F0D /* BlueLibrarySwiftTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = BlueLibrarySwiftTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 101DD6DF1A052EDE00161F0D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 101DD6E01A052EDE00161F0D /* BlueLibrarySwiftTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlueLibrarySwiftTests.swift; sourceTree = ""; }; 101DD6EB1A052F0E00161F0D /* HTTPClient.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HTTPClient.swift; sourceTree = ""; }; + 1936E3EC209E3D9900BDAD0F /* albums.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = albums.json; sourceTree = ""; }; 19B5F9141CDFA8BC0067CC4D /* HorizontalScroller.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HorizontalScroller.swift; sourceTree = ""; }; 19DA519B1CE7929600CE5E80 /* Constants.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Constants.swift; path = ../Constants.swift; sourceTree = ""; }; /* End PBXFileReference section */ @@ -62,47 +48,40 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 101DD6D71A052EDE00161F0D /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 0B238FD01CDD1AB700000CB5 /* Model */ = { + 0B238FD01CDD1AB700000CB5 /* Models */ = { isa = PBXGroup; children = ( 0B238FCE1CDD1AAB00000CB5 /* Album.swift */, - 0B238FE01CDD525E00000CB5 /* AlbumExtensions.swift */, ); - name = Model; + name = Models; sourceTree = ""; }; - 0B238FD11CDD1AC000000CB5 /* Controller */ = { + 0B238FD11CDD1AC000000CB5 /* Controllers */ = { isa = PBXGroup; children = ( 101DD6CC1A052EDE00161F0D /* ViewController.swift */, ); - name = Controller; + name = Controllers; sourceTree = ""; }; - 0B238FD41CDD1DF700000CB5 /* View */ = { + 0B238FD41CDD1DF700000CB5 /* Views */ = { isa = PBXGroup; children = ( + 101DD6CE1A052EDE00161F0D /* Main.storyboard */, + 101DD6D31A052EDE00161F0D /* LaunchScreen.xib */, 0B238FD21CDD1DE900000CB5 /* AlbumView.swift */, 19B5F9141CDFA8BC0067CC4D /* HorizontalScroller.swift */, ); - name = View; + name = Views; sourceTree = ""; }; 101DD6BC1A052EDE00161F0D = { isa = PBXGroup; children = ( 101DD6C71A052EDE00161F0D /* BlueLibrarySwift */, - 101DD6DD1A052EDE00161F0D /* BlueLibrarySwiftTests */, 101DD6C61A052EDE00161F0D /* Products */, ); sourceTree = ""; @@ -111,7 +90,6 @@ isa = PBXGroup; children = ( 101DD6C51A052EDE00161F0D /* BlueLibrarySwift.app */, - 101DD6DA1A052EDE00161F0D /* BlueLibrarySwiftTests.xctest */, ); name = Products; sourceTree = ""; @@ -121,13 +99,11 @@ children = ( 101DD6CA1A052EDE00161F0D /* AppDelegate.swift */, 101DD6EA1A052EE400161F0D /* API */, - 0B238FD41CDD1DF700000CB5 /* View */, - 0B238FD11CDD1AC000000CB5 /* Controller */, - 0B238FD01CDD1AB700000CB5 /* Model */, + 0B238FD41CDD1DF700000CB5 /* Views */, + 0B238FD11CDD1AC000000CB5 /* Controllers */, + 0B238FD01CDD1AB700000CB5 /* Models */, 19DA519D1CE792A700CE5E80 /* Helper */, - 101DD6CE1A052EDE00161F0D /* Main.storyboard */, 101DD6D11A052EDE00161F0D /* Images.xcassets */, - 101DD6D31A052EDE00161F0D /* LaunchScreen.xib */, 101DD6C81A052EDE00161F0D /* Supporting Files */, ); path = BlueLibrarySwift; @@ -141,28 +117,11 @@ name = "Supporting Files"; sourceTree = ""; }; - 101DD6DD1A052EDE00161F0D /* BlueLibrarySwiftTests */ = { - isa = PBXGroup; - children = ( - 101DD6E01A052EDE00161F0D /* BlueLibrarySwiftTests.swift */, - 101DD6DE1A052EDE00161F0D /* Supporting Files */, - ); - path = BlueLibrarySwiftTests; - sourceTree = ""; - }; - 101DD6DE1A052EDE00161F0D /* Supporting Files */ = { - isa = PBXGroup; - children = ( - 101DD6DF1A052EDE00161F0D /* Info.plist */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; 101DD6EA1A052EE400161F0D /* API */ = { isa = PBXGroup; children = ( - 101DD6EB1A052F0E00161F0D /* HTTPClient.swift */, 0B238FDC1CDD43CB00000CB5 /* LibraryAPI.swift */, + 101DD6EB1A052F0E00161F0D /* HTTPClient.swift */, 0B238FDE1CDD455A00000CB5 /* PersistencyManager.swift */, ); name = API; @@ -171,6 +130,7 @@ 19DA519D1CE792A700CE5E80 /* Helper */ = { isa = PBXGroup; children = ( + 1936E3EC209E3D9900BDAD0F /* albums.json */, 19DA519B1CE7929600CE5E80 /* Constants.swift */, ); name = Helper; @@ -196,24 +156,6 @@ productReference = 101DD6C51A052EDE00161F0D /* BlueLibrarySwift.app */; productType = "com.apple.product-type.application"; }; - 101DD6D91A052EDE00161F0D /* BlueLibrarySwiftTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 101DD6E71A052EDE00161F0D /* Build configuration list for PBXNativeTarget "BlueLibrarySwiftTests" */; - buildPhases = ( - 101DD6D61A052EDE00161F0D /* Sources */, - 101DD6D71A052EDE00161F0D /* Frameworks */, - 101DD6D81A052EDE00161F0D /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 101DD6DC1A052EDE00161F0D /* PBXTargetDependency */, - ); - name = BlueLibrarySwiftTests; - productName = BlueLibrarySwiftTests; - productReference = 101DD6DA1A052EDE00161F0D /* BlueLibrarySwiftTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ @@ -222,23 +164,18 @@ attributes = { LastSwiftMigration = 0730; LastSwiftUpdateCheck = 0730; - LastUpgradeCheck = 0820; + LastUpgradeCheck = 1020; ORGANIZATIONNAME = Raywenderlich; TargetAttributes = { 101DD6C41A052EDE00161F0D = { CreatedOnToolsVersion = 6.1; - LastSwiftMigration = 0800; - }; - 101DD6D91A052EDE00161F0D = { - CreatedOnToolsVersion = 6.1; - LastSwiftMigration = 0800; - TestTargetID = 101DD6C41A052EDE00161F0D; + LastSwiftMigration = 1020; }; }; }; buildConfigurationList = 101DD6C01A052EDE00161F0D /* Build configuration list for PBXProject "BlueLibrarySwift" */; compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; + developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, @@ -250,7 +187,6 @@ projectRoot = ""; targets = ( 101DD6C41A052EDE00161F0D /* BlueLibrarySwift */, - 101DD6D91A052EDE00161F0D /* BlueLibrarySwiftTests */, ); }; /* End PBXProject section */ @@ -263,13 +199,7 @@ 101DD6D01A052EDE00161F0D /* Main.storyboard in Resources */, 101DD6D51A052EDE00161F0D /* LaunchScreen.xib in Resources */, 101DD6D21A052EDE00161F0D /* Images.xcassets in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 101DD6D81A052EDE00161F0D /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( + 1936E3ED209E3D9900BDAD0F /* albums.json in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -281,7 +211,6 @@ buildActionMask = 2147483647; files = ( 101DD6CD1A052EDE00161F0D /* ViewController.swift in Sources */, - 0B238FE11CDD525E00000CB5 /* AlbumExtensions.swift in Sources */, 101DD6CB1A052EDE00161F0D /* AppDelegate.swift in Sources */, 0B238FDD1CDD43CB00000CB5 /* LibraryAPI.swift in Sources */, 19B5F9151CDFA8BC0067CC4D /* HorizontalScroller.swift in Sources */, @@ -293,24 +222,8 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 101DD6D61A052EDE00161F0D /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 101DD6E11A052EDE00161F0D /* BlueLibrarySwiftTests.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXSourcesBuildPhase section */ -/* Begin PBXTargetDependency section */ - 101DD6DC1A052EDE00161F0D /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 101DD6C41A052EDE00161F0D /* BlueLibrarySwift */; - targetProxy = 101DD6DB1A052EDE00161F0D /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - /* Begin PBXVariantGroup section */ 101DD6CE1A052EDE00161F0D /* Main.storyboard */ = { isa = PBXVariantGroup; @@ -335,18 +248,27 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -369,7 +291,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.1; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -382,18 +304,27 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -409,7 +340,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.1; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; @@ -426,7 +357,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "com.Raywenderlich.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; }; name = Debug; }; @@ -438,45 +369,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "com.Raywenderlich.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; - }; - name = Release; - }; - 101DD6E81A052EDE00161F0D /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - FRAMEWORK_SEARCH_PATHS = ( - "$(SDKROOT)/Developer/Library/Frameworks", - "$(inherited)", - ); - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - INFOPLIST_FILE = BlueLibrarySwiftTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = "com.Raywenderlich.$(PRODUCT_NAME:rfc1034identifier)"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/BlueLibrarySwift.app/BlueLibrarySwift"; - }; - name = Debug; - }; - 101DD6E91A052EDE00161F0D /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - FRAMEWORK_SEARCH_PATHS = ( - "$(SDKROOT)/Developer/Library/Frameworks", - "$(inherited)", - ); - INFOPLIST_FILE = BlueLibrarySwiftTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = "com.Raywenderlich.$(PRODUCT_NAME:rfc1034identifier)"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/BlueLibrarySwift.app/BlueLibrarySwift"; + SWIFT_VERSION = 5.0; }; name = Release; }; @@ -501,15 +394,6 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 101DD6E71A052EDE00161F0D /* Build configuration list for PBXNativeTarget "BlueLibrarySwiftTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 101DD6E81A052EDE00161F0D /* Debug */, - 101DD6E91A052EDE00161F0D /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; /* End XCConfigurationList section */ }; rootObject = 101DD6BD1A052EDE00161F0D /* Project object */; diff --git a/Project 17 - BlueLibrarySwift/BlueLibrarySwift.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Project 18 - BlueLibrarySwift/BlueLibrarySwift.xcodeproj/project.xcworkspace/contents.xcworkspacedata similarity index 100% rename from Project 17 - BlueLibrarySwift/BlueLibrarySwift.xcodeproj/project.xcworkspace/contents.xcworkspacedata rename to Project 18 - BlueLibrarySwift/BlueLibrarySwift.xcodeproj/project.xcworkspace/contents.xcworkspacedata diff --git a/Project 18 - BlueLibrarySwift/BlueLibrarySwift.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Project 18 - BlueLibrarySwift/BlueLibrarySwift.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/Project 18 - BlueLibrarySwift/BlueLibrarySwift.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Project 18 - BlueLibrarySwift/BlueLibrarySwift/Album.swift b/Project 18 - BlueLibrarySwift/BlueLibrarySwift/Album.swift new file mode 100644 index 00000000..6fbbde68 --- /dev/null +++ b/Project 18 - BlueLibrarySwift/BlueLibrarySwift/Album.swift @@ -0,0 +1,40 @@ +// +// Album.swift +// BlueLibrarySwift +// +// Created by Yi Gu on 5/6/16. +// Copyright © 2016 Raywenderlich. All rights reserved. +// + +import UIKit + +struct Album: Codable { + var title: String + var artist: String + var genre: String + var coverUrl: String + var year: String +} + +extension Album: CustomStringConvertible { + var description: String { + return "title: \(title)" + + " artist: \(artist)" + + " genre: \(genre)" + + " coverUrl: \(coverUrl)" + + " year: \(year)" + } +} + +typealias AlbumData = (title: String, value: String) + +extension Album { + var tableRepresentation: [AlbumData] { + return [ + ("Artist", artist), + ("Album", title), + ("Genre", genre), + ("Year", year) + ] + } +} diff --git a/Project 18 - BlueLibrarySwift/BlueLibrarySwift/AlbumView.swift b/Project 18 - BlueLibrarySwift/BlueLibrarySwift/AlbumView.swift new file mode 100644 index 00000000..849bbdb7 --- /dev/null +++ b/Project 18 - BlueLibrarySwift/BlueLibrarySwift/AlbumView.swift @@ -0,0 +1,71 @@ +// +// AlbumView.swift +// BlueLibrarySwift +// +// Created by Yi Gu on 5/6/16. +// Copyright © 2016 Raywenderlich. All rights reserved. +// + +import UIKit + +class AlbumView: UIView { + private var coverImageView: UIImageView! + private var indicatorView: UIActivityIndicatorView! + private var valueObservation: NSKeyValueObservation! + + required init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + commonInit() + } + + init(frame: CGRect, coverUrl: String) { + super.init(frame: frame) + commonInit() + + NotificationCenter.default.post(name: .BLDownloadImage, object: self, userInfo: ["imageView": coverImageView ?? UIImage(), "coverUrl" : coverUrl]) + } + + private func commonInit() { + // Setup the background + backgroundColor = .black + + // Create the cover image view + coverImageView = UIImageView() + coverImageView.translatesAutoresizingMaskIntoConstraints = false + addSubview(coverImageView) + + // Create the indicator view + indicatorView = UIActivityIndicatorView() + indicatorView.translatesAutoresizingMaskIntoConstraints = false + indicatorView.style = .whiteLarge + indicatorView.startAnimating() + addSubview(indicatorView) + + NSLayoutConstraint.activate([ + coverImageView.leadingAnchor.constraint(equalTo: self.leadingAnchor, constant: 5), + coverImageView.trailingAnchor.constraint(equalTo: self.trailingAnchor, constant: -5), + coverImageView.topAnchor.constraint(equalTo: self.topAnchor, constant: 5), + coverImageView.bottomAnchor.constraint(equalTo: self.bottomAnchor, constant: -5), + indicatorView.centerXAnchor.constraint(equalTo: self.centerXAnchor), + indicatorView.centerYAnchor.constraint(equalTo: self.centerYAnchor) + ]) + + valueObservation = coverImageView.observe(\.image, options: [.new]) { [unowned self] observed, change in + if change.newValue is UIImage { + self.indicatorView.stopAnimating() + } + } + } + + func highlightAlbum(_ didHighlightView: Bool) { + if didHighlightView == true { + backgroundColor = .white + } else { + backgroundColor = .black + } + } +} + +extension Notification.Name { + static let BLDownloadImage = Notification.Name(downloadImageNotification) +} diff --git a/Project 17 - BlueLibrarySwift/BlueLibrarySwift/HTTPClient.swift b/Project 18 - BlueLibrarySwift/BlueLibrarySwift/AppDelegate.swift similarity index 71% rename from Project 17 - BlueLibrarySwift/BlueLibrarySwift/HTTPClient.swift rename to Project 18 - BlueLibrarySwift/BlueLibrarySwift/AppDelegate.swift index 7d489135..a65235a0 100644 --- a/Project 17 - BlueLibrarySwift/BlueLibrarySwift/HTTPClient.swift +++ b/Project 18 - BlueLibrarySwift/BlueLibrarySwift/AppDelegate.swift @@ -22,23 +22,14 @@ import UIKit -class HTTPClient { - - func getRequest(_ url: String) -> (AnyObject) { - return Data() as (AnyObject) - } - - func postRequest(_ url: String, body: String) -> (AnyObject){ - return Data() as (AnyObject) - } - - func downloadImage(_ url: String) -> (UIImage) { - let aUrl = URL(string: url) - guard let data = try? Data(contentsOf: aUrl!) else { - return UIImage() - } - let image = UIImage(data: data) - return image! +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + + var window: UIWindow? + + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { + // Override point for customization after application launch. + return true } - } + diff --git a/Project 17 - BlueLibrarySwift/BlueLibrarySwift/Base.lproj/LaunchScreen.xib b/Project 18 - BlueLibrarySwift/BlueLibrarySwift/Base.lproj/LaunchScreen.xib similarity index 84% rename from Project 17 - BlueLibrarySwift/BlueLibrarySwift/Base.lproj/LaunchScreen.xib rename to Project 18 - BlueLibrarySwift/BlueLibrarySwift/Base.lproj/LaunchScreen.xib index bd1f749d..7e64ab1a 100644 --- a/Project 17 - BlueLibrarySwift/BlueLibrarySwift/Base.lproj/LaunchScreen.xib +++ b/Project 18 - BlueLibrarySwift/BlueLibrarySwift/Base.lproj/LaunchScreen.xib @@ -1,8 +1,13 @@ - - + + + + + - + + + @@ -24,7 +29,7 @@ - + diff --git a/Project 17 - BlueLibrarySwift/BlueLibrarySwift/Base.lproj/Main.storyboard b/Project 18 - BlueLibrarySwift/BlueLibrarySwift/Base.lproj/Main.storyboard similarity index 92% rename from Project 17 - BlueLibrarySwift/BlueLibrarySwift/Base.lproj/Main.storyboard rename to Project 18 - BlueLibrarySwift/BlueLibrarySwift/Base.lproj/Main.storyboard index bfa515a6..2f8c1149 100644 --- a/Project 17 - BlueLibrarySwift/BlueLibrarySwift/Base.lproj/Main.storyboard +++ b/Project 18 - BlueLibrarySwift/BlueLibrarySwift/Base.lproj/Main.storyboard @@ -1,11 +1,11 @@ - + - + @@ -14,7 +14,7 @@ - + @@ -34,18 +34,18 @@ - + - - + + - + @@ -83,8 +83,8 @@ - - + + @@ -107,7 +107,7 @@ - + diff --git a/Project 29 - Grocr/Grocr/AppDelegate.swift b/Project 18 - BlueLibrarySwift/BlueLibrarySwift/HTTPClient.swift similarity index 66% rename from Project 29 - Grocr/Grocr/AppDelegate.swift rename to Project 18 - BlueLibrarySwift/BlueLibrarySwift/HTTPClient.swift index 46abab22..fc2b218b 100644 --- a/Project 29 - Grocr/Grocr/AppDelegate.swift +++ b/Project 18 - BlueLibrarySwift/BlueLibrarySwift/HTTPClient.swift @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015 Razeware LLC + * Copyright (c) 2014 Razeware LLC * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -21,20 +21,27 @@ */ import UIKit -import Firebase -@UIApplicationMain -class AppDelegate: UIResponder, UIApplicationDelegate { +class HTTPClient { - var window: UIWindow? + func getRequest(_ url: String) -> (AnyObject) { + return Data() as (AnyObject) + } - func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { - - FIRApp.configure() - FIRDatabase.database().persistenceEnabled = true - UIApplication.shared.statusBarStyle = .lightContent - return true + func postRequest(_ url: String, body: String) -> (AnyObject){ + return Data() as (AnyObject) } - + + // This is synchronous way to download image via url, please use it in background + func downloadImage(_ url: String) -> (UIImage) { + let aUrl = URL(string: url) + + guard let data = try? Data(contentsOf: aUrl!) else { + return UIImage() + } + + let image = UIImage(data: data) + return image! + } + } - diff --git a/Project 18 - BlueLibrarySwift/BlueLibrarySwift/HorizontalScroller.swift b/Project 18 - BlueLibrarySwift/BlueLibrarySwift/HorizontalScroller.swift new file mode 100644 index 00000000..1e91ce9b --- /dev/null +++ b/Project 18 - BlueLibrarySwift/BlueLibrarySwift/HorizontalScroller.swift @@ -0,0 +1,164 @@ +// +// HorizontalScroller.swift +// BlueLibrarySwift +// +// Created by Yi Gu on 5/8/16. +// Copyright © 2016 Raywenderlich. All rights reserved. +// + +import UIKit + +// MARK: - DataSource +protocol HorizontalScrollerDataSource: class { + // number of views to present inside the horizontal scroller + func numberOfViews(in horizontalScrollerView: HorizontalScrollerView) -> Int + + // the view that should appear at index + func horizontalScrollerView(_ horizontalScrollerView: HorizontalScrollerView, viewAt index: Int) -> UIView +} + +extension HorizontalScrollerDataSource { + func initialViewIndex(_ scroller: HorizontalScrollerView) -> Int { + return 0 + } +} + +// MARK: - Delegate +protocol HorizontalScrollerDelegate: class { + + // inform the delegate what the view at has been clicked + func horizontalScrollerView(_ horizontalScrollerView: HorizontalScrollerView, didSelectViewAt index: Int) +} + +// MARK: - HorizontalScroller +class HorizontalScrollerView: UIView { + weak var delegate: HorizontalScrollerDelegate? + weak var dataSource: HorizontalScrollerDataSource? + + // MARK: - Variables + fileprivate enum ViewConstants { + static let Padding: CGFloat = 10 + static let Dimensions: CGFloat = 100 + static let Offset: CGFloat = 100 + } + + fileprivate var scroller = UIScrollView() + + fileprivate var contentViews = [UIView]() + + // MARK: - Lifecycle + override init(frame: CGRect) { + super.init(frame: frame) + initializeScrollView() + } + + required init(coder aDecoder: NSCoder) { + super.init(coder: aDecoder)! + initializeScrollView() + } + + func initializeScrollView() { + addSubview(scroller) + + scroller.translatesAutoresizingMaskIntoConstraints = false + + NSLayoutConstraint.activate([ + scroller.leadingAnchor.constraint(equalTo: self.leadingAnchor), + scroller.trailingAnchor.constraint(equalTo: self.trailingAnchor), + scroller.topAnchor.constraint(equalTo: self.topAnchor), + scroller.bottomAnchor.constraint(equalTo: self.bottomAnchor) + ]) + + let tapRecognizer = UITapGestureRecognizer(target: self, action: Selector.scrollerDidTap) + scroller.addGestureRecognizer(tapRecognizer) + } + + // call reload when added to another view + override func didMoveToSuperview() { + reload() + } + + func scrollToView(at index: Int, animated: Bool = true) { + guard index < contentViews.count else { + return + } + let centralView = contentViews[index] + let targetCenter = centralView.center + let targetOffsetX = targetCenter.x - (scroller.bounds.width / 2) + scroller.setContentOffset(CGPoint(x: targetOffsetX, y: 0), animated: animated) + } + + @objc func scrollerDidTap(_ gesture: UITapGestureRecognizer) { + let location = gesture.location(in: gesture.view) + + guard let index = contentViews.firstIndex(where: { $0.frame.contains(location) }) + else { + return + } + + delegate?.horizontalScrollerView(self, didSelectViewAt: index) + scrollToView(at: index) + } + + func viewAtIndex(_ index :Int) -> UIView { + return contentViews[index] + } + + func reload() { + guard let dataSource = dataSource else { + return + } + + // Remove the old content views + contentViews.forEach { $0.removeFromSuperview() } + + // xValue is the starting point of each view inside the scroller + var xValue = ViewConstants.Offset + + // Fetch and add the new views + contentViews = (0.. [Album] { + return persistencyManager.getAlbums() + } + + func addAlbum(_ album: Album, index: Int) { + persistencyManager.addAlbum(album, index: index) + if isOnline { + let _ = httpClient.postRequest("/api/addAlbum", body: album.description) + } + } + + func deleteAlbum(_ index: Int) { + persistencyManager.deleteAlbumAtIndex(index) + if isOnline { + let _ = httpClient.postRequest("/api/deleteAlbum", body: "\(index)") + } + } + + @objc func downloadImage(_ notification: Notification) { + // retrieve info from notification + guard let userInfo = notification.userInfo, + let imageView = userInfo["imageView"] as? UIImageView, + let coverUrl = userInfo["coverUrl"] as? String, + let filename = URL(string: coverUrl)?.lastPathComponent else { + return + } + + // get image + if let savedImage = persistencyManager.getImage(with: filename) { + imageView.image = savedImage + return + } + + DispatchQueue.global().async { + let downloadedImage = self.httpClient.downloadImage(coverUrl as String) + DispatchQueue.main.async { + imageView.image = downloadedImage + self.persistencyManager.saveImage(downloadedImage, filename: URL(string: coverUrl)!.lastPathComponent) + } + } + } + + func saveAlbums() { + persistencyManager.saveAlbums() + } +} + +extension Selector { + static let downloadImage = #selector(LibraryAPI.downloadImage(_:)) +} diff --git a/Project 18 - BlueLibrarySwift/BlueLibrarySwift/PersistencyManager.swift b/Project 18 - BlueLibrarySwift/BlueLibrarySwift/PersistencyManager.swift new file mode 100644 index 00000000..687ba483 --- /dev/null +++ b/Project 18 - BlueLibrarySwift/BlueLibrarySwift/PersistencyManager.swift @@ -0,0 +1,79 @@ +// +// PersistencyManager.swift +// BlueLibrarySwift +// +// Created by Yi Gu on 5/6/16. +// Copyright © 2016 Raywenderlich. All rights reserved. +// + +import UIKit + +final class PersistencyManager: NSObject { + fileprivate var albums = [Album]() + fileprivate var cache: URL { + return FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask)[0] + } + private var documents: URL { + return FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0] + } + private enum Filenames { + static let Albums = "albums.json" + } + + override init() { + super.init() + + let savedURL = documents.appendingPathComponent(Filenames.Albums) + var data = try? Data(contentsOf: savedURL) + if data == nil, let bundleURL = Bundle.main.url(forResource: Filenames.Albums, withExtension: nil) { + data = try? Data(contentsOf: bundleURL) + } + + if let albumData = data, + let decodedAlbums = try? JSONDecoder().decode([Album].self, from: albumData) { + albums = decodedAlbums + saveAlbums() + } + } + + func saveAlbums() { + let url = documents.appendingPathComponent(Filenames.Albums) + let encoder = JSONEncoder() + guard let encodedData = try? encoder.encode(albums) else { + return + } + try? encodedData.write(to: url) + } + + func getAlbums() -> [Album] { + return albums + } + + func addAlbum(_ album: Album, index: Int) { + if albums.count >= index { + albums.insert(album, at: index) + } else { + albums.append(album) + } + } + + func deleteAlbumAtIndex(_ index: Int) { + albums.remove(at: index) + } + + func saveImage(_ image: UIImage, filename: String) { + let url = cache.appendingPathComponent(filename) + guard let data = image.pngData() else { + return + } + try? data.write(to: url) + } + + func getImage(with filename: String) -> UIImage? { + let url = cache.appendingPathComponent(filename) + guard let data = try? Data(contentsOf: url) else { + return nil + } + return UIImage(data: data) + } +} diff --git a/Project 17 - BlueLibrarySwift/BlueLibrarySwift/ViewController.swift b/Project 18 - BlueLibrarySwift/BlueLibrarySwift/ViewController.swift similarity index 62% rename from Project 17 - BlueLibrarySwift/BlueLibrarySwift/ViewController.swift rename to Project 18 - BlueLibrarySwift/BlueLibrarySwift/ViewController.swift index 2f5df9f2..e7f18794 100644 --- a/Project 17 - BlueLibrarySwift/BlueLibrarySwift/ViewController.swift +++ b/Project 18 - BlueLibrarySwift/BlueLibrarySwift/ViewController.swift @@ -27,11 +27,11 @@ class ViewController: UIViewController { // MARK: - IBOutlet @IBOutlet var dataTable: UITableView! @IBOutlet var toolbar: UIToolbar! - @IBOutlet var scroller: HorizontalScroller! + @IBOutlet var scroller: HorizontalScrollerView! // MARK: - Private Variables fileprivate var allAlbums = [Album]() - fileprivate var currentAlbumData : (titles:[String], values:[String])? + fileprivate var currentAlbumData: [AlbumData]? fileprivate var currentAlbumIndex = 0 // use a stack to push and pop operation for the undo option fileprivate var undoStack: [(Album, Int)] = [] @@ -40,66 +40,62 @@ class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() - setupUI() - setupData() - setupComponents() - showDataForAlbum(currentAlbumIndex) + func setUI() { + navigationController?.navigationBar.isTranslucent = false + } - NotificationCenter.default.addObserver(self, selector:#selector(ViewController.saveCurrentState), name: NSNotification.Name.UIApplicationDidEnterBackground, object: nil) - } - - deinit { - NotificationCenter.default.removeObserver(self) - } - - func setupUI() { - navigationController?.navigationBar.isTranslucent = false - } - - func setupData() { - currentAlbumIndex = 0 - allAlbums = LibraryAPI.sharedInstance.getAlbums() - } - - func setupComponents() { - dataTable.backgroundView = nil - loadPreviousState() - scroller.delegate = self - reloadScroller() + func setData() { + currentAlbumIndex = 0 + allAlbums = LibraryAPI.sharedInstance.getAlbums() + } - let undoButton = UIBarButtonItem(barButtonSystemItem: .undo, target: self, action:#selector(ViewController.undoAction)) - undoButton.isEnabled = false; - let space = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target:nil, action:nil) - let trashButton = UIBarButtonItem(barButtonSystemItem: .trash, target:self, action:#selector(ViewController.deleteAlbum)) - let toolbarButtonItems = [undoButton, space, trashButton] - toolbar.setItems(toolbarButtonItems, animated: true) - } + func setComponents() { + dataTable.backgroundView = nil + loadPreviousState() + scroller.delegate = self + scroller.dataSource = self + reloadScroller() + scroller.scrollToView(at: currentAlbumIndex) + + let undoButton = UIBarButtonItem(barButtonSystemItem: .undo, target: self, action:Selector.undoAction) + undoButton.isEnabled = false; + let space = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target:nil, action:nil) + let trashButton = UIBarButtonItem(barButtonSystemItem: .trash, target:self, action:Selector.deleteAlbum) + let toolbarButtonItems = [undoButton, space, trashButton] + toolbar.setItems(toolbarButtonItems, animated: true) + } + + setUI() + setData() + setComponents() + showDataForAlbum(at: currentAlbumIndex) + + NotificationCenter.default.addObserver(self, selector:Selector.saveCurrentState, name: UIApplication.didEnterBackgroundNotification, object: nil) + } - func showDataForAlbum(_ index: Int) { + func showDataForAlbum(at index: Int) { if index < allAlbums.count && index > -1 { let album = allAlbums[index] - currentAlbumData = album.ae_tableRepresentation() + currentAlbumData = album.tableRepresentation } else { currentAlbumData = nil } - if let dataTable = dataTable { - dataTable.reloadData() - } + dataTable.reloadData() } // MARK: - Memento Pattern - func saveCurrentState() { + @objc func saveCurrentState() { // When the user leaves the app and then comes back again, he wants it to be in the exact same state // he left it. In order to do this we need to save the currently displayed album. // Since it's only one piece of information we can use NSUserDefaults. - UserDefaults.standard.set(currentAlbumIndex, forKey: "currentAlbumIndex") + UserDefaults.standard.set(currentAlbumIndex, forKey: Constants.indexRestorationKey) LibraryAPI.sharedInstance.saveAlbums() } func loadPreviousState() { - currentAlbumIndex = UserDefaults.standard.integer(forKey: "currentAlbumIndex") - showDataForAlbum(currentAlbumIndex) + currentAlbumIndex = UserDefaults.standard.integer(forKey: Constants.indexRestorationKey) + showDataForAlbum(at: currentAlbumIndex) } // MARK: - Scroller Related @@ -111,7 +107,7 @@ class ViewController: UIViewController { currentAlbumIndex = allAlbums.count - 1 } scroller.reload() - showDataForAlbum(currentAlbumIndex) + showDataForAlbum(at: currentAlbumIndex) } func addAlbumAtIndex(_ album: Album,index: Int) { @@ -120,7 +116,7 @@ class ViewController: UIViewController { reloadScroller() } - func deleteAlbum() { + @objc func deleteAlbum() { // get album let deletedAlbum : Album = allAlbums[currentAlbumIndex] // add to stack @@ -140,7 +136,7 @@ class ViewController: UIViewController { } } - func undoAction() { + @objc func undoAction() { let barButtonItems = toolbar.items! as [UIBarButtonItem] // pop to undo the last one if undoStack.count > 0 { @@ -162,45 +158,48 @@ class ViewController: UIViewController { extension ViewController: UITableViewDataSource { func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { if let albumData = currentAlbumData { - return albumData.titles.count + return albumData.count } else { return 0 } } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { - let cellIdentifier = "Cell" - let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) + + let cell = tableView.dequeueReusableCell(withIdentifier: Constants.cellIdentifier, for: indexPath) if let albumData = currentAlbumData { - cell.textLabel?.text = albumData.titles[(indexPath as NSIndexPath).row] - cell.detailTextLabel?.text = albumData.values[(indexPath as NSIndexPath).row] + cell.textLabel?.text = albumData[(indexPath as NSIndexPath).row].title + cell.detailTextLabel?.text = albumData[(indexPath as NSIndexPath).row].value } return cell } } -// MARK: - HorizontalScroller -extension ViewController: HorizontalScrollerDelegate { - func numberOfViewsForHorizontalScroller(_ scroller: HorizontalScroller) -> Int { +// MARK: - HorizontalScrollerDataSource +extension ViewController: HorizontalScrollerDataSource { + func numberOfViews(in horizontalScrollerView: HorizontalScrollerView) -> Int { return allAlbums.count } - func horizontalScrollerViewAtIndex(_ scroller: HorizontalScroller, index: Int) -> UIView { + func horizontalScrollerView(_ horizontalScrollerView: HorizontalScrollerView, viewAt index: Int) -> UIView { let album = allAlbums[index] - let albumView = AlbumView(frame: CGRect(x: 0, y: 0, width: 100, height: 100), albumCover: album.coverUrl) + + let albumView = AlbumView(frame: CGRect(x: 0, y: 0, width: 100, height: 100), coverUrl: album.coverUrl) if currentAlbumIndex == index { albumView.highlightAlbum(true) } else { albumView.highlightAlbum(false) } - return albumView } - - func horizontalScrollerClickedViewAtIndex(_ scroller: HorizontalScroller, index: Int) { +} + +// MARK: - HorizontalScrollerDelegate +extension ViewController: HorizontalScrollerDelegate { + func horizontalScrollerView(_ horizontalScrollerView: HorizontalScrollerView, didSelectViewAt index: Int) { let previousAlbumView = scroller.viewAtIndex(currentAlbumIndex) as! AlbumView previousAlbumView.highlightAlbum(false) @@ -209,11 +208,19 @@ extension ViewController: HorizontalScrollerDelegate { let albumView = scroller.viewAtIndex(currentAlbumIndex) as! AlbumView albumView.highlightAlbum(true) - showDataForAlbum(currentAlbumIndex) - } - - func initialViewIndex(_ scroller: HorizontalScroller) -> Int { - return currentAlbumIndex + showDataForAlbum(at: currentAlbumIndex) } } +// MARK: - Constants +fileprivate enum Constants { + static let cellIdentifier = "Cell" + static let indexRestorationKey = "currentAlbumIndex" +} + +fileprivate extension Selector { + static let undoAction = #selector(ViewController.undoAction) + static let deleteAlbum = #selector(ViewController.deleteAlbum) + static let saveCurrentState = #selector(ViewController.saveCurrentState) +} + diff --git a/Project 18 - BlueLibrarySwift/BlueLibrarySwift/albums.json b/Project 18 - BlueLibrarySwift/BlueLibrarySwift/albums.json new file mode 100644 index 00000000..ddc26f24 --- /dev/null +++ b/Project 18 - BlueLibrarySwift/BlueLibrarySwift/albums.json @@ -0,0 +1,37 @@ +[ + { + "title": "Opus 12", + "artist": "Jay Chou", + "genre": "Pop", + "coverUrl": "http://a2.att.hudong.com/88/93/19300001321437135520930453813.jpg", + "year": "2012" + }, + { + "artist": "Lady Gaga", + "coverUrl": "https://upload.wikimedia.org/wikipedia/en/3/36/Lady_Gaga_-_Poker_Face.png", + "genre": "Pop", + "title": "Poker Face", + "year": "2013" + }, + { + "artist": "Justin Biber", + "coverUrl": "https://consequenceofsound.files.wordpress.com/2015/08/screen-shot-2015-08-28-at-7-10-21-am.png?w=689", + "genre": "Pop", + "title": "What do you mean", + "year": "2014" + }, + { + "artist": "U2", + "coverUrl": "https://s3.amazonaws.com/CoverProject/album/album_u2_staring_at_the_sun.png", + "genre": "Pop", + "title": "Staring at the Sun", + "year": "2000" + }, + { + "artist": "Linkin Park", + "coverUrl": "http://img01.deviantart.net/19e2/i/2011/156/3/1/linkin_park_album_art_2_by_jaylathe1-d3i344s.jpg", + "genre": "Pop", + "title": "Iridescent", + "year": "2000" + } +] diff --git a/Project 17 - BlueLibrarySwift/Constants.swift b/Project 18 - BlueLibrarySwift/Constants.swift similarity index 100% rename from Project 17 - BlueLibrarySwift/Constants.swift rename to Project 18 - BlueLibrarySwift/Constants.swift diff --git a/Project 17 - BlueLibrarySwift/README.md b/Project 18 - BlueLibrarySwift/README.md similarity index 100% rename from Project 17 - BlueLibrarySwift/README.md rename to Project 18 - BlueLibrarySwift/README.md diff --git a/Project 18 - ClassicPhotos/ClassicPhotos.xcodeproj/project.xcworkspace/xcshareddata/ClassicPhotos.xccheckout b/Project 18 - ClassicPhotos/ClassicPhotos.xcodeproj/project.xcworkspace/xcshareddata/ClassicPhotos.xccheckout deleted file mode 100644 index 3fca11c0..00000000 --- a/Project 18 - ClassicPhotos/ClassicPhotos.xcodeproj/project.xcworkspace/xcshareddata/ClassicPhotos.xccheckout +++ /dev/null @@ -1,41 +0,0 @@ - - - - - IDESourceControlProjectFavoriteDictionaryKey - - IDESourceControlProjectIdentifier - 8EFCE5A8-5C05-43CB-B047-0665CBF9762D - IDESourceControlProjectName - ClassicPhotos - IDESourceControlProjectOriginsDictionary - - F64F7251-746A-46F0-AB07-AFFD68A209E6 - ssh://bitbucket.org/jrturton/nsoperationsampleproject.git - - IDESourceControlProjectPath - ClassicPhotos.xcodeproj/project.xcworkspace - IDESourceControlProjectRelativeInstallPathDictionary - - F64F7251-746A-46F0-AB07-AFFD68A209E6 - ../.. - - IDESourceControlProjectURL - ssh://bitbucket.org/jrturton/nsoperationsampleproject.git - IDESourceControlProjectVersion - 110 - IDESourceControlProjectWCCIdentifier - F64F7251-746A-46F0-AB07-AFFD68A209E6 - IDESourceControlProjectWCConfigurations - - - IDESourceControlRepositoryExtensionIdentifierKey - public.vcs.git - IDESourceControlWCCIdentifierKey - F64F7251-746A-46F0-AB07-AFFD68A209E6 - IDESourceControlWCCName - nsoperationsampleproject - - - - diff --git a/Project 18 - ClassicPhotos/ClassicPhotos.xcodeproj/xcuserdata/Yi.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/Project 18 - ClassicPhotos/ClassicPhotos.xcodeproj/xcuserdata/Yi.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist deleted file mode 100644 index fe2b4541..00000000 --- a/Project 18 - ClassicPhotos/ClassicPhotos.xcodeproj/xcuserdata/Yi.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/Project 18 - ClassicPhotos/ClassicPhotos.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/ClassicPhotos.xcscheme b/Project 18 - ClassicPhotos/ClassicPhotos.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/ClassicPhotos.xcscheme deleted file mode 100644 index acc3825d..00000000 --- a/Project 18 - ClassicPhotos/ClassicPhotos.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/ClassicPhotos.xcscheme +++ /dev/null @@ -1,101 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Project 18 - ClassicPhotos/ClassicPhotos.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/xcschememanagement.plist b/Project 18 - ClassicPhotos/ClassicPhotos.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/xcschememanagement.plist deleted file mode 100644 index 00e8807b..00000000 --- a/Project 18 - ClassicPhotos/ClassicPhotos.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/xcschememanagement.plist +++ /dev/null @@ -1,27 +0,0 @@ - - - - - SchemeUserState - - ClassicPhotos.xcscheme - - orderHint - 0 - - - SuppressBuildableAutocreation - - 27DF645C19657A9300B42725 - - primary - - - 27DF646919657A9300B42725 - - primary - - - - - diff --git a/Project 18 - ClassicPhotos/ClassicPhotos.xcodeproj/xcuserdata/richard.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/Project 18 - ClassicPhotos/ClassicPhotos.xcodeproj/xcuserdata/richard.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist deleted file mode 100644 index fe2b4541..00000000 --- a/Project 18 - ClassicPhotos/ClassicPhotos.xcodeproj/xcuserdata/richard.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/Project 18 - ClassicPhotos/ClassicPhotos.xcodeproj/xcuserdata/richard.xcuserdatad/xcschemes/ClassicPhotos.xcscheme b/Project 18 - ClassicPhotos/ClassicPhotos.xcodeproj/xcuserdata/richard.xcuserdatad/xcschemes/ClassicPhotos.xcscheme deleted file mode 100644 index b0f97129..00000000 --- a/Project 18 - ClassicPhotos/ClassicPhotos.xcodeproj/xcuserdata/richard.xcuserdatad/xcschemes/ClassicPhotos.xcscheme +++ /dev/null @@ -1,110 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Project 18 - ClassicPhotos/ClassicPhotos.xcodeproj/xcuserdata/richard.xcuserdatad/xcschemes/xcschememanagement.plist b/Project 18 - ClassicPhotos/ClassicPhotos.xcodeproj/xcuserdata/richard.xcuserdatad/xcschemes/xcschememanagement.plist deleted file mode 100644 index 00e8807b..00000000 --- a/Project 18 - ClassicPhotos/ClassicPhotos.xcodeproj/xcuserdata/richard.xcuserdatad/xcschemes/xcschememanagement.plist +++ /dev/null @@ -1,27 +0,0 @@ - - - - - SchemeUserState - - ClassicPhotos.xcscheme - - orderHint - 0 - - - SuppressBuildableAutocreation - - 27DF645C19657A9300B42725 - - primary - - - 27DF646919657A9300B42725 - - primary - - - - - diff --git a/Project 18 - ClassicPhotos/ClassicPhotos.xcodeproj/xcuserdata/rnystrom.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/Project 18 - ClassicPhotos/ClassicPhotos.xcodeproj/xcuserdata/rnystrom.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist deleted file mode 100644 index fe2b4541..00000000 --- a/Project 18 - ClassicPhotos/ClassicPhotos.xcodeproj/xcuserdata/rnystrom.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/Project 18 - ClassicPhotos/ClassicPhotos.xcodeproj/xcuserdata/rnystrom.xcuserdatad/xcschemes/ClassicPhotos.xcscheme b/Project 18 - ClassicPhotos/ClassicPhotos.xcodeproj/xcuserdata/rnystrom.xcuserdatad/xcschemes/ClassicPhotos.xcscheme deleted file mode 100644 index 378eec7c..00000000 --- a/Project 18 - ClassicPhotos/ClassicPhotos.xcodeproj/xcuserdata/rnystrom.xcuserdatad/xcschemes/ClassicPhotos.xcscheme +++ /dev/null @@ -1,110 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Project 18 - ClassicPhotos/ClassicPhotos.xcodeproj/xcuserdata/rnystrom.xcuserdatad/xcschemes/xcschememanagement.plist b/Project 18 - ClassicPhotos/ClassicPhotos.xcodeproj/xcuserdata/rnystrom.xcuserdatad/xcschemes/xcschememanagement.plist deleted file mode 100644 index 00e8807b..00000000 --- a/Project 18 - ClassicPhotos/ClassicPhotos.xcodeproj/xcuserdata/rnystrom.xcuserdatad/xcschemes/xcschememanagement.plist +++ /dev/null @@ -1,27 +0,0 @@ - - - - - SchemeUserState - - ClassicPhotos.xcscheme - - orderHint - 0 - - - SuppressBuildableAutocreation - - 27DF645C19657A9300B42725 - - primary - - - 27DF646919657A9300B42725 - - primary - - - - - diff --git a/Project 18 - ClassicPhotos/ClassicPhotos.xcodeproj/xcuserdata/verticalturtle.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/Project 18 - ClassicPhotos/ClassicPhotos.xcodeproj/xcuserdata/verticalturtle.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist deleted file mode 100644 index df9fd28c..00000000 --- a/Project 18 - ClassicPhotos/ClassicPhotos.xcodeproj/xcuserdata/verticalturtle.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - diff --git a/Project 18 - ClassicPhotos/ClassicPhotos.xcodeproj/xcuserdata/verticalturtle.xcuserdatad/xcschemes/ClassicPhotos.xcscheme b/Project 18 - ClassicPhotos/ClassicPhotos.xcodeproj/xcuserdata/verticalturtle.xcuserdatad/xcschemes/ClassicPhotos.xcscheme deleted file mode 100644 index d2baf3cb..00000000 --- a/Project 18 - ClassicPhotos/ClassicPhotos.xcodeproj/xcuserdata/verticalturtle.xcuserdatad/xcschemes/ClassicPhotos.xcscheme +++ /dev/null @@ -1,96 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Project 18 - ClassicPhotos/ClassicPhotos.xcodeproj/xcuserdata/verticalturtle.xcuserdatad/xcschemes/xcschememanagement.plist b/Project 18 - ClassicPhotos/ClassicPhotos.xcodeproj/xcuserdata/verticalturtle.xcuserdatad/xcschemes/xcschememanagement.plist deleted file mode 100644 index 00e8807b..00000000 --- a/Project 18 - ClassicPhotos/ClassicPhotos.xcodeproj/xcuserdata/verticalturtle.xcuserdatad/xcschemes/xcschememanagement.plist +++ /dev/null @@ -1,27 +0,0 @@ - - - - - SchemeUserState - - ClassicPhotos.xcscheme - - orderHint - 0 - - - SuppressBuildableAutocreation - - 27DF645C19657A9300B42725 - - primary - - - 27DF646919657A9300B42725 - - primary - - - - - diff --git a/Project 19 - Pinterest/Pinterest.xcodeproj/project.pbxproj b/Project 19 - Pinterest/Pinterest.xcodeproj/project.pbxproj index 65ff2a9a..7df81089 100644 --- a/Project 19 - Pinterest/Pinterest.xcodeproj/project.pbxproj +++ b/Project 19 - Pinterest/Pinterest.xcodeproj/project.pbxproj @@ -186,19 +186,19 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0730; - LastUpgradeCheck = 0820; + LastUpgradeCheck = 1020; ORGANIZATIONNAME = "Razeware LLC"; TargetAttributes = { 7B0AC7B51AAEF90000885D4A = { CreatedOnToolsVersion = 6.2; DevelopmentTeam = H2B5656ZFA; - LastSwiftMigration = 0800; + LastSwiftMigration = 1020; }; }; }; buildConfigurationList = 7B0AC7B11AAEF90000885D4A /* Build configuration list for PBXProject "Pinterest" */; compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; + developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, @@ -270,18 +270,27 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -304,7 +313,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.2; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -316,18 +325,27 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -343,7 +361,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.2; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; @@ -360,7 +378,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.yigu.Pinterest; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; }; name = Debug; }; @@ -373,7 +391,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.yigu.Pinterest; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; }; name = Release; }; diff --git a/Project 19 - Pinterest/Pinterest.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Project 19 - Pinterest/Pinterest.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/Project 19 - Pinterest/Pinterest.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Project 19 - Pinterest/Pinterest.xcodeproj/project.xcworkspace/xcshareddata/Pinterest.xccheckout b/Project 19 - Pinterest/Pinterest.xcodeproj/project.xcworkspace/xcshareddata/Pinterest.xccheckout deleted file mode 100644 index 32db99b4..00000000 --- a/Project 19 - Pinterest/Pinterest.xcodeproj/project.xcworkspace/xcshareddata/Pinterest.xccheckout +++ /dev/null @@ -1,41 +0,0 @@ - - - - - IDESourceControlProjectFavoriteDictionaryKey - - IDESourceControlProjectIdentifier - F658974D-CEC1-40CF-AC47-8504686B82B8 - IDESourceControlProjectName - Pinterest - IDESourceControlProjectOriginsDictionary - - 2A2B3E9CD14DFD007383D9724ADBD8D768277925 - https://github.com/micpringle/Pinterest.git - - IDESourceControlProjectPath - Pinterest.xcodeproj - IDESourceControlProjectRelativeInstallPathDictionary - - 2A2B3E9CD14DFD007383D9724ADBD8D768277925 - ../.. - - IDESourceControlProjectURL - https://github.com/micpringle/Pinterest.git - IDESourceControlProjectVersion - 111 - IDESourceControlProjectWCCIdentifier - 2A2B3E9CD14DFD007383D9724ADBD8D768277925 - IDESourceControlProjectWCConfigurations - - - IDESourceControlRepositoryExtensionIdentifierKey - public.vcs.git - IDESourceControlWCCIdentifierKey - 2A2B3E9CD14DFD007383D9724ADBD8D768277925 - IDESourceControlWCCName - Pinterest - - - - diff --git a/Project 19 - Pinterest/Pinterest.xcodeproj/project.xcworkspace/xcuserdata/Yi.xcuserdatad/UserInterfaceState.xcuserstate b/Project 19 - Pinterest/Pinterest.xcodeproj/project.xcworkspace/xcuserdata/Yi.xcuserdatad/UserInterfaceState.xcuserstate deleted file mode 100644 index dffbeecf..00000000 Binary files a/Project 19 - Pinterest/Pinterest.xcodeproj/project.xcworkspace/xcuserdata/Yi.xcuserdatad/UserInterfaceState.xcuserstate and /dev/null differ diff --git a/Project 19 - Pinterest/Pinterest.xcodeproj/project.xcworkspace/xcuserdata/ernesto.xcuserdatad/UserInterfaceState.xcuserstate b/Project 19 - Pinterest/Pinterest.xcodeproj/project.xcworkspace/xcuserdata/ernesto.xcuserdatad/UserInterfaceState.xcuserstate deleted file mode 100644 index 35735fa0..00000000 Binary files a/Project 19 - Pinterest/Pinterest.xcodeproj/project.xcworkspace/xcuserdata/ernesto.xcuserdatad/UserInterfaceState.xcuserstate and /dev/null differ diff --git a/Project 19 - Pinterest/Pinterest.xcodeproj/project.xcworkspace/xcuserdata/micpringle.xcuserdatad/UserInterfaceState.xcuserstate b/Project 19 - Pinterest/Pinterest.xcodeproj/project.xcworkspace/xcuserdata/micpringle.xcuserdatad/UserInterfaceState.xcuserstate deleted file mode 100644 index 3000ceaf..00000000 Binary files a/Project 19 - Pinterest/Pinterest.xcodeproj/project.xcworkspace/xcuserdata/micpringle.xcuserdatad/UserInterfaceState.xcuserstate and /dev/null differ diff --git a/Project 19 - Pinterest/Pinterest.xcodeproj/xcuserdata/Yi.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/Project 19 - Pinterest/Pinterest.xcodeproj/xcuserdata/Yi.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist deleted file mode 100644 index fe2b4541..00000000 --- a/Project 19 - Pinterest/Pinterest.xcodeproj/xcuserdata/Yi.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/Project 19 - Pinterest/Pinterest.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/Pinterest.xcscheme b/Project 19 - Pinterest/Pinterest.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/Pinterest.xcscheme deleted file mode 100644 index 2e09540c..00000000 --- a/Project 19 - Pinterest/Pinterest.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/Pinterest.xcscheme +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Project 19 - Pinterest/Pinterest.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/xcschememanagement.plist b/Project 19 - Pinterest/Pinterest.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/xcschememanagement.plist deleted file mode 100644 index bda71529..00000000 --- a/Project 19 - Pinterest/Pinterest.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/xcschememanagement.plist +++ /dev/null @@ -1,22 +0,0 @@ - - - - - SchemeUserState - - Pinterest.xcscheme - - orderHint - 0 - - - SuppressBuildableAutocreation - - 7B0AC7B51AAEF90000885D4A - - primary - - - - - diff --git a/Project 19 - Pinterest/Pinterest/AppDelegate.swift b/Project 19 - Pinterest/Pinterest/AppDelegate.swift index 3f215933..eac27684 100644 --- a/Project 19 - Pinterest/Pinterest/AppDelegate.swift +++ b/Project 19 - Pinterest/Pinterest/AppDelegate.swift @@ -13,9 +13,8 @@ class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? - func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { return true } - } diff --git a/Project 19 - Pinterest/Pinterest/Images.xcassets/AppIcon.appiconset/Contents.json b/Project 19 - Pinterest/Pinterest/Images.xcassets/AppIcon.appiconset/Contents.json index 118c98f7..19882d56 100644 --- a/Project 19 - Pinterest/Pinterest/Images.xcassets/AppIcon.appiconset/Contents.json +++ b/Project 19 - Pinterest/Pinterest/Images.xcassets/AppIcon.appiconset/Contents.json @@ -1,5 +1,15 @@ { "images" : [ + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "3x" + }, { "idiom" : "iphone", "size" : "29x29", @@ -29,6 +39,11 @@ "idiom" : "iphone", "size" : "60x60", "scale" : "3x" + }, + { + "idiom" : "ios-marketing", + "size" : "1024x1024", + "scale" : "1x" } ], "info" : { diff --git a/Project 19 - Pinterest/Pinterest/Photo.swift b/Project 19 - Pinterest/Pinterest/Photo.swift index 4d8e8d20..1c7b61b5 100644 --- a/Project 19 - Pinterest/Pinterest/Photo.swift +++ b/Project 19 - Pinterest/Pinterest/Photo.swift @@ -42,7 +42,7 @@ class Photo { } func heightForComment(_ font: UIFont, width: CGFloat) -> CGFloat { - let rect = NSString(string: comment).boundingRect(with: CGSize(width: width, height: CGFloat(MAXFLOAT)), options: .usesLineFragmentOrigin, attributes: [NSFontAttributeName: font], context: nil) + let rect = NSString(string: comment).boundingRect(with: CGSize(width: width, height: CGFloat(MAXFLOAT)), options: .usesLineFragmentOrigin, attributes: [NSAttributedString.Key.font: font], context: nil) return ceil(rect.height) } diff --git a/Project 19 - Pinterest/Pinterest/PhotoStreamViewController.swift b/Project 19 - Pinterest/Pinterest/PhotoStreamViewController.swift index 36449054..338693e6 100644 --- a/Project 19 - Pinterest/Pinterest/PhotoStreamViewController.swift +++ b/Project 19 - Pinterest/Pinterest/PhotoStreamViewController.swift @@ -13,25 +13,21 @@ class PhotoStreamViewController: UICollectionViewController { var photos = Photo.allPhotos() - override var preferredStatusBarStyle : UIStatusBarStyle { - return UIStatusBarStyle.lightContent - } - override func viewDidLoad() { super.viewDidLoad() - + if let layout = collectionView?.collectionViewLayout as? PinterestLayout { layout.delegate = self } + + view.backgroundColor = UIColor(patternImage: #imageLiteral(resourceName: "Pattern")) - if let patternImage = UIImage(named: "Pattern") { - view.backgroundColor = UIColor(patternImage: patternImage) - } + collectionView!.backgroundColor = #colorLiteral(red: 1, green: 1, blue: 1, alpha: 1) - collectionView!.backgroundColor = UIColor.clear - collectionView!.contentInset = UIEdgeInsets(top: 23, left: 5, bottom: 10, right: 5) + if #available(iOS 11.0, *) { + collectionView?.contentInsetAdjustmentBehavior = .always + } } - } extension PhotoStreamViewController { diff --git a/Project 20 - FlickrSearch/FlickrSearch.xcodeproj/project.pbxproj b/Project 20 - FlickrSearch/FlickrSearch.xcodeproj/project.pbxproj index b5836f88..1a53e050 100644 --- a/Project 20 - FlickrSearch/FlickrSearch.xcodeproj/project.pbxproj +++ b/Project 20 - FlickrSearch/FlickrSearch.xcodeproj/project.pbxproj @@ -130,19 +130,19 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0730; - LastUpgradeCheck = 0810; + LastUpgradeCheck = 1020; ORGANIZATIONNAME = "Yi Gu"; TargetAttributes = { 190B9EA71D7BF3E000ACF7DE = { CreatedOnToolsVersion = 7.3.1; DevelopmentTeam = 44JDRP3T56; - LastSwiftMigration = 0810; + LastSwiftMigration = 1020; }; }; }; buildConfigurationList = 190B9EA31D7BF3E000ACF7DE /* Build configuration list for PBXProject "FlickrSearch" */; compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; + developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, @@ -212,19 +212,28 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -247,7 +256,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -260,19 +269,28 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -289,7 +307,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; @@ -307,7 +325,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = uber.FlickerSearch; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; }; name = Debug; }; @@ -320,7 +338,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = uber.FlickerSearch; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; }; name = Release; }; diff --git a/Project 20 - FlickrSearch/FlickrSearch.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Project 20 - FlickrSearch/FlickrSearch.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/Project 20 - FlickrSearch/FlickrSearch.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Project 20 - FlickrSearch/FlickrSearch.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/FlickerSearch.xcscheme b/Project 20 - FlickrSearch/FlickrSearch.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/FlickerSearch.xcscheme index 88c514f5..6f87c00c 100644 --- a/Project 20 - FlickrSearch/FlickrSearch.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/FlickerSearch.xcscheme +++ b/Project 20 - FlickrSearch/FlickrSearch.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/FlickerSearch.xcscheme @@ -1,6 +1,6 @@ Bool { - // Override point for customization after application launch. + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { + window?.tintColor = themeColor return true } - - func applicationWillResignActive(_ application: UIApplication) { - // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. - // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. - } - - func applicationDidEnterBackground(_ application: UIApplication) { - // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. - // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. - } - - func applicationWillEnterForeground(_ application: UIApplication) { - // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. - } - - func applicationDidBecomeActive(_ application: UIApplication) { - // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. - } - - func applicationWillTerminate(_ application: UIApplication) { - // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. - } - - } diff --git a/Project 20 - FlickrSearch/MainViewController.swift b/Project 20 - FlickrSearch/MainViewController.swift index fb7172e6..78cc6050 100644 --- a/Project 20 - FlickrSearch/MainViewController.swift +++ b/Project 20 - FlickrSearch/MainViewController.swift @@ -49,7 +49,7 @@ class MainViewController: UIViewController { didSet { // reset collectionView and selectedPhotos collectionView?.allowsMultipleSelection = sharing - collectionView?.selectItem(at: nil, animated: true, scrollPosition: UICollectionViewScrollPosition()) + collectionView?.selectItem(at: nil, animated: true, scrollPosition: UICollectionView.ScrollPosition()) selectedPhotos.removeAll(keepingCapacity: false) guard let shareButton = self.navigationItem.rightBarButtonItems?.first else { @@ -81,7 +81,7 @@ class MainViewController: UIViewController { collectionView.addGestureRecognizer(longPressGesture) } - func handleLongGesture(gesture: UILongPressGestureRecognizer) { + @objc func handleLongGesture(gesture: UILongPressGestureRecognizer) { switch(gesture.state) { case UIGestureRecognizerState.began: guard let selectedIndexPath = self.collectionView.indexPathForItem(at: gesture.location(in: self.collectionView)) else { @@ -122,7 +122,7 @@ class MainViewController: UIViewController { // present activityViewController when imageArray has some selected if !imageArray.isEmpty { let shareScreen = UIActivityViewController(activityItems: imageArray, applicationActivities: nil) - shareScreen.completionWithItemsHandler = { _ in + shareScreen.completionWithItemsHandler = { _,_,_,_ in self.sharing = false } let popoverPresentationController = shareScreen.popoverPresentationController @@ -184,7 +184,7 @@ extension MainViewController: UICollectionViewDataSource { viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView { switch kind { - case UICollectionElementKindSectionHeader: + case UICollectionView.elementKindSectionHeader: let headerView = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "FlickrPhotoHeaderView", for: indexPath) as! FlickrPhotoHeaderView @@ -262,7 +262,7 @@ extension MainViewController: UICollectionViewDelegate { let photo = photoForIndexPath(indexPath: indexPath) - if let index = selectedPhotos.index(of: photo) { + if let index = selectedPhotos.firstIndex(of: photo) { selectedPhotos.remove(at: index) updateSharedPhotoCount() } @@ -271,7 +271,7 @@ extension MainViewController: UICollectionViewDelegate { extension MainViewController: UITextFieldDelegate { func textFieldShouldReturn(_ textField: UITextField) -> Bool { - let activityIndicator = UIActivityIndicatorView(activityIndicatorStyle: .gray) + let activityIndicator = UIActivityIndicatorView(style: .gray) textField.addSubview(activityIndicator) activityIndicator.frame = textField.bounds activityIndicator.startAnimating() diff --git a/Project 21 - Browser/Browser.gif b/Project 21 - Browser/Browser.gif new file mode 100644 index 00000000..336e5c75 Binary files /dev/null and b/Project 21 - Browser/Browser.gif differ diff --git a/Project 04 - Todo/Todo.xcodeproj/project.pbxproj b/Project 21 - Browser/Browser.xcodeproj/project.pbxproj similarity index 50% rename from Project 04 - Todo/Todo.xcodeproj/project.pbxproj rename to Project 21 - Browser/Browser.xcodeproj/project.pbxproj index 745803a9..81dc39d0 100644 --- a/Project 04 - Todo/Todo.xcodeproj/project.pbxproj +++ b/Project 21 - Browser/Browser.xcodeproj/project.pbxproj @@ -3,35 +3,29 @@ archiveVersion = 1; classes = { }; - objectVersion = 46; + objectVersion = 50; objects = { /* Begin PBXBuildFile section */ - 19515F8E1C8558F800DC2284 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19515F8D1C8558F800DC2284 /* AppDelegate.swift */; }; - 19515F901C8558F800DC2284 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19515F8F1C8558F800DC2284 /* ViewController.swift */; }; - 19515F931C8558F800DC2284 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 19515F911C8558F800DC2284 /* Main.storyboard */; }; - 19515F951C8558F800DC2284 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 19515F941C8558F800DC2284 /* Assets.xcassets */; }; - 19515F981C8558F800DC2284 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 19515F961C8558F800DC2284 /* LaunchScreen.storyboard */; }; - 19515FA01C855C7300DC2284 /* ToDoItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19515F9F1C855C7300DC2284 /* ToDoItem.swift */; }; - 19515FA21C855D9A00DC2284 /* Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19515FA11C855D9A00DC2284 /* Utils.swift */; }; - 19A79A371C869E270087EEBA /* DetailViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A79A361C869E260087EEBA /* DetailViewController.swift */; }; + 1986E0E9211972BD00001758 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1986E0E8211972BD00001758 /* AppDelegate.swift */; }; + 1986E0EB211972BD00001758 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1986E0EA211972BD00001758 /* ViewController.swift */; }; + 1986E0EE211972BD00001758 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 1986E0EC211972BD00001758 /* Main.storyboard */; }; + 1986E0F0211972BE00001758 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 1986E0EF211972BE00001758 /* Assets.xcassets */; }; + 1986E0F3211972BE00001758 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 1986E0F1211972BE00001758 /* LaunchScreen.storyboard */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ - 19515F8A1C8558F800DC2284 /* Todo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Todo.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 19515F8D1C8558F800DC2284 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 19515F8F1C8558F800DC2284 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; - 19515F921C8558F800DC2284 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; - 19515F941C8558F800DC2284 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - 19515F971C8558F800DC2284 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; - 19515F991C8558F800DC2284 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 19515F9F1C855C7300DC2284 /* ToDoItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ToDoItem.swift; sourceTree = ""; }; - 19515FA11C855D9A00DC2284 /* Utils.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Utils.swift; sourceTree = ""; }; - 19A79A361C869E260087EEBA /* DetailViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DetailViewController.swift; sourceTree = ""; }; + 1986E0E5211972BD00001758 /* Browser.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Browser.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 1986E0E8211972BD00001758 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 1986E0EA211972BD00001758 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; + 1986E0ED211972BD00001758 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 1986E0EF211972BE00001758 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 1986E0F2211972BE00001758 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 1986E0F4211972BE00001758 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 19515F871C8558F800DC2284 /* Frameworks */ = { + 1986E0E2211972BD00001758 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( @@ -41,134 +35,127 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 19515F811C8558F800DC2284 = { + 1986E0DC211972BD00001758 = { isa = PBXGroup; children = ( - 19515F8C1C8558F800DC2284 /* Todo */, - 19515F8B1C8558F800DC2284 /* Products */, + 1986E0E7211972BD00001758 /* Browser */, + 1986E0E6211972BD00001758 /* Products */, ); sourceTree = ""; }; - 19515F8B1C8558F800DC2284 /* Products */ = { + 1986E0E6211972BD00001758 /* Products */ = { isa = PBXGroup; children = ( - 19515F8A1C8558F800DC2284 /* Todo.app */, + 1986E0E5211972BD00001758 /* Browser.app */, ); name = Products; sourceTree = ""; }; - 19515F8C1C8558F800DC2284 /* Todo */ = { + 1986E0E7211972BD00001758 /* Browser */ = { isa = PBXGroup; children = ( - 19515F8D1C8558F800DC2284 /* AppDelegate.swift */, - 19515FA11C855D9A00DC2284 /* Utils.swift */, - 19515F9F1C855C7300DC2284 /* ToDoItem.swift */, - 19515F8F1C8558F800DC2284 /* ViewController.swift */, - 19A79A361C869E260087EEBA /* DetailViewController.swift */, - 19515F911C8558F800DC2284 /* Main.storyboard */, - 19515F941C8558F800DC2284 /* Assets.xcassets */, - 19515F961C8558F800DC2284 /* LaunchScreen.storyboard */, - 19515F991C8558F800DC2284 /* Info.plist */, + 1986E0E8211972BD00001758 /* AppDelegate.swift */, + 1986E0EA211972BD00001758 /* ViewController.swift */, + 1986E0EC211972BD00001758 /* Main.storyboard */, + 1986E0EF211972BE00001758 /* Assets.xcassets */, + 1986E0F1211972BE00001758 /* LaunchScreen.storyboard */, + 1986E0F4211972BE00001758 /* Info.plist */, ); - path = Todo; + path = Browser; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ - 19515F891C8558F800DC2284 /* Todo */ = { + 1986E0E4211972BD00001758 /* Browser */ = { isa = PBXNativeTarget; - buildConfigurationList = 19515F9C1C8558F800DC2284 /* Build configuration list for PBXNativeTarget "Todo" */; + buildConfigurationList = 1986E0F7211972BE00001758 /* Build configuration list for PBXNativeTarget "Browser" */; buildPhases = ( - 19515F861C8558F800DC2284 /* Sources */, - 19515F871C8558F800DC2284 /* Frameworks */, - 19515F881C8558F800DC2284 /* Resources */, + 1986E0E1211972BD00001758 /* Sources */, + 1986E0E2211972BD00001758 /* Frameworks */, + 1986E0E3211972BD00001758 /* Resources */, ); buildRules = ( ); dependencies = ( ); - name = Todo; - productName = Todo; - productReference = 19515F8A1C8558F800DC2284 /* Todo.app */; + name = Browser; + productName = WebviewStudy; + productReference = 1986E0E5211972BD00001758 /* Browser.app */; productType = "com.apple.product-type.application"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ - 19515F821C8558F800DC2284 /* Project object */ = { + 1986E0DD211972BD00001758 /* Project object */ = { isa = PBXProject; attributes = { - LastSwiftUpdateCheck = 0720; - LastUpgradeCheck = 0820; - ORGANIZATIONNAME = YiGu; + LastSwiftUpdateCheck = 0940; + LastUpgradeCheck = 0940; + ORGANIZATIONNAME = "Yi Gu"; TargetAttributes = { - 19515F891C8558F800DC2284 = { - CreatedOnToolsVersion = 7.2.1; - DevelopmentTeam = 44JDRP3T56; - LastSwiftMigration = 0800; + 1986E0E4211972BD00001758 = { + CreatedOnToolsVersion = 9.4.1; + LastSwiftMigration = 1020; }; }; }; - buildConfigurationList = 19515F851C8558F800DC2284 /* Build configuration list for PBXProject "Todo" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; + buildConfigurationList = 1986E0E0211972BD00001758 /* Build configuration list for PBXProject "Browser" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, Base, ); - mainGroup = 19515F811C8558F800DC2284; - productRefGroup = 19515F8B1C8558F800DC2284 /* Products */; + mainGroup = 1986E0DC211972BD00001758; + productRefGroup = 1986E0E6211972BD00001758 /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( - 19515F891C8558F800DC2284 /* Todo */, + 1986E0E4211972BD00001758 /* Browser */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ - 19515F881C8558F800DC2284 /* Resources */ = { + 1986E0E3211972BD00001758 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 19515F981C8558F800DC2284 /* LaunchScreen.storyboard in Resources */, - 19515F951C8558F800DC2284 /* Assets.xcassets in Resources */, - 19515F931C8558F800DC2284 /* Main.storyboard in Resources */, + 1986E0F3211972BE00001758 /* LaunchScreen.storyboard in Resources */, + 1986E0F0211972BE00001758 /* Assets.xcassets in Resources */, + 1986E0EE211972BD00001758 /* Main.storyboard in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ - 19515F861C8558F800DC2284 /* Sources */ = { + 1986E0E1211972BD00001758 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 19515F901C8558F800DC2284 /* ViewController.swift in Sources */, - 19515F8E1C8558F800DC2284 /* AppDelegate.swift in Sources */, - 19A79A371C869E270087EEBA /* DetailViewController.swift in Sources */, - 19515FA01C855C7300DC2284 /* ToDoItem.swift in Sources */, - 19515FA21C855D9A00DC2284 /* Utils.swift in Sources */, + 1986E0EB211972BD00001758 /* ViewController.swift in Sources */, + 1986E0E9211972BD00001758 /* AppDelegate.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXVariantGroup section */ - 19515F911C8558F800DC2284 /* Main.storyboard */ = { + 1986E0EC211972BD00001758 /* Main.storyboard */ = { isa = PBXVariantGroup; children = ( - 19515F921C8558F800DC2284 /* Base */, + 1986E0ED211972BD00001758 /* Base */, ); name = Main.storyboard; sourceTree = ""; }; - 19515F961C8558F800DC2284 /* LaunchScreen.storyboard */ = { + 1986E0F1211972BE00001758 /* LaunchScreen.storyboard */ = { isa = PBXVariantGroup; children = ( - 19515F971C8558F800DC2284 /* Base */, + 1986E0F2211972BE00001758 /* Base */, ); name = LaunchScreen.storyboard; sourceTree = ""; @@ -176,31 +163,44 @@ /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ - 19515F9A1C8558F800DC2284 /* Debug */ = { + 1986E0F5211972BE00001758 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CODE_SIGN_IDENTITY = "iPhone Developer"; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_C_LANGUAGE_STANDARD = gnu11; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; GCC_OPTIMIZATION_LEVEL = 0; @@ -214,40 +214,53 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.2; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; }; - 19515F9B1C8558F800DC2284 /* Release */ = { + 1986E0F6211972BE00001758 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CODE_SIGN_IDENTITY = "iPhone Developer"; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_C_LANGUAGE_STANDARD = gnu11; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; @@ -255,63 +268,73 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.2; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - TARGETED_DEVICE_FAMILY = "1,2"; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; VALIDATE_PRODUCT = YES; }; name = Release; }; - 19515F9D1C8558F800DC2284 /* Debug */ = { + 1986E0F8211972BE00001758 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CODE_SIGN_IDENTITY = "iPhone Developer"; - INFOPLIST_FILE = Todo/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.yigu.Todo; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = 44JDRP3T56; + INFOPLIST_FILE = Browser/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = yigu.Browser; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; }; - 19515F9E1C8558F800DC2284 /* Release */ = { + 1986E0F9211972BE00001758 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CODE_SIGN_IDENTITY = "iPhone Developer"; - INFOPLIST_FILE = Todo/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.yigu.Todo; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = 44JDRP3T56; + INFOPLIST_FILE = Browser/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = yigu.Browser; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - 19515F851C8558F800DC2284 /* Build configuration list for PBXProject "Todo" */ = { + 1986E0E0211972BD00001758 /* Build configuration list for PBXProject "Browser" */ = { isa = XCConfigurationList; buildConfigurations = ( - 19515F9A1C8558F800DC2284 /* Debug */, - 19515F9B1C8558F800DC2284 /* Release */, + 1986E0F5211972BE00001758 /* Debug */, + 1986E0F6211972BE00001758 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 19515F9C1C8558F800DC2284 /* Build configuration list for PBXNativeTarget "Todo" */ = { + 1986E0F7211972BE00001758 /* Build configuration list for PBXNativeTarget "Browser" */ = { isa = XCConfigurationList; buildConfigurations = ( - 19515F9D1C8558F800DC2284 /* Debug */, - 19515F9E1C8558F800DC2284 /* Release */, + 1986E0F8211972BE00001758 /* Debug */, + 1986E0F9211972BE00001758 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; - rootObject = 19515F821C8558F800DC2284 /* Project object */; + rootObject = 1986E0DD211972BD00001758 /* Project object */; } diff --git a/Project 28 - SlidebarMenu/SlidebarMenu.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Project 21 - Browser/Browser.xcodeproj/project.xcworkspace/contents.xcworkspacedata similarity index 69% rename from Project 28 - SlidebarMenu/SlidebarMenu.xcodeproj/project.xcworkspace/contents.xcworkspacedata rename to Project 21 - Browser/Browser.xcodeproj/project.xcworkspace/contents.xcworkspacedata index 51aa2221..1547390c 100644 --- a/Project 28 - SlidebarMenu/SlidebarMenu.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ b/Project 21 - Browser/Browser.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -2,6 +2,6 @@ + location = "self:WebviewStudy.xcodeproj"> diff --git a/Project 21 - Browser/Browser.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Project 21 - Browser/Browser.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/Project 21 - Browser/Browser.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Project 21 - Browser/Browser/AppDelegate.swift b/Project 21 - Browser/Browser/AppDelegate.swift new file mode 100644 index 00000000..9e5c9b3b --- /dev/null +++ b/Project 21 - Browser/Browser/AppDelegate.swift @@ -0,0 +1,46 @@ +// +// AppDelegate.swift +// WebviewStudy +// +// Created by Yi Gu on 8/6/18. +// Copyright © 2018 Yi Gu. All rights reserved. +// + +import UIKit + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + + var window: UIWindow? + + + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { + // Override point for customization after application launch. + return true + } + + func applicationWillResignActive(_ application: UIApplication) { + // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. + // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. + } + + func applicationDidEnterBackground(_ application: UIApplication) { + // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. + // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. + } + + func applicationWillEnterForeground(_ application: UIApplication) { + // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. + } + + func applicationDidBecomeActive(_ application: UIApplication) { + // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. + } + + func applicationWillTerminate(_ application: UIApplication) { + // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. + } + + +} + diff --git a/Project 02 - LoveTweet/LoveTweet/Assets.xcassets/AppIcon.appiconset/Contents.json b/Project 21 - Browser/Browser/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 67% rename from Project 02 - LoveTweet/LoveTweet/Assets.xcassets/AppIcon.appiconset/Contents.json rename to Project 21 - Browser/Browser/Assets.xcassets/AppIcon.appiconset/Contents.json index 36d2c80d..d8db8d65 100644 --- a/Project 02 - LoveTweet/LoveTweet/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/Project 21 - Browser/Browser/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -1,5 +1,15 @@ { "images" : [ + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "3x" + }, { "idiom" : "iphone", "size" : "29x29", @@ -30,6 +40,16 @@ "size" : "60x60", "scale" : "3x" }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "2x" + }, { "idiom" : "ipad", "size" : "29x29", @@ -59,6 +79,16 @@ "idiom" : "ipad", "size" : "76x76", "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "83.5x83.5", + "scale" : "2x" + }, + { + "idiom" : "ios-marketing", + "size" : "1024x1024", + "scale" : "1x" } ], "info" : { diff --git a/Project 04 - Todo/Todo/Assets.xcassets/unselected/Contents.json b/Project 21 - Browser/Browser/Assets.xcassets/Contents.json similarity index 100% rename from Project 04 - Todo/Todo/Assets.xcassets/unselected/Contents.json rename to Project 21 - Browser/Browser/Assets.xcassets/Contents.json diff --git a/Project 21 - Browser/Browser/Base.lproj/LaunchScreen.storyboard b/Project 21 - Browser/Browser/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 00000000..f83f6fd5 --- /dev/null +++ b/Project 21 - Browser/Browser/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Project 21 - Browser/Browser/Base.lproj/Main.storyboard b/Project 21 - Browser/Browser/Base.lproj/Main.storyboard new file mode 100644 index 00000000..ea073b0d --- /dev/null +++ b/Project 21 - Browser/Browser/Base.lproj/Main.storyboard @@ -0,0 +1,112 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Project 03 - Stopwatch/Stopwatch/Info.plist b/Project 21 - Browser/Browser/Info.plist similarity index 95% rename from Project 03 - Stopwatch/Stopwatch/Info.plist rename to Project 21 - Browser/Browser/Info.plist index 40c6215d..16be3b68 100644 --- a/Project 03 - Stopwatch/Stopwatch/Info.plist +++ b/Project 21 - Browser/Browser/Info.plist @@ -3,7 +3,7 @@ CFBundleDevelopmentRegion - en + $(DEVELOPMENT_LANGUAGE) CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier @@ -16,8 +16,6 @@ APPL CFBundleShortVersionString 1.0 - CFBundleSignature - ???? CFBundleVersion 1 LSRequiresIPhoneOS diff --git a/Project 21 - Browser/Browser/ViewController.swift b/Project 21 - Browser/Browser/ViewController.swift new file mode 100644 index 00000000..6fd97a3c --- /dev/null +++ b/Project 21 - Browser/Browser/ViewController.swift @@ -0,0 +1,105 @@ +// +// ViewController.swift +// WebviewStudy +// +// Created by Yi Gu on 8/6/18. +// Copyright © 2018 Yi Gu. All rights reserved. +// + +import UIKit +import WebKit + +class ViewController: UIViewController { + + // MARK: - IBOutlets + @IBOutlet weak var webView: WKWebView! + @IBOutlet weak var progressBar: UIProgressView! + @IBOutlet weak var barView: UIView! + @IBOutlet weak var urlField: UITextField! + @IBOutlet weak var backButton: UIBarButtonItem! + @IBOutlet weak var forwardButton: UIBarButtonItem! + @IBOutlet weak var reloadButton: UIBarButtonItem! + + // MARK: - Parameters + var urlStr: String = "https://www.apple.com" + + // MARK: - Lifecycle + override func viewDidLoad() { + super.viewDidLoad() + + urlField.delegate = self + + backButton.isEnabled = false + forwardButton.isEnabled = false + + webView.navigationDelegate = self + webView.addObserver(self, forKeyPath: "estimatedProgress", options: .new, context: nil) + webView.addObserver(self, forKeyPath: "loading", options: .new, context: nil) + webView.load(urlStr) + } + + override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { + if keyPath == "loading" { + backButton.isEnabled = webView.canGoBack + forwardButton.isEnabled = webView.canGoForward + } else if keyPath == "estimatedProgress" { + progressBar.isHidden = webView.estimatedProgress == 1 + progressBar.setProgress(Float(webView.estimatedProgress), animated: true) + } + } + + // MARK: - Actions + @IBAction func back(_ sender: Any) { + webView.goBack() + } + + @IBAction func forward(_ sender: Any) { + webView.goForward() + } + + @IBAction func reload(_ sender: Any) { + webView.reload() + } +} + +// MARK: - WKNavigationDelegate +extension ViewController: WKNavigationDelegate { + func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: Error) { + + let alert = UIAlertController(title: "Error", message: error.localizedDescription, preferredStyle: .alert) + alert.addAction(UIAlertAction(title: "Ok", style: .default, handler: nil)) + present(alert, animated: true, completion: nil) + } + + func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) { + + urlField.text = webView.url?.absoluteString + + progressBar.setProgress(0.0, animated: false) + } +} + +// MARK: - UITextFieldDelegate +extension ViewController: UITextFieldDelegate { + func textFieldShouldReturn(_ textField: UITextField) -> Bool { + + urlField.resignFirstResponder() + if let str = textField.text { + urlStr = "https://" + str + webView.load(urlStr) + } + + return false + } +} + +// MARK: - WKWebView Extension +extension WKWebView { + func load(_ urlString: String) { + + if let url = URL(string: urlString) { + let request = URLRequest(url: url) + load(request) + } + } +} diff --git a/Project 21 - Browser/README.md b/Project 21 - Browser/README.md new file mode 100644 index 00000000..48b0ee8c --- /dev/null +++ b/Project 21 - Browser/README.md @@ -0,0 +1,9 @@ +Browser +========== + +Browser is an app mocks the safari web browser on iOS side -- it is implemented by WKWebView via using its KVO and Error Handling features with the help of WKNavigationDelegate, UIAlertViewController, UIProgressBar, and UIToolBar. + +For all details, please reference [A Look at at the WebKit Framework](https://www.appcoda.com/tag/wkwebview/) + +## Screenshots +![Browser](./Browser.gif) diff --git a/Project 21 - NotificationsUI/NotificationsUI.xcodeproj/xcuserdata/Yi.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/Project 21 - NotificationsUI/NotificationsUI.xcodeproj/xcuserdata/Yi.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist deleted file mode 100644 index fe2b4541..00000000 --- a/Project 21 - NotificationsUI/NotificationsUI.xcodeproj/xcuserdata/Yi.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/Project 21 - NotificationsUI/NotificationsUI.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/NotificationsUI.xcscheme b/Project 21 - NotificationsUI/NotificationsUI.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/NotificationsUI.xcscheme deleted file mode 100644 index c1736c99..00000000 --- a/Project 21 - NotificationsUI/NotificationsUI.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/NotificationsUI.xcscheme +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Project 21 - NotificationsUI/NotificationsUI.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/xcschememanagement.plist b/Project 21 - NotificationsUI/NotificationsUI.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/xcschememanagement.plist deleted file mode 100644 index 139e19f7..00000000 --- a/Project 21 - NotificationsUI/NotificationsUI.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/xcschememanagement.plist +++ /dev/null @@ -1,22 +0,0 @@ - - - - - SchemeUserState - - NotificationsUI.xcscheme - - orderHint - 0 - - - SuppressBuildableAutocreation - - AF68C1811D875D1300F42FC1 - - primary - - - - - diff --git a/Project 21 - NotificationsUI/NotificationsUI.xcodeproj/xcuserdata/pranjalsatija.xcuserdatad/xcschemes/NotificationExtension.xcscheme b/Project 21 - NotificationsUI/NotificationsUI.xcodeproj/xcuserdata/pranjalsatija.xcuserdatad/xcschemes/NotificationExtension.xcscheme deleted file mode 100644 index 231e1d2c..00000000 --- a/Project 21 - NotificationsUI/NotificationsUI.xcodeproj/xcuserdata/pranjalsatija.xcuserdatad/xcschemes/NotificationExtension.xcscheme +++ /dev/null @@ -1,108 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Project 21 - NotificationsUI/NotificationsUI.xcodeproj/xcuserdata/pranjalsatija.xcuserdatad/xcschemes/NotificationsUI.xcscheme b/Project 21 - NotificationsUI/NotificationsUI.xcodeproj/xcuserdata/pranjalsatija.xcuserdatad/xcschemes/NotificationsUI.xcscheme deleted file mode 100644 index 3fae96f8..00000000 --- a/Project 21 - NotificationsUI/NotificationsUI.xcodeproj/xcuserdata/pranjalsatija.xcuserdatad/xcschemes/NotificationsUI.xcscheme +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Project 21 - NotificationsUI/NotificationsUI.xcodeproj/xcuserdata/pranjalsatija.xcuserdatad/xcschemes/xcschememanagement.plist b/Project 21 - NotificationsUI/NotificationsUI.xcodeproj/xcuserdata/pranjalsatija.xcuserdatad/xcschemes/xcschememanagement.plist deleted file mode 100644 index e5260473..00000000 --- a/Project 21 - NotificationsUI/NotificationsUI.xcodeproj/xcuserdata/pranjalsatija.xcuserdatad/xcschemes/xcschememanagement.plist +++ /dev/null @@ -1,32 +0,0 @@ - - - - - SchemeUserState - - NotificationExtension.xcscheme - - orderHint - 1 - - NotificationsUI.xcscheme - - orderHint - 0 - - - SuppressBuildableAutocreation - - AF479FD71D8B0D0E00AD0505 - - primary - - - AF68C1811D875D1300F42FC1 - - primary - - - - - diff --git a/Project 22 - HonoluluArt/HonoluluArt.xcodeproj/project.pbxproj b/Project 22 - HonoluluArt/HonoluluArt.xcodeproj/project.pbxproj index 4b74f371..9440cd3e 100644 --- a/Project 22 - HonoluluArt/HonoluluArt.xcodeproj/project.pbxproj +++ b/Project 22 - HonoluluArt/HonoluluArt.xcodeproj/project.pbxproj @@ -132,19 +132,20 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0820; - LastUpgradeCheck = 0820; + LastUpgradeCheck = 1020; ORGANIZATIONNAME = "Yi Gu"; TargetAttributes = { 192D16541E3E5F0600139D51 = { CreatedOnToolsVersion = 8.2.1; DevelopmentTeam = 44JDRP3T56; + LastSwiftMigration = 1020; ProvisioningStyle = Automatic; }; }; }; buildConfigurationList = 192D16501E3E5F0600139D51 /* Build configuration list for PBXProject "HonoluluArt" */; compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; + developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, @@ -212,20 +213,29 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -248,7 +258,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.2; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -262,20 +272,29 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -292,7 +311,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.2; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; @@ -310,7 +329,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = yigu.HonoluluArt; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; }; name = Debug; }; @@ -323,7 +342,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = yigu.HonoluluArt; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; }; name = Release; }; diff --git a/Project 22 - HonoluluArt/HonoluluArt.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Project 22 - HonoluluArt/HonoluluArt.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/Project 22 - HonoluluArt/HonoluluArt.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Project 22 - HonoluluArt/HonoluluArt.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/HonoluluArt.xcscheme b/Project 22 - HonoluluArt/HonoluluArt.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/HonoluluArt.xcscheme index d8e21bec..a15ca827 100644 --- a/Project 22 - HonoluluArt/HonoluluArt.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/HonoluluArt.xcscheme +++ b/Project 22 - HonoluluArt/HonoluluArt.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/HonoluluArt.xcscheme @@ -1,6 +1,6 @@ Bool { + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch. return true } diff --git a/Project 22 - HonoluluArt/HonoluluArt/ViewController.swift b/Project 22 - HonoluluArt/HonoluluArt/ViewController.swift index 3a5d4742..9bad8c98 100644 --- a/Project 22 - HonoluluArt/HonoluluArt/ViewController.swift +++ b/Project 22 - HonoluluArt/HonoluluArt/ViewController.swift @@ -43,7 +43,7 @@ class ViewController: UIViewController { } fileprivate func centerMapOnLocation(location: CLLocation) { - let coordinateRegion = MKCoordinateRegionMakeWithDistance(location.coordinate, regionRadius * 2.0, regionRadius * 2.0) + let coordinateRegion = MKCoordinateRegion.init(center: location.coordinate, latitudinalMeters: regionRadius * 2.0, longitudinalMeters: regionRadius * 2.0) mapView.setRegion(coordinateRegion, animated: true) } diff --git a/Project 23 - Birthdays/Birthdays.xcodeproj/project.pbxproj b/Project 23 - Birthdays/Birthdays.xcodeproj/project.pbxproj index 07c29ed0..131218dc 100644 --- a/Project 23 - Birthdays/Birthdays.xcodeproj/project.pbxproj +++ b/Project 23 - Birthdays/Birthdays.xcodeproj/project.pbxproj @@ -105,18 +105,18 @@ C0B57C411BB7FDDA0057F985 /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0820; + LastUpgradeCheck = 1020; ORGANIZATIONNAME = Appcoda; TargetAttributes = { C0B57C481BB7FDDA0057F985 = { CreatedOnToolsVersion = 7.0; - LastSwiftMigration = 0820; + LastSwiftMigration = 1020; }; }; }; buildConfigurationList = C0B57C441BB7FDDA0057F985 /* Build configuration list for PBXProject "Birthdays" */; compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; + developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, @@ -186,18 +186,27 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -220,7 +229,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -232,18 +241,27 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -260,7 +278,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; @@ -276,7 +294,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.appcoda.Birthdays; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; }; name = Debug; }; @@ -288,7 +306,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.appcoda.Birthdays; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; }; name = Release; }; diff --git a/Project 23 - Birthdays/Birthdays.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Project 23 - Birthdays/Birthdays.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/Project 23 - Birthdays/Birthdays.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Project 23 - Birthdays/Birthdays.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/Birthdays.xcscheme b/Project 23 - Birthdays/Birthdays.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/Birthdays.xcscheme index fe9c0190..f0aafd7d 100644 --- a/Project 23 - Birthdays/Birthdays.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/Birthdays.xcscheme +++ b/Project 23 - Birthdays/Birthdays.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/Birthdays.xcscheme @@ -1,6 +1,6 @@ Void in if accessGranted { var contacts = [CNContact]() diff --git a/Project 23 - Birthdays/Birthdays/AppDelegate.swift b/Project 23 - Birthdays/Birthdays/AppDelegate.swift index d712d594..b52f0498 100644 --- a/Project 23 - Birthdays/Birthdays/AppDelegate.swift +++ b/Project 23 - Birthdays/Birthdays/AppDelegate.swift @@ -16,7 +16,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? var contactStore = CNContactStore() - func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch. return true } @@ -46,6 +46,4 @@ class AppDelegate: UIResponder, UIApplicationDelegate { completionHandler(false) } } - - } diff --git a/Project 23 - Birthdays/Birthdays/CreateContactViewController.swift b/Project 23 - Birthdays/Birthdays/CreateContactViewController.swift index b80fd5ae..cbaf300d 100644 --- a/Project 23 - Birthdays/Birthdays/CreateContactViewController.swift +++ b/Project 23 - Birthdays/Birthdays/CreateContactViewController.swift @@ -23,7 +23,7 @@ class CreateContactViewController: UIViewController { txtLastname.delegate = self txtHomeEmail.delegate = self - let saveBarButtonItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.save, target: self, action: #selector(CreateContactViewController.createContact)) + let saveBarButtonItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonItem.SystemItem.save, target: self, action: #selector(CreateContactViewController.createContact)) navigationItem.rightBarButtonItem = saveBarButtonItem } @@ -35,7 +35,7 @@ class CreateContactViewController: UIViewController { // MARK: Custom functions - func createContact() { + @objc func createContact() { let newContact = CNMutableContact() newContact.givenName = txtFirstname.text! diff --git a/Project 23 - Birthdays/Birthdays/ViewController.swift b/Project 23 - Birthdays/Birthdays/ViewController.swift index 34018439..0066e103 100644 --- a/Project 23 - Birthdays/Birthdays/ViewController.swift +++ b/Project 23 - Birthdays/Birthdays/ViewController.swift @@ -131,7 +131,7 @@ extension ViewController: UITableViewDelegate { return true } - func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) { + func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) { if editingStyle == .delete { contacts.remove(at: indexPath.row) tblContacts.reloadData() diff --git a/Project 24 - HitList/HitList.xcodeproj/project.pbxproj b/Project 24 - HitList/HitList.xcodeproj/project.pbxproj index db297f21..327570c3 100644 --- a/Project 24 - HitList/HitList.xcodeproj/project.pbxproj +++ b/Project 24 - HitList/HitList.xcodeproj/project.pbxproj @@ -191,28 +191,28 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0720; - LastUpgradeCheck = 0820; + LastUpgradeCheck = 1020; ORGANIZATIONNAME = YiGu; TargetAttributes = { 193BC8681C8F4E66003E6D2D = { CreatedOnToolsVersion = 7.2.1; - LastSwiftMigration = 0820; + LastSwiftMigration = 1020; }; 193BC87F1C8F4E66003E6D2D = { CreatedOnToolsVersion = 7.2.1; - LastSwiftMigration = 0820; + LastSwiftMigration = 1020; TestTargetID = 193BC8681C8F4E66003E6D2D; }; 193BC88A1C8F4E66003E6D2D = { CreatedOnToolsVersion = 7.2.1; - LastSwiftMigration = 0820; + LastSwiftMigration = 1020; TestTargetID = 193BC8681C8F4E66003E6D2D; }; }; }; buildConfigurationList = 193BC8641C8F4E66003E6D2D /* Build configuration list for PBXProject "HitList" */; compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; + developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, @@ -323,18 +323,27 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -357,7 +366,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.2; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -370,18 +379,27 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -398,7 +416,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.2; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; @@ -415,7 +433,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.yigu.HitList; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; }; name = Debug; }; @@ -427,7 +445,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.yigu.HitList; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; }; name = Release; }; @@ -439,7 +457,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.yigu.HitListTests; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/HitList.app/HitList"; }; name = Debug; @@ -452,7 +470,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.yigu.HitListTests; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/HitList.app/HitList"; }; name = Release; @@ -464,7 +482,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.yigu.HitListUITests; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; TEST_TARGET_NAME = HitList; USES_XCTRUNNER = YES; }; @@ -477,7 +495,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.yigu.HitListUITests; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; TEST_TARGET_NAME = HitList; USES_XCTRUNNER = YES; }; diff --git a/Project 24 - HitList/HitList.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Project 24 - HitList/HitList.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/Project 24 - HitList/HitList.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Project 24 - HitList/HitList.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/HitList.xcscheme b/Project 24 - HitList/HitList.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/HitList.xcscheme index d5cfd9a8..e19edeee 100644 --- a/Project 24 - HitList/HitList.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/HitList.xcscheme +++ b/Project 24 - HitList/HitList.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/HitList.xcscheme @@ -1,6 +1,6 @@ Bool { + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch. return true } diff --git a/Project 24 - HitList/HitList/ViewController.swift b/Project 24 - HitList/HitList/ViewController.swift index 7bf62be4..c846f6ad 100644 --- a/Project 24 - HitList/HitList/ViewController.swift +++ b/Project 24 - HitList/HitList/ViewController.swift @@ -56,7 +56,7 @@ class ViewController: UIViewController, UITableViewDataSource { return cell } - func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) { + func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) { switch editingStyle { case .delete: // remove the deleted item from the model diff --git a/Project 25 - WeatherExtension/Weather Widget/TodayViewController.swift b/Project 25 - WeatherExtension/Weather Widget/TodayViewController.swift index 23dacef8..6049f31f 100644 --- a/Project 25 - WeatherExtension/Weather Widget/TodayViewController.swift +++ b/Project 25 - WeatherExtension/Weather Widget/TodayViewController.swift @@ -16,38 +16,40 @@ class TodayViewController: UIViewController, NCWidgetProviding { @IBOutlet weak var weatherLabel: UILabel! @IBOutlet weak var tempLabel: UILabel! - var location = "San Francisco, U.S." + fileprivate var isFetched = false + fileprivate var location = "San Francisco, U.S." override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view from its nib. self.preferredContentSize = CGSize(width: UIScreen.main.applicationFrame.size.width, height: 37.0); + + // This will be called before widgetPerformUpdate func displayCurrentWeather() } - func displayCurrentWeather() -> Bool { + func displayCurrentWeather() { // Update location cityLabel.text = location - var isFetched = false // Invoke weather service to get the weather data WeatherService.sharedWeatherService().getCurrentWeather(location, completion: { (data) -> () in OperationQueue.main.addOperation({ () -> Void in guard let weatherData = data else { - isFetched = false + self.isFetched = false return } + + self.isFetched = true self.weatherLabel.text = weatherData.weather.capitalized self.tempLabel.text = String(format: "%d", weatherData.temperature) + "\u{00B0}" - isFetched = true }) }) - return isFetched } func widgetPerformUpdate(completionHandler: (@escaping (NCUpdateResult) -> Void)) { - if displayCurrentWeather() { + if isFetched { completionHandler(NCUpdateResult.newData) } else { completionHandler(NCUpdateResult.noData) diff --git a/Project 25 - WeatherExtension/WeatherDemo.xcodeproj/project.pbxproj b/Project 25 - WeatherExtension/WeatherDemo.xcodeproj/project.pbxproj index 65a9c820..96b52966 100644 --- a/Project 25 - WeatherExtension/WeatherDemo.xcodeproj/project.pbxproj +++ b/Project 25 - WeatherExtension/WeatherDemo.xcodeproj/project.pbxproj @@ -23,7 +23,6 @@ F4FCCF7A1A5F7DFF006183CC /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F4FCCF781A5F7DFF006183CC /* Main.storyboard */; }; F4FCCF7C1A5F7DFF006183CC /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = F4FCCF7B1A5F7DFF006183CC /* Images.xcassets */; }; F4FCCF7F1A5F7DFF006183CC /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = F4FCCF7D1A5F7DFF006183CC /* LaunchScreen.xib */; }; - F4FCCF8B1A5F7DFF006183CC /* WeatherDemoTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F4FCCF8A1A5F7DFF006183CC /* WeatherDemoTests.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -41,13 +40,6 @@ remoteGlobalIDString = 19B36D191D7E54A000BE0903; remoteInfo = "Weather Widget"; }; - F4FCCF851A5F7DFF006183CC /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = F4FCCF671A5F7DFF006183CC /* Project object */; - proxyType = 1; - remoteGlobalIDString = F4FCCF6E1A5F7DFF006183CC; - remoteInfo = WeatherDemo; - }; /* End PBXContainerItemProxy section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -94,9 +86,6 @@ F4FCCF791A5F7DFF006183CC /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; F4FCCF7B1A5F7DFF006183CC /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; F4FCCF7E1A5F7DFF006183CC /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; - F4FCCF841A5F7DFF006183CC /* WeatherDemoTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = WeatherDemoTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - F4FCCF891A5F7DFF006183CC /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - F4FCCF8A1A5F7DFF006183CC /* WeatherDemoTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WeatherDemoTests.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -124,13 +113,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - F4FCCF811A5F7DFF006183CC /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ @@ -167,7 +149,6 @@ isa = PBXGroup; children = ( F4FCCF711A5F7DFF006183CC /* WeatherDemo */, - F4FCCF871A5F7DFF006183CC /* WeatherDemoTests */, 19B36D091D7E540600BE0903 /* WeatherKit */, 19B36D1E1D7E54A000BE0903 /* Weather Widget */, 19B36D1B1D7E54A000BE0903 /* Frameworks */, @@ -179,7 +160,6 @@ isa = PBXGroup; children = ( F4FCCF6F1A5F7DFF006183CC /* WeatherDemo.app */, - F4FCCF841A5F7DFF006183CC /* WeatherDemoTests.xctest */, 19B36D081D7E540600BE0903 /* WeatherKit.framework */, 19B36D1A1D7E54A000BE0903 /* Weather Widget.appex */, ); @@ -208,23 +188,6 @@ name = "Supporting Files"; sourceTree = ""; }; - F4FCCF871A5F7DFF006183CC /* WeatherDemoTests */ = { - isa = PBXGroup; - children = ( - F4FCCF8A1A5F7DFF006183CC /* WeatherDemoTests.swift */, - F4FCCF881A5F7DFF006183CC /* Supporting Files */, - ); - path = WeatherDemoTests; - sourceTree = ""; - }; - F4FCCF881A5F7DFF006183CC /* Supporting Files */ = { - isa = PBXGroup; - children = ( - F4FCCF891A5F7DFF006183CC /* Info.plist */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ @@ -295,24 +258,6 @@ productReference = F4FCCF6F1A5F7DFF006183CC /* WeatherDemo.app */; productType = "com.apple.product-type.application"; }; - F4FCCF831A5F7DFF006183CC /* WeatherDemoTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = F4FCCF911A5F7DFF006183CC /* Build configuration list for PBXNativeTarget "WeatherDemoTests" */; - buildPhases = ( - F4FCCF801A5F7DFF006183CC /* Sources */, - F4FCCF811A5F7DFF006183CC /* Frameworks */, - F4FCCF821A5F7DFF006183CC /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - F4FCCF861A5F7DFF006183CC /* PBXTargetDependency */, - ); - name = WeatherDemoTests; - productName = WeatherDemoTests; - productReference = F4FCCF841A5F7DFF006183CC /* WeatherDemoTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ @@ -321,34 +266,29 @@ attributes = { LastSwiftMigration = 0700; LastSwiftUpdateCheck = 0730; - LastUpgradeCheck = 0820; + LastUpgradeCheck = 1020; ORGANIZATIONNAME = AppCoda; TargetAttributes = { 19B36D071D7E540600BE0903 = { CreatedOnToolsVersion = 7.3.1; DevelopmentTeam = 44JDRP3T56; - LastSwiftMigration = 0820; + LastSwiftMigration = 1020; }; 19B36D191D7E54A000BE0903 = { CreatedOnToolsVersion = 7.3.1; DevelopmentTeam = 44JDRP3T56; - LastSwiftMigration = 0820; + LastSwiftMigration = 1020; }; F4FCCF6E1A5F7DFF006183CC = { CreatedOnToolsVersion = 6.1.1; DevelopmentTeam = 44JDRP3T56; - LastSwiftMigration = 0820; - }; - F4FCCF831A5F7DFF006183CC = { - CreatedOnToolsVersion = 6.1.1; - LastSwiftMigration = 0820; - TestTargetID = F4FCCF6E1A5F7DFF006183CC; + LastSwiftMigration = 1020; }; }; }; buildConfigurationList = F4FCCF6A1A5F7DFF006183CC /* Build configuration list for PBXProject "WeatherDemo" */; compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; + developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, @@ -360,7 +300,6 @@ projectRoot = ""; targets = ( F4FCCF6E1A5F7DFF006183CC /* WeatherDemo */, - F4FCCF831A5F7DFF006183CC /* WeatherDemoTests */, 19B36D071D7E540600BE0903 /* WeatherKit */, 19B36D191D7E54A000BE0903 /* Weather Widget */, ); @@ -393,13 +332,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - F4FCCF821A5F7DFF006183CC /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -430,14 +362,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - F4FCCF801A5F7DFF006183CC /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - F4FCCF8B1A5F7DFF006183CC /* WeatherDemoTests.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ @@ -451,11 +375,6 @@ target = 19B36D191D7E54A000BE0903 /* Weather Widget */; targetProxy = 19B36D251D7E54A000BE0903 /* PBXContainerItemProxy */; }; - F4FCCF861A5F7DFF006183CC /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = F4FCCF6E1A5F7DFF006183CC /* WeatherDemo */; - targetProxy = F4FCCF851A5F7DFF006183CC /* PBXContainerItemProxy */; - }; /* End PBXTargetDependency section */ /* Begin PBXVariantGroup section */ @@ -507,7 +426,7 @@ PRODUCT_BUNDLE_IDENTIFIER = yigu.WeatherKit; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; @@ -536,7 +455,7 @@ PRODUCT_BUNDLE_IDENTIFIER = yigu.WeatherKit; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; @@ -556,7 +475,7 @@ PRODUCT_BUNDLE_IDENTIFIER = "com.yigu.WeatherDemo.Weather-Widget"; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; }; name = Debug; }; @@ -574,7 +493,7 @@ PRODUCT_BUNDLE_IDENTIFIER = "com.yigu.WeatherDemo.Weather-Widget"; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; }; name = Release; }; @@ -582,18 +501,27 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -616,7 +544,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.1; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -628,18 +556,27 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -655,7 +592,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.1; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; @@ -673,7 +610,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.yigu.WeatherDemo; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; }; name = Debug; }; @@ -687,45 +624,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.yigu.WeatherDemo; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; - }; - name = Release; - }; - F4FCCF921A5F7DFF006183CC /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - FRAMEWORK_SEARCH_PATHS = ( - "$(SDKROOT)/Developer/Library/Frameworks", - "$(inherited)", - ); - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - INFOPLIST_FILE = WeatherDemoTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = "com.appcoda.$(PRODUCT_NAME:rfc1034identifier)"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/WeatherDemo.app/WeatherDemo"; - }; - name = Debug; - }; - F4FCCF931A5F7DFF006183CC /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - FRAMEWORK_SEARCH_PATHS = ( - "$(SDKROOT)/Developer/Library/Frameworks", - "$(inherited)", - ); - INFOPLIST_FILE = WeatherDemoTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = "com.appcoda.$(PRODUCT_NAME:rfc1034identifier)"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/WeatherDemo.app/WeatherDemo"; + SWIFT_VERSION = 5.0; }; name = Release; }; @@ -768,15 +667,6 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - F4FCCF911A5F7DFF006183CC /* Build configuration list for PBXNativeTarget "WeatherDemoTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - F4FCCF921A5F7DFF006183CC /* Debug */, - F4FCCF931A5F7DFF006183CC /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; /* End XCConfigurationList section */ }; rootObject = F4FCCF671A5F7DFF006183CC /* Project object */; diff --git a/Project 25 - WeatherExtension/WeatherDemo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Project 25 - WeatherExtension/WeatherDemo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/Project 25 - WeatherExtension/WeatherDemo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Project 25 - WeatherExtension/WeatherDemo.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/Weather Widget.xcscheme b/Project 25 - WeatherExtension/WeatherDemo.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/Weather Widget.xcscheme index 4249713f..f3a6e4f7 100644 --- a/Project 25 - WeatherExtension/WeatherDemo.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/Weather Widget.xcscheme +++ b/Project 25 - WeatherExtension/WeatherDemo.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/Weather Widget.xcscheme @@ -1,6 +1,6 @@ Bool { + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch. return true diff --git a/Project 25 - WeatherExtension/WeatherDemo/Base.lproj/Main.storyboard b/Project 25 - WeatherExtension/WeatherDemo/Base.lproj/Main.storyboard index 3a421209..f4416c34 100644 --- a/Project 25 - WeatherExtension/WeatherDemo/Base.lproj/Main.storyboard +++ b/Project 25 - WeatherExtension/WeatherDemo/Base.lproj/Main.storyboard @@ -1,8 +1,12 @@ - - + + + + + - - + + + @@ -14,74 +18,74 @@ - + - + - + - + + + + + + - - + + - - - @@ -99,13 +103,15 @@ - + - + + + @@ -139,7 +145,7 @@ - + @@ -153,7 +159,7 @@
- - + +
diff --git a/Project 25 - WeatherExtension/WeatherDemo/ViewController.swift b/Project 25 - WeatherExtension/WeatherDemo/ViewController.swift index 5c4ae83e..b71de226 100644 --- a/Project 25 - WeatherExtension/WeatherDemo/ViewController.swift +++ b/Project 25 - WeatherExtension/WeatherDemo/ViewController.swift @@ -54,7 +54,7 @@ class ViewController: UIViewController { @IBAction func updateWeatherInfo(_ segue: UIStoryboardSegue) { let sourceViewController = segue.source as! LocationTableViewController - var selectedLocation = sourceViewController.selectedLocation.characters.split { $0 == "," }.map { String($0) } + var selectedLocation = sourceViewController.selectedLocation.split { $0 == "," }.map { String($0) } city = selectedLocation[0] country = selectedLocation[1].trimmingCharacters(in: CharacterSet.whitespaces) diff --git a/Project 25 - WeatherExtension/WeatherDemo/WeatherService.swift b/Project 25 - WeatherExtension/WeatherDemo/WeatherService.swift index 9762db3d..c95564d7 100644 --- a/Project 25 - WeatherExtension/WeatherDemo/WeatherService.swift +++ b/Project 25 - WeatherExtension/WeatherDemo/WeatherService.swift @@ -9,55 +9,54 @@ import Foundation open class WeatherService { - public typealias WeatherDataCompletionBlock = (_ data: WeatherData?) -> () - - let openWeatherBaseAPI = "http://api.openweathermap.org/data/2.5/weather?appid=97cce5b42320d87100a885f5dfa0dac9&units=metric&q=" - let urlSession:URLSession = URLSession.shared - - open class func sharedWeatherService() -> WeatherService { - return _sharedWeatherService - } + public typealias WeatherDataCompletionBlock = (_ data: WeatherData?) -> () + + let openWeatherBaseAPI = "http://api.openweathermap.org/data/2.5/weather?appid=97cce5b42320d87100a885f5dfa0dac9&units=metric&q=" + let urlSession:URLSession = URLSession.shared + + open class func sharedWeatherService() -> WeatherService { + return _sharedWeatherService + } + + open func getCurrentWeather(_ location:String, completion: @escaping WeatherDataCompletionBlock) { + let openWeatherAPI = openWeatherBaseAPI + location.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)! + print(openWeatherAPI) + let request = URLRequest(url: URL(string: openWeatherAPI)!) + let weatherData = WeatherData() - open func getCurrentWeather(_ location:String, completion: @escaping WeatherDataCompletionBlock) { - let openWeatherAPI = openWeatherBaseAPI + location.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)! - print(openWeatherAPI) - let request = URLRequest(url: URL(string: openWeatherAPI)!) - let weatherData = WeatherData() + let task = urlSession.dataTask(with: request, completionHandler: { (data, response, error) -> Void in + + guard let data = data else { + if let error = error { + print(error) + } - let task = urlSession.dataTask(with: request, completionHandler: { (data, response, error) -> Void in - - guard let data = data else { - if let error = error { - print(error) - } - - return - } - - // Retrieve JSON data - do { - let jsonResult = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? NSDictionary - - // Parse JSON data - let jsonWeather = jsonResult?["weather"] as! [AnyObject] - - for jsonCurrentWeather in jsonWeather { - weatherData.weather = jsonCurrentWeather["description"] as! String - } - - let jsonMain = jsonResult?["main"] as! Dictionary - weatherData.temperature = jsonMain["temp"] as! Int - - completion(weatherData) - - } catch { - print(error) - } - }) + return + } + + // Retrieve JSON data + do { + let jsonResult = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? NSDictionary - task.resume() - } - + // Parse JSON data + let jsonWeather = jsonResult?["weather"] as! [AnyObject] + + for jsonCurrentWeather in jsonWeather { + weatherData.weather = jsonCurrentWeather["description"] as! String + } + + let jsonMain = jsonResult?["main"] as! Dictionary + weatherData.temperature = Int(truncating: jsonMain["temp"] as! NSNumber) + + completion(weatherData) + + } catch { + print(error) + } + }) + + task.resume() + } } let _sharedWeatherService: WeatherService = { WeatherService() }() diff --git a/Project 26 - Scale/README.md b/Project 26 - Scale/README.md new file mode 100644 index 00000000..937085de --- /dev/null +++ b/Project 26 - Scale/README.md @@ -0,0 +1,11 @@ +Scale +========== + +Scale is an iOS app demos the way to handle 3D Touch. This app is inspired by [*3D Touch Introduction: Building a Digital Scale App and Quick Actions*](http://www.appcoda.com/3d-touch-tutorial/) in tackling force touch and quick actions by Swift. + +## Screenshots +![Scale](./Screenshots/shot1.png) + +![Scale](./Screenshots/shot2.png) + +![Scale](./Screenshots/shot3.png) diff --git a/Project 02 - LoveTweet/LoveTweet.xcodeproj/project.pbxproj b/Project 26 - Scale/Scale.xcodeproj/project.pbxproj similarity index 51% rename from Project 02 - LoveTweet/LoveTweet.xcodeproj/project.pbxproj rename to Project 26 - Scale/Scale.xcodeproj/project.pbxproj index 48480941..d8d11c8b 100644 --- a/Project 02 - LoveTweet/LoveTweet.xcodeproj/project.pbxproj +++ b/Project 26 - Scale/Scale.xcodeproj/project.pbxproj @@ -7,25 +7,29 @@ objects = { /* Begin PBXBuildFile section */ - 194C54971C72852900749A4F /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 194C54961C72852900749A4F /* AppDelegate.swift */; }; - 194C54991C72852900749A4F /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 194C54981C72852900749A4F /* ViewController.swift */; }; - 194C549C1C72852900749A4F /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 194C549A1C72852900749A4F /* Main.storyboard */; }; - 194C549E1C72852900749A4F /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 194C549D1C72852900749A4F /* Assets.xcassets */; }; - 194C54A11C72852900749A4F /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 194C549F1C72852900749A4F /* LaunchScreen.storyboard */; }; + 22EC737B1BE790FF00507F33 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22EC737A1BE790FF00507F33 /* AppDelegate.swift */; }; + 22EC737D1BE790FF00507F33 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22EC737C1BE790FF00507F33 /* ViewController.swift */; }; + 22EC73801BE790FF00507F33 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 22EC737E1BE790FF00507F33 /* Main.storyboard */; }; + 22EC73821BE790FF00507F33 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 22EC73811BE790FF00507F33 /* Assets.xcassets */; }; + 22EC73851BE790FF00507F33 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 22EC73831BE790FF00507F33 /* LaunchScreen.storyboard */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ - 194C54931C72852900749A4F /* LoveTweet.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = LoveTweet.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 194C54961C72852900749A4F /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 194C54981C72852900749A4F /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; - 194C549B1C72852900749A4F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; - 194C549D1C72852900749A4F /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - 194C54A01C72852900749A4F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; - 194C54A21C72852900749A4F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 22EC73771BE790FF00507F33 /* Scale.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Scale.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 22EC737A1BE790FF00507F33 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 22EC737C1BE790FF00507F33 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; + 22EC737F1BE790FF00507F33 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 22EC73811BE790FF00507F33 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 22EC73841BE790FF00507F33 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 22EC73861BE7910000507F33 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 22EC738F1BE7910000507F33 /* ScaleTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScaleTests.swift; sourceTree = ""; }; + 22EC73911BE7910000507F33 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 22EC739A1BE7910000507F33 /* ScaleUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScaleUITests.swift; sourceTree = ""; }; + 22EC739C1BE7910000507F33 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 194C54901C72852900749A4F /* Frameworks */ = { + 22EC73741BE790FF00507F33 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( @@ -35,127 +39,147 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 194C548A1C72852900749A4F = { + 22EC736E1BE790FF00507F33 = { isa = PBXGroup; children = ( - 194C54951C72852900749A4F /* LoveTweet */, - 194C54941C72852900749A4F /* Products */, + 22EC73791BE790FF00507F33 /* Scale */, + 22EC738E1BE7910000507F33 /* ScaleTests */, + 22EC73991BE7910000507F33 /* ScaleUITests */, + 22EC73781BE790FF00507F33 /* Products */, ); sourceTree = ""; }; - 194C54941C72852900749A4F /* Products */ = { + 22EC73781BE790FF00507F33 /* Products */ = { isa = PBXGroup; children = ( - 194C54931C72852900749A4F /* LoveTweet.app */, + 22EC73771BE790FF00507F33 /* Scale.app */, ); name = Products; sourceTree = ""; }; - 194C54951C72852900749A4F /* LoveTweet */ = { + 22EC73791BE790FF00507F33 /* Scale */ = { isa = PBXGroup; children = ( - 194C54961C72852900749A4F /* AppDelegate.swift */, - 194C54981C72852900749A4F /* ViewController.swift */, - 194C549A1C72852900749A4F /* Main.storyboard */, - 194C549D1C72852900749A4F /* Assets.xcassets */, - 194C549F1C72852900749A4F /* LaunchScreen.storyboard */, - 194C54A21C72852900749A4F /* Info.plist */, + 22EC737A1BE790FF00507F33 /* AppDelegate.swift */, + 22EC737C1BE790FF00507F33 /* ViewController.swift */, + 22EC737E1BE790FF00507F33 /* Main.storyboard */, + 22EC73811BE790FF00507F33 /* Assets.xcassets */, + 22EC73831BE790FF00507F33 /* LaunchScreen.storyboard */, + 22EC73861BE7910000507F33 /* Info.plist */, ); - path = LoveTweet; + path = Scale; + sourceTree = ""; + }; + 22EC738E1BE7910000507F33 /* ScaleTests */ = { + isa = PBXGroup; + children = ( + 22EC738F1BE7910000507F33 /* ScaleTests.swift */, + 22EC73911BE7910000507F33 /* Info.plist */, + ); + path = ScaleTests; + sourceTree = ""; + }; + 22EC73991BE7910000507F33 /* ScaleUITests */ = { + isa = PBXGroup; + children = ( + 22EC739A1BE7910000507F33 /* ScaleUITests.swift */, + 22EC739C1BE7910000507F33 /* Info.plist */, + ); + path = ScaleUITests; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ - 194C54921C72852900749A4F /* LoveTweet */ = { + 22EC73761BE790FF00507F33 /* Scale */ = { isa = PBXNativeTarget; - buildConfigurationList = 194C54A51C72852900749A4F /* Build configuration list for PBXNativeTarget "LoveTweet" */; + buildConfigurationList = 22EC739F1BE7910000507F33 /* Build configuration list for PBXNativeTarget "Scale" */; buildPhases = ( - 194C548F1C72852900749A4F /* Sources */, - 194C54901C72852900749A4F /* Frameworks */, - 194C54911C72852900749A4F /* Resources */, + 22EC73731BE790FF00507F33 /* Sources */, + 22EC73741BE790FF00507F33 /* Frameworks */, + 22EC73751BE790FF00507F33 /* Resources */, ); buildRules = ( ); dependencies = ( ); - name = LoveTweet; - productName = LoveTweet; - productReference = 194C54931C72852900749A4F /* LoveTweet.app */; + name = Scale; + productName = Scale; + productReference = 22EC73771BE790FF00507F33 /* Scale.app */; productType = "com.apple.product-type.application"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ - 194C548B1C72852900749A4F /* Project object */ = { + 22EC736F1BE790FF00507F33 /* Project object */ = { isa = PBXProject; attributes = { - LastSwiftUpdateCheck = 0720; - LastUpgradeCheck = 0820; - ORGANIZATIONNAME = YiGu; + LastSwiftUpdateCheck = 0710; + LastUpgradeCheck = 1020; + ORGANIZATIONNAME = "Maxime Defauw"; TargetAttributes = { - 194C54921C72852900749A4F = { - CreatedOnToolsVersion = 7.2.1; - LastSwiftMigration = 0800; + 22EC73761BE790FF00507F33 = { + CreatedOnToolsVersion = 7.1; + LastSwiftMigration = 1020; }; }; }; - buildConfigurationList = 194C548E1C72852900749A4F /* Build configuration list for PBXProject "LoveTweet" */; + buildConfigurationList = 22EC73721BE790FF00507F33 /* Build configuration list for PBXProject "Scale" */; compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; + developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, Base, ); - mainGroup = 194C548A1C72852900749A4F; - productRefGroup = 194C54941C72852900749A4F /* Products */; + mainGroup = 22EC736E1BE790FF00507F33; + productRefGroup = 22EC73781BE790FF00507F33 /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( - 194C54921C72852900749A4F /* LoveTweet */, + 22EC73761BE790FF00507F33 /* Scale */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ - 194C54911C72852900749A4F /* Resources */ = { + 22EC73751BE790FF00507F33 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 194C54A11C72852900749A4F /* LaunchScreen.storyboard in Resources */, - 194C549E1C72852900749A4F /* Assets.xcassets in Resources */, - 194C549C1C72852900749A4F /* Main.storyboard in Resources */, + 22EC73851BE790FF00507F33 /* LaunchScreen.storyboard in Resources */, + 22EC73821BE790FF00507F33 /* Assets.xcassets in Resources */, + 22EC73801BE790FF00507F33 /* Main.storyboard in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ - 194C548F1C72852900749A4F /* Sources */ = { + 22EC73731BE790FF00507F33 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 194C54991C72852900749A4F /* ViewController.swift in Sources */, - 194C54971C72852900749A4F /* AppDelegate.swift in Sources */, + 22EC737D1BE790FF00507F33 /* ViewController.swift in Sources */, + 22EC737B1BE790FF00507F33 /* AppDelegate.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXVariantGroup section */ - 194C549A1C72852900749A4F /* Main.storyboard */ = { + 22EC737E1BE790FF00507F33 /* Main.storyboard */ = { isa = PBXVariantGroup; children = ( - 194C549B1C72852900749A4F /* Base */, + 22EC737F1BE790FF00507F33 /* Base */, ); name = Main.storyboard; sourceTree = ""; }; - 194C549F1C72852900749A4F /* LaunchScreen.storyboard */ = { + 22EC73831BE790FF00507F33 /* LaunchScreen.storyboard */ = { isa = PBXVariantGroup; children = ( - 194C54A01C72852900749A4F /* Base */, + 22EC73841BE790FF00507F33 /* Base */, ); name = LaunchScreen.storyboard; sourceTree = ""; @@ -163,7 +187,7 @@ /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ - 194C54A31C72852900749A4F /* Debug */ = { + 22EC739D1BE7910000507F33 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; @@ -171,14 +195,22 @@ CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -201,16 +233,15 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.2; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; }; - 194C54A41C72852900749A4F /* Release */ = { + 22EC739E1BE7910000507F33 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; @@ -218,14 +249,22 @@ CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -242,61 +281,62 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.2; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; }; name = Release; }; - 194C54A61C72852900749A4F /* Debug */ = { + 22EC73A01BE7910000507F33 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - INFOPLIST_FILE = LoveTweet/Info.plist; + INFOPLIST_FILE = Scale/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.yigu.LoveTweet; + PRODUCT_BUNDLE_IDENTIFIER = com.yigu.Scale; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; }; name = Debug; }; - 194C54A71C72852900749A4F /* Release */ = { + 22EC73A11BE7910000507F33 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - INFOPLIST_FILE = LoveTweet/Info.plist; + INFOPLIST_FILE = Scale/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.yigu.LoveTweet; + PRODUCT_BUNDLE_IDENTIFIER = com.yigu.Scale; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - 194C548E1C72852900749A4F /* Build configuration list for PBXProject "LoveTweet" */ = { + 22EC73721BE790FF00507F33 /* Build configuration list for PBXProject "Scale" */ = { isa = XCConfigurationList; buildConfigurations = ( - 194C54A31C72852900749A4F /* Debug */, - 194C54A41C72852900749A4F /* Release */, + 22EC739D1BE7910000507F33 /* Debug */, + 22EC739E1BE7910000507F33 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 194C54A51C72852900749A4F /* Build configuration list for PBXNativeTarget "LoveTweet" */ = { + 22EC739F1BE7910000507F33 /* Build configuration list for PBXNativeTarget "Scale" */ = { isa = XCConfigurationList; buildConfigurations = ( - 194C54A61C72852900749A4F /* Debug */, - 194C54A71C72852900749A4F /* Release */, + 22EC73A01BE7910000507F33 /* Debug */, + 22EC73A11BE7910000507F33 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; - rootObject = 194C548B1C72852900749A4F /* Project object */; + rootObject = 22EC736F1BE790FF00507F33 /* Project object */; } diff --git a/Project 29 - Grocr/Grocr.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Project 26 - Scale/Scale.xcodeproj/project.xcworkspace/contents.xcworkspacedata similarity index 72% rename from Project 29 - Grocr/Grocr.xcodeproj/project.xcworkspace/contents.xcworkspacedata rename to Project 26 - Scale/Scale.xcodeproj/project.xcworkspace/contents.xcworkspacedata index 7c7f0215..80d888cd 100644 --- a/Project 29 - Grocr/Grocr.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ b/Project 26 - Scale/Scale.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -2,6 +2,6 @@ + location = "self:Scale.xcodeproj"> diff --git a/Project 26 - Scale/Scale.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Project 26 - Scale/Scale.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/Project 26 - Scale/Scale.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Project 26 - Scale/Scale/AppDelegate.swift b/Project 26 - Scale/Scale/AppDelegate.swift new file mode 100644 index 00000000..aa46b330 --- /dev/null +++ b/Project 26 - Scale/Scale/AppDelegate.swift @@ -0,0 +1,56 @@ +// +// AppDelegate.swift +// Scale +// +// Created by Yi Gu on 04/22/15. +// Copyright © 2016 Yi Gu. All rights reserved. +// + +import UIKit + +enum Shortcut: String { + case openBlue = "OpenBlue" +} + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + + var window: UIWindow? + + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: + [UIApplication.LaunchOptionsKey: Any]?) -> Bool { + + print("didFinishLaunchingWithOptions called") + var isLaunchedFromQuickAction = false + + if let shortcutItem = launchOptions?[UIApplication.LaunchOptionsKey.shortcutItem] as? UIApplicationShortcutItem { + isLaunchedFromQuickAction = true + let _ = handleQuickAction(shortcutItem) + } else { + self.window?.backgroundColor = UIColor.white + } + + return !isLaunchedFromQuickAction + } + + func application(_ application: UIApplication, willFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { + + return true + } + + func handleQuickAction(_ shortcutItem: UIApplicationShortcutItem) -> Bool { + var quickActionHandled = false + let type = shortcutItem.type.components(separatedBy: ".").last! + + if let shortcutType = Shortcut.init(rawValue: type) { + switch shortcutType { + case .openBlue: + self.window?.backgroundColor = UIColor(red: 151.0/255.0, green: 187.0/255.0, blue: 255.0/255.0, alpha: 1.0) + quickActionHandled = true + } + } + + return quickActionHandled + } +} + diff --git a/Project 26 - Scale/Scale/Assets.xcassets/AppIcon.appiconset/Contents.json b/Project 26 - Scale/Scale/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..9cf22df4 --- /dev/null +++ b/Project 26 - Scale/Scale/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,212 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "3x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-29.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-29@2x-1.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-29@3x-1.png", + "scale" : "3x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-40@2x-1.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-40@3x.png", + "scale" : "3x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-60@2x-1.png", + "scale" : "2x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-60@3x.png", + "scale" : "3x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-40.png", + "scale" : "1x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-40@2x.png", + "scale" : "2x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-76.png", + "scale" : "1x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-76@2x.png", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "83.5x83.5", + "scale" : "2x" + }, + { + "idiom" : "ios-marketing", + "size" : "1024x1024", + "scale" : "1x" + }, + { + "size" : "60x60", + "idiom" : "car", + "filename" : "Icon-60@2x.png", + "scale" : "2x" + }, + { + "idiom" : "car", + "size" : "60x60", + "scale" : "3x" + }, + { + "size" : "24x24", + "idiom" : "watch", + "scale" : "2x", + "role" : "notificationCenter", + "subtype" : "38mm" + }, + { + "size" : "27.5x27.5", + "idiom" : "watch", + "scale" : "2x", + "role" : "notificationCenter", + "subtype" : "42mm" + }, + { + "size" : "29x29", + "idiom" : "watch", + "filename" : "Icon-29@2x.png", + "role" : "companionSettings", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "watch", + "filename" : "Icon-29@3x.png", + "role" : "companionSettings", + "scale" : "3x" + }, + { + "size" : "40x40", + "idiom" : "watch", + "scale" : "2x", + "role" : "appLauncher", + "subtype" : "38mm" + }, + { + "size" : "44x44", + "idiom" : "watch", + "scale" : "2x", + "role" : "appLauncher", + "subtype" : "40mm" + }, + { + "size" : "50x50", + "idiom" : "watch", + "scale" : "2x", + "role" : "appLauncher", + "subtype" : "44mm" + }, + { + "size" : "86x86", + "idiom" : "watch", + "scale" : "2x", + "role" : "quickLook", + "subtype" : "38mm" + }, + { + "size" : "98x98", + "idiom" : "watch", + "scale" : "2x", + "role" : "quickLook", + "subtype" : "42mm" + }, + { + "size" : "108x108", + "idiom" : "watch", + "scale" : "2x", + "role" : "quickLook", + "subtype" : "44mm" + }, + { + "idiom" : "watch-marketing", + "size" : "1024x1024", + "scale" : "1x" + }, + { + "size" : "512x512", + "idiom" : "mac", + "filename" : "iTunesArtwork-512.png", + "scale" : "1x" + }, + { + "size" : "512x512", + "idiom" : "mac", + "filename" : "iTunesArtwork-512@2x.png", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Project 26 - Scale/Scale/Assets.xcassets/AppIcon.appiconset/Icon-29.png b/Project 26 - Scale/Scale/Assets.xcassets/AppIcon.appiconset/Icon-29.png new file mode 100644 index 00000000..43db8b72 Binary files /dev/null and b/Project 26 - Scale/Scale/Assets.xcassets/AppIcon.appiconset/Icon-29.png differ diff --git a/Project 26 - Scale/Scale/Assets.xcassets/AppIcon.appiconset/Icon-29@2x-1.png b/Project 26 - Scale/Scale/Assets.xcassets/AppIcon.appiconset/Icon-29@2x-1.png new file mode 100644 index 00000000..56a4bfe5 Binary files /dev/null and b/Project 26 - Scale/Scale/Assets.xcassets/AppIcon.appiconset/Icon-29@2x-1.png differ diff --git a/Project 26 - Scale/Scale/Assets.xcassets/AppIcon.appiconset/Icon-29@2x.png b/Project 26 - Scale/Scale/Assets.xcassets/AppIcon.appiconset/Icon-29@2x.png new file mode 100644 index 00000000..56a4bfe5 Binary files /dev/null and b/Project 26 - Scale/Scale/Assets.xcassets/AppIcon.appiconset/Icon-29@2x.png differ diff --git a/Project 26 - Scale/Scale/Assets.xcassets/AppIcon.appiconset/Icon-29@3x-1.png b/Project 26 - Scale/Scale/Assets.xcassets/AppIcon.appiconset/Icon-29@3x-1.png new file mode 100644 index 00000000..07b72a75 Binary files /dev/null and b/Project 26 - Scale/Scale/Assets.xcassets/AppIcon.appiconset/Icon-29@3x-1.png differ diff --git a/Project 26 - Scale/Scale/Assets.xcassets/AppIcon.appiconset/Icon-29@3x.png b/Project 26 - Scale/Scale/Assets.xcassets/AppIcon.appiconset/Icon-29@3x.png new file mode 100644 index 00000000..07b72a75 Binary files /dev/null and b/Project 26 - Scale/Scale/Assets.xcassets/AppIcon.appiconset/Icon-29@3x.png differ diff --git a/Project 26 - Scale/Scale/Assets.xcassets/AppIcon.appiconset/Icon-40.png b/Project 26 - Scale/Scale/Assets.xcassets/AppIcon.appiconset/Icon-40.png new file mode 100644 index 00000000..73f6260a Binary files /dev/null and b/Project 26 - Scale/Scale/Assets.xcassets/AppIcon.appiconset/Icon-40.png differ diff --git a/Project 26 - Scale/Scale/Assets.xcassets/AppIcon.appiconset/Icon-40@2x-1.png b/Project 26 - Scale/Scale/Assets.xcassets/AppIcon.appiconset/Icon-40@2x-1.png new file mode 100644 index 00000000..2883ba0d Binary files /dev/null and b/Project 26 - Scale/Scale/Assets.xcassets/AppIcon.appiconset/Icon-40@2x-1.png differ diff --git a/Project 26 - Scale/Scale/Assets.xcassets/AppIcon.appiconset/Icon-40@2x.png b/Project 26 - Scale/Scale/Assets.xcassets/AppIcon.appiconset/Icon-40@2x.png new file mode 100644 index 00000000..2883ba0d Binary files /dev/null and b/Project 26 - Scale/Scale/Assets.xcassets/AppIcon.appiconset/Icon-40@2x.png differ diff --git a/Project 26 - Scale/Scale/Assets.xcassets/AppIcon.appiconset/Icon-40@3x.png b/Project 26 - Scale/Scale/Assets.xcassets/AppIcon.appiconset/Icon-40@3x.png new file mode 100644 index 00000000..2b216793 Binary files /dev/null and b/Project 26 - Scale/Scale/Assets.xcassets/AppIcon.appiconset/Icon-40@3x.png differ diff --git a/Project 26 - Scale/Scale/Assets.xcassets/AppIcon.appiconset/Icon-60@2x-1.png b/Project 26 - Scale/Scale/Assets.xcassets/AppIcon.appiconset/Icon-60@2x-1.png new file mode 100644 index 00000000..2b216793 Binary files /dev/null and b/Project 26 - Scale/Scale/Assets.xcassets/AppIcon.appiconset/Icon-60@2x-1.png differ diff --git a/Project 26 - Scale/Scale/Assets.xcassets/AppIcon.appiconset/Icon-60@2x.png b/Project 26 - Scale/Scale/Assets.xcassets/AppIcon.appiconset/Icon-60@2x.png new file mode 100644 index 00000000..2b216793 Binary files /dev/null and b/Project 26 - Scale/Scale/Assets.xcassets/AppIcon.appiconset/Icon-60@2x.png differ diff --git a/Project 26 - Scale/Scale/Assets.xcassets/AppIcon.appiconset/Icon-60@3x.png b/Project 26 - Scale/Scale/Assets.xcassets/AppIcon.appiconset/Icon-60@3x.png new file mode 100644 index 00000000..495fb09c Binary files /dev/null and b/Project 26 - Scale/Scale/Assets.xcassets/AppIcon.appiconset/Icon-60@3x.png differ diff --git a/Project 26 - Scale/Scale/Assets.xcassets/AppIcon.appiconset/Icon-76.png b/Project 26 - Scale/Scale/Assets.xcassets/AppIcon.appiconset/Icon-76.png new file mode 100644 index 00000000..728c7a42 Binary files /dev/null and b/Project 26 - Scale/Scale/Assets.xcassets/AppIcon.appiconset/Icon-76.png differ diff --git a/Project 26 - Scale/Scale/Assets.xcassets/AppIcon.appiconset/Icon-76@2x.png b/Project 26 - Scale/Scale/Assets.xcassets/AppIcon.appiconset/Icon-76@2x.png new file mode 100644 index 00000000..1a9b9173 Binary files /dev/null and b/Project 26 - Scale/Scale/Assets.xcassets/AppIcon.appiconset/Icon-76@2x.png differ diff --git a/Project 26 - Scale/Scale/Assets.xcassets/AppIcon.appiconset/iTunesArtwork-512.png b/Project 26 - Scale/Scale/Assets.xcassets/AppIcon.appiconset/iTunesArtwork-512.png new file mode 100644 index 00000000..46e6db0d Binary files /dev/null and b/Project 26 - Scale/Scale/Assets.xcassets/AppIcon.appiconset/iTunesArtwork-512.png differ diff --git a/Project 26 - Scale/Scale/Assets.xcassets/AppIcon.appiconset/iTunesArtwork-512@2x.png b/Project 26 - Scale/Scale/Assets.xcassets/AppIcon.appiconset/iTunesArtwork-512@2x.png new file mode 100644 index 00000000..9172ac5b Binary files /dev/null and b/Project 26 - Scale/Scale/Assets.xcassets/AppIcon.appiconset/iTunesArtwork-512@2x.png differ diff --git a/Project 18 - ClassicPhotos/ClassicPhotos/Images.xcassets/Contents.json b/Project 26 - Scale/Scale/Assets.xcassets/Contents.json similarity index 100% rename from Project 18 - ClassicPhotos/ClassicPhotos/Images.xcassets/Contents.json rename to Project 26 - Scale/Scale/Assets.xcassets/Contents.json diff --git a/Project 26 - Scale/Scale/Assets.xcassets/OpenBlue.imageset/Contents.json b/Project 26 - Scale/Scale/Assets.xcassets/OpenBlue.imageset/Contents.json new file mode 100644 index 00000000..ace7bade --- /dev/null +++ b/Project 26 - Scale/Scale/Assets.xcassets/OpenBlue.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "OpenBlue.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "OpenBlue@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "OpenBlue@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Project 26 - Scale/Scale/Assets.xcassets/OpenBlue.imageset/OpenBlue.png b/Project 26 - Scale/Scale/Assets.xcassets/OpenBlue.imageset/OpenBlue.png new file mode 100644 index 00000000..67498d74 Binary files /dev/null and b/Project 26 - Scale/Scale/Assets.xcassets/OpenBlue.imageset/OpenBlue.png differ diff --git a/Project 26 - Scale/Scale/Assets.xcassets/OpenBlue.imageset/OpenBlue@2x.png b/Project 26 - Scale/Scale/Assets.xcassets/OpenBlue.imageset/OpenBlue@2x.png new file mode 100644 index 00000000..69380178 Binary files /dev/null and b/Project 26 - Scale/Scale/Assets.xcassets/OpenBlue.imageset/OpenBlue@2x.png differ diff --git a/Project 26 - Scale/Scale/Assets.xcassets/OpenBlue.imageset/OpenBlue@3x.png b/Project 26 - Scale/Scale/Assets.xcassets/OpenBlue.imageset/OpenBlue@3x.png new file mode 100644 index 00000000..8ff41c1d Binary files /dev/null and b/Project 26 - Scale/Scale/Assets.xcassets/OpenBlue.imageset/OpenBlue@3x.png differ diff --git a/Project 04 - Todo/Todo/Assets.xcassets/selected/child-selected.imageset/Contents.json b/Project 26 - Scale/Scale/Assets.xcassets/Spoon.imageset/Contents.json similarity index 72% rename from Project 04 - Todo/Todo/Assets.xcassets/selected/child-selected.imageset/Contents.json rename to Project 26 - Scale/Scale/Assets.xcassets/Spoon.imageset/Contents.json index 190c6322..3ad8ca35 100644 --- a/Project 04 - Todo/Todo/Assets.xcassets/selected/child-selected.imageset/Contents.json +++ b/Project 26 - Scale/Scale/Assets.xcassets/Spoon.imageset/Contents.json @@ -2,15 +2,17 @@ "images" : [ { "idiom" : "universal", + "filename" : "Spoon.png", "scale" : "1x" }, { "idiom" : "universal", - "filename" : "child-selected@2x.png", + "filename" : "Spoon@2x.png", "scale" : "2x" }, { "idiom" : "universal", + "filename" : "Spoon@3x.png", "scale" : "3x" } ], diff --git a/Project 26 - Scale/Scale/Assets.xcassets/Spoon.imageset/Spoon.png b/Project 26 - Scale/Scale/Assets.xcassets/Spoon.imageset/Spoon.png new file mode 100644 index 00000000..1887090e Binary files /dev/null and b/Project 26 - Scale/Scale/Assets.xcassets/Spoon.imageset/Spoon.png differ diff --git a/Project 26 - Scale/Scale/Assets.xcassets/Spoon.imageset/Spoon@2x.png b/Project 26 - Scale/Scale/Assets.xcassets/Spoon.imageset/Spoon@2x.png new file mode 100644 index 00000000..e736cd90 Binary files /dev/null and b/Project 26 - Scale/Scale/Assets.xcassets/Spoon.imageset/Spoon@2x.png differ diff --git a/Project 26 - Scale/Scale/Assets.xcassets/Spoon.imageset/Spoon@3x.png b/Project 26 - Scale/Scale/Assets.xcassets/Spoon.imageset/Spoon@3x.png new file mode 100644 index 00000000..f5607305 Binary files /dev/null and b/Project 26 - Scale/Scale/Assets.xcassets/Spoon.imageset/Spoon@3x.png differ diff --git a/Project 03 - Stopwatch/Stopwatch/Base.lproj/LaunchScreen.storyboard b/Project 26 - Scale/Scale/Base.lproj/LaunchScreen.storyboard similarity index 84% rename from Project 03 - Stopwatch/Stopwatch/Base.lproj/LaunchScreen.storyboard rename to Project 26 - Scale/Scale/Base.lproj/LaunchScreen.storyboard index 2e721e18..180d5609 100644 --- a/Project 03 - Stopwatch/Stopwatch/Base.lproj/LaunchScreen.storyboard +++ b/Project 26 - Scale/Scale/Base.lproj/LaunchScreen.storyboard @@ -1,7 +1,7 @@ - + - + diff --git a/Project 26 - Scale/Scale/Base.lproj/Main.storyboard b/Project 26 - Scale/Scale/Base.lproj/Main.storyboard new file mode 100644 index 00000000..6908e2ce --- /dev/null +++ b/Project 26 - Scale/Scale/Base.lproj/Main.storyboard @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Project 29 - Grocr/Grocr/Info.plist b/Project 26 - Scale/Scale/Info.plist similarity index 66% rename from Project 29 - Grocr/Grocr/Info.plist rename to Project 26 - Scale/Scale/Info.plist index e13a524b..8bea1686 100644 --- a/Project 29 - Grocr/Grocr/Info.plist +++ b/Project 26 - Scale/Scale/Info.plist @@ -2,11 +2,19 @@ - NSAppTransportSecurity - - NSAllowsArbitraryLoads - - + UIApplicationShortcutItems + + + UIApplicationShortcutItemType + $(PRODUCT_BUNDLE_IDENTIFIER).OpenBlue + UIApplicationShortcutItemTitle + Open Blue + UIApplicationShortcutItemSubtitle + Open Scale with a blue background + UIApplicationShortcutItemIconFile + OpenBlue + + CFBundleDevelopmentRegion en CFBundleExecutable @@ -35,15 +43,11 @@ armv7 - UIRequiresFullScreen - - UIStatusBarStyle - UIStatusBarStyleLightContent UISupportedInterfaceOrientations UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight - UIViewControllerBasedStatusBarAppearance - diff --git a/Project 26 - Scale/Scale/ViewController.swift b/Project 26 - Scale/Scale/ViewController.swift new file mode 100644 index 00000000..f753517d --- /dev/null +++ b/Project 26 - Scale/Scale/ViewController.swift @@ -0,0 +1,49 @@ +// +// ViewController.swift +// Scale +// +// Created by Yi Gu on 04/22/15. +// Copyright © 2016 Yi Gu. All rights reserved. +// + +import UIKit + +class ViewController: UIViewController { + // MARK: - IBOutlets + @IBOutlet weak var forceLabel: UILabel! + + // MARK: - init + override func viewDidLoad() { + super.viewDidLoad() + } + + override func didReceiveMemoryWarning() { + super.didReceiveMemoryWarning() + // Dispose of any resources that can be recreated. + } + + // MARK: - UITouch + override func touchesMoved(_ touches: Set, with event: UIEvent?) { + // check only one object in touches + guard let touch = touches.first else { + return + } + + // check if device is 3D Touch capable + if traitCollection.forceTouchCapability == UIForceTouchCapability.available { + if touch.force >= touch.maximumPossibleForce { + forceLabel.text = "385+ g" + } else { + let force = touch.force / touch.maximumPossibleForce + let grams = Int(force * 385) + forceLabel.text = "\(grams) g" + } + } + } + + override func touchesEnded(_ touches: Set, with event: UIEvent?) { + forceLabel.text = "0 g" + } + +} + diff --git a/Project 17 - BlueLibrarySwift/BlueLibrarySwiftTests/Info.plist b/Project 26 - Scale/ScaleTests/Info.plist similarity index 100% rename from Project 17 - BlueLibrarySwift/BlueLibrarySwiftTests/Info.plist rename to Project 26 - Scale/ScaleTests/Info.plist diff --git a/Project 25 - WeatherExtension/WeatherDemoTests/WeatherDemoTests.swift b/Project 26 - Scale/ScaleTests/ScaleTests.swift similarity index 67% rename from Project 25 - WeatherExtension/WeatherDemoTests/WeatherDemoTests.swift rename to Project 26 - Scale/ScaleTests/ScaleTests.swift index 0ad0a71e..4e1ab358 100644 --- a/Project 25 - WeatherExtension/WeatherDemoTests/WeatherDemoTests.swift +++ b/Project 26 - Scale/ScaleTests/ScaleTests.swift @@ -1,15 +1,15 @@ // -// WeatherDemoTests.swift -// WeatherDemoTests +// ScaleTests.swift +// ScaleTests // -// Created by Simon Ng on 9/1/15. -// Copyright (c) 2015 AppCoda. All rights reserved. +// Created by Maxime Defauw on 02/11/15. +// Copyright © 2015 Maxime Defauw. All rights reserved. // -import UIKit import XCTest +@testable import Scale -class WeatherDemoTests: XCTestCase { +class ScaleTests: XCTestCase { override func setUp() { super.setUp() @@ -23,12 +23,12 @@ class WeatherDemoTests: XCTestCase { func testExample() { // This is an example of a functional test case. - XCTAssert(true, "Pass") + // Use XCTAssert and related functions to verify your tests produce the correct results. } func testPerformanceExample() { // This is an example of a performance test case. - self.measure() { + self.measure { // Put the code you want to measure the time of here. } } diff --git a/Project 25 - WeatherExtension/WeatherDemoTests/Info.plist b/Project 26 - Scale/ScaleUITests/Info.plist similarity index 100% rename from Project 25 - WeatherExtension/WeatherDemoTests/Info.plist rename to Project 26 - Scale/ScaleUITests/Info.plist diff --git a/Project 26 - Scale/ScaleUITests/ScaleUITests.swift b/Project 26 - Scale/ScaleUITests/ScaleUITests.swift new file mode 100644 index 00000000..bd6c550d --- /dev/null +++ b/Project 26 - Scale/ScaleUITests/ScaleUITests.swift @@ -0,0 +1,36 @@ +// +// ScaleUITests.swift +// ScaleUITests +// +// Created by Maxime Defauw on 02/11/15. +// Copyright © 2015 Maxime Defauw. All rights reserved. +// + +import XCTest + +class ScaleUITests: XCTestCase { + + override func setUp() { + super.setUp() + + // Put setup code here. This method is called before the invocation of each test method in the class. + + // In UI tests it is usually best to stop immediately when a failure occurs. + continueAfterFailure = false + // UI tests must launch the application that they test. Doing this in setup will make sure it happens for each test method. + XCUIApplication().launch() + + // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this. + } + + override func tearDown() { + // Put teardown code here. This method is called after the invocation of each test method in the class. + super.tearDown() + } + + func testExample() { + // Use recording to get started writing UI tests. + // Use XCTAssert and related functions to verify your tests produce the correct results. + } + +} diff --git a/Project 26 - Scale/Screenshots/shot1.png b/Project 26 - Scale/Screenshots/shot1.png new file mode 100644 index 00000000..51d5cf92 Binary files /dev/null and b/Project 26 - Scale/Screenshots/shot1.png differ diff --git a/Project 26 - Scale/Screenshots/shot2.png b/Project 26 - Scale/Screenshots/shot2.png new file mode 100644 index 00000000..b09215ab Binary files /dev/null and b/Project 26 - Scale/Screenshots/shot2.png differ diff --git a/Project 26 - Scale/Screenshots/shot3.png b/Project 26 - Scale/Screenshots/shot3.png new file mode 100644 index 00000000..3d33532f Binary files /dev/null and b/Project 26 - Scale/Screenshots/shot3.png differ diff --git a/Project 27 - Marslink/Marslink.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/Marslink.xcscheme b/Project 27 - Marslink/Marslink.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/Marslink.xcscheme deleted file mode 100644 index 6c4fb102..00000000 --- a/Project 27 - Marslink/Marslink.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/Marslink.xcscheme +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Project 27 - Marslink/Marslink.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/xcschememanagement.plist b/Project 27 - Marslink/Marslink.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/xcschememanagement.plist deleted file mode 100644 index ff471d9a..00000000 --- a/Project 27 - Marslink/Marslink.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/xcschememanagement.plist +++ /dev/null @@ -1,22 +0,0 @@ - - - - - SchemeUserState - - Marslink.xcscheme - - orderHint - 0 - - - SuppressBuildableAutocreation - - 2949EE871D8AB4F4005BC671 - - primary - - - - - diff --git a/Project 27 - Marslink/Marslink.xcodeproj/xcuserdata/jeffro.xcuserdatad/xcschemes/Marslink.xcscheme b/Project 27 - Marslink/Marslink.xcodeproj/xcuserdata/jeffro.xcuserdatad/xcschemes/Marslink.xcscheme deleted file mode 100644 index cf6564fe..00000000 --- a/Project 27 - Marslink/Marslink.xcodeproj/xcuserdata/jeffro.xcuserdatad/xcschemes/Marslink.xcscheme +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Project 27 - Marslink/Marslink.xcodeproj/xcuserdata/jeffro.xcuserdatad/xcschemes/xcschememanagement.plist b/Project 27 - Marslink/Marslink.xcodeproj/xcuserdata/jeffro.xcuserdatad/xcschemes/xcschememanagement.plist deleted file mode 100644 index ff471d9a..00000000 --- a/Project 27 - Marslink/Marslink.xcodeproj/xcuserdata/jeffro.xcuserdatad/xcschemes/xcschememanagement.plist +++ /dev/null @@ -1,22 +0,0 @@ - - - - - SchemeUserState - - Marslink.xcscheme - - orderHint - 0 - - - SuppressBuildableAutocreation - - 2949EE871D8AB4F4005BC671 - - primary - - - - - diff --git a/Project 27 - Marslink/Marslink.xcodeproj/xcuserdata/rnystrom.xcuserdatad/xcschemes/Marslink.xcscheme b/Project 27 - Marslink/Marslink.xcodeproj/xcuserdata/rnystrom.xcuserdatad/xcschemes/Marslink.xcscheme deleted file mode 100644 index 9342438d..00000000 --- a/Project 27 - Marslink/Marslink.xcodeproj/xcuserdata/rnystrom.xcuserdatad/xcschemes/Marslink.xcscheme +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Project 27 - Marslink/Marslink.xcodeproj/xcuserdata/rnystrom.xcuserdatad/xcschemes/xcschememanagement.plist b/Project 27 - Marslink/Marslink.xcodeproj/xcuserdata/rnystrom.xcuserdatad/xcschemes/xcschememanagement.plist deleted file mode 100644 index ff471d9a..00000000 --- a/Project 27 - Marslink/Marslink.xcodeproj/xcuserdata/rnystrom.xcuserdatad/xcschemes/xcschememanagement.plist +++ /dev/null @@ -1,22 +0,0 @@ - - - - - SchemeUserState - - Marslink.xcscheme - - orderHint - 0 - - - SuppressBuildableAutocreation - - 2949EE871D8AB4F4005BC671 - - primary - - - - - diff --git a/Project 27 - Marslink/Marslink.xcworkspace/xcuserdata/rnystrom.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/Project 27 - Marslink/Marslink.xcworkspace/xcuserdata/rnystrom.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist deleted file mode 100644 index bba028fd..00000000 --- a/Project 27 - Marslink/Marslink.xcworkspace/xcuserdata/rnystrom.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - diff --git a/Project 27 - Marslink/Podfile.lock b/Project 27 - Marslink/Podfile.lock deleted file mode 100644 index 2a98a251..00000000 --- a/Project 27 - Marslink/Podfile.lock +++ /dev/null @@ -1,22 +0,0 @@ -PODS: - - IGListKit (1.0.0) - -DEPENDENCIES: - - IGListKit (from `https://github.com/Instagram/IGListKit.git`, branch `master`) - -EXTERNAL SOURCES: - IGListKit: - :branch: master - :git: https://github.com/Instagram/IGListKit.git - -CHECKOUT OPTIONS: - IGListKit: - :commit: e1d6f5255243cbf4c2f7d8e77e2ea1dd1f583dcf - :git: https://github.com/Instagram/IGListKit.git - -SPEC CHECKSUMS: - IGListKit: a534a917b574ec56697390ef182f125ccff2145b - -PODFILE CHECKSUM: 821e6140b55085368f6ab60db1c7d34ebfdca84d - -COCOAPODS: 1.1.1 diff --git a/Project 27 - Marslink/Pods/IGListKit/README.md b/Project 27 - Marslink/Pods/IGListKit/README.md deleted file mode 100644 index 911f06aa..00000000 --- a/Project 27 - Marslink/Pods/IGListKit/README.md +++ /dev/null @@ -1,91 +0,0 @@ -

- -

- -

- - Build Status - - - Coverage Status - - - Pods Version - - - Carthage Compatible - -

- ----------------- - -A data-driven `UICollectionView` framework for building fast and flexible lists. - -| | Main Features | -----------|----------------- -🙅 | Never call `performBatchUpdates(_:, completion:)` or `reloadData()` again -🏠 | Better architecture with reusable cells and components -🔠 | Create collections with multiple data types -🔑 | Decoupled diffing algorithm -✅ | Fully unit tested -🔍 | Customize your diffing behavior for your models -📱 | Simply `UICollectionView` at its core -🚀 | Extendable API -🐦 | Written in Objective-C with full Swift interop support - -`IGListKit` is built and maintained with ❤️ by [Instagram engineering](https://engineering.instagram.com/), using the open source version for the Instagram app. - -## Requirements - -- Xcode 8.0+ -- iOS 8.0+ -- tvOS 9.0+ -- Interoperability with Swift 3.0+ - -## Installation - -### CocoaPods - -The preferred installation method for `IGListKit` is with [CocoaPods](https://cocoapods.org). Simply add the following to your `Podfile`: - -```ruby -# Latest release of IGListKit -pod 'IGListKit' - -# Use the master branch (we use this at Instagram) -pod 'IGListKit', :git => 'https://github.com/Instagram/IGListKit.git', :branch => 'master' -``` - -### Carthage - -To integrate `IGListKit` into your Xcode project using [Carthage](https://github.com/Carthage/Carthage), specify it in your `Cartfile`: - -```ogdl -github "Instagram/IGListKit" ~> 1.0.0 -``` - -### Manually - -You can also manually install the framework by dragging and dropping the `IGListKit.xcodeproj` into your project or workspace. - -## Getting Started - -See the [Getting Started guide here](https://instagram.github.io/IGListKit/getting-started.html). - -## Documentation - -You can find [the docs here](https://instagram.github.io/IGListKit). Documentation is generated with [jazzy](https://github.com/realm/jazzy) and hosted on [GitHub-Pages](https://pages.github.com). - -## Contributing - -Please see the [CONTRIBUTING](https://github.com/Instagram/IGListKit/blob/master/.github/CONTRIBUTING.md) file for how to help out. At Instagram we sync the open source version of `IGListKit` almost daily, so we're always testing the latest changes. But that requires all changes be thoroughly tested follow our style guide. - -## License - -`IGListKit` is BSD-licensed. We also provide an additional patent grant. - -The files in the /Example directory are licensed under a separate license as specified in each file; documentation is licensed [CC-BY-4.0](https://creativecommons.org/licenses/by/4.0/). diff --git a/Project 27 - Marslink/Pods/IGListKit/Source/IGListCollectionView.h b/Project 27 - Marslink/Pods/IGListKit/Source/IGListCollectionView.h deleted file mode 100644 index dcd85d02..00000000 --- a/Project 27 - Marslink/Pods/IGListKit/Source/IGListCollectionView.h +++ /dev/null @@ -1,88 +0,0 @@ -/** - * Copyright (c) 2016-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import - -#import - -/** - This class is never actually used by the `IGListKit` infrastructure. - It exists only to give compiler errors when editing - methods are called on the collection view returned by `-[IGListAdapter collectionView]`. - */ -IGLK_SUBCLASSING_RESTRICTED -@interface IGListCollectionView : UICollectionView - -/** - :nodoc: - */ -- (void)performBatchUpdates:(void (^)(void))updates - completion:(void (^)(BOOL))completion IGLK_UNAVAILABLE("Call -[IGListAdapter performUpdatesWithCompletion:] instead"); - -/** - :nodoc: - */ -- (void)reloadData IGLK_UNAVAILABLE("Call -[IGListAdapter reloadDataWithCompletion:] instead"); - -/** - :nodoc: - */ -- (void)reloadSections:(NSIndexSet *)sections IGLK_UNAVAILABLE("Call -[IGListAdapter reloadItems:] instead"); - -/** - :nodoc: - */ -- (void)insertSections:(NSIndexSet *)sections IGLK_UNAVAILABLE("Call -[IGListAdapter performUpdatesWithCompletion:] instead"); - -/** - :nodoc: - */ -- (void)deleteSections:(NSIndexSet *)sections IGLK_UNAVAILABLE("Call -[IGListAdapter performUpdatesWithCompletion:] instead"); - -/** - :nodoc: - */ -- (void)moveSection:(NSInteger)section toSection:(NSInteger)newSection IGLK_UNAVAILABLE("Call -[IGListAdapter performUpdatesWithCompletion:] instead"); - -/** - :nodoc: - */ -- (void)insertItemsAtIndexPaths:(NSArray *)indexPaths IGLK_UNAVAILABLE("Call -[ insertSectionController:forItems:completion:] instead"); - -/** - :nodoc: - */ -- (void)reloadItemsAtIndexPaths:(NSArray *)indexPaths IGLK_UNAVAILABLE("Call -[ reloadSectionController:forItems:completion:] instead"); - -/** - :nodoc: - */ -- (void)deleteItemsAtIndexPaths:(NSArray *)indexPaths IGLK_UNAVAILABLE("Call -[ deleteSectionController:forItems:completion:] instead"); - -/** - :nodoc: - */ -- (void)moveItemAtIndexPath:(NSIndexPath *)indexPath toIndexPath:(NSIndexPath *)newIndexPath IGLK_UNAVAILABLE("Moving items currently unsupported"); - -/** - :nodoc: - */ -- (void)setDelegate:(id)delegate IGLK_UNAVAILABLE("IGListAdapter should be the delegate of the collection view"); - -/** - :nodoc: - */ -- (void)setDataSource:(id)dataSource IGLK_UNAVAILABLE("IGListAdapter should be the data source of the collection view"); - -/** - :nodoc: - */ -- (void)setBackgroundView:(UIView *)backgroundView IGLK_UNAVAILABLE("Return a view in -[IGListAdapterDataSource emptyViewForListAdapter:] instead"); - -@end diff --git a/Project 27 - Marslink/Pods/IGListKit/Source/IGListCollectionView.m b/Project 27 - Marslink/Pods/IGListKit/Source/IGListCollectionView.m deleted file mode 100644 index be9f5a1b..00000000 --- a/Project 27 - Marslink/Pods/IGListKit/Source/IGListCollectionView.m +++ /dev/null @@ -1,44 +0,0 @@ -/** - * Copyright (c) 2016-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import "IGListCollectionView.h" - -@implementation IGListCollectionView - -- (void)commonInit { - self.backgroundColor = [UIColor whiteColor]; - self.alwaysBounceVertical = YES; -} - -- (instancetype)initWithFrame:(CGRect)frame collectionViewLayout:(UICollectionViewLayout *)layout { - if (self = [super initWithFrame:frame collectionViewLayout:layout]) { - [self commonInit]; - } - return self; -} - -- (instancetype)initWithCoder:(NSCoder *)aDecoder { - if (self = [super initWithCoder:aDecoder]) { - [self commonInit]; - } - return self; -} - -- (void)layoutSubviews { - /** - UICollectionView will sometimes lay its cells out with an animation. This is especially noticeable on older devices - while scrolling quickly. The simplest fix is to just disable animations for -layoutSubviews, which is where cells - and other views inside the UICollectionView are laid out. - */ - [UIView performWithoutAnimation:^{ - [super layoutSubviews]; - }]; -} - -@end diff --git a/Project 27 - Marslink/Pods/IGListKit/Source/IGListGridCollectionViewLayout.h b/Project 27 - Marslink/Pods/IGListKit/Source/IGListGridCollectionViewLayout.h deleted file mode 100644 index 503da4e8..00000000 --- a/Project 27 - Marslink/Pods/IGListKit/Source/IGListGridCollectionViewLayout.h +++ /dev/null @@ -1,43 +0,0 @@ -/** - * Copyright (c) 2016-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import -#import - -NS_ASSUME_NONNULL_BEGIN - -/** - `IGListGridCollectionViewLayout` provides a vertically-scrolling, section-based grid layout for `UICollectionView`. - Items in the layout are displayed consecutively in a grid with exactly 1 item per section. - If items are square, the appearance would be similar to the iOS Photos app. - However, the size of the items for each section can vary. - */ -IGLK_SUBCLASSING_RESTRICTED -@interface IGListGridCollectionViewLayout : UICollectionViewLayout - -/** - The minimum spacing to use between lines of items in the grid. The default value is `0.0`. - */ -@property (nonatomic, assign) IBInspectable CGFloat minimumLineSpacing; - -/** - The minimum spacing to use between items in the same row. The default value is `0.0`. - */ -@property (nonatomic, assign) IBInspectable CGFloat minimumInteritemSpacing; - -/** - The default size to use for cells. The default value is `(0.0, 0.0)`. - If this size is non-zero, the layout will use this item size for all items. - When the size is zero (the default), then the layout will query the collection view's delegate for the size. - */ -@property (nonatomic, assign) IBInspectable CGSize itemSize; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Project 27 - Marslink/Pods/IGListKit/Source/IGListGridCollectionViewLayout.m b/Project 27 - Marslink/Pods/IGListKit/Source/IGListGridCollectionViewLayout.m deleted file mode 100644 index ab1c3d20..00000000 --- a/Project 27 - Marslink/Pods/IGListKit/Source/IGListGridCollectionViewLayout.m +++ /dev/null @@ -1,331 +0,0 @@ -/** - * Copyright (c) 2016-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import -#import "IGListGridCollectionViewLayout.h" - -#pragma mark - IGListGridLayoutLine - -@interface _IGListGridLayoutLine : NSObject - -@property (nonatomic, assign) CGRect frame; -@property (nonatomic, assign) CGFloat tailSpace; -@property (nonatomic, assign, readonly) CGFloat minimumInteritemSpacing; -@property (nonatomic, assign) NSInteger headIndex; -@property (nonatomic, copy) NSMutableArray *itemSizes; - -- (instancetype)initWithMinimumInteritemSpacing:(CGFloat)spacing - headIndex:(NSInteger)headIndex - frame:(CGRect)frame; -- (BOOL)addItemToTailWithSize:(CGSize)size; -- (UICollectionViewLayoutAttributes *)attributesForItemAtIndexPath:(NSIndexPath *)indexPath; -- (NSArray *)attributesForAllItems; - -@end - - -#pragma mark - IGListGridCollectionViewLayout - -@interface IGListGridCollectionViewLayout () - -@property (nonatomic, copy, nullable, readonly) NSMutableArray<_IGListGridLayoutLine *> *lineCache; -@property (nonatomic, copy, nullable, readonly) NSMutableArray *lineForItem; - -@property (nonatomic, assign, readonly) CGFloat contentWidth; -@property (nonatomic, assign, readonly) CGFloat contentHeight; - -@property (nonatomic, assign) NSInteger itemPerLine; -@property (nonatomic, assign) NSInteger lineNumber; - -@end - -@implementation IGListGridCollectionViewLayout - -- (instancetype)init { - self = [super init]; - if (self) { - [self commonInit]; - } - return self; -} - -- (instancetype)initWithCoder:(nonnull NSCoder *)aDecoder { - self = [super initWithCoder:aDecoder]; - if (self) { - [self commonInit]; - } - return self; -} - -- (void)commonInit { - _minimumLineSpacing = 0.0f; - _minimumInteritemSpacing = 0.0f; - _lineCache = [NSMutableArray new]; - _lineForItem = [NSMutableArray new]; - _itemSize = CGSizeZero; -} - -#pragma mark - Layout Infomation - -- (void)prepareLayout { -#if DEBUG - IGAssertMainThread(); - for (NSInteger section = 0; section < [self.collectionView numberOfSections]; section++) { - IGAssert([self.collectionView numberOfItemsInSection:section] == 1, @"Each section should have exactly one item for this layout to work."); - } -#endif - if (CGSizeEqualToSize(self.itemSize, CGSizeZero)) { - [self reloadLayout]; - } else { - [self reloadLayoutWithConstantItemSize:self.itemSize]; - } -} - -- (CGSize)collectionViewContentSize { - return CGSizeMake(self.contentWidth, self.contentHeight); -} - -- (NSArray<__kindof UICollectionViewLayoutAttributes *> *)layoutAttributesForElementsInRect:(CGRect)rect { - NSMutableArray *array = [NSMutableArray array]; - if (CGSizeEqualToSize(self.itemSize, CGSizeZero)) { - BOOL findFirstLine = NO; - for (_IGListGridLayoutLine *line in self.lineCache) { - if (CGRectIntersectsRect(line.frame, rect)) { - findFirstLine = YES; - NSArray *lineAttributes = [line attributesForAllItems]; - for (UICollectionViewLayoutAttributes *attributes in lineAttributes) { - if (CGRectIntersectsRect(attributes.frame, rect)) { - [array addObject:attributes]; - } - } - } else if (findFirstLine) { - break; - } - } - } else { - NSInteger firstLine = (NSInteger)(rect.origin.y / (self.itemSize.height + self.minimumLineSpacing)); - NSInteger lastLine = (NSInteger)((rect.origin.y + rect.size.height + self.itemSize.height + self.minimumLineSpacing) - / (self.itemSize.height + self.minimumLineSpacing)); - NSInteger firstColumn = (NSInteger)(rect.origin.x / (self.itemSize.width + self.minimumInteritemSpacing)); - NSInteger LastColumn = (NSInteger)((rect.origin.x + rect.size.width + self.itemSize.width + self.minimumInteritemSpacing) - / (self.itemSize.width + self.minimumInteritemSpacing)); - firstLine = firstLine >= 0 ? firstLine : 0; - lastLine = lastLine >= 0 ? lastLine : 0; - firstColumn = firstColumn >= 0 ? firstColumn : 0; - LastColumn = LastColumn >= 0 ? LastColumn : 0; - for (NSInteger l = firstLine; l <= lastLine; l++) { - NSInteger section = 0; - for (NSInteger c = firstColumn; c <= LastColumn; c++) { - section = l * self.itemPerLine + c; - if (section >= self.collectionView.numberOfSections) { - break; - } - NSIndexPath *indexPath = [NSIndexPath indexPathForItem:0 inSection:section]; - UICollectionViewLayoutAttributes *attributes = [self layoutAttributesForItemAtIndexPath:indexPath]; - if (attributes != nil) { - [array addObject:attributes]; - } - } - if (section >= self.collectionView.numberOfSections) { - break; - } - } - } - return array; -} - -- (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath { - if (CGSizeEqualToSize(self.itemSize, CGSizeZero)) { - const NSInteger lineNumber = [self.lineForItem[indexPath.section] integerValue]; - _IGListGridLayoutLine *line = self.lineCache[lineNumber]; - return [line attributesForItemAtIndexPath:indexPath]; - } else { - const NSInteger section = indexPath.section; - const NSInteger lineNumber = section / self.itemPerLine; - const NSInteger column = section - lineNumber * self.itemPerLine; - const CGFloat x = column * (self.itemSize.width + self.minimumInteritemSpacing); - const CGFloat y = lineNumber * (self.itemSize.height + self.minimumLineSpacing); - const CGRect frame = CGRectMake(x, y, self.itemSize.width, self.itemSize.height); - UICollectionViewLayoutAttributes *attributes = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath]; - attributes.frame = frame; - return attributes; - } -} - -- (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds { - const CGRect oldBounds = self.collectionView.bounds; - return CGRectGetWidth(oldBounds) != CGRectGetWidth(newBounds) - || CGRectGetHeight(oldBounds) != CGRectGetHeight(newBounds); -} - -#pragma mark - Getter Setter - -- (CGFloat)contentWidth { - UIEdgeInsets insets = self.collectionView.contentInset; - return CGRectGetWidth(self.collectionView.bounds) - (insets.left + insets.right); -} - -- (CGFloat)contentHeight { - CGFloat height = 0; - - if (CGSizeEqualToSize(self.itemSize, CGSizeZero)) { - for (_IGListGridLayoutLine *line in self.lineCache) { - height += line.frame.size.height; - } - height += ([self.lineCache count] - 1) * self.minimumLineSpacing; - } else { - height = self.lineNumber * (self.itemSize.height + self.minimumLineSpacing) - self.minimumLineSpacing; - } - - return height; -} - -- (void)setMinimumLineSpacing:(CGFloat)minimumLineSpacing { - if (_minimumLineSpacing != minimumLineSpacing) { - _minimumLineSpacing = minimumLineSpacing; - [self invalidateLayout]; - } -} - -- (void)setMinimumInteritemSpacing:(CGFloat)minimumInteritemSpacing { - if (_minimumInteritemSpacing != minimumInteritemSpacing) { - _minimumInteritemSpacing = minimumInteritemSpacing; - [self invalidateLayout]; - } -} - -#pragma mark - Private API - -- (void)reloadLayout { - [self.lineCache removeAllObjects]; - [self.lineForItem removeAllObjects]; - - // Init first line and add to lineCache - CGRect frame = CGRectMake(0, 0, self.contentWidth, 0); - _IGListGridLayoutLine *firstLine = [[_IGListGridLayoutLine alloc] initWithMinimumInteritemSpacing:self.minimumInteritemSpacing - headIndex:0 - frame:frame]; - [self.lineCache addObject:firstLine]; - - UICollectionView *collectionView = self.collectionView; - - for (NSInteger i = 0; i < collectionView.numberOfSections; i++) { - NSIndexPath *indexPath = [NSIndexPath indexPathForItem:0 inSection:i]; - id delegate = (id) collectionView.delegate; - const CGSize itemSize = [delegate collectionView:collectionView layout:self sizeForItemAtIndexPath:indexPath]; - _IGListGridLayoutLine *lastLine = [self.lineCache lastObject]; - if (![lastLine addItemToTailWithSize:itemSize]) { - // Not enough space for the last line - CGFloat y = lastLine.frame.origin.y + lastLine.frame.size.height + self.minimumLineSpacing; - frame = CGRectMake(0, y, self.contentWidth, 0); - _IGListGridLayoutLine *newLine = [[_IGListGridLayoutLine alloc] initWithMinimumInteritemSpacing:self.minimumInteritemSpacing - headIndex:i - frame:frame]; - [self.lineCache addObject:newLine]; - [newLine addItemToTailWithSize:itemSize]; - } - [self.lineForItem addObject:@(self.lineCache.count - 1)]; - } -} - -- (void)reloadLayoutWithConstantItemSize:(CGSize)itemSize { - self.itemPerLine = (NSInteger) ((self.contentWidth + self.minimumInteritemSpacing) - / (itemSize.width + self.minimumInteritemSpacing)); - self.lineNumber = (self.collectionView.numberOfSections + self.itemPerLine - 1) / self.itemPerLine; -} - -@end - - -#pragma mark - IGListGridLayoutLine - -@implementation _IGListGridLayoutLine - -- (instancetype)initWithMinimumInteritemSpacing:(CGFloat)spacing - headIndex:(NSInteger)headIndex - frame:(CGRect)frame { - IGAssertMainThread(); - IGParameterAssert(spacing >= 0); - IGParameterAssert(headIndex >= 0); - - self = [super init]; - if (self) { - _frame = frame; - _minimumInteritemSpacing = spacing; - _itemSizes = [NSMutableArray array]; - _headIndex = headIndex; - _tailSpace = frame.size.width - self.minimumInteritemSpacing; - } - return self; -} - -- (BOOL)addItemToTailWithSize:(CGSize)size { - if (size.width > self.tailSpace) { - return NO; - } - - self.tailSpace -= size.width + self.minimumInteritemSpacing; - if (size.height > self.frame.size.height) { - CGRect frame = self.frame; - frame.size.height = size.height; - self.frame = frame; - } - NSValue *sizeValue = [NSValue valueWithCGSize:size]; - [self.itemSizes addObject:sizeValue]; - return YES; -} - -- (UICollectionViewLayoutAttributes *)attributesForItemAtIndexPath:(NSIndexPath *)indexPath { - const NSInteger index = indexPath.section - self.headIndex; - CGFloat x = 0; - NSInteger idx = 0; - for (NSValue *sizeValue in self.itemSizes) { - if (idx < index) { - const CGSize size = [sizeValue CGSizeValue]; - x += size.width + self.minimumInteritemSpacing; - } else { - break; - } - idx++; - } - UICollectionViewLayoutAttributes *attributes = [self attributesForItemAtIndexPath:indexPath withXOffset:x]; - return attributes; -} - -- (NSArray *)attributesForAllItems { - NSMutableArray *array = [NSMutableArray array]; - CGFloat x = 0; - NSInteger idx = 0; - for (NSValue *sizeValue in self.itemSizes) { - NSIndexPath *indexPath = [NSIndexPath indexPathForItem:0 inSection:(self.headIndex + idx)]; - UICollectionViewLayoutAttributes *attributes = [self attributesForItemAtIndexPath:indexPath withXOffset:x]; - [array addObject:attributes]; - const CGSize size = [sizeValue CGSizeValue]; - x += size.width + self.minimumInteritemSpacing; - idx++; - } - return [array copy]; -} - -#pragma mark - Private API - -- (UICollectionViewLayoutAttributes *)attributesForItemAtIndexPath:(NSIndexPath *)indexPath withXOffset:(CGFloat)xOffset { - const NSInteger index = indexPath.section - self.headIndex; - const CGSize itemSize = [self.itemSizes[index] CGSizeValue]; - - // Center vertically - const CGFloat y = (self.frame.size.height - itemSize.height) / 2; - - const CGRect frame = CGRectMake(self.frame.origin.x + xOffset, self.frame.origin.y + y, itemSize.width, itemSize.height); - UICollectionViewLayoutAttributes *attributes = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath]; - attributes.frame = frame; - return attributes; -} - -@end diff --git a/Project 27 - Marslink/Pods/IGListKit/Source/IGListSectionController.h b/Project 27 - Marslink/Pods/IGListKit/Source/IGListSectionController.h deleted file mode 100644 index 68d99a92..00000000 --- a/Project 27 - Marslink/Pods/IGListKit/Source/IGListSectionController.h +++ /dev/null @@ -1,107 +0,0 @@ -/** - * Copyright (c) 2016-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import - -#import -#import -#import -#import -#import - -/** - The base class for section controllers used in a list. This class is intended to be subclassed. - */ -@interface IGListSectionController : NSObject - -/** - The view controller housing the adapter that created this section controller. - - @note Use this view controller to push, pop, present, or do other custom transitions. - - @warning It is considered very bad practice to cast this to a known view controller - and call methods on it other than for navigations and transitions. - */ -@property (nonatomic, weak, nullable, readonly) UIViewController *viewController; - -/** - A context object for interacting with the collection. - - Use this property for accessing the collection size, dequeing cells, reloading, inserting, deleting, etc. - */ -@property (nonatomic, weak, nullable, readonly) id collectionContext; - -/** - Returns `YES` if the section controller is the first section in the list, `NO` otherwise. - */ -@property (nonatomic, assign, readonly) BOOL isFirstSection; - -/** - Returns `YES` if the section controller is the last section in the list, `NO` otherwise. - */ -@property (nonatomic, assign, readonly) BOOL isLastSection; - -/** - The margins used to lay out content in the section controller. - - @see `-[UICollectionViewFlowLayout sectionInset]`. - */ -@property (nonatomic, assign) UIEdgeInsets inset; - -/** - The minimum spacing to use between rows of items. - - @see `-[UICollectionViewFlowLayout minimumLineSpacing]`. - */ -@property (nonatomic, assign) CGFloat minimumLineSpacing; - -/** - The minimum spacing to use between items in the same row. - - @see `-[UICollectionViewFlowLayout minimumInteritemSpacing]`. - */ -@property (nonatomic, assign) CGFloat minimumInteritemSpacing; - -/** - The supplementary view source for the section controller. Can be `nil`. - - @return An object that conforms to `IGListSupplementaryViewSource` or `nil`. - - @note You may wish to return `self` if your section controller implements this protocol. - */ -@property (nonatomic, weak, nullable) id supplementaryViewSource; - -/** - An object that handles display events for the section controller. Can be `nil`. - - @return An object that conforms to `IGListDisplayDelegate` or `nil`. - - @note You may wish to return `self` if your section controller implements this protocol. - */ -@property (nonatomic, weak, nullable) id displayDelegate; - -/** - An object that handles working range events for the section controller. Can be `nil`. - - @return An object that conforms to `IGListWorkingRangeDelegate` or `nil`. - - @note You may wish to return `self` if your section controller implements this protocol. - */ -@property (nonatomic, weak, nullable) id workingRangeDelegate; - -/** - An object that handles display events for the section controller. Can be `nil`. - - @return An object that conforms to `IGListDisplayDelegate` or `nil`. - - @note You may wish to return `self` if your section controller implements this protocol. - */ -@property (nonatomic, weak, nullable) id scrollDelegate; - -@end diff --git a/Project 27 - Marslink/Pods/IGListKit/Source/IGListSectionType.h b/Project 27 - Marslink/Pods/IGListKit/Source/IGListSectionType.h deleted file mode 100644 index 72193df0..00000000 --- a/Project 27 - Marslink/Pods/IGListKit/Source/IGListSectionType.h +++ /dev/null @@ -1,91 +0,0 @@ -/** - * Copyright (c) 2016-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import - -@protocol IGListSupplementaryViewSource; -@protocol IGListDisplayDelegate; -@protocol IGListWorkingRangeDelegate; - -NS_ASSUME_NONNULL_BEGIN - -/** - Implement this protocol in order to be used within the `IGListKit` data infrastructure and be registered for use in an - `IGListAdapter`. An `IGListSectionType` conforming object represents a single instance of an object in a collection of - objects. - - The infrastructure uses each `IGListSectionType` conforming object as a "view model" to populate and control cells as - part of a section in a `UICollectionView`. `IGListSectionType` objects should be architected without knowledge of - "global" state of the list in which they are contained. - - Index paths are used as a convenience for communicating the section index to each section object without allowing each - section to mutate its own position within a list. The row of an index path can be directly mapped to a cell within - an `IGListSectionType` conforming object. - */ -@protocol IGListSectionType - -/** - Returns the number of items in the section. - - @return A count of items in the list. - - @note The count returned is used to drive the number of cells displayed for this list. You are free to change - this value between data loading passes. - */ -- (NSInteger)numberOfItems; - -/** - The specific size for the item at the specified index. - - @param index The row index of the item. - - @return The size for the item at index. - - @note The returned size is not garaunteed to be used. The implementation may query sections for their - layout information at will, or use its own layout metrics. For example, consider a dynamic-text sized list versus a fixed - height-and-width grid. The former will ask each section for a size, and the latter will likely not. - */ -- (CGSize)sizeForItemAtIndex:(NSInteger)index; - -/** - Asks the section controller for a fully configured cell at the specified index. - - @param index The index of the requested row. - - @return A configured `UICollectionViewCell` subclass. - - @note This is your opportunity to do any cell setup and configuration. The infrastructure requests a cell when it - will be used on screen. You should never allocate new cells in this method, instead use the provided adapter to call - `-dequeCellClass:forIndexPath:` which either deques a cell from the collection view or creates a new one for you. - */ -- (__kindof UICollectionViewCell *)cellForItemAtIndex:(NSInteger)index; - -/** - Tells the section that the controller was updated to a new object. - - @param object The object mapped to this section controller. - - @note When this method is called, all available contexts and configurations have been set for the section - controller. Also, depending on the updating strategy used, your item models may have changed objects in memory, so you - can use this event to update the object stored on your section controller. - - This method will only be called when the object instance has changed, including from `nil` or a previous object. - */ -- (void)didUpdateToObject:(id)object; - -/** - Tells the section that the cell at the specified index path was selected. - - @param index The index of the selected cell. - */ -- (void)didSelectItemAtIndex:(NSInteger)index; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Project 27 - Marslink/Pods/IGListKit/Source/Internal/IGListDisplayHandler.h b/Project 27 - Marslink/Pods/IGListKit/Source/Internal/IGListDisplayHandler.h deleted file mode 100644 index c27644c9..00000000 --- a/Project 27 - Marslink/Pods/IGListKit/Source/Internal/IGListDisplayHandler.h +++ /dev/null @@ -1,54 +0,0 @@ -/** - * Copyright (c) 2016-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import - -#import - -@class IGListAdapter; -@class IGListSectionController; - -@protocol IGListSectionType; - -NS_ASSUME_NONNULL_BEGIN - -IGLK_SUBCLASSING_RESTRICTED -@interface IGListDisplayHandler : NSObject - -/** - Tells the handler that a cell will be displayed in the IGListKit infra. - - @param cell A cell that will display. - @param listAdapter The adapter managing the infra. - @param sectionController The section controller the cell is in. - @param object The object associated with the section controller. - @param indexPath The index path of the cell in the UICollectionView. - */ -- (void)willDisplayCell:(UICollectionViewCell *)cell - forListAdapter:(IGListAdapter *)listAdapter - sectionController:(IGListSectionController *)sectionController - object:(id)object - indexPath:(NSIndexPath *)indexPath; - -/** - Tells the handler that a cell did end display in the IGListKit infra. - - @param cell A cell that did end display. - @param listAdapter The adapter managing the infra. - @param sectionController The section controller the cell is in. - @param indexPath The index path of the cell in the UICollectionView. - */ -- (void)didEndDisplayingCell:(UICollectionViewCell *)cell - forListAdapter:(IGListAdapter *)listAdapter - sectionController:(IGListSectionController *)sectionController - indexPath:(NSIndexPath *)indexPath; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Project 27 - Marslink/Pods/IGListKit/Source/Internal/IGListDisplayHandler.m b/Project 27 - Marslink/Pods/IGListKit/Source/Internal/IGListDisplayHandler.m deleted file mode 100644 index 6d106b61..00000000 --- a/Project 27 - Marslink/Pods/IGListKit/Source/Internal/IGListDisplayHandler.m +++ /dev/null @@ -1,86 +0,0 @@ -/** - * Copyright (c) 2016-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -#import "IGListDisplayHandler.h" - -#import -#import -#import -#import - -@interface IGListDisplayHandler () - -@property (nonatomic, strong) NSCountedSet *visibleListSections; -@property (nonatomic, strong) NSMapTable *visibleCellObjectMap; - -@end - -@implementation IGListDisplayHandler - -- (instancetype)init { - if (self = [super init]) { - _visibleListSections = [[NSCountedSet alloc] init]; - _visibleCellObjectMap = [[NSMapTable alloc] initWithKeyOptions:NSMapTableStrongMemory valueOptions:NSMapTableStrongMemory capacity:0]; - } - return self; -} - -- (void)willDisplayCell:(UICollectionViewCell *)cell - forListAdapter:(IGListAdapter *)listAdapter - sectionController:(IGListSectionController *)sectionController - object:(id)object - indexPath:(NSIndexPath *)indexPath { - IGParameterAssert(cell != nil); - IGParameterAssert(listAdapter != nil); - IGParameterAssert(object != nil); - IGParameterAssert(indexPath != nil); - - id displayDelegate = [sectionController displayDelegate]; - - [displayDelegate listAdapter:listAdapter willDisplaySectionController:sectionController cell:cell atIndex:indexPath.item]; - - [self.visibleCellObjectMap setObject:object forKey:cell]; - - if ([self.visibleListSections countForObject:sectionController] == 0) { - [displayDelegate listAdapter:listAdapter willDisplaySectionController:sectionController]; - [listAdapter.delegate listAdapter:listAdapter willDisplayObject:object atIndex:indexPath.section]; - } - [self.visibleListSections addObject:sectionController]; -} - -- (void)didEndDisplayingCell:(UICollectionViewCell *)cell - forListAdapter:(IGListAdapter *)listAdapter - sectionController:(IGListSectionController *)sectionController - indexPath:(NSIndexPath *)indexPath { - IGParameterAssert(cell != nil); - IGParameterAssert(listAdapter != nil); - IGParameterAssert(indexPath != nil); - - const NSUInteger section = indexPath.section; - - NSMapTable *cellObjectMap = self.visibleCellObjectMap; - id object = [cellObjectMap objectForKey:cell]; - [cellObjectMap removeObjectForKey:cell]; - - if (object == nil || sectionController == nil) { - return; - } - - id displayDelegate = [sectionController displayDelegate]; - [displayDelegate listAdapter:listAdapter didEndDisplayingSectionController:sectionController cell:cell atIndex:indexPath.item]; - - NSCountedSet *visibleSections = self.visibleListSections; - [visibleSections removeObject:sectionController]; - if ([visibleSections countForObject:sectionController] == 0) { - [displayDelegate listAdapter:listAdapter didEndDisplayingSectionController:sectionController]; - [listAdapter.delegate listAdapter:listAdapter didEndDisplayingObject:object atIndex:section]; - } -} - -@end diff --git a/Project 27 - Marslink/Pods/Local Podspecs/IGListKit.podspec.json b/Project 27 - Marslink/Pods/Local Podspecs/IGListKit.podspec.json deleted file mode 100644 index 9e6054f9..00000000 --- a/Project 27 - Marslink/Pods/Local Podspecs/IGListKit.podspec.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "IGListKit", - "version": "1.0.0", - "summary": "A data-driven UICollectionView framework.", - "homepage": "https://github.com/Instagram/IGListKit", - "documentation_url": "https://instagram.github.io/IGListKit", - "description": "A data-driven UICollectionView framework for building fast and flexible lists.", - "license": { - "type": "BSD" - }, - "authors": "Instagram", - "social_media_url": "https://twitter.com/fbOpenSource", - "source": { - "git": "https://github.com/Instagram/IGListKit.git", - "tag": "1.0.0", - "branch": "stable" - }, - "source_files": "Source/**/*.{h,m,mm}", - "private_header_files": "Source/Internal/*.h", - "requires_arc": true, - "platforms": { - "ios": "8.0", - "tvos": "9.0" - }, - "frameworks": "UIKit", - "libraries": "c++", - "pod_target_xcconfig": { - "CLANG_CXX_LANGUAGE_STANDARD": "c++11", - "CLANG_CXX_LIBRARY": "libc++" - } -} diff --git a/Project 27 - Marslink/Pods/Manifest.lock b/Project 27 - Marslink/Pods/Manifest.lock deleted file mode 100644 index 2a98a251..00000000 --- a/Project 27 - Marslink/Pods/Manifest.lock +++ /dev/null @@ -1,22 +0,0 @@ -PODS: - - IGListKit (1.0.0) - -DEPENDENCIES: - - IGListKit (from `https://github.com/Instagram/IGListKit.git`, branch `master`) - -EXTERNAL SOURCES: - IGListKit: - :branch: master - :git: https://github.com/Instagram/IGListKit.git - -CHECKOUT OPTIONS: - IGListKit: - :commit: e1d6f5255243cbf4c2f7d8e77e2ea1dd1f583dcf - :git: https://github.com/Instagram/IGListKit.git - -SPEC CHECKSUMS: - IGListKit: a534a917b574ec56697390ef182f125ccff2145b - -PODFILE CHECKSUM: 821e6140b55085368f6ab60db1c7d34ebfdca84d - -COCOAPODS: 1.1.1 diff --git a/Project 27 - Marslink/Pods/Pods.xcodeproj/project.pbxproj b/Project 27 - Marslink/Pods/Pods.xcodeproj/project.pbxproj deleted file mode 100644 index 4417b81a..00000000 --- a/Project 27 - Marslink/Pods/Pods.xcodeproj/project.pbxproj +++ /dev/null @@ -1,792 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 03D9F2C118B2F4721833FA5E2D8701F0 /* IGListIndexPathResult.m in Sources */ = {isa = PBXBuildFile; fileRef = B4E68E27BA4B1311FDFDAA88350E89F7 /* IGListIndexPathResult.m */; }; - 0F2F9C4A2CADD056A0ECABC67AA0C407 /* IGListWorkingRangeHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = 67B659A8339B67039D95205A5693490A /* IGListWorkingRangeHandler.h */; settings = {ATTRIBUTES = (Private, ); }; }; - 134326D1672305F8CE717DB323604C8C /* IGListIndexPathResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 0283ED2AE58381818109C11DC603CE8E /* IGListIndexPathResult.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 146A5A3963E321715014255CC6A73435 /* IGListGridCollectionViewLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = BE623E1EAF572054D3FBC8C7D12A1BFB /* IGListGridCollectionViewLayout.m */; }; - 17C50221A0A67A2851FD27B1D1C7D29D /* IGListAdapterUpdaterDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 78A3F4C18B522C14F01074D0B09930D2 /* IGListAdapterUpdaterDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1A4BF429109363AB21E514ACA86EE52B /* UICollectionView+IGListBatchUpdateData.h in Headers */ = {isa = PBXBuildFile; fileRef = 69A89EE9FDB10FDFFC6C88130E2CA6AA /* UICollectionView+IGListBatchUpdateData.h */; settings = {ATTRIBUTES = (Private, ); }; }; - 1DDDE9A5156100FB6A267F6BCC632C22 /* IGListAdapterUpdater.h in Headers */ = {isa = PBXBuildFile; fileRef = CB24E5F76A0DE0C0DDCE3D14A24C8F38 /* IGListAdapterUpdater.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 250C5284B31A0B4566A492B99F6B680A /* IGListSectionType.h in Headers */ = {isa = PBXBuildFile; fileRef = F92BCFFA9E94171CCA4EE34B7DA8B0FE /* IGListSectionType.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 25858F9C0BC4CC1C10DBED1300A7CE14 /* IGListBatchUpdateData.h in Headers */ = {isa = PBXBuildFile; fileRef = 1952F1F775260AA652E0F8498C3E3960 /* IGListBatchUpdateData.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 2E047E1A54807DE6F35EC3205BEF82F8 /* IGListMoveIndexPathInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = AFD681039861E66BA6161BCF26E0201B /* IGListMoveIndexPathInternal.h */; settings = {ATTRIBUTES = (Private, ); }; }; - 2E1A9095D891D1B7A2152ADF6D773401 /* Pods-Marslink-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B4AC447EBDD0F94086F6DA64FDEBFA9 /* Pods-Marslink-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 30B15D99A1F770C9423047B947CE3A0F /* IGListKit-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 13EC3DBF5A827288E0B10D554855E636 /* IGListKit-dummy.m */; }; - 3109138B22BB7B707A014D164C3856D0 /* IGListGridCollectionViewLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = 03CAC45C3B34E99EC6770EA154976A77 /* IGListGridCollectionViewLayout.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 37D1483A6785A27D9B1A6D89E4CA3C94 /* IGListIndexPathResultInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 41E46A9E1E2CA93B89C5BCD120469741 /* IGListIndexPathResultInternal.h */; settings = {ATTRIBUTES = (Private, ); }; }; - 3B6C2D70ECB9D76D26F923170C635C38 /* IGListMoveIndexPath.m in Sources */ = {isa = PBXBuildFile; fileRef = 4FE4CE7E1CB9C3C9D1040AFA4DCD40BF /* IGListMoveIndexPath.m */; }; - 4115551919DE9633F6395AF2F559DF20 /* IGListCollectionView.h in Headers */ = {isa = PBXBuildFile; fileRef = 36D9A21A8FE5DDA336F3714EB1A5DD1C /* IGListCollectionView.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 4633751C48C788283EF370A47FC9EAC8 /* IGListDiffable.h in Headers */ = {isa = PBXBuildFile; fileRef = 3FAC2777F302D5290C891C1FD77C330D /* IGListDiffable.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 47995A7CF19EADF3CDC1375E80AD7518 /* IGListSectionController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8B6C0E933C6838767ADAED3174292D20 /* IGListSectionController.m */; }; - 499990494C7F0D2AE64F6BDAFBB0DF17 /* IGListExperiments.h in Headers */ = {isa = PBXBuildFile; fileRef = F4E6F86849D59A1C7D49BC4AB5D8E78D /* IGListExperiments.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 4AE2202F38F2D7327DDF803E7B619DE4 /* IGListMoveIndexInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = B29960CFF7F3FD45D5A303FF7616CBCE /* IGListMoveIndexInternal.h */; settings = {ATTRIBUTES = (Private, ); }; }; - 4B173D112A82A3535655BCDF59ECF10D /* IGListSectionMap.m in Sources */ = {isa = PBXBuildFile; fileRef = 73C35ECA74E3FF591F5CB4156DEE9DE0 /* IGListSectionMap.m */; }; - 50FC67816EB0ABB18D2BDB997EDD818B /* Pods-Marslink-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = E599AAEA69FEBFA25C5FEF9AD99A7605 /* Pods-Marslink-dummy.m */; }; - 579BD7728557C6603907654E003D7F11 /* IGListAdapterUpdater.m in Sources */ = {isa = PBXBuildFile; fileRef = B9878F8A7AF627DBD9E1B97C27ECF9E7 /* IGListAdapterUpdater.m */; }; - 57FB00520639383E67755B91A0B34CB2 /* IGListMoveIndexPath.h in Headers */ = {isa = PBXBuildFile; fileRef = C31FDF10D5A92579A4B76A91741BAECA /* IGListMoveIndexPath.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 5CF27D82613DC819AA9890A35AD1E446 /* IGListMoveIndex.m in Sources */ = {isa = PBXBuildFile; fileRef = D891AFF8D765856D03643EAFF72135C8 /* IGListMoveIndex.m */; }; - 6B411132695738A97E803B0A19F26E40 /* IGListSupplementaryViewSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 9BDC49B1263CD327A86EF82BE5C6304A /* IGListSupplementaryViewSource.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 6B7A55180C34021A501B706B019626D0 /* IGListReloadDataUpdater.h in Headers */ = {isa = PBXBuildFile; fileRef = C294311E79E2AD0780BC4C92FE5E7FDB /* IGListReloadDataUpdater.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 6C4CFA0B5DACEBA7FCE5D4EF2503C61B /* IGListAdapterProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = 57E507501C4854EACDA0C71901D8B011 /* IGListAdapterProxy.m */; }; - 6D310F2EBE279C4BA58AC78ED4ACF8B2 /* IGListAdapterProxy.h in Headers */ = {isa = PBXBuildFile; fileRef = 391DFD0B663B68AD9B51CE7AC90B0609 /* IGListAdapterProxy.h */; settings = {ATTRIBUTES = (Private, ); }; }; - 6DC05DAED19A05B1B239D2FD588C4EF7 /* IGListStackedSectionController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8AC2C7F782D1CAF1BF584D50334C0547 /* IGListStackedSectionController.m */; }; - 6DF8205380DF1209208417DCB0BB933E /* IGListAdapterDataSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 1C3A48E1DB23E7D61B6AEC975CAC86F1 /* IGListAdapterDataSource.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 6E613C9AECE3F7789BFD9997CB9D29E0 /* IGListSingleSectionController.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A75B411EB44F9C1B9B029F78CBC8B73 /* IGListSingleSectionController.m */; }; - 6F68465FAC250F81F2F089218B2DE012 /* IGListAssert.h in Headers */ = {isa = PBXBuildFile; fileRef = F1F920F7B272A65E5055EF5A40BE6C2E /* IGListAssert.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 6FF62F7C7199C2012A0B17A3C6A9E7A5 /* NSNumber+IGListDiffable.m in Sources */ = {isa = PBXBuildFile; fileRef = F41AFC85EFBA76E2F8EF56781A21E8A6 /* NSNumber+IGListDiffable.m */; }; - 734BDA047AE790465776B5471E730C56 /* IGListDiff.h in Headers */ = {isa = PBXBuildFile; fileRef = 89D2BFD78EABA429A8A556A70AC97020 /* IGListDiff.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 83B6A64F2AD0FE5DF0CEE751EF8BF26D /* UICollectionView+IGListBatchUpdateData.m in Sources */ = {isa = PBXBuildFile; fileRef = 17ED9B0AC5FA436333F79096D5B50D62 /* UICollectionView+IGListBatchUpdateData.m */; }; - 84D87AFDF73634104EAFCB03A82CCA40 /* IGListAdapterUpdaterInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 553B01473C5F2AE284705069ED036177 /* IGListAdapterUpdaterInternal.h */; settings = {ATTRIBUTES = (Private, ); }; }; - 887E96BDA96118C5EBAAB3EA476B2A04 /* IGListStackedSectionControllerInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = BE0B916148ECB0CF2FF5A79BA47C08D5 /* IGListStackedSectionControllerInternal.h */; settings = {ATTRIBUTES = (Private, ); }; }; - 889AADC3C1BE1DD2704B08D219522B17 /* IGListStackedSectionController.h in Headers */ = {isa = PBXBuildFile; fileRef = 50C5A537F0D255B30E0AF0E35C801157 /* IGListStackedSectionController.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 8902BC0EBC7718A380A2F9319B5C206D /* IGListReloadDataUpdater.m in Sources */ = {isa = PBXBuildFile; fileRef = 87955A5EC7372E12FEF0BE13A1A8ADF8 /* IGListReloadDataUpdater.m */; }; - 8B694B75CFFA9D9E7DD05BB62DF81CCA /* IGListIndexSetResult.m in Sources */ = {isa = PBXBuildFile; fileRef = E9C0C61E5243F210603F5EAA594B4218 /* IGListIndexSetResult.m */; }; - 8C1D6B555F9936B7ADB6F70C4F297CCA /* IGListScrollDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 82400BEDF2E6A14799E9462FAA972529 /* IGListScrollDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 8DECCC3914EF1FB8F1376F7F0F22AA0D /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 616BEB51ECCAD129BDBCB7A956B56CC6 /* Foundation.framework */; }; - 9E0190CE92E119EE99BE24CE87B7F499 /* IGListAdapterInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 81025A61A6B4B9F3EC31A9C3F831B64A /* IGListAdapterInternal.h */; settings = {ATTRIBUTES = (Private, ); }; }; - A13ABBFDE8A390D9A7FE2D78C0552B57 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 616BEB51ECCAD129BDBCB7A956B56CC6 /* Foundation.framework */; }; - A37632320946CC05DC84449C0F23D7EF /* IGListKit-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 0B06DC0A895F1B67E26CB344F87EE8FA /* IGListKit-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - A3C63A19DD5D204FDF88C1C5B131DE8D /* IGListDisplayDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = ADC9B6F4C5BC2B38C33A9D8E99F622A4 /* IGListDisplayDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; }; - A430D44BF9642FA6C62D1B3212E3B7C9 /* IGListCollectionView.m in Sources */ = {isa = PBXBuildFile; fileRef = 72EC0BF2062566370B70831E63EC45B1 /* IGListCollectionView.m */; }; - AB09A5CB54F76BA01DC888E96C502BED /* IGListMacros.h in Headers */ = {isa = PBXBuildFile; fileRef = 5CA21A970A460585B2DAF13FB063A82E /* IGListMacros.h */; settings = {ATTRIBUTES = (Public, ); }; }; - ADC18B8A467A4390B130B91CD781004B /* IGListIndexSetResultInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = C8821ED62F7EE5D9593FE6E14F3A1A20 /* IGListIndexSetResultInternal.h */; settings = {ATTRIBUTES = (Private, ); }; }; - B0C558D8F5E70DB822D0BE9722A91631 /* IGListIndexSetResult.h in Headers */ = {isa = PBXBuildFile; fileRef = B891A5414369B55062DACF8465469423 /* IGListIndexSetResult.h */; settings = {ATTRIBUTES = (Public, ); }; }; - B20BF95AD2C7A6588DD3F031B8DC37C0 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7EC994CDC2D681BA26389F78A7E4B325 /* UIKit.framework */; }; - B85090D1B555D35C97EFC0192C741954 /* IGListKit.h in Headers */ = {isa = PBXBuildFile; fileRef = D0DCB4A6A523897D9E4BD8025D8FCA3C /* IGListKit.h */; settings = {ATTRIBUTES = (Public, ); }; }; - BB2D3FD9525FFCE2B59E769A35234736 /* IGListSingleSectionController.h in Headers */ = {isa = PBXBuildFile; fileRef = 69B9C2E5D8A5DBF6B82E605B352C5A07 /* IGListSingleSectionController.h */; settings = {ATTRIBUTES = (Public, ); }; }; - BE1EC29245521FAE05DB9EE2DC97E117 /* IGListSectionMap.h in Headers */ = {isa = PBXBuildFile; fileRef = 85709FB8D7CBE9798592E32CBD228B54 /* IGListSectionMap.h */; settings = {ATTRIBUTES = (Private, ); }; }; - C07BA9537D41D1EDDF54D2322DE869DD /* IGListWorkingRangeDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 41F6D05AE0DBC2EC20D9FA57C8843CBF /* IGListWorkingRangeDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; }; - CF55E9BF1332E1FD16AD14BA226932F0 /* IGListDisplayHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = B89EC7169E848E9D7E6CE8E3282B3934 /* IGListDisplayHandler.h */; settings = {ATTRIBUTES = (Private, ); }; }; - D227E8DC1846462A9B401C55E0726797 /* IGListBatchUpdateData.mm in Sources */ = {isa = PBXBuildFile; fileRef = 7FCE7C2877E7A799FC5253501B506420 /* IGListBatchUpdateData.mm */; }; - DB45328DFBC30368CA6D9820ADC17F53 /* IGListMoveIndex.h in Headers */ = {isa = PBXBuildFile; fileRef = 51844C3DE0280BB9DE8B77AD4311EBB8 /* IGListMoveIndex.h */; settings = {ATTRIBUTES = (Public, ); }; }; - DBB8430E46A7A61D6CED2D5D61C5691C /* IGListUpdatingDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = F1D7FE58FA4DC3BBE091CDA3247266DD /* IGListUpdatingDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; }; - DFE13DF5EBEAC559AE077E158C2A799F /* IGListAdapter.h in Headers */ = {isa = PBXBuildFile; fileRef = D5EC908741F593B60B541F7254011929 /* IGListAdapter.h */; settings = {ATTRIBUTES = (Public, ); }; }; - E3B54773F37740D5C110BC911795DAD1 /* IGListCollectionContext.h in Headers */ = {isa = PBXBuildFile; fileRef = 001305F4755521F2EE0D06E95FB61AC0 /* IGListCollectionContext.h */; settings = {ATTRIBUTES = (Public, ); }; }; - E8421FCAB6BACB2BA1AA9025BE1CA2F3 /* IGListSectionController.h in Headers */ = {isa = PBXBuildFile; fileRef = 38261DEBA656254745FF3218B5B359D1 /* IGListSectionController.h */; settings = {ATTRIBUTES = (Public, ); }; }; - ECB644F35F962A905C599DFA812700BB /* NSString+IGListDiffable.m in Sources */ = {isa = PBXBuildFile; fileRef = 06094DC46A1FAB55ADAF9488F712D72F /* NSString+IGListDiffable.m */; }; - ED10986E509116BF0EDF4F0E856BBD77 /* NSString+IGListDiffable.h in Headers */ = {isa = PBXBuildFile; fileRef = CE3051EFE57DE55D1CD14CD9B2301284 /* NSString+IGListDiffable.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F379E86C71333ED9A2F4F7FE8031A9AD /* IGListDiff.mm in Sources */ = {isa = PBXBuildFile; fileRef = B62CADD0B43ADBC7AD7B8262E2E2513B /* IGListDiff.mm */; }; - F429AB7A46487150BA17772E7188B0B8 /* IGListDisplayHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 915284B92DE6D71034D596F2A888CB63 /* IGListDisplayHandler.m */; }; - F81DAB84FE444B48DDB0A40E5AD3BA8D /* IGListWorkingRangeHandler.mm in Sources */ = {isa = PBXBuildFile; fileRef = 84F95C2EC803C5F103B34671771978AD /* IGListWorkingRangeHandler.mm */; }; - F9957117341A7CB7E40D52944B35E7FF /* IGListAdapter.m in Sources */ = {isa = PBXBuildFile; fileRef = 32BBB2EC5B0BD25F328051CE34F6E095 /* IGListAdapter.m */; }; - FB582A36D43F2B261A98E9604577D61D /* IGListSectionControllerInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 7796C7118B593DC1A9EC669113FDC010 /* IGListSectionControllerInternal.h */; settings = {ATTRIBUTES = (Private, ); }; }; - FE82A383E657A54615930390153D539D /* IGListAdapterDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = D8D89983F9E49FD9BAFD29FD312980BD /* IGListAdapterDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; }; - FF9C95C6B13B9EE21B4436107FCBC8B9 /* NSNumber+IGListDiffable.h in Headers */ = {isa = PBXBuildFile; fileRef = FCA3E9DE5266D3173A94CE27549A4FEA /* NSNumber+IGListDiffable.h */; settings = {ATTRIBUTES = (Public, ); }; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 59532D90F56EEAE0E93CFCD365BB2E24 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; - proxyType = 1; - remoteGlobalIDString = 9D781EB30AA915DF5F4DD7F2BB2A2CA3; - remoteInfo = IGListKit; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXFileReference section */ - 001305F4755521F2EE0D06E95FB61AC0 /* IGListCollectionContext.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListCollectionContext.h; path = Source/IGListCollectionContext.h; sourceTree = ""; }; - 0283ED2AE58381818109C11DC603CE8E /* IGListIndexPathResult.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListIndexPathResult.h; path = Source/IGListIndexPathResult.h; sourceTree = ""; }; - 03CAC45C3B34E99EC6770EA154976A77 /* IGListGridCollectionViewLayout.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListGridCollectionViewLayout.h; path = Source/IGListGridCollectionViewLayout.h; sourceTree = ""; }; - 06094DC46A1FAB55ADAF9488F712D72F /* NSString+IGListDiffable.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSString+IGListDiffable.m"; path = "Source/NSString+IGListDiffable.m"; sourceTree = ""; }; - 0B06DC0A895F1B67E26CB344F87EE8FA /* IGListKit-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "IGListKit-umbrella.h"; sourceTree = ""; }; - 13EC3DBF5A827288E0B10D554855E636 /* IGListKit-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "IGListKit-dummy.m"; sourceTree = ""; }; - 17ED9B0AC5FA436333F79096D5B50D62 /* UICollectionView+IGListBatchUpdateData.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UICollectionView+IGListBatchUpdateData.m"; path = "Source/Internal/UICollectionView+IGListBatchUpdateData.m"; sourceTree = ""; }; - 1952F1F775260AA652E0F8498C3E3960 /* IGListBatchUpdateData.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListBatchUpdateData.h; path = Source/IGListBatchUpdateData.h; sourceTree = ""; }; - 1ACDE2E96AAFD4AEB0BBC077C7AE0987 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 1C3A48E1DB23E7D61B6AEC975CAC86F1 /* IGListAdapterDataSource.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListAdapterDataSource.h; path = Source/IGListAdapterDataSource.h; sourceTree = ""; }; - 1EDA8350F812A94F669D9978C44326D3 /* Pods-Marslink-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-Marslink-resources.sh"; sourceTree = ""; }; - 27FD2BC30D3F440534414FAACE9C2FDB /* Pods-Marslink.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-Marslink.release.xcconfig"; sourceTree = ""; }; - 28E49C8D5658A50DD4D2231E8A4A5482 /* IGListKit.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = IGListKit.modulemap; sourceTree = ""; }; - 28F33D3838585CAFDDE96D89CA7CE2F7 /* Pods-Marslink.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = "Pods-Marslink.modulemap"; sourceTree = ""; }; - 2A75B411EB44F9C1B9B029F78CBC8B73 /* IGListSingleSectionController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IGListSingleSectionController.m; path = Source/IGListSingleSectionController.m; sourceTree = ""; }; - 32320C9EBC24A2C6FD71B501B4D9993C /* Pods_Marslink.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_Marslink.framework; path = "Pods-Marslink.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; - 32BBB2EC5B0BD25F328051CE34F6E095 /* IGListAdapter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IGListAdapter.m; path = Source/IGListAdapter.m; sourceTree = ""; }; - 36D9A21A8FE5DDA336F3714EB1A5DD1C /* IGListCollectionView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListCollectionView.h; path = Source/IGListCollectionView.h; sourceTree = ""; }; - 38261DEBA656254745FF3218B5B359D1 /* IGListSectionController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListSectionController.h; path = Source/IGListSectionController.h; sourceTree = ""; }; - 391DFD0B663B68AD9B51CE7AC90B0609 /* IGListAdapterProxy.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListAdapterProxy.h; path = Source/Internal/IGListAdapterProxy.h; sourceTree = ""; }; - 3FAC2777F302D5290C891C1FD77C330D /* IGListDiffable.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListDiffable.h; path = Source/IGListDiffable.h; sourceTree = ""; }; - 41E46A9E1E2CA93B89C5BCD120469741 /* IGListIndexPathResultInternal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListIndexPathResultInternal.h; path = Source/Internal/IGListIndexPathResultInternal.h; sourceTree = ""; }; - 41F6D05AE0DBC2EC20D9FA57C8843CBF /* IGListWorkingRangeDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListWorkingRangeDelegate.h; path = Source/IGListWorkingRangeDelegate.h; sourceTree = ""; }; - 4533F285742D2BD64FEBEF2BDDC07D51 /* IGListKit.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = IGListKit.xcconfig; sourceTree = ""; }; - 4B4AC447EBDD0F94086F6DA64FDEBFA9 /* Pods-Marslink-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-Marslink-umbrella.h"; sourceTree = ""; }; - 4FE4CE7E1CB9C3C9D1040AFA4DCD40BF /* IGListMoveIndexPath.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IGListMoveIndexPath.m; path = Source/IGListMoveIndexPath.m; sourceTree = ""; }; - 50C5A537F0D255B30E0AF0E35C801157 /* IGListStackedSectionController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListStackedSectionController.h; path = Source/IGListStackedSectionController.h; sourceTree = ""; }; - 51844C3DE0280BB9DE8B77AD4311EBB8 /* IGListMoveIndex.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListMoveIndex.h; path = Source/IGListMoveIndex.h; sourceTree = ""; }; - 53B18A22D4D1B00B5075DE18C94F8CE9 /* Pods-Marslink-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-Marslink-acknowledgements.plist"; sourceTree = ""; }; - 553B01473C5F2AE284705069ED036177 /* IGListAdapterUpdaterInternal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListAdapterUpdaterInternal.h; path = Source/Internal/IGListAdapterUpdaterInternal.h; sourceTree = ""; }; - 57E507501C4854EACDA0C71901D8B011 /* IGListAdapterProxy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IGListAdapterProxy.m; path = Source/Internal/IGListAdapterProxy.m; sourceTree = ""; }; - 5CA21A970A460585B2DAF13FB063A82E /* IGListMacros.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListMacros.h; path = Source/IGListMacros.h; sourceTree = ""; }; - 616BEB51ECCAD129BDBCB7A956B56CC6 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; - 67B659A8339B67039D95205A5693490A /* IGListWorkingRangeHandler.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListWorkingRangeHandler.h; path = Source/Internal/IGListWorkingRangeHandler.h; sourceTree = ""; }; - 68FC02CCEDD430A6EDCDAEAAAAE0D352 /* IGListKit-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "IGListKit-prefix.pch"; sourceTree = ""; }; - 69A89EE9FDB10FDFFC6C88130E2CA6AA /* UICollectionView+IGListBatchUpdateData.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UICollectionView+IGListBatchUpdateData.h"; path = "Source/Internal/UICollectionView+IGListBatchUpdateData.h"; sourceTree = ""; }; - 69B9C2E5D8A5DBF6B82E605B352C5A07 /* IGListSingleSectionController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListSingleSectionController.h; path = Source/IGListSingleSectionController.h; sourceTree = ""; }; - 72EC0BF2062566370B70831E63EC45B1 /* IGListCollectionView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IGListCollectionView.m; path = Source/IGListCollectionView.m; sourceTree = ""; }; - 73C35ECA74E3FF591F5CB4156DEE9DE0 /* IGListSectionMap.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IGListSectionMap.m; path = Source/Internal/IGListSectionMap.m; sourceTree = ""; }; - 7796C7118B593DC1A9EC669113FDC010 /* IGListSectionControllerInternal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListSectionControllerInternal.h; path = Source/Internal/IGListSectionControllerInternal.h; sourceTree = ""; }; - 78A3F4C18B522C14F01074D0B09930D2 /* IGListAdapterUpdaterDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListAdapterUpdaterDelegate.h; path = Source/IGListAdapterUpdaterDelegate.h; sourceTree = ""; }; - 7EC994CDC2D681BA26389F78A7E4B325 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.0.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; }; - 7FCE7C2877E7A799FC5253501B506420 /* IGListBatchUpdateData.mm */ = {isa = PBXFileReference; includeInIndex = 1; name = IGListBatchUpdateData.mm; path = Source/IGListBatchUpdateData.mm; sourceTree = ""; }; - 81025A61A6B4B9F3EC31A9C3F831B64A /* IGListAdapterInternal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListAdapterInternal.h; path = Source/Internal/IGListAdapterInternal.h; sourceTree = ""; }; - 82400BEDF2E6A14799E9462FAA972529 /* IGListScrollDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListScrollDelegate.h; path = Source/IGListScrollDelegate.h; sourceTree = ""; }; - 84F95C2EC803C5F103B34671771978AD /* IGListWorkingRangeHandler.mm */ = {isa = PBXFileReference; includeInIndex = 1; name = IGListWorkingRangeHandler.mm; path = Source/Internal/IGListWorkingRangeHandler.mm; sourceTree = ""; }; - 85709FB8D7CBE9798592E32CBD228B54 /* IGListSectionMap.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListSectionMap.h; path = Source/Internal/IGListSectionMap.h; sourceTree = ""; }; - 87955A5EC7372E12FEF0BE13A1A8ADF8 /* IGListReloadDataUpdater.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IGListReloadDataUpdater.m; path = Source/IGListReloadDataUpdater.m; sourceTree = ""; }; - 89D2BFD78EABA429A8A556A70AC97020 /* IGListDiff.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListDiff.h; path = Source/IGListDiff.h; sourceTree = ""; }; - 8AC2C7F782D1CAF1BF584D50334C0547 /* IGListStackedSectionController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IGListStackedSectionController.m; path = Source/IGListStackedSectionController.m; sourceTree = ""; }; - 8B6C0E933C6838767ADAED3174292D20 /* IGListSectionController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IGListSectionController.m; path = Source/IGListSectionController.m; sourceTree = ""; }; - 915284B92DE6D71034D596F2A888CB63 /* IGListDisplayHandler.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IGListDisplayHandler.m; path = Source/Internal/IGListDisplayHandler.m; sourceTree = ""; }; - 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; - 98418E39B77A14D7AA027C0F514B3543 /* Pods-Marslink.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-Marslink.debug.xcconfig"; sourceTree = ""; }; - 9BDC49B1263CD327A86EF82BE5C6304A /* IGListSupplementaryViewSource.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListSupplementaryViewSource.h; path = Source/IGListSupplementaryViewSource.h; sourceTree = ""; }; - ADC9B6F4C5BC2B38C33A9D8E99F622A4 /* IGListDisplayDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListDisplayDelegate.h; path = Source/IGListDisplayDelegate.h; sourceTree = ""; }; - AFD681039861E66BA6161BCF26E0201B /* IGListMoveIndexPathInternal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListMoveIndexPathInternal.h; path = Source/Internal/IGListMoveIndexPathInternal.h; sourceTree = ""; }; - B29960CFF7F3FD45D5A303FF7616CBCE /* IGListMoveIndexInternal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListMoveIndexInternal.h; path = Source/Internal/IGListMoveIndexInternal.h; sourceTree = ""; }; - B4E68E27BA4B1311FDFDAA88350E89F7 /* IGListIndexPathResult.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IGListIndexPathResult.m; path = Source/IGListIndexPathResult.m; sourceTree = ""; }; - B62CADD0B43ADBC7AD7B8262E2E2513B /* IGListDiff.mm */ = {isa = PBXFileReference; includeInIndex = 1; name = IGListDiff.mm; path = Source/IGListDiff.mm; sourceTree = ""; }; - B891A5414369B55062DACF8465469423 /* IGListIndexSetResult.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListIndexSetResult.h; path = Source/IGListIndexSetResult.h; sourceTree = ""; }; - B89EC7169E848E9D7E6CE8E3282B3934 /* IGListDisplayHandler.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListDisplayHandler.h; path = Source/Internal/IGListDisplayHandler.h; sourceTree = ""; }; - B9878F8A7AF627DBD9E1B97C27ECF9E7 /* IGListAdapterUpdater.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IGListAdapterUpdater.m; path = Source/IGListAdapterUpdater.m; sourceTree = ""; }; - BE0B916148ECB0CF2FF5A79BA47C08D5 /* IGListStackedSectionControllerInternal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListStackedSectionControllerInternal.h; path = Source/Internal/IGListStackedSectionControllerInternal.h; sourceTree = ""; }; - BE623E1EAF572054D3FBC8C7D12A1BFB /* IGListGridCollectionViewLayout.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IGListGridCollectionViewLayout.m; path = Source/IGListGridCollectionViewLayout.m; sourceTree = ""; }; - C06B0AE941A11A3ECE36C27A3009FCC6 /* IGListKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = IGListKit.framework; path = IGListKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - C294311E79E2AD0780BC4C92FE5E7FDB /* IGListReloadDataUpdater.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListReloadDataUpdater.h; path = Source/IGListReloadDataUpdater.h; sourceTree = ""; }; - C31FDF10D5A92579A4B76A91741BAECA /* IGListMoveIndexPath.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListMoveIndexPath.h; path = Source/IGListMoveIndexPath.h; sourceTree = ""; }; - C572296ED32AD6D1F0EE7C2F77F78E55 /* Pods-Marslink-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-Marslink-acknowledgements.markdown"; sourceTree = ""; }; - C8821ED62F7EE5D9593FE6E14F3A1A20 /* IGListIndexSetResultInternal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListIndexSetResultInternal.h; path = Source/Internal/IGListIndexSetResultInternal.h; sourceTree = ""; }; - CB24E5F76A0DE0C0DDCE3D14A24C8F38 /* IGListAdapterUpdater.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListAdapterUpdater.h; path = Source/IGListAdapterUpdater.h; sourceTree = ""; }; - CE3051EFE57DE55D1CD14CD9B2301284 /* NSString+IGListDiffable.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSString+IGListDiffable.h"; path = "Source/NSString+IGListDiffable.h"; sourceTree = ""; }; - D0DCB4A6A523897D9E4BD8025D8FCA3C /* IGListKit.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListKit.h; path = Source/IGListKit.h; sourceTree = ""; }; - D5EC908741F593B60B541F7254011929 /* IGListAdapter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListAdapter.h; path = Source/IGListAdapter.h; sourceTree = ""; }; - D891AFF8D765856D03643EAFF72135C8 /* IGListMoveIndex.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IGListMoveIndex.m; path = Source/IGListMoveIndex.m; sourceTree = ""; }; - D8D89983F9E49FD9BAFD29FD312980BD /* IGListAdapterDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListAdapterDelegate.h; path = Source/IGListAdapterDelegate.h; sourceTree = ""; }; - E599AAEA69FEBFA25C5FEF9AD99A7605 /* Pods-Marslink-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-Marslink-dummy.m"; sourceTree = ""; }; - E9C0C61E5243F210603F5EAA594B4218 /* IGListIndexSetResult.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IGListIndexSetResult.m; path = Source/IGListIndexSetResult.m; sourceTree = ""; }; - F1D7FE58FA4DC3BBE091CDA3247266DD /* IGListUpdatingDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListUpdatingDelegate.h; path = Source/IGListUpdatingDelegate.h; sourceTree = ""; }; - F1F920F7B272A65E5055EF5A40BE6C2E /* IGListAssert.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListAssert.h; path = Source/IGListAssert.h; sourceTree = ""; }; - F41AFC85EFBA76E2F8EF56781A21E8A6 /* NSNumber+IGListDiffable.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSNumber+IGListDiffable.m"; path = "Source/NSNumber+IGListDiffable.m"; sourceTree = ""; }; - F4E6F86849D59A1C7D49BC4AB5D8E78D /* IGListExperiments.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListExperiments.h; path = Source/IGListExperiments.h; sourceTree = ""; }; - F80775F063B7393917604814738DE407 /* Pods-Marslink-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-Marslink-frameworks.sh"; sourceTree = ""; }; - F92BCFFA9E94171CCA4EE34B7DA8B0FE /* IGListSectionType.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListSectionType.h; path = Source/IGListSectionType.h; sourceTree = ""; }; - FCA3E9DE5266D3173A94CE27549A4FEA /* NSNumber+IGListDiffable.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSNumber+IGListDiffable.h"; path = "Source/NSNumber+IGListDiffable.h"; sourceTree = ""; }; - FDEF1620A79B599F0641410B72EC516A /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 9338C194129560BC7B655B7D5DC4AC48 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - A13ABBFDE8A390D9A7FE2D78C0552B57 /* Foundation.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - E740BDF0F8326DA093D94B70B8370630 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 8DECCC3914EF1FB8F1376F7F0F22AA0D /* Foundation.framework in Frameworks */, - B20BF95AD2C7A6588DD3F031B8DC37C0 /* UIKit.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 399F245F0F8E3C07D784C049CDFEBA59 /* Pods */ = { - isa = PBXGroup; - children = ( - D39488910188E7F7BC9E2307B1A85ADD /* IGListKit */, - ); - name = Pods; - sourceTree = ""; - }; - 3D8944B1E721B6810E915ADA3FCB120A /* Targets Support Files */ = { - isa = PBXGroup; - children = ( - D53C972E79F3791525BB4F3CFD7C802A /* Pods-Marslink */, - ); - name = "Targets Support Files"; - sourceTree = ""; - }; - 433CD3331B6C3787F473C941B61FC68F /* Frameworks */ = { - isa = PBXGroup; - children = ( - E6EE98446B568159EE277B68FD442AF0 /* iOS */, - ); - name = Frameworks; - sourceTree = ""; - }; - 4F421F378E3F13D95C172DD34D445C82 /* Support Files */ = { - isa = PBXGroup; - children = ( - 28E49C8D5658A50DD4D2231E8A4A5482 /* IGListKit.modulemap */, - 4533F285742D2BD64FEBEF2BDDC07D51 /* IGListKit.xcconfig */, - 13EC3DBF5A827288E0B10D554855E636 /* IGListKit-dummy.m */, - 68FC02CCEDD430A6EDCDAEAAAAE0D352 /* IGListKit-prefix.pch */, - 0B06DC0A895F1B67E26CB344F87EE8FA /* IGListKit-umbrella.h */, - 1ACDE2E96AAFD4AEB0BBC077C7AE0987 /* Info.plist */, - ); - name = "Support Files"; - path = "../Target Support Files/IGListKit"; - sourceTree = ""; - }; - 745608014D91D678A712F9BC8FF4C484 /* Products */ = { - isa = PBXGroup; - children = ( - C06B0AE941A11A3ECE36C27A3009FCC6 /* IGListKit.framework */, - 32320C9EBC24A2C6FD71B501B4D9993C /* Pods_Marslink.framework */, - ); - name = Products; - sourceTree = ""; - }; - 7DB346D0F39D3F0E887471402A8071AB = { - isa = PBXGroup; - children = ( - 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */, - 433CD3331B6C3787F473C941B61FC68F /* Frameworks */, - 399F245F0F8E3C07D784C049CDFEBA59 /* Pods */, - 745608014D91D678A712F9BC8FF4C484 /* Products */, - 3D8944B1E721B6810E915ADA3FCB120A /* Targets Support Files */, - ); - sourceTree = ""; - }; - D39488910188E7F7BC9E2307B1A85ADD /* IGListKit */ = { - isa = PBXGroup; - children = ( - D5EC908741F593B60B541F7254011929 /* IGListAdapter.h */, - 32BBB2EC5B0BD25F328051CE34F6E095 /* IGListAdapter.m */, - 1C3A48E1DB23E7D61B6AEC975CAC86F1 /* IGListAdapterDataSource.h */, - D8D89983F9E49FD9BAFD29FD312980BD /* IGListAdapterDelegate.h */, - 81025A61A6B4B9F3EC31A9C3F831B64A /* IGListAdapterInternal.h */, - 391DFD0B663B68AD9B51CE7AC90B0609 /* IGListAdapterProxy.h */, - 57E507501C4854EACDA0C71901D8B011 /* IGListAdapterProxy.m */, - CB24E5F76A0DE0C0DDCE3D14A24C8F38 /* IGListAdapterUpdater.h */, - B9878F8A7AF627DBD9E1B97C27ECF9E7 /* IGListAdapterUpdater.m */, - 78A3F4C18B522C14F01074D0B09930D2 /* IGListAdapterUpdaterDelegate.h */, - 553B01473C5F2AE284705069ED036177 /* IGListAdapterUpdaterInternal.h */, - F1F920F7B272A65E5055EF5A40BE6C2E /* IGListAssert.h */, - 1952F1F775260AA652E0F8498C3E3960 /* IGListBatchUpdateData.h */, - 7FCE7C2877E7A799FC5253501B506420 /* IGListBatchUpdateData.mm */, - 001305F4755521F2EE0D06E95FB61AC0 /* IGListCollectionContext.h */, - 36D9A21A8FE5DDA336F3714EB1A5DD1C /* IGListCollectionView.h */, - 72EC0BF2062566370B70831E63EC45B1 /* IGListCollectionView.m */, - 89D2BFD78EABA429A8A556A70AC97020 /* IGListDiff.h */, - B62CADD0B43ADBC7AD7B8262E2E2513B /* IGListDiff.mm */, - 3FAC2777F302D5290C891C1FD77C330D /* IGListDiffable.h */, - ADC9B6F4C5BC2B38C33A9D8E99F622A4 /* IGListDisplayDelegate.h */, - B89EC7169E848E9D7E6CE8E3282B3934 /* IGListDisplayHandler.h */, - 915284B92DE6D71034D596F2A888CB63 /* IGListDisplayHandler.m */, - F4E6F86849D59A1C7D49BC4AB5D8E78D /* IGListExperiments.h */, - 03CAC45C3B34E99EC6770EA154976A77 /* IGListGridCollectionViewLayout.h */, - BE623E1EAF572054D3FBC8C7D12A1BFB /* IGListGridCollectionViewLayout.m */, - 0283ED2AE58381818109C11DC603CE8E /* IGListIndexPathResult.h */, - B4E68E27BA4B1311FDFDAA88350E89F7 /* IGListIndexPathResult.m */, - 41E46A9E1E2CA93B89C5BCD120469741 /* IGListIndexPathResultInternal.h */, - B891A5414369B55062DACF8465469423 /* IGListIndexSetResult.h */, - E9C0C61E5243F210603F5EAA594B4218 /* IGListIndexSetResult.m */, - C8821ED62F7EE5D9593FE6E14F3A1A20 /* IGListIndexSetResultInternal.h */, - D0DCB4A6A523897D9E4BD8025D8FCA3C /* IGListKit.h */, - 5CA21A970A460585B2DAF13FB063A82E /* IGListMacros.h */, - 51844C3DE0280BB9DE8B77AD4311EBB8 /* IGListMoveIndex.h */, - D891AFF8D765856D03643EAFF72135C8 /* IGListMoveIndex.m */, - B29960CFF7F3FD45D5A303FF7616CBCE /* IGListMoveIndexInternal.h */, - C31FDF10D5A92579A4B76A91741BAECA /* IGListMoveIndexPath.h */, - 4FE4CE7E1CB9C3C9D1040AFA4DCD40BF /* IGListMoveIndexPath.m */, - AFD681039861E66BA6161BCF26E0201B /* IGListMoveIndexPathInternal.h */, - C294311E79E2AD0780BC4C92FE5E7FDB /* IGListReloadDataUpdater.h */, - 87955A5EC7372E12FEF0BE13A1A8ADF8 /* IGListReloadDataUpdater.m */, - 82400BEDF2E6A14799E9462FAA972529 /* IGListScrollDelegate.h */, - 38261DEBA656254745FF3218B5B359D1 /* IGListSectionController.h */, - 8B6C0E933C6838767ADAED3174292D20 /* IGListSectionController.m */, - 7796C7118B593DC1A9EC669113FDC010 /* IGListSectionControllerInternal.h */, - 85709FB8D7CBE9798592E32CBD228B54 /* IGListSectionMap.h */, - 73C35ECA74E3FF591F5CB4156DEE9DE0 /* IGListSectionMap.m */, - F92BCFFA9E94171CCA4EE34B7DA8B0FE /* IGListSectionType.h */, - 69B9C2E5D8A5DBF6B82E605B352C5A07 /* IGListSingleSectionController.h */, - 2A75B411EB44F9C1B9B029F78CBC8B73 /* IGListSingleSectionController.m */, - 50C5A537F0D255B30E0AF0E35C801157 /* IGListStackedSectionController.h */, - 8AC2C7F782D1CAF1BF584D50334C0547 /* IGListStackedSectionController.m */, - BE0B916148ECB0CF2FF5A79BA47C08D5 /* IGListStackedSectionControllerInternal.h */, - 9BDC49B1263CD327A86EF82BE5C6304A /* IGListSupplementaryViewSource.h */, - F1D7FE58FA4DC3BBE091CDA3247266DD /* IGListUpdatingDelegate.h */, - 41F6D05AE0DBC2EC20D9FA57C8843CBF /* IGListWorkingRangeDelegate.h */, - 67B659A8339B67039D95205A5693490A /* IGListWorkingRangeHandler.h */, - 84F95C2EC803C5F103B34671771978AD /* IGListWorkingRangeHandler.mm */, - FCA3E9DE5266D3173A94CE27549A4FEA /* NSNumber+IGListDiffable.h */, - F41AFC85EFBA76E2F8EF56781A21E8A6 /* NSNumber+IGListDiffable.m */, - CE3051EFE57DE55D1CD14CD9B2301284 /* NSString+IGListDiffable.h */, - 06094DC46A1FAB55ADAF9488F712D72F /* NSString+IGListDiffable.m */, - 69A89EE9FDB10FDFFC6C88130E2CA6AA /* UICollectionView+IGListBatchUpdateData.h */, - 17ED9B0AC5FA436333F79096D5B50D62 /* UICollectionView+IGListBatchUpdateData.m */, - 4F421F378E3F13D95C172DD34D445C82 /* Support Files */, - ); - name = IGListKit; - path = IGListKit; - sourceTree = ""; - }; - D53C972E79F3791525BB4F3CFD7C802A /* Pods-Marslink */ = { - isa = PBXGroup; - children = ( - FDEF1620A79B599F0641410B72EC516A /* Info.plist */, - 28F33D3838585CAFDDE96D89CA7CE2F7 /* Pods-Marslink.modulemap */, - C572296ED32AD6D1F0EE7C2F77F78E55 /* Pods-Marslink-acknowledgements.markdown */, - 53B18A22D4D1B00B5075DE18C94F8CE9 /* Pods-Marslink-acknowledgements.plist */, - E599AAEA69FEBFA25C5FEF9AD99A7605 /* Pods-Marslink-dummy.m */, - F80775F063B7393917604814738DE407 /* Pods-Marslink-frameworks.sh */, - 1EDA8350F812A94F669D9978C44326D3 /* Pods-Marslink-resources.sh */, - 4B4AC447EBDD0F94086F6DA64FDEBFA9 /* Pods-Marslink-umbrella.h */, - 98418E39B77A14D7AA027C0F514B3543 /* Pods-Marslink.debug.xcconfig */, - 27FD2BC30D3F440534414FAACE9C2FDB /* Pods-Marslink.release.xcconfig */, - ); - name = "Pods-Marslink"; - path = "Target Support Files/Pods-Marslink"; - sourceTree = ""; - }; - E6EE98446B568159EE277B68FD442AF0 /* iOS */ = { - isa = PBXGroup; - children = ( - 616BEB51ECCAD129BDBCB7A956B56CC6 /* Foundation.framework */, - 7EC994CDC2D681BA26389F78A7E4B325 /* UIKit.framework */, - ); - name = iOS; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXHeadersBuildPhase section */ - 16FAA228DE47900020B37AB606A11912 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 2E1A9095D891D1B7A2152ADF6D773401 /* Pods-Marslink-umbrella.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 4A0E575F5BB81B96717488A132729513 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - DFE13DF5EBEAC559AE077E158C2A799F /* IGListAdapter.h in Headers */, - 6DF8205380DF1209208417DCB0BB933E /* IGListAdapterDataSource.h in Headers */, - FE82A383E657A54615930390153D539D /* IGListAdapterDelegate.h in Headers */, - 9E0190CE92E119EE99BE24CE87B7F499 /* IGListAdapterInternal.h in Headers */, - 6D310F2EBE279C4BA58AC78ED4ACF8B2 /* IGListAdapterProxy.h in Headers */, - 1DDDE9A5156100FB6A267F6BCC632C22 /* IGListAdapterUpdater.h in Headers */, - 17C50221A0A67A2851FD27B1D1C7D29D /* IGListAdapterUpdaterDelegate.h in Headers */, - 84D87AFDF73634104EAFCB03A82CCA40 /* IGListAdapterUpdaterInternal.h in Headers */, - 6F68465FAC250F81F2F089218B2DE012 /* IGListAssert.h in Headers */, - 25858F9C0BC4CC1C10DBED1300A7CE14 /* IGListBatchUpdateData.h in Headers */, - E3B54773F37740D5C110BC911795DAD1 /* IGListCollectionContext.h in Headers */, - 4115551919DE9633F6395AF2F559DF20 /* IGListCollectionView.h in Headers */, - 734BDA047AE790465776B5471E730C56 /* IGListDiff.h in Headers */, - 4633751C48C788283EF370A47FC9EAC8 /* IGListDiffable.h in Headers */, - A3C63A19DD5D204FDF88C1C5B131DE8D /* IGListDisplayDelegate.h in Headers */, - CF55E9BF1332E1FD16AD14BA226932F0 /* IGListDisplayHandler.h in Headers */, - 499990494C7F0D2AE64F6BDAFBB0DF17 /* IGListExperiments.h in Headers */, - 3109138B22BB7B707A014D164C3856D0 /* IGListGridCollectionViewLayout.h in Headers */, - 134326D1672305F8CE717DB323604C8C /* IGListIndexPathResult.h in Headers */, - 37D1483A6785A27D9B1A6D89E4CA3C94 /* IGListIndexPathResultInternal.h in Headers */, - B0C558D8F5E70DB822D0BE9722A91631 /* IGListIndexSetResult.h in Headers */, - ADC18B8A467A4390B130B91CD781004B /* IGListIndexSetResultInternal.h in Headers */, - A37632320946CC05DC84449C0F23D7EF /* IGListKit-umbrella.h in Headers */, - B85090D1B555D35C97EFC0192C741954 /* IGListKit.h in Headers */, - AB09A5CB54F76BA01DC888E96C502BED /* IGListMacros.h in Headers */, - DB45328DFBC30368CA6D9820ADC17F53 /* IGListMoveIndex.h in Headers */, - 4AE2202F38F2D7327DDF803E7B619DE4 /* IGListMoveIndexInternal.h in Headers */, - 57FB00520639383E67755B91A0B34CB2 /* IGListMoveIndexPath.h in Headers */, - 2E047E1A54807DE6F35EC3205BEF82F8 /* IGListMoveIndexPathInternal.h in Headers */, - 6B7A55180C34021A501B706B019626D0 /* IGListReloadDataUpdater.h in Headers */, - 8C1D6B555F9936B7ADB6F70C4F297CCA /* IGListScrollDelegate.h in Headers */, - E8421FCAB6BACB2BA1AA9025BE1CA2F3 /* IGListSectionController.h in Headers */, - FB582A36D43F2B261A98E9604577D61D /* IGListSectionControllerInternal.h in Headers */, - BE1EC29245521FAE05DB9EE2DC97E117 /* IGListSectionMap.h in Headers */, - 250C5284B31A0B4566A492B99F6B680A /* IGListSectionType.h in Headers */, - BB2D3FD9525FFCE2B59E769A35234736 /* IGListSingleSectionController.h in Headers */, - 889AADC3C1BE1DD2704B08D219522B17 /* IGListStackedSectionController.h in Headers */, - 887E96BDA96118C5EBAAB3EA476B2A04 /* IGListStackedSectionControllerInternal.h in Headers */, - 6B411132695738A97E803B0A19F26E40 /* IGListSupplementaryViewSource.h in Headers */, - DBB8430E46A7A61D6CED2D5D61C5691C /* IGListUpdatingDelegate.h in Headers */, - C07BA9537D41D1EDDF54D2322DE869DD /* IGListWorkingRangeDelegate.h in Headers */, - 0F2F9C4A2CADD056A0ECABC67AA0C407 /* IGListWorkingRangeHandler.h in Headers */, - FF9C95C6B13B9EE21B4436107FCBC8B9 /* NSNumber+IGListDiffable.h in Headers */, - ED10986E509116BF0EDF4F0E856BBD77 /* NSString+IGListDiffable.h in Headers */, - 1A4BF429109363AB21E514ACA86EE52B /* UICollectionView+IGListBatchUpdateData.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXHeadersBuildPhase section */ - -/* Begin PBXNativeTarget section */ - 83717B0A04268D3257867FB3A9DF0873 /* Pods-Marslink */ = { - isa = PBXNativeTarget; - buildConfigurationList = 64A8E4AB0D7559C50F15F2EC0878740B /* Build configuration list for PBXNativeTarget "Pods-Marslink" */; - buildPhases = ( - E2D47BCD490B06CCED77C6FE228B9D35 /* Sources */, - 9338C194129560BC7B655B7D5DC4AC48 /* Frameworks */, - 16FAA228DE47900020B37AB606A11912 /* Headers */, - ); - buildRules = ( - ); - dependencies = ( - D401FE3F025BB7458A4616A02AEB8CF1 /* PBXTargetDependency */, - ); - name = "Pods-Marslink"; - productName = "Pods-Marslink"; - productReference = 32320C9EBC24A2C6FD71B501B4D9993C /* Pods_Marslink.framework */; - productType = "com.apple.product-type.framework"; - }; - 9D781EB30AA915DF5F4DD7F2BB2A2CA3 /* IGListKit */ = { - isa = PBXNativeTarget; - buildConfigurationList = B3CE34E552D702764C716F6DB1F3C643 /* Build configuration list for PBXNativeTarget "IGListKit" */; - buildPhases = ( - AD9C71E92C9D4879BBD43AEB124C62A3 /* Sources */, - E740BDF0F8326DA093D94B70B8370630 /* Frameworks */, - 4A0E575F5BB81B96717488A132729513 /* Headers */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = IGListKit; - productName = IGListKit; - productReference = C06B0AE941A11A3ECE36C27A3009FCC6 /* IGListKit.framework */; - productType = "com.apple.product-type.framework"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - D41D8CD98F00B204E9800998ECF8427E /* Project object */ = { - isa = PBXProject; - attributes = { - LastSwiftUpdateCheck = 0730; - LastUpgradeCheck = 0700; - }; - buildConfigurationList = 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - ); - mainGroup = 7DB346D0F39D3F0E887471402A8071AB; - productRefGroup = 745608014D91D678A712F9BC8FF4C484 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 9D781EB30AA915DF5F4DD7F2BB2A2CA3 /* IGListKit */, - 83717B0A04268D3257867FB3A9DF0873 /* Pods-Marslink */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXSourcesBuildPhase section */ - AD9C71E92C9D4879BBD43AEB124C62A3 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - F9957117341A7CB7E40D52944B35E7FF /* IGListAdapter.m in Sources */, - 6C4CFA0B5DACEBA7FCE5D4EF2503C61B /* IGListAdapterProxy.m in Sources */, - 579BD7728557C6603907654E003D7F11 /* IGListAdapterUpdater.m in Sources */, - D227E8DC1846462A9B401C55E0726797 /* IGListBatchUpdateData.mm in Sources */, - A430D44BF9642FA6C62D1B3212E3B7C9 /* IGListCollectionView.m in Sources */, - F379E86C71333ED9A2F4F7FE8031A9AD /* IGListDiff.mm in Sources */, - F429AB7A46487150BA17772E7188B0B8 /* IGListDisplayHandler.m in Sources */, - 146A5A3963E321715014255CC6A73435 /* IGListGridCollectionViewLayout.m in Sources */, - 03D9F2C118B2F4721833FA5E2D8701F0 /* IGListIndexPathResult.m in Sources */, - 8B694B75CFFA9D9E7DD05BB62DF81CCA /* IGListIndexSetResult.m in Sources */, - 30B15D99A1F770C9423047B947CE3A0F /* IGListKit-dummy.m in Sources */, - 5CF27D82613DC819AA9890A35AD1E446 /* IGListMoveIndex.m in Sources */, - 3B6C2D70ECB9D76D26F923170C635C38 /* IGListMoveIndexPath.m in Sources */, - 8902BC0EBC7718A380A2F9319B5C206D /* IGListReloadDataUpdater.m in Sources */, - 47995A7CF19EADF3CDC1375E80AD7518 /* IGListSectionController.m in Sources */, - 4B173D112A82A3535655BCDF59ECF10D /* IGListSectionMap.m in Sources */, - 6E613C9AECE3F7789BFD9997CB9D29E0 /* IGListSingleSectionController.m in Sources */, - 6DC05DAED19A05B1B239D2FD588C4EF7 /* IGListStackedSectionController.m in Sources */, - F81DAB84FE444B48DDB0A40E5AD3BA8D /* IGListWorkingRangeHandler.mm in Sources */, - 6FF62F7C7199C2012A0B17A3C6A9E7A5 /* NSNumber+IGListDiffable.m in Sources */, - ECB644F35F962A905C599DFA812700BB /* NSString+IGListDiffable.m in Sources */, - 83B6A64F2AD0FE5DF0CEE751EF8BF26D /* UICollectionView+IGListBatchUpdateData.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - E2D47BCD490B06CCED77C6FE228B9D35 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 50FC67816EB0ABB18D2BDB997EDD818B /* Pods-Marslink-dummy.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - D401FE3F025BB7458A4616A02AEB8CF1 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = IGListKit; - target = 9D781EB30AA915DF5F4DD7F2BB2A2CA3 /* IGListKit */; - targetProxy = 59532D90F56EEAE0E93CFCD365BB2E24 /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin XCBuildConfiguration section */ - 12914D756594D15C6F2CA12FE5F89F1B /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGNING_REQUIRED = NO; - COPY_PHASE_STRIP = NO; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "POD_CONFIGURATION_DEBUG=1", - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; - ONLY_ACTIVE_ARCH = YES; - PROVISIONING_PROFILE_SPECIFIER = NO_SIGNING/; - STRIP_INSTALLED_PRODUCT = NO; - SYMROOT = "${SRCROOT}/../build"; - }; - name = Debug; - }; - 2A9EFDA2E7E4217E094C6DC642F51C42 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 4533F285742D2BD64FEBEF2BDDC07D51 /* IGListKit.xcconfig */; - buildSettings = { - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/IGListKit/IGListKit-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/IGListKit/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/IGListKit/IGListKit.modulemap"; - MTL_ENABLE_DEBUG_INFO = NO; - PRODUCT_NAME = IGListKit; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_VERSION = 3.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; - 5A5F4631DD6F94DA7B494621034CD53A /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 98418E39B77A14D7AA027C0F514B3543 /* Pods-Marslink.debug.xcconfig */; - buildSettings = { - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = dwarf; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_NO_COMMON_BLOCKS = YES; - INFOPLIST_FILE = "Target Support Files/Pods-Marslink/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-Marslink/Pods-Marslink.modulemap"; - MTL_ENABLE_DEBUG_INFO = YES; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = Pods_Marslink; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - 70CB01C03C6727B4CEAFBFF71E678F4C /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 27FD2BC30D3F440534414FAACE9C2FDB /* Pods-Marslink.release.xcconfig */; - buildSettings = { - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_NO_COMMON_BLOCKS = YES; - INFOPLIST_FILE = "Target Support Files/Pods-Marslink/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-Marslink/Pods-Marslink.modulemap"; - MTL_ENABLE_DEBUG_INFO = NO; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = Pods_Marslink; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; - 927309BA7A6EC59A940E63EB69FE932F /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 4533F285742D2BD64FEBEF2BDDC07D51 /* IGListKit.xcconfig */; - buildSettings = { - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = dwarf; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_NO_COMMON_BLOCKS = YES; - GCC_PREFIX_HEADER = "Target Support Files/IGListKit/IGListKit-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/IGListKit/Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/IGListKit/IGListKit.modulemap"; - MTL_ENABLE_DEBUG_INFO = YES; - PRODUCT_NAME = IGListKit; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_VERSION = 3.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - E72E7977875C2D251FC62736BBDDC389 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGNING_REQUIRED = NO; - COPY_PHASE_STRIP = YES; - ENABLE_NS_ASSERTIONS = NO; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_PREPROCESSOR_DEFINITIONS = ( - "POD_CONFIGURATION_RELEASE=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; - PROVISIONING_PROFILE_SPECIFIER = NO_SIGNING/; - STRIP_INSTALLED_PRODUCT = NO; - SYMROOT = "${SRCROOT}/../build"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 12914D756594D15C6F2CA12FE5F89F1B /* Debug */, - E72E7977875C2D251FC62736BBDDC389 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 64A8E4AB0D7559C50F15F2EC0878740B /* Build configuration list for PBXNativeTarget "Pods-Marslink" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 5A5F4631DD6F94DA7B494621034CD53A /* Debug */, - 70CB01C03C6727B4CEAFBFF71E678F4C /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - B3CE34E552D702764C716F6DB1F3C643 /* Build configuration list for PBXNativeTarget "IGListKit" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 927309BA7A6EC59A940E63EB69FE932F /* Debug */, - 2A9EFDA2E7E4217E094C6DC642F51C42 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = D41D8CD98F00B204E9800998ECF8427E /* Project object */; -} diff --git a/Project 27 - Marslink/Pods/Pods.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/IGListKit.xcscheme b/Project 27 - Marslink/Pods/Pods.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/IGListKit.xcscheme deleted file mode 100644 index 8ba414a6..00000000 --- a/Project 27 - Marslink/Pods/Pods.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/IGListKit.xcscheme +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Project 27 - Marslink/Pods/Pods.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/Pods-Marslink.xcscheme b/Project 27 - Marslink/Pods/Pods.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/Pods-Marslink.xcscheme deleted file mode 100644 index a18c1439..00000000 --- a/Project 27 - Marslink/Pods/Pods.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/Pods-Marslink.xcscheme +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Project 27 - Marslink/Pods/Pods.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/xcschememanagement.plist b/Project 27 - Marslink/Pods/Pods.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/xcschememanagement.plist deleted file mode 100644 index a5085478..00000000 --- a/Project 27 - Marslink/Pods/Pods.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/xcschememanagement.plist +++ /dev/null @@ -1,32 +0,0 @@ - - - - - SchemeUserState - - IGListKit.xcscheme - - orderHint - 1 - - Pods-Marslink.xcscheme - - orderHint - 2 - - - SuppressBuildableAutocreation - - 83717B0A04268D3257867FB3A9DF0873 - - primary - - - 9D781EB30AA915DF5F4DD7F2BB2A2CA3 - - primary - - - - - diff --git a/Project 27 - Marslink/Pods/Pods.xcodeproj/xcuserdata/jeffro.xcuserdatad/xcschemes/IGListKit.xcscheme b/Project 27 - Marslink/Pods/Pods.xcodeproj/xcuserdata/jeffro.xcuserdatad/xcschemes/IGListKit.xcscheme deleted file mode 100644 index d4564818..00000000 --- a/Project 27 - Marslink/Pods/Pods.xcodeproj/xcuserdata/jeffro.xcuserdatad/xcschemes/IGListKit.xcscheme +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Project 27 - Marslink/Pods/Pods.xcodeproj/xcuserdata/jeffro.xcuserdatad/xcschemes/Pods-Marslink.xcscheme b/Project 27 - Marslink/Pods/Pods.xcodeproj/xcuserdata/jeffro.xcuserdatad/xcschemes/Pods-Marslink.xcscheme deleted file mode 100644 index 5103fa20..00000000 --- a/Project 27 - Marslink/Pods/Pods.xcodeproj/xcuserdata/jeffro.xcuserdatad/xcschemes/Pods-Marslink.xcscheme +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Project 27 - Marslink/Pods/Pods.xcodeproj/xcuserdata/jeffro.xcuserdatad/xcschemes/xcschememanagement.plist b/Project 27 - Marslink/Pods/Pods.xcodeproj/xcuserdata/jeffro.xcuserdatad/xcschemes/xcschememanagement.plist deleted file mode 100644 index eac3526e..00000000 --- a/Project 27 - Marslink/Pods/Pods.xcodeproj/xcuserdata/jeffro.xcuserdatad/xcschemes/xcschememanagement.plist +++ /dev/null @@ -1,32 +0,0 @@ - - - - - SchemeUserState - - IGListKit.xcscheme - - orderHint - 1 - - Pods-Marslink.xcscheme - - orderHint - 2 - - - SuppressBuildableAutocreation - - 26932F09684B706888A7BF05E69D387C - - primary - - - CFCB91C4B8F80FA07C268ABE462EA32F - - primary - - - - - diff --git a/Project 27 - Marslink/Pods/Pods.xcodeproj/xcuserdata/rnystrom.xcuserdatad/xcschemes/IGListKit.xcscheme b/Project 27 - Marslink/Pods/Pods.xcodeproj/xcuserdata/rnystrom.xcuserdatad/xcschemes/IGListKit.xcscheme deleted file mode 100644 index 4a69b19e..00000000 --- a/Project 27 - Marslink/Pods/Pods.xcodeproj/xcuserdata/rnystrom.xcuserdatad/xcschemes/IGListKit.xcscheme +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Project 27 - Marslink/Pods/Pods.xcodeproj/xcuserdata/rnystrom.xcuserdatad/xcschemes/Pods-Marslink.xcscheme b/Project 27 - Marslink/Pods/Pods.xcodeproj/xcuserdata/rnystrom.xcuserdatad/xcschemes/Pods-Marslink.xcscheme deleted file mode 100644 index a007c9ee..00000000 --- a/Project 27 - Marslink/Pods/Pods.xcodeproj/xcuserdata/rnystrom.xcuserdatad/xcschemes/Pods-Marslink.xcscheme +++ /dev/null @@ -1,71 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Project 27 - Marslink/Pods/Pods.xcodeproj/xcuserdata/rnystrom.xcuserdatad/xcschemes/xcschememanagement.plist b/Project 27 - Marslink/Pods/Pods.xcodeproj/xcuserdata/rnystrom.xcuserdatad/xcschemes/xcschememanagement.plist deleted file mode 100644 index 588450ba..00000000 --- a/Project 27 - Marslink/Pods/Pods.xcodeproj/xcuserdata/rnystrom.xcuserdatad/xcschemes/xcschememanagement.plist +++ /dev/null @@ -1,32 +0,0 @@ - - - - - SchemeUserState - - IGListKit.xcscheme - - isShown - - - Pods-Marslink.xcscheme - - isShown - - - - SuppressBuildableAutocreation - - 83717B0A04268D3257867FB3A9DF0873 - - primary - - - 9D781EB30AA915DF5F4DD7F2BB2A2CA3 - - primary - - - - - diff --git a/Project 27 - Marslink/Pods/Target Support Files/IGListKit/IGListKit-prefix.pch b/Project 27 - Marslink/Pods/Target Support Files/IGListKit/IGListKit-prefix.pch deleted file mode 100644 index aa992a4a..00000000 --- a/Project 27 - Marslink/Pods/Target Support Files/IGListKit/IGListKit-prefix.pch +++ /dev/null @@ -1,4 +0,0 @@ -#ifdef __OBJC__ -#import -#endif - diff --git a/Project 21 - NotificationsUI/NotificationsUI.gif b/Project 27 - NotificationsUI/NotificationsUI.gif similarity index 100% rename from Project 21 - NotificationsUI/NotificationsUI.gif rename to Project 27 - NotificationsUI/NotificationsUI.gif diff --git a/Project 21 - NotificationsUI/NotificationsUI.xcodeproj/project.pbxproj b/Project 27 - NotificationsUI/NotificationsUI.xcodeproj/project.pbxproj similarity index 92% rename from Project 21 - NotificationsUI/NotificationsUI.xcodeproj/project.pbxproj rename to Project 27 - NotificationsUI/NotificationsUI.xcodeproj/project.pbxproj index e71f7af7..19e0177b 100644 --- a/Project 21 - NotificationsUI/NotificationsUI.xcodeproj/project.pbxproj +++ b/Project 27 - NotificationsUI/NotificationsUI.xcodeproj/project.pbxproj @@ -120,19 +120,20 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0800; - LastUpgradeCheck = 0820; + LastUpgradeCheck = 1020; ORGANIZATIONNAME = "Pranjal Satija"; TargetAttributes = { AF68C1811D875D1300F42FC1 = { CreatedOnToolsVersion = 8.0; DevelopmentTeam = KRY6CYGL84; + LastSwiftMigration = 1020; ProvisioningStyle = Automatic; }; }; }; buildConfigurationList = AF68C17D1D875D1300F42FC1 /* Build configuration list for PBXProject "NotificationsUI" */; compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; + developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, @@ -199,20 +200,29 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_SUSPICIOUS_MOVES = YES; CLANG_WARN_UNREACHABLE_CODE = YES; @@ -236,7 +246,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -249,20 +259,29 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_SUSPICIOUS_MOVES = YES; CLANG_WARN_UNREACHABLE_CODE = YES; @@ -280,7 +299,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; @@ -298,7 +317,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.pranjalsatija.NotificationsUI; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; }; name = Debug; }; @@ -312,7 +331,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.pranjalsatija.NotificationsUI; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; }; name = Release; }; diff --git a/Project 21 - NotificationsUI/NotificationsUI.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Project 27 - NotificationsUI/NotificationsUI.xcodeproj/project.xcworkspace/contents.xcworkspacedata similarity index 100% rename from Project 21 - NotificationsUI/NotificationsUI.xcodeproj/project.xcworkspace/contents.xcworkspacedata rename to Project 27 - NotificationsUI/NotificationsUI.xcodeproj/project.xcworkspace/contents.xcworkspacedata diff --git a/Project 27 - NotificationsUI/NotificationsUI.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Project 27 - NotificationsUI/NotificationsUI.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/Project 27 - NotificationsUI/NotificationsUI.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Project 21 - NotificationsUI/NotificationsUI/AppDelegate.swift b/Project 27 - NotificationsUI/NotificationsUI/AppDelegate.swift similarity index 94% rename from Project 21 - NotificationsUI/NotificationsUI/AppDelegate.swift rename to Project 27 - NotificationsUI/NotificationsUI/AppDelegate.swift index 95c9fa38..58f60e5b 100644 --- a/Project 21 - NotificationsUI/NotificationsUI/AppDelegate.swift +++ b/Project 27 - NotificationsUI/NotificationsUI/AppDelegate.swift @@ -11,10 +11,10 @@ import UserNotifications @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? - func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { /// Request local notification authorizations. - UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound]) { (accepted, error) in + UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) { accepted, error in if !accepted { print("Notification access denied.") } @@ -44,7 +44,7 @@ import UserNotifications let content = UNMutableNotificationContent() content.title = "Coding Reminder" content.body = "Ready to code? Let us do some Swift!" - content.sound = UNNotificationSound.default() + content.sound = UNNotificationSound.default content.categoryIdentifier = "normal" /// Add a image as attachment. diff --git a/Project 21 - NotificationsUI/NotificationsUI/Assets.xcassets/AppIcon.appiconset/Contents.json b/Project 27 - NotificationsUI/NotificationsUI/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from Project 21 - NotificationsUI/NotificationsUI/Assets.xcassets/AppIcon.appiconset/Contents.json rename to Project 27 - NotificationsUI/NotificationsUI/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/Project 21 - NotificationsUI/NotificationsUI/Assets.xcassets/Contents.json b/Project 27 - NotificationsUI/NotificationsUI/Assets.xcassets/Contents.json similarity index 100% rename from Project 21 - NotificationsUI/NotificationsUI/Assets.xcassets/Contents.json rename to Project 27 - NotificationsUI/NotificationsUI/Assets.xcassets/Contents.json diff --git a/Project 21 - NotificationsUI/NotificationsUI/Base.lproj/LaunchScreen.storyboard b/Project 27 - NotificationsUI/NotificationsUI/Base.lproj/LaunchScreen.storyboard similarity index 100% rename from Project 21 - NotificationsUI/NotificationsUI/Base.lproj/LaunchScreen.storyboard rename to Project 27 - NotificationsUI/NotificationsUI/Base.lproj/LaunchScreen.storyboard diff --git a/Project 21 - NotificationsUI/NotificationsUI/Base.lproj/Main.storyboard b/Project 27 - NotificationsUI/NotificationsUI/Base.lproj/Main.storyboard similarity index 100% rename from Project 21 - NotificationsUI/NotificationsUI/Base.lproj/Main.storyboard rename to Project 27 - NotificationsUI/NotificationsUI/Base.lproj/Main.storyboard diff --git a/Project 21 - NotificationsUI/NotificationsUI/Info.plist b/Project 27 - NotificationsUI/NotificationsUI/Info.plist similarity index 100% rename from Project 21 - NotificationsUI/NotificationsUI/Info.plist rename to Project 27 - NotificationsUI/NotificationsUI/Info.plist diff --git a/Project 21 - NotificationsUI/NotificationsUI/Swift.png b/Project 27 - NotificationsUI/NotificationsUI/Swift.png similarity index 100% rename from Project 21 - NotificationsUI/NotificationsUI/Swift.png rename to Project 27 - NotificationsUI/NotificationsUI/Swift.png diff --git a/Project 21 - NotificationsUI/NotificationsUI/ViewController.swift b/Project 27 - NotificationsUI/NotificationsUI/ViewController.swift similarity index 100% rename from Project 21 - NotificationsUI/NotificationsUI/ViewController.swift rename to Project 27 - NotificationsUI/NotificationsUI/ViewController.swift diff --git a/Project 21 - NotificationsUI/README.md b/Project 27 - NotificationsUI/README.md similarity index 100% rename from Project 21 - NotificationsUI/README.md rename to Project 27 - NotificationsUI/README.md diff --git a/Project 28 - SceneDetector/README.md b/Project 28 - SceneDetector/README.md new file mode 100644 index 00000000..9a834a7c --- /dev/null +++ b/Project 28 - SceneDetector/README.md @@ -0,0 +1,16 @@ +SceneDetector +========== + +SceneDetector explains the scenario of Core ML -- using trained GoogLeNetPlaces model to detect scenes of a selected image. Literately 5 steps are required: + +1. Drag and drop the .mlmodel to the project +1. Load model from the automatic generated model class of the .mlmodel file +2. Define a Vision service with the model +3. Create a request handler with image provided +4. Perform the request service with the request handler + + +For more details, please reference [here](https://www.raywenderlich.com/164213/coreml-and-vision-machine-learning-in-ios-11-tutorial). + +## Screenshots +![SceneDetector](./SceneDetector.gif) diff --git a/Project 28 - SceneDetector/SceneDetector.gif b/Project 28 - SceneDetector/SceneDetector.gif new file mode 100644 index 00000000..56f480b4 Binary files /dev/null and b/Project 28 - SceneDetector/SceneDetector.gif differ diff --git a/Project 28 - SceneDetector/SceneDetector.xcodeproj/project.pbxproj b/Project 28 - SceneDetector/SceneDetector.xcodeproj/project.pbxproj new file mode 100644 index 00000000..2c679ddc --- /dev/null +++ b/Project 28 - SceneDetector/SceneDetector.xcodeproj/project.pbxproj @@ -0,0 +1,354 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 48; + objects = { + +/* Begin PBXBuildFile section */ + 195F1AC5225EFC290018B16B /* GoogLeNetPlaces.mlmodel in Sources */ = {isa = PBXBuildFile; fileRef = 195F1AC4225EFC290018B16B /* GoogLeNetPlaces.mlmodel */; }; + CD8A65A11EE7EC0700942922 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD8A65A01EE7EC0700942922 /* AppDelegate.swift */; }; + CD8A65A31EE7EC0700942922 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD8A65A21EE7EC0700942922 /* ViewController.swift */; }; + CD8A65A61EE7EC0700942922 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = CD8A65A41EE7EC0700942922 /* Main.storyboard */; }; + CD8A65A81EE7EC0700942922 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = CD8A65A71EE7EC0700942922 /* Assets.xcassets */; }; + CD8A65AB1EE7EC0700942922 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = CD8A65A91EE7EC0700942922 /* LaunchScreen.storyboard */; }; + CD8A65B61EE7EE3B00942922 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = CD8A65B51EE7ECF600942922 /* Default-568h@2x.png */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 195F1AC4225EFC290018B16B /* GoogLeNetPlaces.mlmodel */ = {isa = PBXFileReference; lastKnownFileType = file.mlmodel; path = GoogLeNetPlaces.mlmodel; sourceTree = ""; }; + CD8A659D1EE7EC0700942922 /* SceneDetector.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SceneDetector.app; sourceTree = BUILT_PRODUCTS_DIR; }; + CD8A65A01EE7EC0700942922 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + CD8A65A21EE7EC0700942922 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; + CD8A65A51EE7EC0700942922 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + CD8A65A71EE7EC0700942922 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + CD8A65AA1EE7EC0700942922 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + CD8A65AC1EE7EC0700942922 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + CD8A65B51EE7ECF600942922 /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + CD8A659A1EE7EC0700942922 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + CD8A65941EE7EC0700942922 = { + isa = PBXGroup; + children = ( + CD8A659F1EE7EC0700942922 /* SceneDetector */, + CD8A659E1EE7EC0700942922 /* Products */, + ); + indentWidth = 2; + sourceTree = ""; + tabWidth = 2; + }; + CD8A659E1EE7EC0700942922 /* Products */ = { + isa = PBXGroup; + children = ( + CD8A659D1EE7EC0700942922 /* SceneDetector.app */, + ); + name = Products; + sourceTree = ""; + }; + CD8A659F1EE7EC0700942922 /* SceneDetector */ = { + isa = PBXGroup; + children = ( + CD8A65A01EE7EC0700942922 /* AppDelegate.swift */, + CD8A65A21EE7EC0700942922 /* ViewController.swift */, + CD8A65AC1EE7EC0700942922 /* Info.plist */, + CD8A65B21EE7EC4100942922 /* Resources */, + ); + path = SceneDetector; + sourceTree = ""; + }; + CD8A65B21EE7EC4100942922 /* Resources */ = { + isa = PBXGroup; + children = ( + CD8A65A41EE7EC0700942922 /* Main.storyboard */, + 195F1AC4225EFC290018B16B /* GoogLeNetPlaces.mlmodel */, + CD8A65A71EE7EC0700942922 /* Assets.xcassets */, + CD8A65B51EE7ECF600942922 /* Default-568h@2x.png */, + CD8A65A91EE7EC0700942922 /* LaunchScreen.storyboard */, + ); + path = Resources; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + CD8A659C1EE7EC0700942922 /* SceneDetector */ = { + isa = PBXNativeTarget; + buildConfigurationList = CD8A65AF1EE7EC0700942922 /* Build configuration list for PBXNativeTarget "SceneDetector" */; + buildPhases = ( + CD8A65991EE7EC0700942922 /* Sources */, + CD8A659A1EE7EC0700942922 /* Frameworks */, + CD8A659B1EE7EC0700942922 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = SceneDetector; + productName = SceneDetector; + productReference = CD8A659D1EE7EC0700942922 /* SceneDetector.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + CD8A65951EE7EC0700942922 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0900; + LastUpgradeCheck = 1020; + ORGANIZATIONNAME = "Ray Wenderlich"; + TargetAttributes = { + CD8A659C1EE7EC0700942922 = { + CreatedOnToolsVersion = 9.0; + LastSwiftMigration = 1020; + ProvisioningStyle = Manual; + }; + }; + }; + buildConfigurationList = CD8A65981EE7EC0700942922 /* Build configuration list for PBXProject "SceneDetector" */; + compatibilityVersion = "Xcode 8.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = CD8A65941EE7EC0700942922; + productRefGroup = CD8A659E1EE7EC0700942922 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + CD8A659C1EE7EC0700942922 /* SceneDetector */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + CD8A659B1EE7EC0700942922 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + CD8A65AB1EE7EC0700942922 /* LaunchScreen.storyboard in Resources */, + CD8A65B61EE7EE3B00942922 /* Default-568h@2x.png in Resources */, + CD8A65A81EE7EC0700942922 /* Assets.xcassets in Resources */, + CD8A65A61EE7EC0700942922 /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + CD8A65991EE7EC0700942922 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + CD8A65A31EE7EC0700942922 /* ViewController.swift in Sources */, + CD8A65A11EE7EC0700942922 /* AppDelegate.swift in Sources */, + 195F1AC5225EFC290018B16B /* GoogLeNetPlaces.mlmodel in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + CD8A65A41EE7EC0700942922 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + CD8A65A51EE7EC0700942922 /* Base */, + ); + name = Main.storyboard; + path = ..; + sourceTree = ""; + }; + CD8A65A91EE7EC0700942922 /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + CD8A65AA1EE7EC0700942922 /* Base */, + ); + name = LaunchScreen.storyboard; + path = ..; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + CD8A65AD1EE7EC0700942922 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + CD8A65AE1EE7EC0700942922 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + CD8A65B01EE7EC0700942922 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Manual; + DEVELOPMENT_TEAM = ""; + INFOPLIST_FILE = SceneDetector/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.razeware.SceneDetector; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 1; + }; + name = Debug; + }; + CD8A65B11EE7EC0700942922 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Manual; + DEVELOPMENT_TEAM = ""; + INFOPLIST_FILE = SceneDetector/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.razeware.SceneDetector; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = 1; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + CD8A65981EE7EC0700942922 /* Build configuration list for PBXProject "SceneDetector" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + CD8A65AD1EE7EC0700942922 /* Debug */, + CD8A65AE1EE7EC0700942922 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + CD8A65AF1EE7EC0700942922 /* Build configuration list for PBXNativeTarget "SceneDetector" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + CD8A65B01EE7EC0700942922 /* Debug */, + CD8A65B11EE7EC0700942922 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = CD8A65951EE7EC0700942922 /* Project object */; +} diff --git a/Project 28 - SceneDetector/SceneDetector.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Project 28 - SceneDetector/SceneDetector.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..28e6a1b1 --- /dev/null +++ b/Project 28 - SceneDetector/SceneDetector.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Project 28 - SceneDetector/SceneDetector.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Project 28 - SceneDetector/SceneDetector.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/Project 28 - SceneDetector/SceneDetector.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Project 29 - Grocr/Grocr/User.swift b/Project 28 - SceneDetector/SceneDetector/AppDelegate.swift similarity index 55% rename from Project 29 - Grocr/Grocr/User.swift rename to Project 28 - SceneDetector/SceneDetector/AppDelegate.swift index 1546e60a..a5b28293 100644 --- a/Project 29 - Grocr/Grocr/User.swift +++ b/Project 28 - SceneDetector/SceneDetector/AppDelegate.swift @@ -1,5 +1,5 @@ -/* - * Copyright (c) 2015 Razeware LLC +/** + * Copyright (c) 2017 Razeware LLC * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -11,6 +11,14 @@ * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * + * Notwithstanding the foregoing, you may not use, copy, modify, merge, publish, + * distribute, sublicense, create a derivative work, and/or sell copies of the + * Software in any work that is designed, intended, or marketed for pedagogical or + * instructional purposes related to programming, coding, application development, + * or information technology. Permission for such use, copying, modification, + * merger, publication, distribution, sublicensing, creation of derivative works, + * or sale is expressly withheld. + * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE @@ -20,22 +28,15 @@ * THE SOFTWARE. */ -import Foundation -import Firebase +import UIKit -struct User { - - let uid: String - let email: String - - init(authData: FIRUser) { - uid = authData.uid - email = authData.email! - } - - init(uid: String, email: String) { - self.uid = uid - self.email = email +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + + var window: UIWindow? + + func application(_ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { + return true } - } diff --git a/Project 28 - SlidebarMenu/SlidebarMenu/Base.lproj/LaunchScreen.storyboard b/Project 28 - SceneDetector/SceneDetector/Base.lproj/LaunchScreen.storyboard similarity index 100% rename from Project 28 - SlidebarMenu/SlidebarMenu/Base.lproj/LaunchScreen.storyboard rename to Project 28 - SceneDetector/SceneDetector/Base.lproj/LaunchScreen.storyboard diff --git a/Project 28 - SceneDetector/SceneDetector/Base.lproj/Main.storyboard b/Project 28 - SceneDetector/SceneDetector/Base.lproj/Main.storyboard new file mode 100644 index 00000000..dfd4ce6e --- /dev/null +++ b/Project 28 - SceneDetector/SceneDetector/Base.lproj/Main.storyboard @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Project 28 - SceneDetector/SceneDetector/Info.plist b/Project 28 - SceneDetector/SceneDetector/Info.plist new file mode 100644 index 00000000..e92ae04a --- /dev/null +++ b/Project 28 - SceneDetector/SceneDetector/Info.plist @@ -0,0 +1,47 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + NSPhotoLibraryUsageDescription + Pick a photo to detect its scene category. + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/Project 29 - Grocr/Grocr/Images.xcassets/AppIcon.appiconset/Contents.json b/Project 28 - SceneDetector/SceneDetector/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 60% rename from Project 29 - Grocr/Grocr/Images.xcassets/AppIcon.appiconset/Contents.json rename to Project 28 - SceneDetector/SceneDetector/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json index a3e78d0a..6a65342e 100644 --- a/Project 29 - Grocr/Grocr/Images.xcassets/AppIcon.appiconset/Contents.json +++ b/Project 28 - SceneDetector/SceneDetector/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -1,55 +1,57 @@ { "images" : [ { + "size" : "20x20", "idiom" : "iphone", - "size" : "29x29", - "scale" : "1x" - }, - { - "idiom" : "iphone", - "size" : "29x29", + "filename" : "icon-app-20@2x.png", "scale" : "2x" }, { - "size" : "29x29", + "size" : "20x20", "idiom" : "iphone", - "filename" : "Icon-Small@3x.png", + "filename" : "icon-app-20@3x.png", "scale" : "3x" }, { + "size" : "29x29", "idiom" : "iphone", - "size" : "40x40", + "filename" : "icon-app-29@2x.png", "scale" : "2x" }, { - "size" : "40x40", + "size" : "29x29", "idiom" : "iphone", - "filename" : "Icon-Small-40@3x.png", + "filename" : "icon-app-29@3x copy.png", "scale" : "3x" }, { - "size" : "57x57", + "size" : "40x40", "idiom" : "iphone", - "filename" : "Icon.png", - "scale" : "1x" + "filename" : "icon-app-40@2x.png", + "scale" : "2x" }, { - "size" : "57x57", + "size" : "40x40", "idiom" : "iphone", - "filename" : "Icon@2x.png", - "scale" : "2x" + "filename" : "icon-app-40@3x.png", + "scale" : "3x" }, { "size" : "60x60", "idiom" : "iphone", - "filename" : "Icon-60@2x.png", + "filename" : "icon-app-60@2x.png", "scale" : "2x" }, { "size" : "60x60", "idiom" : "iphone", - "filename" : "Icon-60@3x.png", + "filename" : "icon-app-60@3x.png", "scale" : "3x" + }, + { + "idiom" : "ios-marketing", + "size" : "1024x1024", + "scale" : "1x" } ], "info" : { diff --git a/Project 28 - SceneDetector/SceneDetector/Resources/Assets.xcassets/AppIcon.appiconset/icon-app-20@2x.png b/Project 28 - SceneDetector/SceneDetector/Resources/Assets.xcassets/AppIcon.appiconset/icon-app-20@2x.png new file mode 100644 index 00000000..11d267bf Binary files /dev/null and b/Project 28 - SceneDetector/SceneDetector/Resources/Assets.xcassets/AppIcon.appiconset/icon-app-20@2x.png differ diff --git a/Project 28 - SceneDetector/SceneDetector/Resources/Assets.xcassets/AppIcon.appiconset/icon-app-20@3x.png b/Project 28 - SceneDetector/SceneDetector/Resources/Assets.xcassets/AppIcon.appiconset/icon-app-20@3x.png new file mode 100644 index 00000000..c38ba0fa Binary files /dev/null and b/Project 28 - SceneDetector/SceneDetector/Resources/Assets.xcassets/AppIcon.appiconset/icon-app-20@3x.png differ diff --git a/Project 28 - SceneDetector/SceneDetector/Resources/Assets.xcassets/AppIcon.appiconset/icon-app-29@2x.png b/Project 28 - SceneDetector/SceneDetector/Resources/Assets.xcassets/AppIcon.appiconset/icon-app-29@2x.png new file mode 100644 index 00000000..2603ea9c Binary files /dev/null and b/Project 28 - SceneDetector/SceneDetector/Resources/Assets.xcassets/AppIcon.appiconset/icon-app-29@2x.png differ diff --git a/Project 28 - SceneDetector/SceneDetector/Resources/Assets.xcassets/AppIcon.appiconset/icon-app-29@3x copy.png b/Project 28 - SceneDetector/SceneDetector/Resources/Assets.xcassets/AppIcon.appiconset/icon-app-29@3x copy.png new file mode 100644 index 00000000..0d0d727a Binary files /dev/null and b/Project 28 - SceneDetector/SceneDetector/Resources/Assets.xcassets/AppIcon.appiconset/icon-app-29@3x copy.png differ diff --git a/Project 28 - SceneDetector/SceneDetector/Resources/Assets.xcassets/AppIcon.appiconset/icon-app-40@2x.png b/Project 28 - SceneDetector/SceneDetector/Resources/Assets.xcassets/AppIcon.appiconset/icon-app-40@2x.png new file mode 100644 index 00000000..08a7c242 Binary files /dev/null and b/Project 28 - SceneDetector/SceneDetector/Resources/Assets.xcassets/AppIcon.appiconset/icon-app-40@2x.png differ diff --git a/Project 28 - SceneDetector/SceneDetector/Resources/Assets.xcassets/AppIcon.appiconset/icon-app-40@3x.png b/Project 28 - SceneDetector/SceneDetector/Resources/Assets.xcassets/AppIcon.appiconset/icon-app-40@3x.png new file mode 100644 index 00000000..ed585762 Binary files /dev/null and b/Project 28 - SceneDetector/SceneDetector/Resources/Assets.xcassets/AppIcon.appiconset/icon-app-40@3x.png differ diff --git a/Project 28 - SceneDetector/SceneDetector/Resources/Assets.xcassets/AppIcon.appiconset/icon-app-60@2x.png b/Project 28 - SceneDetector/SceneDetector/Resources/Assets.xcassets/AppIcon.appiconset/icon-app-60@2x.png new file mode 100644 index 00000000..1bd7d56b Binary files /dev/null and b/Project 28 - SceneDetector/SceneDetector/Resources/Assets.xcassets/AppIcon.appiconset/icon-app-60@2x.png differ diff --git a/Project 28 - SceneDetector/SceneDetector/Resources/Assets.xcassets/AppIcon.appiconset/icon-app-60@3x.png b/Project 28 - SceneDetector/SceneDetector/Resources/Assets.xcassets/AppIcon.appiconset/icon-app-60@3x.png new file mode 100644 index 00000000..42b0d287 Binary files /dev/null and b/Project 28 - SceneDetector/SceneDetector/Resources/Assets.xcassets/AppIcon.appiconset/icon-app-60@3x.png differ diff --git a/Project 27 - Marslink/Marslink/Resources/Assets.xcassets/Contents.json b/Project 28 - SceneDetector/SceneDetector/Resources/Assets.xcassets/Contents.json similarity index 100% rename from Project 27 - Marslink/Marslink/Resources/Assets.xcassets/Contents.json rename to Project 28 - SceneDetector/SceneDetector/Resources/Assets.xcassets/Contents.json diff --git a/Project 04 - Todo/Todo/Assets.xcassets/unselected/child.imageset/Contents.json b/Project 28 - SceneDetector/SceneDetector/Resources/Assets.xcassets/dark_road.imageset/Contents.json similarity index 88% rename from Project 04 - Todo/Todo/Assets.xcassets/unselected/child.imageset/Contents.json rename to Project 28 - SceneDetector/SceneDetector/Resources/Assets.xcassets/dark_road.imageset/Contents.json index efdcd731..b3cfc15a 100644 --- a/Project 04 - Todo/Todo/Assets.xcassets/unselected/child.imageset/Contents.json +++ b/Project 28 - SceneDetector/SceneDetector/Resources/Assets.xcassets/dark_road.imageset/Contents.json @@ -2,11 +2,11 @@ "images" : [ { "idiom" : "universal", + "filename" : "dark_road.jpg", "scale" : "1x" }, { "idiom" : "universal", - "filename" : "child@2x.png", "scale" : "2x" }, { diff --git a/Project 28 - SceneDetector/SceneDetector/Resources/Assets.xcassets/dark_road.imageset/dark_road.jpg b/Project 28 - SceneDetector/SceneDetector/Resources/Assets.xcassets/dark_road.imageset/dark_road.jpg new file mode 100644 index 00000000..2dafdf8d Binary files /dev/null and b/Project 28 - SceneDetector/SceneDetector/Resources/Assets.xcassets/dark_road.imageset/dark_road.jpg differ diff --git a/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/author.imageset/Contents.json b/Project 28 - SceneDetector/SceneDetector/Resources/Assets.xcassets/train_day.imageset/Contents.json similarity index 88% rename from Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/author.imageset/Contents.json rename to Project 28 - SceneDetector/SceneDetector/Resources/Assets.xcassets/train_day.imageset/Contents.json index 05d44d3d..8a1bb15e 100644 --- a/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/author.imageset/Contents.json +++ b/Project 28 - SceneDetector/SceneDetector/Resources/Assets.xcassets/train_day.imageset/Contents.json @@ -2,7 +2,7 @@ "images" : [ { "idiom" : "universal", - "filename" : "author.jpg", + "filename" : "train_day.jpg", "scale" : "1x" }, { diff --git a/Project 28 - SceneDetector/SceneDetector/Resources/Assets.xcassets/train_day.imageset/train_day.jpg b/Project 28 - SceneDetector/SceneDetector/Resources/Assets.xcassets/train_day.imageset/train_day.jpg new file mode 100644 index 00000000..2745884d Binary files /dev/null and b/Project 28 - SceneDetector/SceneDetector/Resources/Assets.xcassets/train_day.imageset/train_day.jpg differ diff --git a/Project 04 - Todo/Todo/Assets.xcassets/unselected/travel.imageset/Contents.json b/Project 28 - SceneDetector/SceneDetector/Resources/Assets.xcassets/train_night.imageset/Contents.json similarity index 87% rename from Project 04 - Todo/Todo/Assets.xcassets/unselected/travel.imageset/Contents.json rename to Project 28 - SceneDetector/SceneDetector/Resources/Assets.xcassets/train_night.imageset/Contents.json index 18202ba3..213216ab 100644 --- a/Project 04 - Todo/Todo/Assets.xcassets/unselected/travel.imageset/Contents.json +++ b/Project 28 - SceneDetector/SceneDetector/Resources/Assets.xcassets/train_night.imageset/Contents.json @@ -2,11 +2,11 @@ "images" : [ { "idiom" : "universal", + "filename" : "train_night.jpg", "scale" : "1x" }, { "idiom" : "universal", - "filename" : "travel@2x.png", "scale" : "2x" }, { diff --git a/Project 28 - SceneDetector/SceneDetector/Resources/Assets.xcassets/train_night.imageset/train_night.jpg b/Project 28 - SceneDetector/SceneDetector/Resources/Assets.xcassets/train_night.imageset/train_night.jpg new file mode 100644 index 00000000..082dcc5d Binary files /dev/null and b/Project 28 - SceneDetector/SceneDetector/Resources/Assets.xcassets/train_night.imageset/train_night.jpg differ diff --git a/Project 13 - TwitterBird/Default-568h@2x.png b/Project 28 - SceneDetector/SceneDetector/Resources/Default-568h@2x.png similarity index 100% rename from Project 13 - TwitterBird/Default-568h@2x.png rename to Project 28 - SceneDetector/SceneDetector/Resources/Default-568h@2x.png diff --git a/Project 29 - Grocr/Pods/FirebaseDatabase/Frameworks/FirebaseDatabase.framework/FirebaseDatabase b/Project 28 - SceneDetector/SceneDetector/Resources/GoogLeNetPlaces.mlmodel old mode 100755 new mode 100644 similarity index 55% rename from Project 29 - Grocr/Pods/FirebaseDatabase/Frameworks/FirebaseDatabase.framework/FirebaseDatabase rename to Project 28 - SceneDetector/SceneDetector/Resources/GoogLeNetPlaces.mlmodel index 162c2ef8..569f10ba Binary files a/Project 29 - Grocr/Pods/FirebaseDatabase/Frameworks/FirebaseDatabase.framework/FirebaseDatabase and b/Project 28 - SceneDetector/SceneDetector/Resources/GoogLeNetPlaces.mlmodel differ diff --git a/Project 28 - SceneDetector/SceneDetector/Resources/hogwarts_express.jpg b/Project 28 - SceneDetector/SceneDetector/Resources/hogwarts_express.jpg new file mode 100644 index 00000000..835fa066 Binary files /dev/null and b/Project 28 - SceneDetector/SceneDetector/Resources/hogwarts_express.jpg differ diff --git a/Project 28 - SceneDetector/SceneDetector/ViewController.swift b/Project 28 - SceneDetector/SceneDetector/ViewController.swift new file mode 100644 index 00000000..c6b7d6aa --- /dev/null +++ b/Project 28 - SceneDetector/SceneDetector/ViewController.swift @@ -0,0 +1,138 @@ +/** + * Copyright (c) 2017 Razeware LLC + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * Notwithstanding the foregoing, you may not use, copy, modify, merge, publish, + * distribute, sublicense, create a derivative work, and/or sell copies of the + * Software in any work that is designed, intended, or marketed for pedagogical or + * instructional purposes related to programming, coding, application development, + * or information technology. Permission for such use, copying, modification, + * merger, publication, distribution, sublicensing, creation of derivative works, + * or sale is expressly withheld. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +import UIKit +import CoreML +import Vision + +class ViewController: UIViewController { + + // MARK: - IBOutlets + @IBOutlet weak var scene: UIImageView! + @IBOutlet weak var answerLabel: UILabel! + + // MARK: - View Life Cycle + override func viewDidLoad() { + super.viewDidLoad() + + guard let image = UIImage(named: "train_night") else { + fatalError("no starting image") + } + + scene.image = image + } +} + +// MARK: - IBActions +extension ViewController { + + @IBAction func pickImage(_ sender: Any) { + let pickerController = UIImagePickerController() + pickerController.delegate = self + pickerController.sourceType = .savedPhotosAlbum + present(pickerController, animated: true) + } +} + +// MARK: - UIImagePickerControllerDelegate +extension ViewController: UIImagePickerControllerDelegate { + + func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { +// Local variable inserted by Swift 4.2 migrator. +let info = convertFromUIImagePickerControllerInfoKeyDictionary(info) + + dismiss(animated: true) + + guard let image = info[convertFromUIImagePickerControllerInfoKey(UIImagePickerController.InfoKey.originalImage)] as? UIImage else { + fatalError("couldn't load image from Photos") + } + + scene.image = image + + guard let ciImage = CIImage(image: image) else { + fatalError("couldn't convert UIImage to CIImage") + } + + detectScene(image: ciImage) + } +} + +// MARK: - UINavigationControllerDelegate +extension ViewController: UINavigationControllerDelegate { +} + +// MARK: - Private functions +extension ViewController { + func detectScene(image: CIImage) { + answerLabel.text = "detecting scene..." + + // Load the ML model through its generated class + guard let model = try? VNCoreMLModel(for: GoogLeNetPlaces().model) else { + fatalError("can't load Places ML model") + } + + // Define a Vision request service with the ML model + let request = VNCoreMLRequest(model: model) { [weak self] request, error in + guard let results = request.results, + let topResult = results.first as? VNClassificationObservation else { + fatalError("unexpected result type from VNCoreMLRequest") + } + + // Update UI on main queue + let article = (["a", "e", "i", "o", "u"].contains(topResult.identifier.first!)) ? "an" : "a" + + DispatchQueue.main.async { [weak self] in + self?.answerLabel.text = "\(Int(topResult.confidence * 100))% it's \(article) \(topResult.identifier)" + } + } + + // Create a request handler with the image provided + let handler = VNImageRequestHandler(ciImage: image) + + // Perform the request service with the request handler + DispatchQueue.global(qos: .userInteractive).async { + do { + try handler.perform([request]) + } catch { + print(error) + } + } + } +} + +// Helper function inserted by Swift 4.2 migrator. +fileprivate func convertFromUIImagePickerControllerInfoKeyDictionary(_ input: [UIImagePickerController.InfoKey: Any]) -> [String: Any] { + return Dictionary(uniqueKeysWithValues: input.map {key, value in (key.rawValue, value)}) +} + +// Helper function inserted by Swift 4.2 migrator. +fileprivate func convertFromUIImagePickerControllerInfoKey(_ input: UIImagePickerController.InfoKey) -> String { + return input.rawValue +} diff --git a/Project 28 - SlidebarMenu/README.md b/Project 28 - SlidebarMenu/README.md deleted file mode 100644 index ad743bc1..00000000 --- a/Project 28 - SlidebarMenu/README.md +++ /dev/null @@ -1,7 +0,0 @@ -SlidebarMenu -========== - -SlidebarMenu demos the way to achieve facebook-like slide-out sidebar menu. I here take the advantage of SWRevealViewController and the Appcoda starter app to implement the feature. For more details, please reference [here](https://github.com/John-Lluch/SWRevealViewController). - -## Screenshots -![SlidebarMenu](./SlidebarMenu.gif) diff --git a/Project 28 - SlidebarMenu/SlidebarMenu.gif b/Project 28 - SlidebarMenu/SlidebarMenu.gif deleted file mode 100644 index 87e9ea5d..00000000 Binary files a/Project 28 - SlidebarMenu/SlidebarMenu.gif and /dev/null differ diff --git a/Project 28 - SlidebarMenu/SlidebarMenu.xcodeproj/project.pbxproj b/Project 28 - SlidebarMenu/SlidebarMenu.xcodeproj/project.pbxproj deleted file mode 100644 index 843cc28d..00000000 --- a/Project 28 - SlidebarMenu/SlidebarMenu.xcodeproj/project.pbxproj +++ /dev/null @@ -1,387 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 19D355FA1E0E47B900EFF873 /* SWRevealViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 19D355F91E0E47B900EFF873 /* SWRevealViewController.m */; }; - 19D355FF1E0E4EC000EFF873 /* SlidebarMenu.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19D355FE1E0E4EC000EFF873 /* SlidebarMenu.swift */; }; - F448092B1DB9972F0083B681 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = F448092A1DB9972F0083B681 /* AppDelegate.swift */; }; - F44809301DB9972F0083B681 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F448092E1DB9972F0083B681 /* Main.storyboard */; }; - F44809321DB9972F0083B681 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = F44809311DB9972F0083B681 /* Assets.xcassets */; }; - F44809351DB9972F0083B681 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F44809331DB9972F0083B681 /* LaunchScreen.storyboard */; }; - F448093D1DB9EF100083B681 /* MenuController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F448093C1DB9EF100083B681 /* MenuController.swift */; }; - F44809401DBB28980083B681 /* MapKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F448093F1DBB28980083B681 /* MapKit.framework */; }; - F44809421DBDA87D0083B681 /* NewsTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F44809411DBDA87D0083B681 /* NewsTableViewCell.swift */; }; - F44809441DBDA9360083B681 /* NewsTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F44809431DBDA9360083B681 /* NewsTableViewController.swift */; }; - F44809461DBDAC730083B681 /* MapViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F44809451DBDAC730083B681 /* MapViewController.swift */; }; - F44809481DBDAC7D0083B681 /* PhotoViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F44809471DBDAC7D0083B681 /* PhotoViewController.swift */; }; -/* End PBXBuildFile section */ - -/* Begin PBXFileReference section */ - 19D355F71E0E47B800EFF873 /* SlidebarMenu-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "SlidebarMenu-Bridging-Header.h"; sourceTree = ""; }; - 19D355F81E0E47B900EFF873 /* SWRevealViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SWRevealViewController.h; sourceTree = ""; }; - 19D355F91E0E47B900EFF873 /* SWRevealViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SWRevealViewController.m; sourceTree = ""; }; - 19D355FE1E0E4EC000EFF873 /* SlidebarMenu.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SlidebarMenu.swift; sourceTree = ""; }; - F44809271DB9972F0083B681 /* SlidebarMenu.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SlidebarMenu.app; sourceTree = BUILT_PRODUCTS_DIR; }; - F448092A1DB9972F0083B681 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - F448092F1DB9972F0083B681 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; - F44809311DB9972F0083B681 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - F44809341DB9972F0083B681 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; - F44809361DB9972F0083B681 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - F448093C1DB9EF100083B681 /* MenuController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MenuController.swift; sourceTree = ""; }; - F448093F1DBB28980083B681 /* MapKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MapKit.framework; path = System/Library/Frameworks/MapKit.framework; sourceTree = SDKROOT; }; - F44809411DBDA87D0083B681 /* NewsTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NewsTableViewCell.swift; sourceTree = ""; }; - F44809431DBDA9360083B681 /* NewsTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NewsTableViewController.swift; sourceTree = ""; }; - F44809451DBDAC730083B681 /* MapViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MapViewController.swift; sourceTree = ""; }; - F44809471DBDAC7D0083B681 /* PhotoViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PhotoViewController.swift; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - F44809241DB9972F0083B681 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - F44809401DBB28980083B681 /* MapKit.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 19D355FB1E0E47BF00EFF873 /* SWRevealViewController */ = { - isa = PBXGroup; - children = ( - 19D355F71E0E47B800EFF873 /* SlidebarMenu-Bridging-Header.h */, - 19D355F81E0E47B900EFF873 /* SWRevealViewController.h */, - 19D355F91E0E47B900EFF873 /* SWRevealViewController.m */, - ); - name = SWRevealViewController; - sourceTree = ""; - }; - 19D355FC1E0E487900EFF873 /* Controller */ = { - isa = PBXGroup; - children = ( - F448093C1DB9EF100083B681 /* MenuController.swift */, - F44809431DBDA9360083B681 /* NewsTableViewController.swift */, - F44809451DBDAC730083B681 /* MapViewController.swift */, - F44809471DBDAC7D0083B681 /* PhotoViewController.swift */, - ); - name = Controller; - sourceTree = ""; - }; - 19D355FD1E0E488C00EFF873 /* View */ = { - isa = PBXGroup; - children = ( - F448092E1DB9972F0083B681 /* Main.storyboard */, - F44809331DB9972F0083B681 /* LaunchScreen.storyboard */, - F44809411DBDA87D0083B681 /* NewsTableViewCell.swift */, - ); - name = View; - sourceTree = ""; - }; - F448091E1DB9972F0083B681 = { - isa = PBXGroup; - children = ( - F44809291DB9972F0083B681 /* SlidebarMenu */, - F44809281DB9972F0083B681 /* Products */, - F448093E1DBB28980083B681 /* Frameworks */, - ); - sourceTree = ""; - }; - F44809281DB9972F0083B681 /* Products */ = { - isa = PBXGroup; - children = ( - F44809271DB9972F0083B681 /* SlidebarMenu.app */, - ); - name = Products; - sourceTree = ""; - }; - F44809291DB9972F0083B681 /* SlidebarMenu */ = { - isa = PBXGroup; - children = ( - 19D355FE1E0E4EC000EFF873 /* SlidebarMenu.swift */, - F448092A1DB9972F0083B681 /* AppDelegate.swift */, - 19D355FB1E0E47BF00EFF873 /* SWRevealViewController */, - 19D355FC1E0E487900EFF873 /* Controller */, - 19D355FD1E0E488C00EFF873 /* View */, - F44809311DB9972F0083B681 /* Assets.xcassets */, - F44809361DB9972F0083B681 /* Info.plist */, - ); - path = SlidebarMenu; - sourceTree = ""; - }; - F448093E1DBB28980083B681 /* Frameworks */ = { - isa = PBXGroup; - children = ( - F448093F1DBB28980083B681 /* MapKit.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - F44809261DB9972F0083B681 /* SlidebarMenu */ = { - isa = PBXNativeTarget; - buildConfigurationList = F44809391DB9972F0083B681 /* Build configuration list for PBXNativeTarget "SlidebarMenu" */; - buildPhases = ( - F44809231DB9972F0083B681 /* Sources */, - F44809241DB9972F0083B681 /* Frameworks */, - F44809251DB9972F0083B681 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = SlidebarMenu; - productName = SlidebarMenu; - productReference = F44809271DB9972F0083B681 /* SlidebarMenu.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - F448091F1DB9972F0083B681 /* Project object */ = { - isa = PBXProject; - attributes = { - LastSwiftUpdateCheck = 0800; - LastUpgradeCheck = 0820; - ORGANIZATIONNAME = AppCoda; - TargetAttributes = { - F44809261DB9972F0083B681 = { - CreatedOnToolsVersion = 8.0; - DevelopmentTeam = 44JDRP3T56; - LastSwiftMigration = 0820; - ProvisioningStyle = Automatic; - SystemCapabilities = { - com.apple.Maps.iOS = { - enabled = 1; - }; - }; - }; - }; - }; - buildConfigurationList = F44809221DB9972F0083B681 /* Build configuration list for PBXProject "SlidebarMenu" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = F448091E1DB9972F0083B681; - productRefGroup = F44809281DB9972F0083B681 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - F44809261DB9972F0083B681 /* SlidebarMenu */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - F44809251DB9972F0083B681 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - F44809351DB9972F0083B681 /* LaunchScreen.storyboard in Resources */, - F44809321DB9972F0083B681 /* Assets.xcassets in Resources */, - F44809301DB9972F0083B681 /* Main.storyboard in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - F44809231DB9972F0083B681 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 19D355FF1E0E4EC000EFF873 /* SlidebarMenu.swift in Sources */, - 19D355FA1E0E47B900EFF873 /* SWRevealViewController.m in Sources */, - F44809441DBDA9360083B681 /* NewsTableViewController.swift in Sources */, - F448093D1DB9EF100083B681 /* MenuController.swift in Sources */, - F448092B1DB9972F0083B681 /* AppDelegate.swift in Sources */, - F44809461DBDAC730083B681 /* MapViewController.swift in Sources */, - F44809421DBDA87D0083B681 /* NewsTableViewCell.swift in Sources */, - F44809481DBDAC7D0083B681 /* PhotoViewController.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXVariantGroup section */ - F448092E1DB9972F0083B681 /* Main.storyboard */ = { - isa = PBXVariantGroup; - children = ( - F448092F1DB9972F0083B681 /* Base */, - ); - name = Main.storyboard; - sourceTree = ""; - }; - F44809331DB9972F0083B681 /* LaunchScreen.storyboard */ = { - isa = PBXVariantGroup; - children = ( - F44809341DB9972F0083B681 /* Base */, - ); - name = LaunchScreen.storyboard; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - F44809371DB9972F0083B681 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_SUSPICIOUS_MOVES = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - F44809381DB9972F0083B681 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_SUSPICIOUS_MOVES = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - F448093A1DB9972F0083B681 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_MODULES = YES; - DEVELOPMENT_TEAM = 44JDRP3T56; - INFOPLIST_FILE = SlidebarMenu/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.appcoda.SlidebarMenu; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OBJC_BRIDGING_HEADER = "SlidebarMenu/SlidebarMenu-Bridging-Header.h"; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 3.0; - }; - name = Debug; - }; - F448093B1DB9972F0083B681 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_MODULES = YES; - DEVELOPMENT_TEAM = 44JDRP3T56; - INFOPLIST_FILE = SlidebarMenu/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = com.appcoda.SlidebarMenu; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OBJC_BRIDGING_HEADER = "SlidebarMenu/SlidebarMenu-Bridging-Header.h"; - SWIFT_VERSION = 3.0; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - F44809221DB9972F0083B681 /* Build configuration list for PBXProject "SlidebarMenu" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - F44809371DB9972F0083B681 /* Debug */, - F44809381DB9972F0083B681 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - F44809391DB9972F0083B681 /* Build configuration list for PBXNativeTarget "SlidebarMenu" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - F448093A1DB9972F0083B681 /* Debug */, - F448093B1DB9972F0083B681 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = F448091F1DB9972F0083B681 /* Project object */; -} diff --git a/Project 28 - SlidebarMenu/SlidebarMenu.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/SlidebarMenu.xcscheme b/Project 28 - SlidebarMenu/SlidebarMenu.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/SlidebarMenu.xcscheme deleted file mode 100644 index 2fb367d4..00000000 --- a/Project 28 - SlidebarMenu/SlidebarMenu.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/SlidebarMenu.xcscheme +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Project 28 - SlidebarMenu/SlidebarMenu.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/xcschememanagement.plist b/Project 28 - SlidebarMenu/SlidebarMenu.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/xcschememanagement.plist deleted file mode 100644 index 70292876..00000000 --- a/Project 28 - SlidebarMenu/SlidebarMenu.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/xcschememanagement.plist +++ /dev/null @@ -1,22 +0,0 @@ - - - - - SchemeUserState - - SlidebarMenu.xcscheme - - orderHint - 0 - - - SuppressBuildableAutocreation - - F44809261DB9972F0083B681 - - primary - - - - - diff --git a/Project 28 - SlidebarMenu/SlidebarMenu.xcodeproj/xcuserdata/simon.xcuserdatad/xcschemes/SlidebarMenu.xcscheme b/Project 28 - SlidebarMenu/SlidebarMenu.xcodeproj/xcuserdata/simon.xcuserdatad/xcschemes/SlidebarMenu.xcscheme deleted file mode 100644 index f4c744b0..00000000 --- a/Project 28 - SlidebarMenu/SlidebarMenu.xcodeproj/xcuserdata/simon.xcuserdatad/xcschemes/SlidebarMenu.xcscheme +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Project 28 - SlidebarMenu/SlidebarMenu.xcodeproj/xcuserdata/simon.xcuserdatad/xcschemes/xcschememanagement.plist b/Project 28 - SlidebarMenu/SlidebarMenu.xcodeproj/xcuserdata/simon.xcuserdatad/xcschemes/xcschememanagement.plist deleted file mode 100644 index 70292876..00000000 --- a/Project 28 - SlidebarMenu/SlidebarMenu.xcodeproj/xcuserdata/simon.xcuserdatad/xcschemes/xcschememanagement.plist +++ /dev/null @@ -1,22 +0,0 @@ - - - - - SchemeUserState - - SlidebarMenu.xcscheme - - orderHint - 0 - - - SuppressBuildableAutocreation - - F44809261DB9972F0083B681 - - primary - - - - - diff --git a/Project 28 - SlidebarMenu/SlidebarMenu/AppDelegate.swift b/Project 28 - SlidebarMenu/SlidebarMenu/AppDelegate.swift deleted file mode 100644 index 6098f49c..00000000 --- a/Project 28 - SlidebarMenu/SlidebarMenu/AppDelegate.swift +++ /dev/null @@ -1,45 +0,0 @@ -// -// AppDelegate.swift -// SlidebarMenu -// -// Created by Simon Ng on 21/10/2016. -// Copyright © 2016 AppCoda. All rights reserved. -// - -import UIKit - -@UIApplicationMain -class AppDelegate: UIResponder, UIApplicationDelegate { - - var window: UIWindow? - - func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { - // Override point for customization after application launch. - return true - } - - func applicationWillResignActive(_ application: UIApplication) { - // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. - // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. - } - - func applicationDidEnterBackground(_ application: UIApplication) { - // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. - // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. - } - - func applicationWillEnterForeground(_ application: UIApplication) { - // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. - } - - func applicationDidBecomeActive(_ application: UIApplication) { - // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. - } - - func applicationWillTerminate(_ application: UIApplication) { - // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. - } - - -} - diff --git a/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/appcoda-fav-logo.imageset/Contents.json b/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/appcoda-fav-logo.imageset/Contents.json deleted file mode 100644 index ef760707..00000000 --- a/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/appcoda-fav-logo.imageset/Contents.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "filename" : "appcoda-fav-logo.jpg", - "scale" : "1x" - }, - { - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/appcoda-fav-logo.imageset/appcoda-fav-logo.jpg b/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/appcoda-fav-logo.imageset/appcoda-fav-logo.jpg deleted file mode 100644 index 147db6bf..00000000 Binary files a/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/appcoda-fav-logo.imageset/appcoda-fav-logo.jpg and /dev/null differ diff --git a/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/author.imageset/author.jpg b/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/author.imageset/author.jpg deleted file mode 100644 index 1303ba0c..00000000 Binary files a/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/author.imageset/author.jpg and /dev/null differ diff --git a/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/calendar.imageset/Contents.json b/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/calendar.imageset/Contents.json deleted file mode 100644 index d8c420cd..00000000 --- a/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/calendar.imageset/Contents.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "filename" : "calendar.png", - "scale" : "1x" - }, - { - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/calendar.imageset/calendar.png b/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/calendar.imageset/calendar.png deleted file mode 100644 index e77fed02..00000000 Binary files a/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/calendar.imageset/calendar.png and /dev/null differ diff --git a/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/comments.imageset/Contents.json b/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/comments.imageset/Contents.json deleted file mode 100644 index 78acdd5c..00000000 --- a/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/comments.imageset/Contents.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "filename" : "comments.png", - "scale" : "1x" - }, - { - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/comments.imageset/comments.png b/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/comments.imageset/comments.png deleted file mode 100644 index 7198d05c..00000000 Binary files a/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/comments.imageset/comments.png and /dev/null differ diff --git a/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/custom-segue-featured-1024.imageset/Contents.json b/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/custom-segue-featured-1024.imageset/Contents.json deleted file mode 100644 index 1e930127..00000000 --- a/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/custom-segue-featured-1024.imageset/Contents.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "filename" : "custom-segue-featured-1024.jpg", - "scale" : "1x" - }, - { - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/custom-segue-featured-1024.imageset/custom-segue-featured-1024.jpg b/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/custom-segue-featured-1024.imageset/custom-segue-featured-1024.jpg deleted file mode 100644 index 9311c2ac..00000000 Binary files a/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/custom-segue-featured-1024.imageset/custom-segue-featured-1024.jpg and /dev/null differ diff --git a/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/japanvillage.imageset/Contents.json b/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/japanvillage.imageset/Contents.json deleted file mode 100644 index ff563360..00000000 --- a/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/japanvillage.imageset/Contents.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "filename" : "japanvillage.jpg", - "scale" : "1x" - }, - { - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/japanvillage.imageset/japanvillage.jpg b/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/japanvillage.imageset/japanvillage.jpg deleted file mode 100644 index ec5b137c..00000000 Binary files a/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/japanvillage.imageset/japanvillage.jpg and /dev/null differ diff --git a/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/map.imageset/map.png b/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/map.imageset/map.png deleted file mode 100644 index 67984814..00000000 Binary files a/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/map.imageset/map.png and /dev/null differ diff --git a/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/menu.imageset/Contents.json b/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/menu.imageset/Contents.json deleted file mode 100644 index acf46f4d..00000000 --- a/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/menu.imageset/Contents.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "filename" : "menu.png", - "scale" : "1x" - }, - { - "idiom" : "universal", - "filename" : "menu@2x.png", - "scale" : "2x" - }, - { - "idiom" : "universal", - "filename" : "menu@3x.png", - "scale" : "3x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/menu.imageset/menu.png b/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/menu.imageset/menu.png deleted file mode 100644 index fe97b0cf..00000000 Binary files a/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/menu.imageset/menu.png and /dev/null differ diff --git a/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/menu.imageset/menu@2x.png b/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/menu.imageset/menu@2x.png deleted file mode 100644 index f5e9a159..00000000 Binary files a/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/menu.imageset/menu@2x.png and /dev/null differ diff --git a/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/menu.imageset/menu@3x.png b/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/menu.imageset/menu@3x.png deleted file mode 100644 index 9f00717f..00000000 Binary files a/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/menu.imageset/menu@3x.png and /dev/null differ diff --git a/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/news.imageset/Contents.json b/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/news.imageset/Contents.json deleted file mode 100644 index 45477816..00000000 --- a/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/news.imageset/Contents.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "filename" : "news.png", - "scale" : "1x" - }, - { - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/news.imageset/news.png b/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/news.imageset/news.png deleted file mode 100644 index 50fad4d3..00000000 Binary files a/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/news.imageset/news.png and /dev/null differ diff --git a/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/photo.imageset/Contents.json b/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/photo.imageset/Contents.json deleted file mode 100644 index 1f3e2e70..00000000 --- a/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/photo.imageset/Contents.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "filename" : "photo.png", - "scale" : "1x" - }, - { - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/photo.imageset/photo.png b/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/photo.imageset/photo.png deleted file mode 100644 index ed299c2d..00000000 Binary files a/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/photo.imageset/photo.png and /dev/null differ diff --git a/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/tag.imageset/Contents.json b/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/tag.imageset/Contents.json deleted file mode 100644 index 59889db0..00000000 --- a/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/tag.imageset/Contents.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "filename" : "tag.png", - "scale" : "1x" - }, - { - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/tag.imageset/tag.png b/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/tag.imageset/tag.png deleted file mode 100644 index 286efc2f..00000000 Binary files a/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/tag.imageset/tag.png and /dev/null differ diff --git a/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/watchkit-intro.imageset/Contents.json b/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/watchkit-intro.imageset/Contents.json deleted file mode 100644 index b33ce3df..00000000 --- a/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/watchkit-intro.imageset/Contents.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "filename" : "watchkit-intro.jpg", - "scale" : "1x" - }, - { - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/watchkit-intro.imageset/watchkit-intro.jpg b/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/watchkit-intro.imageset/watchkit-intro.jpg deleted file mode 100644 index 3970358b..00000000 Binary files a/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/watchkit-intro.imageset/watchkit-intro.jpg and /dev/null differ diff --git a/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/webkit-featured.imageset/Contents.json b/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/webkit-featured.imageset/Contents.json deleted file mode 100644 index 28220108..00000000 --- a/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/webkit-featured.imageset/Contents.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "filename" : "webkit-featured.jpg", - "scale" : "1x" - }, - { - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/webkit-featured.imageset/webkit-featured.jpg b/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/webkit-featured.imageset/webkit-featured.jpg deleted file mode 100644 index 12691a12..00000000 Binary files a/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/webkit-featured.imageset/webkit-featured.jpg and /dev/null differ diff --git a/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/wishlist.imageset/Contents.json b/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/wishlist.imageset/Contents.json deleted file mode 100644 index b2bb6ca8..00000000 --- a/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/wishlist.imageset/Contents.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "filename" : "wishlist.png", - "scale" : "1x" - }, - { - "idiom" : "universal", - "scale" : "2x" - }, - { - "idiom" : "universal", - "scale" : "3x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/wishlist.imageset/wishlist.png b/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/wishlist.imageset/wishlist.png deleted file mode 100644 index e17ff395..00000000 Binary files a/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/wishlist.imageset/wishlist.png and /dev/null differ diff --git a/Project 28 - SlidebarMenu/SlidebarMenu/Base.lproj/Main.storyboard b/Project 28 - SlidebarMenu/SlidebarMenu/Base.lproj/Main.storyboard deleted file mode 100644 index 8a2b1362..00000000 --- a/Project 28 - SlidebarMenu/SlidebarMenu/Base.lproj/Main.storyboard +++ /dev/null @@ -1,554 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Project 28 - SlidebarMenu/SlidebarMenu/MapViewController.swift b/Project 28 - SlidebarMenu/SlidebarMenu/MapViewController.swift deleted file mode 100644 index 9f6095a6..00000000 --- a/Project 28 - SlidebarMenu/SlidebarMenu/MapViewController.swift +++ /dev/null @@ -1,21 +0,0 @@ -// -// MapViewController.swift -// SlidebarMenu -// -// Created by Simon Ng on 24/10/2016. -// Copyright © 2016 AppCoda. All rights reserved. -// - -import UIKit - -class MapViewController: UIViewController { - - @IBOutlet var menuButton:UIBarButtonItem! - @IBOutlet weak var extraButton: UIBarButtonItem! - - override func viewDidLoad() { - super.viewDidLoad() - - addSideBarMenu(leftMenuButton: menuButton, rightMenuButton: extraButton) - } -} diff --git a/Project 28 - SlidebarMenu/SlidebarMenu/MenuController.swift b/Project 28 - SlidebarMenu/SlidebarMenu/MenuController.swift deleted file mode 100644 index 2cef516f..00000000 --- a/Project 28 - SlidebarMenu/SlidebarMenu/MenuController.swift +++ /dev/null @@ -1,24 +0,0 @@ -// -// MenuController.swift -// SlidebarMenu -// -// Created by Simon Ng on 21/10/2016. -// Copyright © 2016 AppCoda. All rights reserved. -// - -import UIKit - -class MenuController: UITableViewController { - - override func viewDidLoad() { - super.viewDidLoad() - - } - - override func didReceiveMemoryWarning() { - super.didReceiveMemoryWarning() - // Dispose of any resources that can be recreated. - } - - -} diff --git a/Project 28 - SlidebarMenu/SlidebarMenu/NewsTableViewCell.swift b/Project 28 - SlidebarMenu/SlidebarMenu/NewsTableViewCell.swift deleted file mode 100644 index f2dff108..00000000 --- a/Project 28 - SlidebarMenu/SlidebarMenu/NewsTableViewCell.swift +++ /dev/null @@ -1,29 +0,0 @@ -// -// NewsTableViewCell.swift -// SlidebarMenu -// -// Created by Simon Ng on 24/10/2016. -// Copyright © 2016 AppCoda. All rights reserved. -// - -import UIKit - -class NewsTableViewCell: UITableViewCell { - - @IBOutlet var postImageView:UIImageView! - @IBOutlet var authorImageView:UIImageView! - @IBOutlet var postTitleLabel:UILabel! - @IBOutlet var authorLabel:UILabel! - - override func awakeFromNib() { - super.awakeFromNib() - // Initialization code - } - - override func setSelected(_ selected: Bool, animated: Bool) { - super.setSelected(selected, animated: animated) - - // Configure the view for the selected state - } - -} diff --git a/Project 28 - SlidebarMenu/SlidebarMenu/NewsTableViewController.swift b/Project 28 - SlidebarMenu/SlidebarMenu/NewsTableViewController.swift deleted file mode 100644 index 34dcef33..00000000 --- a/Project 28 - SlidebarMenu/SlidebarMenu/NewsTableViewController.swift +++ /dev/null @@ -1,70 +0,0 @@ -// -// NewsTableViewController.swift -// SlidebarMenu -// -// Created by Simon Ng on 24/10/2016. -// Copyright © 2016 AppCoda. All rights reserved. -// - -import UIKit - -class NewsTableViewController: UITableViewController { - - @IBOutlet var menuButton:UIBarButtonItem! - @IBOutlet weak var extraButton: UIBarButtonItem! - - override func viewDidLoad() { - super.viewDidLoad() - - tableView.estimatedRowHeight = 242.0 - tableView.rowHeight = UITableViewAutomaticDimension - - addSideBarMenu(leftMenuButton: menuButton, rightMenuButton: extraButton) - } - - override func didReceiveMemoryWarning() { - super.didReceiveMemoryWarning() - // Dispose of any resources that can be recreated. - } - - // MARK: - Table view data source - - override func numberOfSections(in tableView: UITableView) -> Int { - // Return the number of sections - return 1 - } - - override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - // Return the number of rows - return 3 - } - - override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { - let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! NewsTableViewCell - - // Configure the cell... - if indexPath.row == 0 { - cell.postImageView.image = UIImage(named: "watchkit-intro") - cell.postTitleLabel.text = "WatchKit Introduction: Building a Simple Guess Game" - cell.authorLabel.text = "Simon Ng" - cell.authorImageView.image = UIImage(named: "author") - - } else if indexPath.row == 1 { - cell.postImageView.image = UIImage(named: "custom-segue-featured-1024") - cell.postTitleLabel.text = "Building a Chat App in Swift Using Multipeer Connectivity Framework" - cell.authorLabel.text = "Gabriel Theodoropoulos" - cell.authorImageView.image = UIImage(named: "appcoda-fav-logo") - - } else { - cell.postImageView.image = UIImage(named: "webkit-featured") - cell.postTitleLabel.text = "A Beginner’s Guide to Animated Custom Segues in iOS 8" - cell.authorLabel.text = "Gabriel Theodoropoulos" - cell.authorImageView.image = UIImage(named: "appcoda-fav-logo") - - } - - return cell - } -} - - diff --git a/Project 28 - SlidebarMenu/SlidebarMenu/PhotoViewController.swift b/Project 28 - SlidebarMenu/SlidebarMenu/PhotoViewController.swift deleted file mode 100644 index fe5b0392..00000000 --- a/Project 28 - SlidebarMenu/SlidebarMenu/PhotoViewController.swift +++ /dev/null @@ -1,21 +0,0 @@ -// -// PhotoViewController.swift -// SlidebarMenu -// -// Created by Simon Ng on 24/10/2016. -// Copyright © 2016 AppCoda. All rights reserved. -// - -import UIKit - -class PhotoViewController: UIViewController { - - @IBOutlet var menuButton:UIBarButtonItem! - @IBOutlet weak var extraButton: UIBarButtonItem! - - override func viewDidLoad() { - super.viewDidLoad() - - addSideBarMenu(leftMenuButton: menuButton, rightMenuButton: extraButton) - } -} diff --git a/Project 28 - SlidebarMenu/SlidebarMenu/SWRevealViewController.h b/Project 28 - SlidebarMenu/SlidebarMenu/SWRevealViewController.h deleted file mode 100755 index 345dfaa0..00000000 --- a/Project 28 - SlidebarMenu/SlidebarMenu/SWRevealViewController.h +++ /dev/null @@ -1,422 +0,0 @@ -/* - - Copyright (c) 2013 Joan Lluch - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is furnished - to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - THE SOFTWARE. - - Early code inspired on a similar class by Philip Kluz (Philip.Kluz@zuui.org) - -*/ - -/* - - RELEASE NOTES - - Version 2.4.0 (Current Version) - - - Updated behaviour of appearance method calls on child controllers - - Removes Xcode 6.3.1 warnings - - Version 2.3.0 - - - StoryBoard initializing bug fix - - Minor Code refactoring - - Version 2.2.0 - - - State Restoration support. - - Reverted panGestureRecognizer implementation to before v2.1.0 (works better). - - New properties 'toggleAnimationType', 'springDampingRatio'. Default reveal animation is 'Spring' - - New property 'frontViewShadowColor' - - New properties 'clipsViewsToBounds' and '_extendedPointInsideHit' - - New delegate methods for finer control of front view location in the overdraw area, as long as deprecation note on former delegate methods - - Other minor changes that should not affect current implementations - - Version 2.1.0 - - - Removed SWDirectionPanGestureRecognizer. Horizontal panning is filtered on the shouldBegin delegate. This is cleaner, I hope it does not break previous funcionality - - Took a cleaner approach to storyboard support. SWRevealViewControllerSegue is now deprecated and you should use SWRevealViewControllerSegueSetController and SWRevealViewControllerSeguePushController instead. - - A minor change on the autoresizingMask of the internal views to fix a glitch on iOS8. This should not affect iOS7 - - Version 2.0.2 - - - Added new delegates for better control of gesture recognizers - - Version 2.0.1 - - - Fix: draggableBorderWidth now correctly handles the cases where one of the rear controllers is not provided - - Fix: the shadow related properties are now granted at any time after view load, not just after initialization. - - Version 2.0.0 - -- Dropped support for iOS6 and earlier. This version will only work on iOS7 - -- The method setFrontViewController:animated: does not longer perform a full reveal animation. Instead it just replaces the frontViewController in - its current position. Use the new pushFrontViewController:animated: method to perform a replacement of the front controlles with reveal animation - as in the previous version - - IMPORTANT: You must replace all calls to setFrontViewController:animated by calls to pushFrontViewController:animated to prevent breaking - functionality on existing projects. - -- Added support for animated replacement of child controllers: setRearViewController, setFrontViewController, setRightViewController now have animated versions. - -- The new 'replaceViewAnimationDuration' property sets the default duration of child viewController replacement. - -- Added the following new delegate methods - revealController:willAddViewController:forOperation:animated: - revealController:didAddViewController:forOperation:animated: - -- The class also supports custom UIViewControllerAnimatedTransitioning related with the replacement of child viewControllers. - You can implement the following new delegate method: revealController:animationControllerForOperation:fromViewController:toViewController: - and provide an object conforming to UIViewControllerAnimatedTransitioning to implement custom animations. - - Version 1.1.3 - -- Reverted the supportedInterfaceOrientations to the default behavior. This is consistent with Apple provided controllers - -- The presentFrontViewHierarchically now dynamically takes into account the smaller header height of bars on iPhone landscape orientation - - Version 1.1.2 - - - The status bar style and appearance are now handled in sync with the class animations. - You can implement the methods preferredStatusBarStyle and prefersStatusBarHidden on your child controllers to define the desired appearance - - - The loadView method now calls a method, loadStoryboardControllers, just for the purpose of loading child controllers from a storyboard. - You can override this method and remove the @try @catch statements if you want the debugger not to stop at them in case you have set an exception breakpoint. - - Version 1.1.1 - - - You can now get a tapGestureRecognizer from the class. See the tapGestureRecognizer method for more information. - - - Both the panGestureRecognizer and the tapGestureRecognizer are now attached to the revealViewController's front content view - by default, so they will start working just by calling their access methods even if you do not attach them to any of your views. - This enables you to dissable interactions on your views -for example based on position- without breaking normal gesture behavior. - - - Corrected a bug that caused a crash on iOS6 and earlier. - - Version 1.1.0 - - - The method setFrontViewController:animated now performs the correct animations both for left and right controllers. - - - The class now automatically handles the status bar appearance depending on the currently shown child controller. - - Version 1.0.8 - - - Support for constant width frontView by setting a negative value to reveal widths. See properties rearViewRevealWidth and rightViewRevealWidth - - - Support for draggableBorderWidth. See property of the same name. - - - The Pan gesture recongnizer can be disabled by implementing the following delegate method and returning NO - revealControllerPanGestureShouldBegin: - - - Added the ability to track pan gesture reveal progress through the following new delegate methods - revealController:panGestureBeganFromLocation:progress: - revealController:panGestureMovedToLocation:progress: - revealController:panGestureEndedToLocation:progress: - - Previous Versions - - - No release notes were updated for previous versions. - -*/ - - -#import - -@class SWRevealViewController; -@protocol SWRevealViewControllerDelegate; - -#pragma mark - SWRevealViewController Class - -// Enum values for setFrontViewPosition:animated: -typedef NS_ENUM( NSInteger, FrontViewPosition) -{ - // Front controller is removed from view. Animated transitioning from this state will cause the same - // effect than animating from FrontViewPositionLeftSideMost. Use this instead of FrontViewPositionLeftSideMost when - // you want to remove the front view controller view from the view hierarchy. - FrontViewPositionLeftSideMostRemoved, - - // Left most position, front view is presented left-offseted by rightViewRevealWidth+rigthViewRevealOverdraw - FrontViewPositionLeftSideMost, - - // Left position, front view is presented left-offseted by rightViewRevealWidth - FrontViewPositionLeftSide, - - // Center position, rear view is hidden behind front controller - FrontViewPositionLeft, - - // Right possition, front view is presented right-offseted by rearViewRevealWidth - FrontViewPositionRight, - - // Right most possition, front view is presented right-offseted by rearViewRevealWidth+rearViewRevealOverdraw - FrontViewPositionRightMost, - - // Front controller is removed from view. Animated transitioning from this state will cause the same - // effect than animating from FrontViewPositionRightMost. Use this instead of FrontViewPositionRightMost when - // you intent to remove the front controller view from the view hierarchy. - FrontViewPositionRightMostRemoved, - -}; - -// Enum values for toggleAnimationType -typedef NS_ENUM(NSInteger, SWRevealToggleAnimationType) -{ - SWRevealToggleAnimationTypeSpring, // <- produces a spring based animation - SWRevealToggleAnimationTypeEaseOut, // <- produces an ease out curve animation -}; - - -@interface SWRevealViewController : UIViewController - -/* Basic API */ - -// Object instance init and rear view setting -- (id)initWithRearViewController:(UIViewController *)rearViewController frontViewController:(UIViewController *)frontViewController; - -// Rear view controller, can be nil if not used -@property (nonatomic) UIViewController *rearViewController; -- (void)setRearViewController:(UIViewController *)rearViewController animated:(BOOL)animated; - -// Optional right view controller, can be nil if not used -@property (nonatomic) UIViewController *rightViewController; -- (void)setRightViewController:(UIViewController *)rightViewController animated:(BOOL)animated; - -// Front view controller, can be nil on initialization but must be supplied by the time the view is loaded -@property (nonatomic) UIViewController *frontViewController; -- (void)setFrontViewController:(UIViewController *)frontViewController animated:(BOOL)animated; - -// Sets the frontViewController using a default set of chained animations consisting on moving the -// presented frontViewController to the right most possition, replacing it, and moving it back to the left position -- (void)pushFrontViewController:(UIViewController *)frontViewController animated:(BOOL)animated; - -// Sets the frontViewController position. You can call the animated version several times with different -// positions to obtain a set of animations that will be performed in order one after the other. -@property (nonatomic) FrontViewPosition frontViewPosition; -- (void)setFrontViewPosition:(FrontViewPosition)frontViewPosition animated:(BOOL)animated; - -// The following methods are meant to be directly connected to the action method of a button -// to perform user triggered postion change of the controller views. This is ussually added to a -// button on top left or right of the frontViewController -- (IBAction)revealToggle:(id)sender; -- (IBAction)rightRevealToggle:(id)sender; // <-- simetric implementation of the above for the rightViewController - -// Toogles the current state of the front controller between Left or Right and fully visible -// Use setFrontViewPosition to set a particular position -- (void)revealToggleAnimated:(BOOL)animated; -- (void)rightRevealToggleAnimated:(BOOL)animated; // <-- simetric implementation of the above for the rightViewController - -// The following method will provide a panGestureRecognizer suitable to be added to any view -// in order to perform usual drag and swipe gestures to reveal the rear views. This is usually added to the top bar -// of a front controller, but it can be added to your frontViewController view or to the reveal controller view to provide full screen panning. -// By default, the panGestureRecognizer is added to the view containing the front controller view. To keep this default behavior -// you still need to call this method, just don't add it to any of your views. The default setup allows you to dissable -// user interactions on your controller views without affecting the recognizer. -- (UIPanGestureRecognizer*)panGestureRecognizer; - -// The following method will provide a tapGestureRecognizer suitable to be added to any view on the frontController -// for concealing the rear views. By default no tap recognizer is created or added to any view, however if you call this method after -// the controller's view has been loaded the recognizer is added to the reveal controller's front container view. -// Thus, you can disable user interactions on your frontViewController view without affecting the tap recognizer. -- (UITapGestureRecognizer*)tapGestureRecognizer; - -/* The following properties are provided for further customization, they are set to default values on initialization, - you do not generally have to set them */ - -// Defines how much of the rear or right view is shown, default is 260. -// Negative values indicate that the reveal width should be computed by substracting the full front view width, -// so the revealed frontView width is kept constant when bounds change as opposed to the rear or right width. -@property (nonatomic) CGFloat rearViewRevealWidth; -@property (nonatomic) CGFloat rightViewRevealWidth; // <-- simetric implementation of the above for the rightViewController - -// Defines how much of an overdraw can occur when dragging further than 'rearViewRevealWidth', default is 60. -@property (nonatomic) CGFloat rearViewRevealOverdraw; -@property (nonatomic) CGFloat rightViewRevealOverdraw; // <-- simetric implementation of the above for the rightViewController - -// Defines how much displacement is applied to the rear view when animating or dragging the front view, default is 40. -@property (nonatomic) CGFloat rearViewRevealDisplacement; -@property (nonatomic) CGFloat rightViewRevealDisplacement; // <-- simetric implementation of the above for the rightViewController - -// Defines a width on the border of the view attached to the panGesturRecognizer where the gesture is allowed, -// default is 0 which means no restriction. -@property (nonatomic) CGFloat draggableBorderWidth; - -// If YES (the default) the controller will bounce to the Left position when dragging further than 'rearViewRevealWidth' -@property (nonatomic) BOOL bounceBackOnOverdraw; -@property (nonatomic) BOOL bounceBackOnLeftOverdraw; // <-- simetric implementation of the above for the rightViewController - -// If YES (default is NO) the controller will allow permanent dragging up to the rightMostPosition -@property (nonatomic) BOOL stableDragOnOverdraw; -@property (nonatomic) BOOL stableDragOnLeftOverdraw; // <-- simetric implementation of the above for the rightViewController - -// If YES (default is NO) the front view controller will be ofsseted vertically by the height of a navigation bar. -// Use this on iOS7 when you add an instance of RevealViewController as a child of a UINavigationController (or another SWRevealViewController) -// and you want the front view controller to be presented below the navigation bar of its UINavigationController grand parent. -// The rearViewController will still appear full size and blurred behind the navigation bar of its UINavigationController grand parent -@property (nonatomic) BOOL presentFrontViewHierarchically; - -// Velocity required for the controller to toggle its state based on a swipe movement, default is 250 -@property (nonatomic) CGFloat quickFlickVelocity; - -// Duration for the revealToggle animation, default is 0.25 -@property (nonatomic) NSTimeInterval toggleAnimationDuration; - -// Animation type, default is SWRevealToggleAnimationTypeSpring -@property (nonatomic) SWRevealToggleAnimationType toggleAnimationType; - -// When animation type is SWRevealToggleAnimationTypeSpring determines the damping ratio, default is 1 -@property (nonatomic) CGFloat springDampingRatio; - -// Duration for animated replacement of view controllers -@property (nonatomic) NSTimeInterval replaceViewAnimationDuration; - -// Defines the radius of the front view's shadow, default is 2.5f -@property (nonatomic) CGFloat frontViewShadowRadius; - -// Defines the radius of the front view's shadow offset default is {0.0f,2.5f} -@property (nonatomic) CGSize frontViewShadowOffset; - -// Defines the front view's shadow opacity, default is 1.0f -@property (nonatomic) CGFloat frontViewShadowOpacity; - -// Defines the front view's shadow color, default is blackColor -@property (nonatomic) UIColor *frontViewShadowColor; - -// Defines whether the controller should clip subviews to its view bounds. Default is NO. -// Set this to YES when you are presenting this controller as a non full-screen child of a -// custom container controller which does not explicitly clips its subviews. -@property (nonatomic) BOOL clipsViewsToBounds; - -// Defines whether your views clicable area extends beyond the bounds of this controller. Default is NO. -// Set this to YES if you are presenting this controller as a non full-screen child of a custom container and you are not -// clipping your front view to this controller bounds. -@property (nonatomic) BOOL extendsPointInsideHit; - -/* The class properly handles all the relevant calls to appearance methods on the contained controllers. - Moreover you can assign a delegate to let the class inform you on positions and animation activity */ - -// Delegate -@property (nonatomic,weak) id delegate; - -@end - - -#pragma mark - SWRevealViewControllerDelegate Protocol - -typedef enum -{ - SWRevealControllerOperationNone, - SWRevealControllerOperationReplaceRearController, - SWRevealControllerOperationReplaceFrontController, - SWRevealControllerOperationReplaceRightController, - -} SWRevealControllerOperation; - - -@protocol SWRevealViewControllerDelegate - -@optional - -// The following delegate methods will be called before and after the front view moves to a position -- (void)revealController:(SWRevealViewController *)revealController willMoveToPosition:(FrontViewPosition)position; -- (void)revealController:(SWRevealViewController *)revealController didMoveToPosition:(FrontViewPosition)position; - -// This will be called inside the reveal animation, thus you can use it to place your own code that will be animated in sync -- (void)revealController:(SWRevealViewController *)revealController animateToPosition:(FrontViewPosition)position; - -// Implement this to return NO when you want the pan gesture recognizer to be ignored -- (BOOL)revealControllerPanGestureShouldBegin:(SWRevealViewController *)revealController; - -// Implement this to return NO when you want the tap gesture recognizer to be ignored -- (BOOL)revealControllerTapGestureShouldBegin:(SWRevealViewController *)revealController; - -// Implement this to return YES if you want other gesture recognizer to share touch events with the pan gesture -- (BOOL)revealController:(SWRevealViewController *)revealController - panGestureRecognizerShouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer; - -// Implement this to return YES if you want other gesture recognizer to share touch events with the tap gesture -- (BOOL)revealController:(SWRevealViewController *)revealController - tapGestureRecognizerShouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer; - -// Called when the gestureRecognizer began and ended -- (void)revealControllerPanGestureBegan:(SWRevealViewController *)revealController; -- (void)revealControllerPanGestureEnded:(SWRevealViewController *)revealController; - -// The following methods provide a means to track the evolution of the gesture recognizer. -// The 'location' parameter is the X origin coordinate of the front view as the user drags it -// The 'progress' parameter is a number ranging from 0 to 1 indicating the front view location relative to the -// rearRevealWidth or rightRevealWidth. 1 is fully revealed, dragging ocurring in the overDraw region will result in values above 1. -// The 'overProgress' parameter is a number ranging from 0 to 1 indicating the front view location relative to the -// overdraw region. 0 is fully revealed, 1 is fully overdrawn. Negative values occur inside the normal reveal region -- (void)revealController:(SWRevealViewController *)revealController panGestureBeganFromLocation:(CGFloat)location progress:(CGFloat)progress overProgress:(CGFloat)overProgress; -- (void)revealController:(SWRevealViewController *)revealController panGestureMovedToLocation:(CGFloat)location progress:(CGFloat)progress overProgress:(CGFloat)overProgress; -- (void)revealController:(SWRevealViewController *)revealController panGestureEndedToLocation:(CGFloat)location progress:(CGFloat)progress overProgress:(CGFloat)overProgress; - -// Notification of child controller replacement -- (void)revealController:(SWRevealViewController *)revealController willAddViewController:(UIViewController *)viewController - forOperation:(SWRevealControllerOperation)operation animated:(BOOL)animated; -- (void)revealController:(SWRevealViewController *)revealController didAddViewController:(UIViewController *)viewController - forOperation:(SWRevealControllerOperation)operation animated:(BOOL)animated; - -// Support for custom transition animations while replacing child controllers. If implemented, it will be fired in response -// to calls to 'setXXViewController' methods -- (id)revealController:(SWRevealViewController *)revealController - animationControllerForOperation:(SWRevealControllerOperation)operation fromViewController:(UIViewController *)fromVC toViewController:(UIViewController *)toVC; - -// DEPRECATED - The following delegate methods will be removed some time in the future -- (void)revealController:(SWRevealViewController *)revealController panGestureBeganFromLocation:(CGFloat)location progress:(CGFloat)progress; // (DEPRECATED) -- (void)revealController:(SWRevealViewController *)revealController panGestureMovedToLocation:(CGFloat)location progress:(CGFloat)progress; // (DEPRECATED) -- (void)revealController:(SWRevealViewController *)revealController panGestureEndedToLocation:(CGFloat)location progress:(CGFloat)progress; // (DEPRECATED) -@end - - -#pragma mark - UIViewController(SWRevealViewController) Category - -// A category of UIViewController to let childViewControllers easily access their parent SWRevealViewController -@interface UIViewController(SWRevealViewController) - -- (SWRevealViewController*)revealViewController; - -@end - - -#pragma mark - StoryBoard support Classes - -/* StoryBoard support */ - -// String identifiers to be applied to segues on a storyboard -extern NSString* const SWSegueRearIdentifier; // this is @"sw_rear" -extern NSString* const SWSegueFrontIdentifier; // this is @"sw_front" -extern NSString* const SWSegueRightIdentifier; // this is @"sw_right" - -/* This will allow the class to be defined on a storyboard */ - -// Use this along with one of the above segue identifiers to segue to the initial state -@interface SWRevealViewControllerSegueSetController : UIStoryboardSegue -@end - -// Use this to push a view controller -@interface SWRevealViewControllerSeguePushController : UIStoryboardSegue -@end - - -//#pragma mark - SWRevealViewControllerSegue (DEPRECATED) -// -//@interface SWRevealViewControllerSegue : UIStoryboardSegue // DEPRECATED: USE SWRevealViewControllerSegueSetController instead -//@property (nonatomic, strong) void(^performBlock)( SWRevealViewControllerSegue* segue, UIViewController* svc, UIViewController* dvc ); -//@end diff --git a/Project 28 - SlidebarMenu/SlidebarMenu/SWRevealViewController.m b/Project 28 - SlidebarMenu/SlidebarMenu/SWRevealViewController.m deleted file mode 100755 index d378d135..00000000 --- a/Project 28 - SlidebarMenu/SlidebarMenu/SWRevealViewController.m +++ /dev/null @@ -1,1936 +0,0 @@ -/* - - Copyright (c) 2013 Joan Lluch - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is furnished - to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - THE SOFTWARE. - - Early code inspired on a similar class by Philip Kluz (Philip.Kluz@zuui.org) - -*/ - -#import - -#import "SWRevealViewController.h" - - -#pragma mark - StatusBar Helper Function - -// computes the required offset adjustment due to the status bar for the passed in view, -// it will return the statusBar height if view fully overlaps the statusBar, otherwise returns 0.0f -static CGFloat statusBarAdjustment( UIView* view ) -{ - CGFloat adjustment = 0.0f; - UIApplication *app = [UIApplication sharedApplication]; - CGRect viewFrame = [view convertRect:view.bounds toView:[app keyWindow]]; - CGRect statusBarFrame = [app statusBarFrame]; - - if ( CGRectIntersectsRect(viewFrame, statusBarFrame) ) - adjustment = fminf(statusBarFrame.size.width, statusBarFrame.size.height); - - return adjustment; -} - - -#pragma mark - SWRevealView Class - -@interface SWRevealView: UIView -{ - __weak SWRevealViewController *_c; -} - -@property (nonatomic, readonly) UIView *rearView; -@property (nonatomic, readonly) UIView *rightView; -@property (nonatomic, readonly) UIView *frontView; -@property (nonatomic, assign) BOOL disableLayout; - -@end - - -@interface SWRevealViewController() -- (void)_getRevealWidth:(CGFloat*)pRevealWidth revealOverDraw:(CGFloat*)pRevealOverdraw forSymetry:(int)symetry; -- (void)_getBounceBack:(BOOL*)pBounceBack pStableDrag:(BOOL*)pStableDrag forSymetry:(int)symetry; -- (void)_getAdjustedFrontViewPosition:(FrontViewPosition*)frontViewPosition forSymetry:(int)symetry; -@end - - -@implementation SWRevealView - - -static CGFloat scaledValue( CGFloat v1, CGFloat min2, CGFloat max2, CGFloat min1, CGFloat max1) -{ - CGFloat result = min2 + (v1-min1)*((max2-min2)/(max1-min1)); - if ( result != result ) return min2; // nan - if ( result < min2 ) return min2; - if ( result > max2 ) return max2; - return result; -} - - -- (id)initWithFrame:(CGRect)frame controller:(SWRevealViewController*)controller -{ - self = [super initWithFrame:frame]; - if ( self ) - { - _c = controller; - CGRect bounds = self.bounds; - - _frontView = [[UIView alloc] initWithFrame:bounds]; - _frontView.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight; - [self reloadShadow]; - - [self addSubview:_frontView]; - } - return self; -} - - -- (void)reloadShadow -{ - CALayer *frontViewLayer = _frontView.layer; - frontViewLayer.shadowColor = [_c.frontViewShadowColor CGColor]; - frontViewLayer.shadowOpacity = _c.frontViewShadowOpacity; - frontViewLayer.shadowOffset = _c.frontViewShadowOffset; - frontViewLayer.shadowRadius = _c.frontViewShadowRadius; -} - - -- (CGRect)hierarchycalFrameAdjustment:(CGRect)frame -{ - if ( _c.presentFrontViewHierarchically ) - { - UINavigationBar *dummyBar = [[UINavigationBar alloc] init]; - CGFloat barHeight = [dummyBar sizeThatFits:CGSizeMake(100,100)].height; - CGFloat offset = barHeight + statusBarAdjustment(self); - frame.origin.y += offset; - frame.size.height -= offset; - } - return frame; -} - - -- (void)prepareRearViewForPosition:(FrontViewPosition)newPosition -{ - if ( _rearView == nil ) - { - _rearView = [[UIView alloc] initWithFrame:self.bounds]; - _rearView.autoresizingMask = /*UIViewAutoresizingFlexibleWidth|*/UIViewAutoresizingFlexibleHeight; - [self insertSubview:_rearView belowSubview:_frontView]; - } - - CGFloat xLocation = [self frontLocationForPosition:_c.frontViewPosition]; - [self _layoutRearViewsForLocation:xLocation]; - [self _prepareForNewPosition:newPosition]; -} - - -- (void)prepareRightViewForPosition:(FrontViewPosition)newPosition -{ - if ( _rightView == nil ) - { - _rightView = [[UIView alloc] initWithFrame:self.bounds]; - _rightView.autoresizingMask = /*UIViewAutoresizingFlexibleWidth|*/UIViewAutoresizingFlexibleHeight; - [self insertSubview:_rightView belowSubview:_frontView]; - } - - CGFloat xLocation = [self frontLocationForPosition:_c.frontViewPosition]; - [self _layoutRearViewsForLocation:xLocation]; - [self _prepareForNewPosition:newPosition]; -} - - -- (void)unloadRearView -{ - [_rearView removeFromSuperview]; - _rearView = nil; -} - - -- (void)unloadRightView -{ - [_rightView removeFromSuperview]; - _rightView = nil; -} - - -- (CGFloat)frontLocationForPosition:(FrontViewPosition)frontViewPosition -{ - CGFloat revealWidth; - CGFloat revealOverdraw; - - CGFloat location = 0.0f; - - int symetry = frontViewPosition FrontViewPositionRight ) - location = revealWidth + revealOverdraw; - - return location*symetry; -} - - -- (void)dragFrontViewToXLocation:(CGFloat)xLocation -{ - CGRect bounds = self.bounds; - - xLocation = [self _adjustedDragLocationForLocation:xLocation]; - [self _layoutRearViewsForLocation:xLocation]; - - CGRect frame = CGRectMake(xLocation, 0.0f, bounds.size.width, bounds.size.height); - _frontView.frame = [self hierarchycalFrameAdjustment:frame]; -} - - -# pragma mark - overrides - -- (void)layoutSubviews -{ - if ( _disableLayout ) return; - - CGRect bounds = self.bounds; - - FrontViewPosition position = _c.frontViewPosition; - CGFloat xLocation = [self frontLocationForPosition:position]; - - // set rear view frames - [self _layoutRearViewsForLocation:xLocation]; - - // set front view frame - CGRect frame = CGRectMake(xLocation, 0.0f, bounds.size.width, bounds.size.height); - _frontView.frame = [self hierarchycalFrameAdjustment:frame]; - - // setup front view shadow path if needed (front view loaded and not removed) - UIViewController *frontViewController = _c.frontViewController; - BOOL viewLoaded = frontViewController != nil && frontViewController.isViewLoaded; - BOOL viewNotRemoved = position > FrontViewPositionLeftSideMostRemoved && position < FrontViewPositionRightMostRemoved; - CGRect shadowBounds = viewLoaded && viewNotRemoved ? _frontView.bounds : CGRectZero; - - UIBezierPath *shadowPath = [UIBezierPath bezierPathWithRect:shadowBounds]; - _frontView.layer.shadowPath = shadowPath.CGPath; -} - - -- (BOOL)pointInsideD:(CGPoint)point withEvent:(UIEvent *)event -{ - BOOL isInside = [super pointInside:point withEvent:event]; - if ( _c.extendsPointInsideHit ) - { - if ( !isInside && _rearView && [_c.rearViewController isViewLoaded] ) - { - CGPoint pt = [self convertPoint:point toView:_rearView]; - isInside = [_rearView pointInside:pt withEvent:event]; - } - - if ( !isInside && _frontView && [_c.frontViewController isViewLoaded] ) - { - CGPoint pt = [self convertPoint:point toView:_frontView]; - isInside = [_frontView pointInside:pt withEvent:event]; - } - - if ( !isInside && _rightView && [_c.rightViewController isViewLoaded] ) - { - CGPoint pt = [self convertPoint:point toView:_rightView]; - isInside = [_rightView pointInside:pt withEvent:event]; - } - } - return isInside; -} - - -- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event -{ - BOOL isInside = [super pointInside:point withEvent:event]; - if ( !isInside && _c.extendsPointInsideHit ) - { - UIView *testViews[] = { _rearView, _frontView, _rightView }; - UIViewController *testControllers[] = { _c.rearViewController, _c.frontViewController, _c.rightViewController }; - - for ( NSInteger i=0 ; i<3 && !isInside ; i++ ) - { - if ( testViews[i] && [testControllers[i] isViewLoaded] ) - { - CGPoint pt = [self convertPoint:point toView:testViews[i]]; - isInside = [testViews[i] pointInside:pt withEvent:event]; - } - } - } - return isInside; -} - - -# pragma mark - private - - -- (void)_layoutRearViewsForLocation:(CGFloat)xLocation -{ - CGRect bounds = self.bounds; - - CGFloat rearRevealWidth = _c.rearViewRevealWidth; - if ( rearRevealWidth < 0) rearRevealWidth = bounds.size.width + _c.rearViewRevealWidth; - - CGFloat rearXLocation = scaledValue(xLocation, -_c.rearViewRevealDisplacement, 0, 0, rearRevealWidth); - - CGFloat rearWidth = rearRevealWidth + _c.rearViewRevealOverdraw; - _rearView.frame = CGRectMake(rearXLocation, 0.0, rearWidth, bounds.size.height); - - CGFloat rightRevealWidth = _c.rightViewRevealWidth; - if ( rightRevealWidth < 0) rightRevealWidth = bounds.size.width + _c.rightViewRevealWidth; - - CGFloat rightXLocation = scaledValue(xLocation, 0, _c.rightViewRevealDisplacement, -rightRevealWidth, 0); - - CGFloat rightWidth = rightRevealWidth + _c.rightViewRevealOverdraw; - _rightView.frame = CGRectMake(bounds.size.width-rightWidth+rightXLocation, 0.0f, rightWidth, bounds.size.height); -} - - -- (void)_prepareForNewPosition:(FrontViewPosition)newPosition; -{ - if ( _rearView == nil || _rightView == nil ) - return; - - int symetry = newPosition 0 && rearIndex < rightIndex) ) - [self exchangeSubviewAtIndex:rightIndex withSubviewAtIndex:rearIndex]; -} - - -- (CGFloat)_adjustedDragLocationForLocation:(CGFloat)x -{ - CGFloat result; - - CGFloat revealWidth; - CGFloat revealOverdraw; - BOOL bounceBack; - BOOL stableDrag; - FrontViewPosition position = _c.frontViewPosition; - - int symetry = x<0 ? -1 : 1; - - [_c _getRevealWidth:&revealWidth revealOverDraw:&revealOverdraw forSymetry:symetry]; - [_c _getBounceBack:&bounceBack pStableDrag:&stableDrag forSymetry:symetry]; - - BOOL stableTrack = !bounceBack || stableDrag || position==FrontViewPositionRightMost || position==FrontViewPositionLeftSideMost; - if ( stableTrack ) - { - revealWidth += revealOverdraw; - revealOverdraw = 0.0f; - } - - x = x * symetry; - - if (x <= revealWidth) - result = x; // Translate linearly. - - else if (x <= revealWidth+2*revealOverdraw) - result = revealWidth + (x-revealWidth)/2; // slow down translation by halph the movement. - - else - result = revealWidth+revealOverdraw; // keep at the rightMost location. - - return result * symetry; -} - -@end - - -#pragma mark - SWContextTransitioningObject - -@interface SWContextTransitionObject : NSObject -@end - - -@implementation SWContextTransitionObject -{ - __weak SWRevealViewController *_revealVC; - UIView *_view; - UIViewController *_toVC; - UIViewController *_fromVC; - void (^_completion)(void); -} - - -- (id)initWithRevealController:(SWRevealViewController*)revealVC containerView:(UIView*)view fromVC:(UIViewController*)fromVC - toVC:(UIViewController*)toVC completion:(void (^)(void))completion -{ - self = [super init]; - if ( self ) - { - _revealVC = revealVC; - _view = view; - _fromVC = fromVC; - _toVC = toVC; - _completion = completion; - } - return self; -} - - -- (UIView *)containerView -{ - return _view; -} - - -- (BOOL)isAnimated -{ - return YES; -} - - -- (BOOL)isInteractive -{ - return NO; // not supported -} - - -- (BOOL)transitionWasCancelled -{ - return NO; // not supported -} - - -- (CGAffineTransform)targetTransform -{ - return CGAffineTransformIdentity; -} - - -- (UIModalPresentationStyle)presentationStyle -{ - return UIModalPresentationNone; // not applicable -} - - -- (void)updateInteractiveTransition:(CGFloat)percentComplete -{ - // not supported -} - - -- (void)finishInteractiveTransition -{ - // not supported -} - - -- (void)cancelInteractiveTransition -{ - // not supported -} - - -- (void)completeTransition:(BOOL)didComplete -{ - _completion(); -} - - -- (UIViewController *)viewControllerForKey:(NSString *)key -{ - if ( [key isEqualToString:UITransitionContextFromViewControllerKey] ) - return _fromVC; - - if ( [key isEqualToString:UITransitionContextToViewControllerKey] ) - return _toVC; - - return nil; -} - - -- (UIView *)viewForKey:(NSString *)key -{ - return nil; -} - - -- (CGRect)initialFrameForViewController:(UIViewController *)vc -{ - return _view.bounds; -} - - -- (CGRect)finalFrameForViewController:(UIViewController *)vc -{ - return _view.bounds; -} - -@end - - -#pragma mark - SWDefaultAnimationController Class - -@interface SWDefaultAnimationController : NSObject -@end - -@implementation SWDefaultAnimationController -{ - NSTimeInterval _duration; -} - - -- (id)initWithDuration:(NSTimeInterval)duration -{ - self = [super init]; - if ( self ) - { - _duration = duration; - } - return self; -} - - -- (NSTimeInterval)transitionDuration:(id)transitionContext -{ - return _duration; -} - - -- (void)animateTransition:(id )transitionContext -{ - UIViewController *fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey]; - UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey]; - - if ( fromViewController ) - { - [UIView transitionFromView:fromViewController.view toView:toViewController.view duration:_duration - options:UIViewAnimationOptionTransitionCrossDissolve|UIViewAnimationOptionOverrideInheritedOptions - completion:^(BOOL finished) { [transitionContext completeTransition:finished]; }]; - } - else - { - // tansitionFromView does not correctly handle the case where the fromView is nil (at least on iOS7) it just pops up the toView view with no animation, - // so in such case we replace the crossDissolve animation by a simple alpha animation on the appearing view - UIView *toView = toViewController.view; - CGFloat alpha = toView.alpha; - toView.alpha = 0; - - [UIView animateWithDuration:_duration delay:0 options:UIViewAnimationOptionCurveEaseOut - animations:^{ toView.alpha = alpha;} - completion:^(BOOL finished) { [transitionContext completeTransition:finished];}]; - } -} - -@end - - -#pragma mark - SWRevealViewControllerPanGestureRecognizer - -#import - -@interface SWRevealViewControllerPanGestureRecognizer : UIPanGestureRecognizer -@end - -@implementation SWRevealViewControllerPanGestureRecognizer -{ - BOOL _dragging; - CGPoint _beginPoint; -} - -- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event -{ - [super touchesBegan:touches withEvent:event]; - - UITouch *touch = [touches anyObject]; - _beginPoint = [touch locationInView:self.view]; - _dragging = NO; -} - - -- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event -{ - [super touchesMoved:touches withEvent:event]; - - if ( _dragging || self.state == UIGestureRecognizerStateFailed) - return; - - const CGFloat kDirectionPanThreshold = 5; - - UITouch *touch = [touches anyObject]; - CGPoint nowPoint = [touch locationInView:self.view]; - - if (ABS(nowPoint.x - _beginPoint.x) > kDirectionPanThreshold) _dragging = YES; - else if (ABS(nowPoint.y - _beginPoint.y) > kDirectionPanThreshold) self.state = UIGestureRecognizerStateFailed; -} - -@end - - -#pragma mark - SWRevealViewController Class - -@interface SWRevealViewController() -{ - SWRevealView *_contentView; - UIPanGestureRecognizer *_panGestureRecognizer; - UITapGestureRecognizer *_tapGestureRecognizer; - FrontViewPosition _frontViewPosition; - FrontViewPosition _rearViewPosition; - FrontViewPosition _rightViewPosition; - SWContextTransitionObject *_rearTransitioningController; - SWContextTransitionObject *_frontTransitioningController; - SWContextTransitionObject *_rightTransitioningController; -} -@end - - -@implementation SWRevealViewController -{ - FrontViewPosition _panInitialFrontPosition; - NSMutableArray *_animationQueue; - BOOL _userInteractionStore; -} - -const int FrontViewPositionNone = 0xff; - - -#pragma mark - Init - -- (id)initWithCoder:(NSCoder *)aDecoder -{ - self = [super initWithCoder:aDecoder]; - if ( self ) - { - [self _initDefaultProperties]; - } - return self; -} - - -- (id)init -{ - return [self initWithRearViewController:nil frontViewController:nil]; -} - - -- (id)initWithRearViewController:(UIViewController *)rearViewController frontViewController:(UIViewController *)frontViewController; -{ - self = [super init]; - if ( self ) - { - [self _initDefaultProperties]; - [self _performTransitionOperation:SWRevealControllerOperationReplaceRearController withViewController:rearViewController animated:NO]; - [self _performTransitionOperation:SWRevealControllerOperationReplaceFrontController withViewController:frontViewController animated:NO]; - } - return self; -} - - -- (void)_initDefaultProperties -{ - _frontViewPosition = FrontViewPositionLeft; - _rearViewPosition = FrontViewPositionLeft; - _rightViewPosition = FrontViewPositionLeft; - _rearViewRevealWidth = 260.0f; - _rearViewRevealOverdraw = 60.0f; - _rearViewRevealDisplacement = 40.0f; - _rightViewRevealWidth = 260.0f; - _rightViewRevealOverdraw = 60.0f; - _rightViewRevealDisplacement = 40.0f; - _bounceBackOnOverdraw = YES; - _bounceBackOnLeftOverdraw = YES; - _stableDragOnOverdraw = NO; - _stableDragOnLeftOverdraw = NO; - _presentFrontViewHierarchically = NO; - _quickFlickVelocity = 250.0f; - _toggleAnimationDuration = 0.3; - _toggleAnimationType = SWRevealToggleAnimationTypeSpring; - _springDampingRatio = 1; - _replaceViewAnimationDuration = 0.25; - _frontViewShadowRadius = 2.5f; - _frontViewShadowOffset = CGSizeMake(0.0f, 2.5f); - _frontViewShadowOpacity = 1.0f; - _frontViewShadowColor = [UIColor blackColor]; - _userInteractionStore = YES; - _animationQueue = [NSMutableArray array]; - _draggableBorderWidth = 0.0f; - _clipsViewsToBounds = NO; - _extendsPointInsideHit = NO; -} - - -#pragma mark - StatusBar - -- (UIViewController *)childViewControllerForStatusBarStyle -{ - int positionDif = _frontViewPosition - FrontViewPositionLeft; - - UIViewController *controller = _frontViewController; - if ( positionDif > 0 ) controller = _rearViewController; - else if ( positionDif < 0 ) controller = _rightViewController; - - return controller; -} - -- (UIViewController *)childViewControllerForStatusBarHidden -{ - UIViewController *controller = [self childViewControllerForStatusBarStyle]; - return controller; -} - - -#pragma mark - View lifecycle - -- (void)loadView -{ - // Do not call super, to prevent the apis from unfruitful looking for inexistent xibs! - //[super loadView]; - - // load any defined front/rear controllers from the storyboard before - [self loadStoryboardControllers]; - - // This is what Apple used to tell us to set as the initial frame, which is of course totally irrelevant - // with view controller containment patterns, let's leave it for the sake of it! - // CGRect frame = [[UIScreen mainScreen] applicationFrame]; - - // On iOS7 the applicationFrame does not return the whole screen. This is possibly a bug. - // As a workaround we use the screen bounds, this still works on iOS6, any zero based frame would work anyway! - CGRect frame = [[UIScreen mainScreen] bounds]; - - // create a custom content view for the controller - _contentView = [[SWRevealView alloc] initWithFrame:frame controller:self]; - - // set the content view to resize along with its superview - [_contentView setAutoresizingMask:UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight]; - - // set the content view to clip its bounds if requested - [_contentView setClipsToBounds:_clipsViewsToBounds]; - - // set our contentView to the controllers view - self.view = _contentView; - - // Apple also tells us to do this: - _contentView.backgroundColor = [UIColor blackColor]; - - // we set the current frontViewPosition to none before seting the - // desired initial position, this will force proper controller reload - FrontViewPosition initialPosition = _frontViewPosition; - _frontViewPosition = FrontViewPositionNone; - _rearViewPosition = FrontViewPositionNone; - _rightViewPosition = FrontViewPositionNone; - - // now set the desired initial position - [self _setFrontViewPosition:initialPosition withDuration:0.0]; -} - - -- (void)viewDidAppear:(BOOL)animated -{ - [super viewDidAppear:animated]; - - // Uncomment the following code if you want the child controllers - // to be loaded at this point. - // - // We leave this commented out because we think loading childs here is conceptually wrong. - // Instead, we refrain view loads until necesary, for example we may never load - // the rear controller view -or the front controller view- if it is never displayed. - // - // If you need to manipulate views of any of your child controllers in an override - // of this method, you can load yourself the views explicitly on your overriden method. - // However we discourage it as an app following the MVC principles should never need to do so - -// [_frontViewController view]; -// [_rearViewController view]; - - // we store at this point the view's user interaction state as we may temporarily disable it - // and resume it back to the previous state, it is possible to override this behaviour by - // intercepting it on the panGestureBegan and panGestureEnded delegates - _userInteractionStore = _contentView.userInteractionEnabled; -} - - -- (NSUInteger)supportedInterfaceOrientations -{ - // we could have simply not implemented this, but we choose to call super to make explicit that we - // want the default behavior. - return [super supportedInterfaceOrientations]; -} - - -#pragma mark - Public methods and property accessors - -- (void)setFrontViewController:(UIViewController *)frontViewController -{ - [self setFrontViewController:frontViewController animated:NO]; -} - - -- (void)setFrontViewController:(UIViewController *)frontViewController animated:(BOOL)animated -{ - if ( ![self isViewLoaded]) - { - [self _performTransitionOperation:SWRevealControllerOperationReplaceFrontController withViewController:frontViewController animated:NO]; - return; - } - - [self _dispatchTransitionOperation:SWRevealControllerOperationReplaceFrontController withViewController:frontViewController animated:animated]; -} - - -- (void)pushFrontViewController:(UIViewController *)frontViewController animated:(BOOL)animated -{ - if ( ![self isViewLoaded]) - { - [self _performTransitionOperation:SWRevealControllerOperationReplaceFrontController withViewController:frontViewController animated:NO]; - return; - } - - [self _dispatchPushFrontViewController:frontViewController animated:animated]; -} - - -- (void)setRearViewController:(UIViewController *)rearViewController -{ - [self setRearViewController:rearViewController animated:NO]; -} - - -- (void)setRearViewController:(UIViewController *)rearViewController animated:(BOOL)animated -{ - if ( ![self isViewLoaded]) - { - [self _performTransitionOperation:SWRevealControllerOperationReplaceRearController withViewController:rearViewController animated:NO]; - return; - } - - [self _dispatchTransitionOperation:SWRevealControllerOperationReplaceRearController withViewController:rearViewController animated:animated]; -} - - -- (void)setRightViewController:(UIViewController *)rightViewController -{ - [self setRightViewController:rightViewController animated:NO]; -} - - -- (void)setRightViewController:(UIViewController *)rightViewController animated:(BOOL)animated -{ - if ( ![self isViewLoaded]) - { - [self _performTransitionOperation:SWRevealControllerOperationReplaceRightController withViewController:rightViewController animated:NO]; - return; - } - - [self _dispatchTransitionOperation:SWRevealControllerOperationReplaceRightController withViewController:rightViewController animated:animated]; -} - - -- (void)revealToggleAnimated:(BOOL)animated -{ - FrontViewPosition toggledFrontViewPosition = FrontViewPositionLeft; - if (_frontViewPosition <= FrontViewPositionLeft) - toggledFrontViewPosition = FrontViewPositionRight; - - [self setFrontViewPosition:toggledFrontViewPosition animated:animated]; -} - - -- (void)rightRevealToggleAnimated:(BOOL)animated -{ - FrontViewPosition toggledFrontViewPosition = FrontViewPositionLeft; - if (_frontViewPosition >= FrontViewPositionLeft) - toggledFrontViewPosition = FrontViewPositionLeftSide; - - [self setFrontViewPosition:toggledFrontViewPosition animated:animated]; -} - - -- (void)setFrontViewPosition:(FrontViewPosition)frontViewPosition -{ - [self setFrontViewPosition:frontViewPosition animated:NO]; -} - - -- (void)setFrontViewPosition:(FrontViewPosition)frontViewPosition animated:(BOOL)animated -{ - if ( ![self isViewLoaded] ) - { - _frontViewPosition = frontViewPosition; - _rearViewPosition = frontViewPosition; - _rightViewPosition = frontViewPosition; - return; - } - - [self _dispatchSetFrontViewPosition:frontViewPosition animated:animated]; -} - - -- (void)setFrontViewShadowRadius:(CGFloat)frontViewShadowRadius -{ - _frontViewShadowRadius = frontViewShadowRadius; - [_contentView reloadShadow]; -} - - -- (void)setFrontViewShadowOffset:(CGSize)frontViewShadowOffset -{ - _frontViewShadowOffset = frontViewShadowOffset; - [_contentView reloadShadow]; -} - - -- (void)setFrontViewShadowOpacity:(CGFloat)frontViewShadowOpacity -{ - _frontViewShadowOpacity = frontViewShadowOpacity; - [_contentView reloadShadow]; -} - - -- (void)setFrontViewShadowColor:(UIColor *)frontViewShadowColor -{ - _frontViewShadowColor = frontViewShadowColor; - [_contentView reloadShadow]; -} - - -- (UIPanGestureRecognizer*)panGestureRecognizer -{ - if ( _panGestureRecognizer == nil ) - { - _panGestureRecognizer = [[SWRevealViewControllerPanGestureRecognizer alloc] initWithTarget:self action:@selector(_handleRevealGesture:)]; - _panGestureRecognizer.delegate = self; - [_contentView.frontView addGestureRecognizer:_panGestureRecognizer]; - } - return _panGestureRecognizer; -} - - -- (UITapGestureRecognizer*)tapGestureRecognizer -{ - if ( _tapGestureRecognizer == nil ) - { - UITapGestureRecognizer *tapRecognizer = - [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(_handleTapGesture:)]; - - tapRecognizer.delegate = self; - [_contentView.frontView addGestureRecognizer:tapRecognizer]; - _tapGestureRecognizer = tapRecognizer ; - } - return _tapGestureRecognizer; -} - - -- (void)setClipsViewsToBounds:(BOOL)clipsViewsToBounds -{ - _clipsViewsToBounds = clipsViewsToBounds; - [_contentView setClipsToBounds:clipsViewsToBounds]; -} - - - -#pragma mark - Provided acction methods - -- (IBAction)revealToggle:(id)sender -{ - [self revealToggleAnimated:YES]; -} - - -- (IBAction)rightRevealToggle:(id)sender -{ - [self rightRevealToggleAnimated:YES]; -} - - -#pragma mark - UserInteractionEnabling - -// disable userInteraction on the entire control -- (void)_disableUserInteraction -{ - [_contentView setUserInteractionEnabled:NO]; - [_contentView setDisableLayout:YES]; -} - -// restore userInteraction on the control -- (void)_restoreUserInteraction -{ - // we use the stored userInteraction state just in case a developer decided - // to have our view interaction disabled beforehand - [_contentView setUserInteractionEnabled:_userInteractionStore]; - [_contentView setDisableLayout:NO]; -} - - -#pragma mark - PanGesture progress notification - -- (void)_notifyPanGestureBegan -{ - if ( [_delegate respondsToSelector:@selector(revealControllerPanGestureBegan:)] ) - [_delegate revealControllerPanGestureBegan:self]; - - CGFloat xLocation, dragProgress, overProgress; - [self _getDragLocation:&xLocation progress:&dragProgress overdrawProgress:&overProgress]; - - if ( [_delegate respondsToSelector:@selector(revealController:panGestureBeganFromLocation:progress:overProgress:)] ) - [_delegate revealController:self panGestureBeganFromLocation:xLocation progress:dragProgress overProgress:overProgress]; - - else if ( [_delegate respondsToSelector:@selector(revealController:panGestureBeganFromLocation:progress:)] ) - [_delegate revealController:self panGestureBeganFromLocation:xLocation progress:dragProgress]; -} - -- (void)_notifyPanGestureMoved -{ - CGFloat xLocation, dragProgress, overProgress; - [self _getDragLocation:&xLocation progress:&dragProgress overdrawProgress:&overProgress]; - - if ( [_delegate respondsToSelector:@selector(revealController:panGestureMovedToLocation:progress:overProgress:)] ) - [_delegate revealController:self panGestureMovedToLocation:xLocation progress:dragProgress overProgress:overProgress]; - - else if ( [_delegate respondsToSelector:@selector(revealController:panGestureMovedToLocation:progress:)] ) - [_delegate revealController:self panGestureMovedToLocation:xLocation progress:dragProgress]; -} - -- (void)_notifyPanGestureEnded -{ - CGFloat xLocation, dragProgress, overProgress; - [self _getDragLocation:&xLocation progress:&dragProgress overdrawProgress:&overProgress]; - - if ( [_delegate respondsToSelector:@selector(revealController:panGestureEndedToLocation:progress:overProgress:)] ) - [_delegate revealController:self panGestureEndedToLocation:xLocation progress:dragProgress overProgress:overProgress]; - - else if ( [_delegate respondsToSelector:@selector(revealController:panGestureEndedToLocation:progress:)] ) - [_delegate revealController:self panGestureEndedToLocation:xLocation progress:dragProgress]; - - if ( [_delegate respondsToSelector:@selector(revealControllerPanGestureEnded:)] ) - [_delegate revealControllerPanGestureEnded:self]; -} - - -#pragma mark - Symetry - -- (void)_getRevealWidth:(CGFloat*)pRevealWidth revealOverDraw:(CGFloat*)pRevealOverdraw forSymetry:(int)symetry -{ - if ( symetry < 0 ) *pRevealWidth = _rightViewRevealWidth, *pRevealOverdraw = _rightViewRevealOverdraw; - else *pRevealWidth = _rearViewRevealWidth, *pRevealOverdraw = _rearViewRevealOverdraw; - - if (*pRevealWidth < 0) *pRevealWidth = _contentView.bounds.size.width + *pRevealWidth; -} - -- (void)_getBounceBack:(BOOL*)pBounceBack pStableDrag:(BOOL*)pStableDrag forSymetry:(int)symetry -{ - if ( symetry < 0 ) *pBounceBack = _bounceBackOnLeftOverdraw, *pStableDrag = _stableDragOnLeftOverdraw; - else *pBounceBack = _bounceBackOnOverdraw, *pStableDrag = _stableDragOnOverdraw; -} - -- (void)_getAdjustedFrontViewPosition:(FrontViewPosition*)frontViewPosition forSymetry:(int)symetry -{ - if ( symetry < 0 ) *frontViewPosition = FrontViewPositionLeft + symetry*(*frontViewPosition-FrontViewPositionLeft); -} - -- (void)_getDragLocationx:(CGFloat*)xLocation progress:(CGFloat*)progress -{ - UIView *frontView = _contentView.frontView; - *xLocation = frontView.frame.origin.x; - - int symetry = *xLocation<0 ? -1 : 1; - - CGFloat xWidth = symetry < 0 ? _rightViewRevealWidth : _rearViewRevealWidth; - if ( xWidth < 0 ) xWidth = _contentView.bounds.size.width + xWidth; - - *progress = *xLocation/xWidth * symetry; -} - -- (void)_getDragLocation:(CGFloat*)xLocation progress:(CGFloat*)progress overdrawProgress:(CGFloat*)overProgress -{ - UIView *frontView = _contentView.frontView; - *xLocation = frontView.frame.origin.x; - - int symetry = *xLocation<0 ? -1 : 1; - - CGFloat xWidth = symetry < 0 ? _rightViewRevealWidth : _rearViewRevealWidth; - CGFloat xOverWidth = symetry < 0 ? _rightViewRevealOverdraw : _rearViewRevealOverdraw; - - if ( xWidth < 0 ) xWidth = _contentView.bounds.size.width + xWidth; - - *progress = *xLocation*symetry/xWidth; - *overProgress = (*xLocation*symetry-xWidth)/xOverWidth; -} - - -#pragma mark - Deferred block execution queue - -// Define a convenience macro to enqueue single statements -#define _enqueue(code) [self _enqueueBlock:^{code;}]; - -// Defers the execution of the passed in block until a paired _dequeue call is received, -// or executes the block right away if no pending requests are present. -- (void)_enqueueBlock:(void (^)(void))block -{ - [_animationQueue insertObject:block atIndex:0]; - if ( _animationQueue.count == 1) - { - block(); - } -} - -// Removes the top most block in the queue and executes the following one if any. -// Calls to this method must be paired with calls to _enqueueBlock, particularly it may be called -// from within a block passed to _enqueueBlock to remove itself when done with animations. -- (void)_dequeue -{ - [_animationQueue removeLastObject]; - - if ( _animationQueue.count > 0 ) - { - void (^block)(void) = [_animationQueue lastObject]; - block(); - } -} - - -#pragma mark - Gesture Delegate - -- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)recognizer -{ - // only allow gesture if no previous request is in process - if ( _animationQueue.count == 0 ) - { - if ( recognizer == _panGestureRecognizer ) - return [self _panGestureShouldBegin]; - - if ( recognizer == _tapGestureRecognizer ) - return [self _tapGestureShouldBegin]; - } - - return NO; -} - - -- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer -{ - if ( gestureRecognizer == _panGestureRecognizer ) - { - if ( [_delegate respondsToSelector:@selector(revealController:panGestureRecognizerShouldRecognizeSimultaneouslyWithGestureRecognizer:)] ) - if ( [_delegate revealController:self panGestureRecognizerShouldRecognizeSimultaneouslyWithGestureRecognizer:otherGestureRecognizer] != NO ) - return YES; - } - if ( gestureRecognizer == _tapGestureRecognizer ) - { - if ( [_delegate respondsToSelector:@selector(revealController:tapGestureRecognizerShouldRecognizeSimultaneouslyWithGestureRecognizer:)] ) - if ( [_delegate revealController:self tapGestureRecognizerShouldRecognizeSimultaneouslyWithGestureRecognizer:otherGestureRecognizer] != NO ) - return YES; - } - - return NO; -} - - -- (BOOL)_tapGestureShouldBegin -{ - if ( _frontViewPosition == FrontViewPositionLeft || - _frontViewPosition == FrontViewPositionRightMostRemoved || - _frontViewPosition == FrontViewPositionLeftSideMostRemoved ) - return NO; - - // forbid gesture if the following delegate is implemented and returns NO - if ( [_delegate respondsToSelector:@selector(revealControllerTapGestureShouldBegin:)] ) - if ( [_delegate revealControllerTapGestureShouldBegin:self] == NO ) - return NO; - - return YES; -} - - -- (BOOL)_panGestureShouldBegin -{ - // forbid gesture if the initial translation is not horizontal - UIView *recognizerView = _panGestureRecognizer.view; - CGPoint translation = [_panGestureRecognizer translationInView:recognizerView]; -// NSLog( @"translation:%@", NSStringFromCGPoint(translation) ); -// if ( fabs(translation.y/translation.x) > 1 ) -// return NO; - - // forbid gesture if the following delegate is implemented and returns NO - if ( [_delegate respondsToSelector:@selector(revealControllerPanGestureShouldBegin:)] ) - if ( [_delegate revealControllerPanGestureShouldBegin:self] == NO ) - return NO; - - CGFloat xLocation = [_panGestureRecognizer locationInView:recognizerView].x; - CGFloat width = recognizerView.bounds.size.width; - - BOOL draggableBorderAllowing = ( - /*_frontViewPosition != FrontViewPositionLeft ||*/ _draggableBorderWidth == 0.0f || - (_rearViewController && xLocation <= _draggableBorderWidth) || - (_rightViewController && xLocation >= (width - _draggableBorderWidth)) ); - - - BOOL translationForbidding = ( _frontViewPosition == FrontViewPositionLeft && - ((_rearViewController == nil && translation.x > 0) || (_rightViewController == nil && translation.x < 0)) ); - - // allow gesture only within the bounds defined by the draggableBorderWidth property - return draggableBorderAllowing && !translationForbidding ; -} - - -#pragma mark - Gesture Based Reveal - -- (void)_handleTapGesture:(UITapGestureRecognizer *)recognizer -{ - NSTimeInterval duration = _toggleAnimationDuration; - [self _setFrontViewPosition:FrontViewPositionLeft withDuration:duration]; -} - - -- (void)_handleRevealGesture:(UIPanGestureRecognizer *)recognizer -{ - switch ( recognizer.state ) - { - case UIGestureRecognizerStateBegan: - [self _handleRevealGestureStateBeganWithRecognizer:recognizer]; - break; - - case UIGestureRecognizerStateChanged: - [self _handleRevealGestureStateChangedWithRecognizer:recognizer]; - break; - - case UIGestureRecognizerStateEnded: - [self _handleRevealGestureStateEndedWithRecognizer:recognizer]; - break; - - case UIGestureRecognizerStateCancelled: - //case UIGestureRecognizerStateFailed: - [self _handleRevealGestureStateCancelledWithRecognizer:recognizer]; - break; - - default: - break; - } -} - - -- (void)_handleRevealGestureStateBeganWithRecognizer:(UIPanGestureRecognizer *)recognizer -{ - // we know that we will not get here unless the animationQueue is empty because the recognizer - // delegate prevents it, however we do not want any forthcoming programatic actions to disturb - // the gesture, so we just enqueue a dummy block to ensure any programatic acctions will be - // scheduled after the gesture is completed - [self _enqueueBlock:^{}]; // <-- dummy block - - // we store the initial position and initialize a target position - _panInitialFrontPosition = _frontViewPosition; - - // we disable user interactions on the views, however programatic accions will still be - // enqueued to be performed after the gesture completes - [self _disableUserInteraction]; - [self _notifyPanGestureBegan]; -} - - -- (void)_handleRevealGestureStateChangedWithRecognizer:(UIPanGestureRecognizer *)recognizer -{ - CGFloat translation = [recognizer translationInView:_contentView].x; - - CGFloat baseLocation = [_contentView frontLocationForPosition:_panInitialFrontPosition]; - CGFloat xLocation = baseLocation + translation; - - if ( xLocation < 0 ) - { - if ( _rightViewController == nil ) xLocation = 0; - [self _rightViewDeploymentForNewFrontViewPosition:FrontViewPositionLeftSide](); - [self _rearViewDeploymentForNewFrontViewPosition:FrontViewPositionLeftSide](); - } - - if ( xLocation > 0 ) - { - if ( _rearViewController == nil ) xLocation = 0; - [self _rightViewDeploymentForNewFrontViewPosition:FrontViewPositionRight](); - [self _rearViewDeploymentForNewFrontViewPosition:FrontViewPositionRight](); - } - - [_contentView dragFrontViewToXLocation:xLocation]; - [self _notifyPanGestureMoved]; -} - - -- (void)_handleRevealGestureStateEndedWithRecognizer:(UIPanGestureRecognizer *)recognizer -{ - UIView *frontView = _contentView.frontView; - - CGFloat xLocation = frontView.frame.origin.x; - CGFloat velocity = [recognizer velocityInView:_contentView].x; - //NSLog( @"Velocity:%1.4f", velocity); - - // depending on position we compute a simetric replacement of widths and positions - int symetry = xLocation<0 ? -1 : 1; - - // simetring computing of widths - CGFloat revealWidth ; - CGFloat revealOverdraw ; - BOOL bounceBack; - BOOL stableDrag; - - [self _getRevealWidth:&revealWidth revealOverDraw:&revealOverdraw forSymetry:symetry]; - [self _getBounceBack:&bounceBack pStableDrag:&stableDrag forSymetry:symetry]; - - // simetric replacement of position - xLocation = xLocation * symetry; - - // initially we assume drag to left and default duration - FrontViewPosition frontViewPosition = FrontViewPositionLeft; - NSTimeInterval duration = _toggleAnimationDuration; - - // Velocity driven change: - if (ABS(velocity) > _quickFlickVelocity) - { - // we may need to set the drag position and to adjust the animation duration - CGFloat journey = xLocation; - if (velocity*symetry > 0.0f) - { - frontViewPosition = FrontViewPositionRight; - journey = revealWidth - xLocation; - if (xLocation > revealWidth) - { - if (!bounceBack && stableDrag /*&& xPosition > _rearViewRevealWidth+_rearViewRevealOverdraw*0.5f*/) - { - frontViewPosition = FrontViewPositionRightMost; - journey = revealWidth+revealOverdraw - xLocation; - } - } - } - - duration = ABS(journey/velocity); - } - - // Position driven change: - else - { - // we may need to set the drag position - if (xLocation > revealWidth*0.5f) - { - frontViewPosition = FrontViewPositionRight; - if (xLocation > revealWidth) - { - if (bounceBack) - frontViewPosition = FrontViewPositionLeft; - - else if (stableDrag && xLocation > revealWidth+revealOverdraw*0.5f) - frontViewPosition = FrontViewPositionRightMost; - } - } - } - - // symetric replacement of frontViewPosition - [self _getAdjustedFrontViewPosition:&frontViewPosition forSymetry:symetry]; - - // restore user interaction and animate to the final position - [self _restoreUserInteraction]; - [self _notifyPanGestureEnded]; - [self _setFrontViewPosition:frontViewPosition withDuration:duration]; -} - - -- (void)_handleRevealGestureStateCancelledWithRecognizer:(UIPanGestureRecognizer *)recognizer -{ - [self _restoreUserInteraction]; - [self _notifyPanGestureEnded]; - [self _dequeue]; -} - - -#pragma mark Enqueued position and controller setup - -- (void)_dispatchSetFrontViewPosition:(FrontViewPosition)frontViewPosition animated:(BOOL)animated -{ - NSTimeInterval duration = animated?_toggleAnimationDuration:0.0; - __weak SWRevealViewController *theSelf = self; - _enqueue( [theSelf _setFrontViewPosition:frontViewPosition withDuration:duration] ); -} - - -- (void)_dispatchPushFrontViewController:(UIViewController *)newFrontViewController animated:(BOOL)animated -{ - FrontViewPosition preReplacementPosition = FrontViewPositionLeft; - if ( _frontViewPosition > FrontViewPositionLeft ) preReplacementPosition = FrontViewPositionRightMost; - if ( _frontViewPosition < FrontViewPositionLeft ) preReplacementPosition = FrontViewPositionLeftSideMost; - - NSTimeInterval duration = animated?_toggleAnimationDuration:0.0; - NSTimeInterval firstDuration = duration; - NSInteger initialPosDif = ABS( _frontViewPosition - preReplacementPosition ); - if ( initialPosDif == 1 ) firstDuration *= 0.8; - else if ( initialPosDif == 0 ) firstDuration = 0; - - __weak SWRevealViewController *theSelf = self; - if ( animated ) - { - _enqueue( [theSelf _setFrontViewPosition:preReplacementPosition withDuration:firstDuration] ); - _enqueue( [theSelf _performTransitionOperation:SWRevealControllerOperationReplaceFrontController withViewController:newFrontViewController animated:NO] ); - _enqueue( [theSelf _setFrontViewPosition:FrontViewPositionLeft withDuration:duration] ); - } - else - { - _enqueue( [theSelf _performTransitionOperation:SWRevealControllerOperationReplaceFrontController withViewController:newFrontViewController animated:NO] ); - } -} - - -- (void)_dispatchTransitionOperation:(SWRevealControllerOperation)operation withViewController:(UIViewController *)newViewController animated:(BOOL)animated -{ - __weak SWRevealViewController *theSelf = self; - _enqueue( [theSelf _performTransitionOperation:operation withViewController:newViewController animated:animated] ); -} - - -#pragma mark Animated view controller deployment and layout - -// Primitive method for view controller deployment and animated layout to the given position. -- (void)_setFrontViewPosition:(FrontViewPosition)newPosition withDuration:(NSTimeInterval)duration -{ - void (^rearDeploymentCompletion)() = [self _rearViewDeploymentForNewFrontViewPosition:newPosition]; - void (^rightDeploymentCompletion)() = [self _rightViewDeploymentForNewFrontViewPosition:newPosition]; - void (^frontDeploymentCompletion)() = [self _frontViewDeploymentForNewFrontViewPosition:newPosition]; - - void (^animations)() = ^() - { - // Calling this in the animation block causes the status bar to appear/dissapear in sync with our own animation - [self setNeedsStatusBarAppearanceUpdate]; - - // We call the layoutSubviews method on the contentView view and send a delegate, which will - // occur inside of an animation block if any animated transition is being performed - [_contentView layoutSubviews]; - - if ([_delegate respondsToSelector:@selector(revealController:animateToPosition:)]) - [_delegate revealController:self animateToPosition:_frontViewPosition]; - }; - - void (^completion)(BOOL) = ^(BOOL finished) - { - rearDeploymentCompletion(); - rightDeploymentCompletion(); - frontDeploymentCompletion(); - [self _dequeue]; - }; - - if ( duration > 0.0 ) - { - if ( _toggleAnimationType == SWRevealToggleAnimationTypeEaseOut ) - { - [UIView animateWithDuration:duration delay:0.0 - options:UIViewAnimationOptionCurveEaseOut animations:animations completion:completion]; - } - else - { - [UIView animateWithDuration:_toggleAnimationDuration delay:0.0 usingSpringWithDamping:_springDampingRatio initialSpringVelocity:1/duration - options:0 animations:animations completion:completion]; - } - } - else - { - animations(); - completion(YES); - } -} - - -// Primitive method for animated controller transition -//- (void)_performTransitionToViewController:(UIViewController*)new operation:(SWRevealControllerOperation)operation animated:(BOOL)animated -- (void)_performTransitionOperation:(SWRevealControllerOperation)operation withViewController:(UIViewController*)new animated:(BOOL)animated -{ - if ( [_delegate respondsToSelector:@selector(revealController:willAddViewController:forOperation:animated:)] ) - [_delegate revealController:self willAddViewController:new forOperation:operation animated:animated]; - - UIViewController *old = nil; - UIView *view = nil; - - if ( operation == SWRevealControllerOperationReplaceRearController ) - old = _rearViewController, _rearViewController = new, view = _contentView.rearView; - - else if ( operation == SWRevealControllerOperationReplaceFrontController ) - old = _frontViewController, _frontViewController = new, view = _contentView.frontView; - - else if ( operation == SWRevealControllerOperationReplaceRightController ) - old = _rightViewController, _rightViewController = new, view = _contentView.rightView; - - void (^completion)() = [self _transitionFromViewController:old toViewController:new inView:view]; - - void (^animationCompletion)() = ^ - { - completion(); - if ( [_delegate respondsToSelector:@selector(revealController:didAddViewController:forOperation:animated:)] ) - [_delegate revealController:self didAddViewController:new forOperation:operation animated:animated]; - - [self _dequeue]; - }; - - if ( animated ) - { - id animationController = nil; - - if ( [_delegate respondsToSelector:@selector(revealController:animationControllerForOperation:fromViewController:toViewController:)] ) - animationController = [_delegate revealController:self animationControllerForOperation:operation fromViewController:old toViewController:new]; - - if ( !animationController ) - animationController = [[SWDefaultAnimationController alloc] initWithDuration:_replaceViewAnimationDuration]; - - SWContextTransitionObject *transitioningObject = [[SWContextTransitionObject alloc] initWithRevealController:self containerView:view - fromVC:old toVC:new completion:animationCompletion]; - - if ( [animationController transitionDuration:transitioningObject] > 0 ) - [animationController animateTransition:transitioningObject]; - else - animationCompletion(); - } - else - { - animationCompletion(); - } -} - - -#pragma mark Position based view controller deployment - -// Deploy/Undeploy of the front view controller following the containment principles. Returns a block -// that must be invoked on animation completion in order to finish deployment -- (void (^)(void))_frontViewDeploymentForNewFrontViewPosition:(FrontViewPosition)newPosition -{ - if ( (_rightViewController == nil && newPosition < FrontViewPositionLeft) || - (_rearViewController == nil && newPosition > FrontViewPositionLeft) ) - newPosition = FrontViewPositionLeft; - - BOOL positionIsChanging = (_frontViewPosition != newPosition); - - BOOL appear = - (_frontViewPosition >= FrontViewPositionRightMostRemoved || _frontViewPosition <= FrontViewPositionLeftSideMostRemoved || _frontViewPosition == FrontViewPositionNone) && - (newPosition < FrontViewPositionRightMostRemoved && newPosition > FrontViewPositionLeftSideMostRemoved); - - BOOL disappear = - (newPosition >= FrontViewPositionRightMostRemoved || newPosition <= FrontViewPositionLeftSideMostRemoved ) && - (_frontViewPosition < FrontViewPositionRightMostRemoved && _frontViewPosition > FrontViewPositionLeftSideMostRemoved && _frontViewPosition != FrontViewPositionNone); - - if ( positionIsChanging ) - { - if ( [_delegate respondsToSelector:@selector(revealController:willMoveToPosition:)] ) - [_delegate revealController:self willMoveToPosition:newPosition]; - } - - _frontViewPosition = newPosition; - - void (^deploymentCompletion)() = - [self _deploymentForViewController:_frontViewController inView:_contentView.frontView appear:appear disappear:disappear]; - - void (^completion)() = ^() - { - deploymentCompletion(); - if ( positionIsChanging ) - { - if ( [_delegate respondsToSelector:@selector(revealController:didMoveToPosition:)] ) - [_delegate revealController:self didMoveToPosition:newPosition]; - } - }; - - return completion; -} - -// Deploy/Undeploy of the left view controller following the containment principles. Returns a block -// that must be invoked on animation completion in order to finish deployment -- (void (^)(void))_rearViewDeploymentForNewFrontViewPosition:(FrontViewPosition)newPosition -{ - if ( _presentFrontViewHierarchically ) - newPosition = FrontViewPositionRight; - - if ( _rearViewController == nil && newPosition > FrontViewPositionLeft ) - newPosition = FrontViewPositionLeft; - - BOOL appear = (_rearViewPosition <= FrontViewPositionLeft || _rearViewPosition == FrontViewPositionNone) && newPosition > FrontViewPositionLeft; - BOOL disappear = newPosition <= FrontViewPositionLeft && (_rearViewPosition > FrontViewPositionLeft && _rearViewPosition != FrontViewPositionNone); - - if ( appear ) - [_contentView prepareRearViewForPosition:newPosition]; - - _rearViewPosition = newPosition; - - void (^deploymentCompletion)() = - [self _deploymentForViewController:_rearViewController inView:_contentView.rearView appear:appear disappear:disappear]; - - void (^completion)() = ^() - { - deploymentCompletion(); - if ( disappear ) - [_contentView unloadRearView]; - }; - - return completion; -} - -// Deploy/Undeploy of the right view controller following the containment principles. Returns a block -// that must be invoked on animation completion in order to finish deployment -- (void (^)(void))_rightViewDeploymentForNewFrontViewPosition:(FrontViewPosition)newPosition -{ - if ( _rightViewController == nil && newPosition < FrontViewPositionLeft ) - newPosition = FrontViewPositionLeft; - - BOOL appear = (_rightViewPosition >= FrontViewPositionLeft || _rightViewPosition == FrontViewPositionNone) && newPosition < FrontViewPositionLeft ; - BOOL disappear = newPosition >= FrontViewPositionLeft && (_rightViewPosition < FrontViewPositionLeft && _rightViewPosition != FrontViewPositionNone); - - if ( appear ) - [_contentView prepareRightViewForPosition:newPosition]; - - _rightViewPosition = newPosition; - - void (^deploymentCompletion)() = - [self _deploymentForViewController:_rightViewController inView:_contentView.rightView appear:appear disappear:disappear]; - - void (^completion)() = ^() - { - deploymentCompletion(); - if ( disappear ) - [_contentView unloadRightView]; - }; - - return completion; -} - - -- (void (^)(void)) _deploymentForViewController:(UIViewController*)controller inView:(UIView*)view appear:(BOOL)appear disappear:(BOOL)disappear -{ - if ( appear ) return [self _deployForViewController:controller inView:view]; - if ( disappear ) return [self _undeployForViewController:controller]; - return ^{}; -} - - -#pragma mark Containment view controller deployment and transition - -// Containment Deploy method. Returns a block to be invoked at the -// animation completion, or right after return in case of non-animated deployment. -- (void (^)(void))_deployForViewController:(UIViewController*)controller inView:(UIView*)view -{ - if ( !controller || !view ) - return ^(void){}; - - CGRect frame = view.bounds; - - UIView *controllerView = controller.view; - controllerView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; - controllerView.frame = frame; - - if ( [controllerView isKindOfClass:[UIScrollView class]] ) - { - BOOL adjust = controller.automaticallyAdjustsScrollViewInsets; - - if ( adjust ) - { - [(id)controllerView setContentInset:UIEdgeInsetsMake(statusBarAdjustment(_contentView), 0, 0, 0)]; - } - } - - [view addSubview:controllerView]; - - void (^completionBlock)(void) = ^(void) - { - // nothing to do on completion at this stage - }; - - return completionBlock; -} - -// Containment Undeploy method. Returns a block to be invoked at the -// animation completion, or right after return in case of non-animated deployment. -- (void (^)(void))_undeployForViewController:(UIViewController*)controller -{ - if (!controller) - return ^(void){}; - - // nothing to do before completion at this stage - - void (^completionBlock)(void) = ^(void) - { - [controller.view removeFromSuperview]; - }; - - return completionBlock; -} - -// Containment Transition method. Returns a block to be invoked at the -// animation completion, or right after return in case of non-animated transition. -- (void(^)(void))_transitionFromViewController:(UIViewController*)fromController toViewController:(UIViewController*)toController inView:(UIView*)view -{ - if ( fromController == toController ) - return ^(void){}; - - if ( toController ) [self addChildViewController:toController]; - - void (^deployCompletion)() = [self _deployForViewController:toController inView:view]; - - [fromController willMoveToParentViewController:nil]; - - void (^undeployCompletion)() = [self _undeployForViewController:fromController]; - - void (^completionBlock)(void) = ^(void) - { - undeployCompletion() ; - [fromController removeFromParentViewController]; - - deployCompletion() ; - [toController didMoveToParentViewController:self]; - }; - return completionBlock; -} - -// Load any defined front/rear controllers from the storyboard -// This method is intended to be overrided in case the default behavior will not meet your needs -- (void)loadStoryboardControllers -{ - if ( self.storyboard && _rearViewController == nil ) - { - //Try each segue separately so it doesn't break prematurely if either Rear or Right views are not used. - @try - { - [self performSegueWithIdentifier:SWSegueRearIdentifier sender:nil]; - } - @catch(NSException *exception) {} - - @try - { - [self performSegueWithIdentifier:SWSegueFrontIdentifier sender:nil]; - } - @catch(NSException *exception) {} - - @try - { - [self performSegueWithIdentifier:SWSegueRightIdentifier sender:nil]; - } - @catch(NSException *exception) {} - } -} - - -#pragma mark state preservation / restoration - -+ (UIViewController *)viewControllerWithRestorationIdentifierPath:(NSArray *)identifierComponents coder:(NSCoder*)coder -{ - SWRevealViewController* vc = nil; - UIStoryboard* sb = [coder decodeObjectForKey:UIStateRestorationViewControllerStoryboardKey]; - - if (sb) - { - vc = (SWRevealViewController*)[sb instantiateViewControllerWithIdentifier:@"SWRevealViewController"]; - vc.restorationIdentifier = [identifierComponents lastObject]; - vc.restorationClass = [SWRevealViewController class]; - } - return vc; -} - - -- (void)encodeRestorableStateWithCoder:(NSCoder *)coder -{ - [coder encodeDouble:_rearViewRevealWidth forKey:@"_rearViewRevealWidth"]; - [coder encodeDouble:_rearViewRevealOverdraw forKey:@"_rearViewRevealOverdraw"]; - [coder encodeDouble:_rearViewRevealDisplacement forKey:@"_rearViewRevealDisplacement"]; - [coder encodeDouble:_rightViewRevealWidth forKey:@"_rightViewRevealWidth"]; - [coder encodeDouble:_rightViewRevealOverdraw forKey:@"_rightViewRevealOverdraw"]; - [coder encodeDouble:_rightViewRevealDisplacement forKey:@"_rightViewRevealDisplacement"]; - [coder encodeBool:_bounceBackOnOverdraw forKey:@"_bounceBackOnOverdraw"]; - [coder encodeBool:_bounceBackOnLeftOverdraw forKey:@"_bounceBackOnLeftOverdraw"]; - [coder encodeBool:_stableDragOnOverdraw forKey:@"_stableDragOnOverdraw"]; - [coder encodeBool:_stableDragOnLeftOverdraw forKey:@"_stableDragOnLeftOverdraw"]; - [coder encodeBool:_presentFrontViewHierarchically forKey:@"_presentFrontViewHierarchically"]; - [coder encodeDouble:_quickFlickVelocity forKey:@"_quickFlickVelocity"]; - [coder encodeDouble:_toggleAnimationDuration forKey:@"_toggleAnimationDuration"]; - [coder encodeInteger:_toggleAnimationType forKey:@"_toggleAnimationType"]; - [coder encodeDouble:_springDampingRatio forKey:@"_springDampingRatio"]; - [coder encodeDouble:_replaceViewAnimationDuration forKey:@"_replaceViewAnimationDuration"]; - [coder encodeDouble:_frontViewShadowRadius forKey:@"_frontViewShadowRadius"]; - [coder encodeCGSize:_frontViewShadowOffset forKey:@"_frontViewShadowOffset"]; - [coder encodeDouble:_frontViewShadowOpacity forKey:@"_frontViewShadowOpacity"]; - [coder encodeObject:_frontViewShadowColor forKey:@"_frontViewShadowColor"]; - [coder encodeBool:_userInteractionStore forKey:@"_userInteractionStore"]; - [coder encodeDouble:_draggableBorderWidth forKey:@"_draggableBorderWidth"]; - [coder encodeBool:_clipsViewsToBounds forKey:@"_clipsViewsToBounds"]; - [coder encodeBool:_extendsPointInsideHit forKey:@"_extendsPointInsideHit"]; - - [coder encodeObject:_rearViewController forKey:@"_rearViewController"]; - [coder encodeObject:_frontViewController forKey:@"_frontViewController"]; - [coder encodeObject:_rightViewController forKey:@"_rightViewController"]; - - [coder encodeInteger:_frontViewPosition forKey:@"_frontViewPosition"]; - - [super encodeRestorableStateWithCoder:coder]; -} - - -- (void)decodeRestorableStateWithCoder:(NSCoder *)coder -{ - _rearViewRevealWidth = [coder decodeDoubleForKey:@"_rearViewRevealWidth"]; - _rearViewRevealOverdraw = [coder decodeDoubleForKey:@"_rearViewRevealOverdraw"]; - _rearViewRevealDisplacement = [coder decodeDoubleForKey:@"_rearViewRevealDisplacement"]; - _rightViewRevealWidth = [coder decodeDoubleForKey:@"_rightViewRevealWidth"]; - _rightViewRevealOverdraw = [coder decodeDoubleForKey:@"_rightViewRevealOverdraw"]; - _rightViewRevealDisplacement = [coder decodeDoubleForKey:@"_rightViewRevealDisplacement"]; - _bounceBackOnOverdraw = [coder decodeBoolForKey:@"_bounceBackOnOverdraw"]; - _bounceBackOnLeftOverdraw = [coder decodeBoolForKey:@"_bounceBackOnLeftOverdraw"]; - _stableDragOnOverdraw = [coder decodeBoolForKey:@"_stableDragOnOverdraw"]; - _stableDragOnLeftOverdraw = [coder decodeBoolForKey:@"_stableDragOnLeftOverdraw"]; - _presentFrontViewHierarchically = [coder decodeBoolForKey:@"_presentFrontViewHierarchically"]; - _quickFlickVelocity = [coder decodeDoubleForKey:@"_quickFlickVelocity"]; - _toggleAnimationDuration = [coder decodeDoubleForKey:@"_toggleAnimationDuration"]; - _toggleAnimationType = [coder decodeIntegerForKey:@"_toggleAnimationType"]; - _springDampingRatio = [coder decodeDoubleForKey:@"_springDampingRatio"]; - _replaceViewAnimationDuration = [coder decodeDoubleForKey:@"_replaceViewAnimationDuration"]; - _frontViewShadowRadius = [coder decodeDoubleForKey:@"_frontViewShadowRadius"]; - _frontViewShadowOffset = [coder decodeCGSizeForKey:@"_frontViewShadowOffset"]; - _frontViewShadowOpacity = [coder decodeDoubleForKey:@"_frontViewShadowOpacity"]; - _frontViewShadowColor = [coder decodeObjectForKey:@"_frontViewShadowColor"]; - _userInteractionStore = [coder decodeBoolForKey:@"_userInteractionStore"]; - _animationQueue = [NSMutableArray array]; - _draggableBorderWidth = [coder decodeDoubleForKey:@"_draggableBorderWidth"]; - _clipsViewsToBounds = [coder decodeBoolForKey:@"_clipsViewsToBounds"]; - _extendsPointInsideHit = [coder decodeBoolForKey:@"_extendsPointInsideHit"]; - - [self setRearViewController:[coder decodeObjectForKey:@"_rearViewController"]]; - [self setFrontViewController:[coder decodeObjectForKey:@"_frontViewController"]]; - [self setRightViewController:[coder decodeObjectForKey:@"_rightViewController"]]; - - [self setFrontViewPosition:[coder decodeIntForKey: @"_frontViewPosition"]]; - - [super decodeRestorableStateWithCoder:coder]; -} - - -- (void)applicationFinishedRestoringState -{ - // nothing to do at this stage -} - - -@end - - -#pragma mark - UIViewController(SWRevealViewController) Category - -@implementation UIViewController(SWRevealViewController) - -- (SWRevealViewController*)revealViewController -{ - UIViewController *parent = self; - Class revealClass = [SWRevealViewController class]; - while ( nil != (parent = [parent parentViewController]) && ![parent isKindOfClass:revealClass] ) {} - return (id)parent; -} - -@end - - -#pragma mark - SWRevealViewControllerSegueSetController segue identifiers - -NSString * const SWSegueRearIdentifier = @"sw_rear"; -NSString * const SWSegueFrontIdentifier = @"sw_front"; -NSString * const SWSegueRightIdentifier = @"sw_right"; - - -#pragma mark - SWRevealViewControllerSegueSetController class - -@implementation SWRevealViewControllerSegueSetController - -- (void)perform -{ - SWRevealControllerOperation operation = SWRevealControllerOperationNone; - - NSString *identifier = self.identifier; - SWRevealViewController *rvc = self.sourceViewController; - UIViewController *dvc = self.destinationViewController; - - if ( [identifier isEqualToString:SWSegueFrontIdentifier] ) - operation = SWRevealControllerOperationReplaceFrontController; - - else if ( [identifier isEqualToString:SWSegueRearIdentifier] ) - operation = SWRevealControllerOperationReplaceRearController; - - else if ( [identifier isEqualToString:SWSegueRightIdentifier] ) - operation = SWRevealControllerOperationReplaceRightController; - - if ( operation != SWRevealControllerOperationNone ) - [rvc _performTransitionOperation:operation withViewController:dvc animated:NO]; -} - -@end - - -#pragma mark - SWRevealViewControllerSeguePushController class - -@implementation SWRevealViewControllerSeguePushController - -- (void)perform -{ - SWRevealViewController *rvc = [self.sourceViewController revealViewController]; - UIViewController *dvc = self.destinationViewController; - [rvc pushFrontViewController:dvc animated:YES]; -} - -@end - - -//#pragma mark - SWRevealViewControllerSegue Class -// -//@implementation SWRevealViewControllerSegue // DEPRECATED -// -//- (void)perform -//{ -// if ( _performBlock ) -// _performBlock( self, self.sourceViewController, self.destinationViewController ); -//} -// -//@end -// -// -//#pragma mark Storyboard support -// -//@implementation SWRevealViewController(deprecated) -// -//- (void)prepareForSegue:(SWRevealViewControllerSegue *)segue sender:(id)sender // TO REMOVE: DEPRECATED IMPLEMENTATION -//{ -// // This method is required for compatibility with SWRevealViewControllerSegue, now deprecated. -// // It can be simply removed when using SWRevealViewControllerSegueSetController and SWRevealViewControlerSeguePushController -// -// NSString *identifier = segue.identifier; -// if ( [segue isKindOfClass:[SWRevealViewControllerSegue class]] && sender == nil ) -// { -// if ( [identifier isEqualToString:SWSegueRearIdentifier] ) -// { -// segue.performBlock = ^(SWRevealViewControllerSegue* rvc_segue, UIViewController* svc, UIViewController* dvc) -// { -// [self _setRearViewController:dvc animated:NO]; -// }; -// } -// else if ( [identifier isEqualToString:SWSegueFrontIdentifier] ) -// { -// segue.performBlock = ^(SWRevealViewControllerSegue* rvc_segue, UIViewController* svc, UIViewController* dvc) -// { -// [self _setFrontViewController:dvc animated:NO]; -// }; -// } -// else if ( [identifier isEqualToString:SWSegueRightIdentifier] ) -// { -// segue.performBlock = ^(SWRevealViewControllerSegue* rvc_segue, UIViewController* svc, UIViewController* dvc) -// { -// [self _setRightViewController:dvc animated:NO]; -// }; -// } -// } -//} -// -//@end - - diff --git a/Project 28 - SlidebarMenu/SlidebarMenu/SlidebarMenu-Bridging-Header.h b/Project 28 - SlidebarMenu/SlidebarMenu/SlidebarMenu-Bridging-Header.h deleted file mode 100644 index f27ab0c8..00000000 --- a/Project 28 - SlidebarMenu/SlidebarMenu/SlidebarMenu-Bridging-Header.h +++ /dev/null @@ -1,4 +0,0 @@ -// -// Use this file to import your target's public headers that you would like to expose to Swift. -// -#import "SWRevealViewController.h" diff --git a/Project 28 - SlidebarMenu/SlidebarMenu/SlidebarMenu.swift b/Project 28 - SlidebarMenu/SlidebarMenu/SlidebarMenu.swift deleted file mode 100644 index d33ca3c6..00000000 --- a/Project 28 - SlidebarMenu/SlidebarMenu/SlidebarMenu.swift +++ /dev/null @@ -1,34 +0,0 @@ -// -// SlidebarMenu.swift -// SlidebarMenu -// -// Copyright © 2016 AppCoda. All rights reserved. -// - -import Foundation -import UIKit - -extension Selector { - static let toMenu = #selector(SWRevealViewController.revealToggle(_:)) - static let toExtra = #selector(SWRevealViewController.rightRevealToggle(_:)) -} - -extension UIViewController { - func addSideBarMenu(leftMenuButton: UIBarButtonItem?, rightMenuButton: UIBarButtonItem? = nil) { - if let revealVC = revealViewController() { - if let menuButton = leftMenuButton { - menuButton.target = revealVC - menuButton.action = Selector.toMenu - } - - if let extraButton = rightMenuButton { - revealVC.rightViewRevealWidth = 150 - extraButton.target = revealVC - extraButton.action = Selector.toExtra - } - - view.addGestureRecognizer(revealVC.panGestureRecognizer()) - } - - } -} diff --git a/Project 29 - Grocr/Grocr.gif b/Project 29 - Grocr/Grocr.gif deleted file mode 100644 index 77fc855b..00000000 Binary files a/Project 29 - Grocr/Grocr.gif and /dev/null differ diff --git a/Project 29 - Grocr/Grocr.xcodeproj/project.pbxproj b/Project 29 - Grocr/Grocr.xcodeproj/project.pbxproj deleted file mode 100644 index 3e11b9e9..00000000 --- a/Project 29 - Grocr/Grocr.xcodeproj/project.pbxproj +++ /dev/null @@ -1,475 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 19C5D3FA1E3038990082E992 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 19C5D3F91E3038990082E992 /* GoogleService-Info.plist */; }; - 941A68C9047CFC613264BFB7 /* libPods.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F599D9265F4B40571F432E78 /* libPods.a */; }; - BB2385621B3DD5AB0079CD01 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB2385611B3DD5AB0079CD01 /* AppDelegate.swift */; }; - BB2385641B3DD5AB0079CD01 /* LoginViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB2385631B3DD5AB0079CD01 /* LoginViewController.swift */; }; - BB2385671B3DD5AB0079CD01 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = BB2385651B3DD5AB0079CD01 /* Main.storyboard */; }; - BB2385691B3DD5AB0079CD01 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = BB2385681B3DD5AB0079CD01 /* Images.xcassets */; }; - BB23856C1B3DD5AB0079CD01 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = BB23856A1B3DD5AB0079CD01 /* LaunchScreen.xib */; }; - BB2385841B3DD8660079CD01 /* GroceryListTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB2385831B3DD8660079CD01 /* GroceryListTableViewController.swift */; }; - BB23858A1B3DD9640079CD01 /* GroceryItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB2385891B3DD9640079CD01 /* GroceryItem.swift */; }; - BB30CD4A1B439B60004B3177 /* OnlineUsersTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB30CD491B439B60004B3177 /* OnlineUsersTableViewController.swift */; }; - BB7DA5111B42C8100018B530 /* User.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB7DA5101B42C8100018B530 /* User.swift */; }; -/* End PBXBuildFile section */ - -/* Begin PBXFileReference section */ - 19C5D3F91E3038990082E992 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; - 19C5D3FB1E307FC90082E992 /* Grocr.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Grocr.entitlements; sourceTree = ""; }; - 9BA2A2DB5BA4733818152B9B /* Pods.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.debug.xcconfig; path = "Pods/Target Support Files/Pods/Pods.debug.xcconfig"; sourceTree = ""; }; - A898E3AE11425E4495FAC93A /* Pods.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.release.xcconfig; path = "Pods/Target Support Files/Pods/Pods.release.xcconfig"; sourceTree = ""; }; - BB23855C1B3DD5AB0079CD01 /* Grocr.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Grocr.app; sourceTree = BUILT_PRODUCTS_DIR; }; - BB2385601B3DD5AB0079CD01 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - BB2385611B3DD5AB0079CD01 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - BB2385631B3DD5AB0079CD01 /* LoginViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoginViewController.swift; sourceTree = ""; }; - BB2385661B3DD5AB0079CD01 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; - BB2385681B3DD5AB0079CD01 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; - BB23856B1B3DD5AB0079CD01 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; - BB2385831B3DD8660079CD01 /* GroceryListTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GroceryListTableViewController.swift; sourceTree = ""; }; - BB2385851B3DD8820079CD01 /* Grocr-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Grocr-Bridging-Header.h"; sourceTree = ""; }; - BB2385891B3DD9640079CD01 /* GroceryItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GroceryItem.swift; sourceTree = ""; }; - BB30CD491B439B60004B3177 /* OnlineUsersTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OnlineUsersTableViewController.swift; sourceTree = ""; }; - BB7DA5101B42C8100018B530 /* User.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = User.swift; sourceTree = ""; }; - F599D9265F4B40571F432E78 /* libPods.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libPods.a; sourceTree = BUILT_PRODUCTS_DIR; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - BB2385591B3DD5AB0079CD01 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 941A68C9047CFC613264BFB7 /* libPods.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 5BCB7DE7572521D09DC0AA00 /* Pods */ = { - isa = PBXGroup; - children = ( - 9BA2A2DB5BA4733818152B9B /* Pods.debug.xcconfig */, - A898E3AE11425E4495FAC93A /* Pods.release.xcconfig */, - ); - name = Pods; - sourceTree = ""; - }; - BB2385531B3DD5AB0079CD01 = { - isa = PBXGroup; - children = ( - BB23855E1B3DD5AB0079CD01 /* Grocr */, - BB23855D1B3DD5AB0079CD01 /* Products */, - 5BCB7DE7572521D09DC0AA00 /* Pods */, - C8A8CAF31E6679C1B66E9218 /* Frameworks */, - ); - indentWidth = 2; - sourceTree = ""; - tabWidth = 2; - }; - BB23855D1B3DD5AB0079CD01 /* Products */ = { - isa = PBXGroup; - children = ( - BB23855C1B3DD5AB0079CD01 /* Grocr.app */, - ); - name = Products; - sourceTree = ""; - }; - BB23855E1B3DD5AB0079CD01 /* Grocr */ = { - isa = PBXGroup; - children = ( - 19C5D3FB1E307FC90082E992 /* Grocr.entitlements */, - BB2385881B3DD9550079CD01 /* Models */, - BB2385811B3DD8310079CD01 /* Controllers */, - BB2385821B3DD8490079CD01 /* Layouts */, - BB2385681B3DD5AB0079CD01 /* Images.xcassets */, - BB7DA5121B42CA790018B530 /* Other */, - BB23855F1B3DD5AB0079CD01 /* Supporting Files */, - ); - path = Grocr; - sourceTree = ""; - }; - BB23855F1B3DD5AB0079CD01 /* Supporting Files */ = { - isa = PBXGroup; - children = ( - BB2385601B3DD5AB0079CD01 /* Info.plist */, - BB2385851B3DD8820079CD01 /* Grocr-Bridging-Header.h */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; - BB2385811B3DD8310079CD01 /* Controllers */ = { - isa = PBXGroup; - children = ( - BB2385631B3DD5AB0079CD01 /* LoginViewController.swift */, - BB2385831B3DD8660079CD01 /* GroceryListTableViewController.swift */, - BB30CD491B439B60004B3177 /* OnlineUsersTableViewController.swift */, - ); - name = Controllers; - sourceTree = ""; - }; - BB2385821B3DD8490079CD01 /* Layouts */ = { - isa = PBXGroup; - children = ( - BB2385651B3DD5AB0079CD01 /* Main.storyboard */, - BB23856A1B3DD5AB0079CD01 /* LaunchScreen.xib */, - ); - name = Layouts; - sourceTree = ""; - }; - BB2385881B3DD9550079CD01 /* Models */ = { - isa = PBXGroup; - children = ( - BB2385891B3DD9640079CD01 /* GroceryItem.swift */, - BB7DA5101B42C8100018B530 /* User.swift */, - ); - name = Models; - sourceTree = ""; - }; - BB7DA5121B42CA790018B530 /* Other */ = { - isa = PBXGroup; - children = ( - 19C5D3F91E3038990082E992 /* GoogleService-Info.plist */, - BB2385611B3DD5AB0079CD01 /* AppDelegate.swift */, - ); - name = Other; - sourceTree = ""; - }; - C8A8CAF31E6679C1B66E9218 /* Frameworks */ = { - isa = PBXGroup; - children = ( - F599D9265F4B40571F432E78 /* libPods.a */, - ); - name = Frameworks; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - BB23855B1B3DD5AB0079CD01 /* Grocr */ = { - isa = PBXNativeTarget; - buildConfigurationList = BB23857B1B3DD5AB0079CD01 /* Build configuration list for PBXNativeTarget "Grocr" */; - buildPhases = ( - 271B2361A34E68199850C66E /* Check Pods Manifest.lock */, - BB2385581B3DD5AB0079CD01 /* Sources */, - BB2385591B3DD5AB0079CD01 /* Frameworks */, - BB23855A1B3DD5AB0079CD01 /* Resources */, - 3AAA8D86D4ADEB9EEF3F0820 /* Copy Pods Resources */, - 49E4AC6533427A10BAC363B2 /* Embed Pods Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = Grocr; - productName = Grocr; - productReference = BB23855C1B3DD5AB0079CD01 /* Grocr.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - BB2385541B3DD5AB0079CD01 /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0820; - ORGANIZATIONNAME = "Razeware LLC"; - TargetAttributes = { - BB23855B1B3DD5AB0079CD01 = { - CreatedOnToolsVersion = 6.3.1; - DevelopmentTeam = 9VUC3R8D65; - LastSwiftMigration = 0800; - ProvisioningStyle = Automatic; - SystemCapabilities = { - com.apple.ApplicationGroups.iOS = { - enabled = 0; - }; - com.apple.Keychain = { - enabled = 1; - }; - }; - }; - }; - }; - buildConfigurationList = BB2385571B3DD5AB0079CD01 /* Build configuration list for PBXProject "Grocr" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = BB2385531B3DD5AB0079CD01; - productRefGroup = BB23855D1B3DD5AB0079CD01 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - BB23855B1B3DD5AB0079CD01 /* Grocr */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - BB23855A1B3DD5AB0079CD01 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - BB2385671B3DD5AB0079CD01 /* Main.storyboard in Resources */, - 19C5D3FA1E3038990082E992 /* GoogleService-Info.plist in Resources */, - BB23856C1B3DD5AB0079CD01 /* LaunchScreen.xib in Resources */, - BB2385691B3DD5AB0079CD01 /* Images.xcassets in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 271B2361A34E68199850C66E /* Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Check Pods Manifest.lock"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n exit 1\nfi\n"; - showEnvVarsInLog = 0; - }; - 3AAA8D86D4ADEB9EEF3F0820 /* Copy Pods Resources */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Copy Pods Resources"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods/Pods-resources.sh\"\n"; - showEnvVarsInLog = 0; - }; - 49E4AC6533427A10BAC363B2 /* Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Embed Pods Frameworks"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods/Pods-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - BB2385581B3DD5AB0079CD01 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - BB2385641B3DD5AB0079CD01 /* LoginViewController.swift in Sources */, - BB2385841B3DD8660079CD01 /* GroceryListTableViewController.swift in Sources */, - BB23858A1B3DD9640079CD01 /* GroceryItem.swift in Sources */, - BB30CD4A1B439B60004B3177 /* OnlineUsersTableViewController.swift in Sources */, - BB7DA5111B42C8100018B530 /* User.swift in Sources */, - BB2385621B3DD5AB0079CD01 /* AppDelegate.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXVariantGroup section */ - BB2385651B3DD5AB0079CD01 /* Main.storyboard */ = { - isa = PBXVariantGroup; - children = ( - BB2385661B3DD5AB0079CD01 /* Base */, - ); - name = Main.storyboard; - sourceTree = ""; - }; - BB23856A1B3DD5AB0079CD01 /* LaunchScreen.xib */ = { - isa = PBXVariantGroup; - children = ( - BB23856B1B3DD5AB0079CD01 /* Base */, - ); - name = LaunchScreen.xib; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - BB2385791B3DD5AB0079CD01 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - }; - name = Debug; - }; - BB23857A1B3DD5AB0079CD01 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - BB23857C1B3DD5AB0079CD01 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 9BA2A2DB5BA4733818152B9B /* Pods.debug.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_MODULES = YES; - CODE_SIGN_ENTITLEMENTS = Grocr/Grocr.entitlements; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - DEVELOPMENT_TEAM = 9VUC3R8D65; - ENABLE_BITCODE = NO; - INFOPLIST_FILE = Grocr/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = rw.firebase.gettingstarted; - PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE = ""; - PROVISIONING_PROFILE_SPECIFIER = ""; - SWIFT_OBJC_BRIDGING_HEADER = "Grocr/Grocr-Bridging-Header.h"; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 3.0; - TARGETED_DEVICE_FAMILY = 1; - }; - name = Debug; - }; - BB23857D1B3DD5AB0079CD01 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = A898E3AE11425E4495FAC93A /* Pods.release.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_MODULES = YES; - CODE_SIGN_ENTITLEMENTS = Grocr/Grocr.entitlements; - CODE_SIGN_IDENTITY = "iPhone Developer"; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - DEVELOPMENT_TEAM = 9VUC3R8D65; - ENABLE_BITCODE = NO; - INFOPLIST_FILE = Grocr/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = rw.firebase.gettingstarted; - PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE = ""; - SWIFT_OBJC_BRIDGING_HEADER = "Grocr/Grocr-Bridging-Header.h"; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - SWIFT_VERSION = 3.0; - TARGETED_DEVICE_FAMILY = 1; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - BB2385571B3DD5AB0079CD01 /* Build configuration list for PBXProject "Grocr" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - BB2385791B3DD5AB0079CD01 /* Debug */, - BB23857A1B3DD5AB0079CD01 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - BB23857B1B3DD5AB0079CD01 /* Build configuration list for PBXNativeTarget "Grocr" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - BB23857C1B3DD5AB0079CD01 /* Debug */, - BB23857D1B3DD5AB0079CD01 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = BB2385541B3DD5AB0079CD01 /* Project object */; -} diff --git a/Project 29 - Grocr/Grocr.xcodeproj/xcuserdata/Attila.xcuserdatad/xcschemes/Grocr.xcscheme b/Project 29 - Grocr/Grocr.xcodeproj/xcuserdata/Attila.xcuserdatad/xcschemes/Grocr.xcscheme deleted file mode 100644 index 979757dc..00000000 --- a/Project 29 - Grocr/Grocr.xcodeproj/xcuserdata/Attila.xcuserdatad/xcschemes/Grocr.xcscheme +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Project 29 - Grocr/Grocr.xcodeproj/xcuserdata/Attila.xcuserdatad/xcschemes/xcschememanagement.plist b/Project 29 - Grocr/Grocr.xcodeproj/xcuserdata/Attila.xcuserdatad/xcschemes/xcschememanagement.plist deleted file mode 100644 index 6ca61cb9..00000000 --- a/Project 29 - Grocr/Grocr.xcodeproj/xcuserdata/Attila.xcuserdatad/xcschemes/xcschememanagement.plist +++ /dev/null @@ -1,22 +0,0 @@ - - - - - SchemeUserState - - Grocr.xcscheme - - orderHint - 1 - - - SuppressBuildableAutocreation - - BB23855B1B3DD5AB0079CD01 - - primary - - - - - diff --git a/Project 29 - Grocr/Grocr.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/Grocr.xcscheme b/Project 29 - Grocr/Grocr.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/Grocr.xcscheme deleted file mode 100644 index eba8a5a2..00000000 --- a/Project 29 - Grocr/Grocr.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/Grocr.xcscheme +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Project 29 - Grocr/Grocr.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/xcschememanagement.plist b/Project 29 - Grocr/Grocr.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/xcschememanagement.plist deleted file mode 100644 index 899338cf..00000000 --- a/Project 29 - Grocr/Grocr.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/xcschememanagement.plist +++ /dev/null @@ -1,22 +0,0 @@ - - - - - SchemeUserState - - Grocr.xcscheme - - orderHint - 0 - - - SuppressBuildableAutocreation - - BB23855B1B3DD5AB0079CD01 - - primary - - - - - diff --git a/Project 29 - Grocr/Grocr.xcworkspace/contents.xcworkspacedata b/Project 29 - Grocr/Grocr.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 40965ed1..00000000 --- a/Project 29 - Grocr/Grocr.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - diff --git a/Project 29 - Grocr/Grocr.xcworkspace/xcuserdata/Yi.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/Project 29 - Grocr/Grocr.xcworkspace/xcuserdata/Yi.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist deleted file mode 100644 index ed9a9b4d..00000000 --- a/Project 29 - Grocr/Grocr.xcworkspace/xcuserdata/Yi.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/Project 29 - Grocr/Grocr/Base.lproj/LaunchScreen.xib b/Project 29 - Grocr/Grocr/Base.lproj/LaunchScreen.xib deleted file mode 100644 index efc0b383..00000000 --- a/Project 29 - Grocr/Grocr/Base.lproj/LaunchScreen.xib +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Project 29 - Grocr/Grocr/Base.lproj/Main.storyboard b/Project 29 - Grocr/Grocr/Base.lproj/Main.storyboard deleted file mode 100644 index 32752c0f..00000000 --- a/Project 29 - Grocr/Grocr/Base.lproj/Main.storyboard +++ /dev/null @@ -1,252 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Project 29 - Grocr/Grocr/GoogleService-Info.plist b/Project 29 - Grocr/Grocr/GoogleService-Info.plist deleted file mode 100644 index e7a70b39..00000000 --- a/Project 29 - Grocr/Grocr/GoogleService-Info.plist +++ /dev/null @@ -1,42 +0,0 @@ - - - - - API_KEY - AIzaSyBatBmCf8mLI1fw2sVlwuTrT1jKEcGm0h8 - CFBundleIdentifier - - AD_UNIT_ID_FOR_BANNER_TEST - ca-app-pub-3940256099942544/2934735716 - AD_UNIT_ID_FOR_INTERSTITIAL_TEST - ca-app-pub-3940256099942544/4411468910 - CLIENT_ID - 1059628758828-2qqe6oh0gg6t6536g36l7vog3ghtr9fh.apps.googleusercontent.com - REVERSED_CLIENT_ID - com.googleusercontent.apps.1059628758828-2qqe6oh0gg6t6536g36l7vog3ghtr9fh - GCM_SENDER_ID - 1059628758828 - PLIST_VERSION - 1 - BUNDLE_ID - rw.firebase.gettingstarted - PROJECT_ID - grocr-a694e - STORAGE_BUCKET - grocr-a694e.appspot.com - IS_ADS_ENABLED - - IS_ANALYTICS_ENABLED - - IS_APPINVITE_ENABLED - - IS_GCM_ENABLED - - IS_SIGNIN_ENABLED - - GOOGLE_APP_ID - 1:1059628758828:ios:11bd119eb6688866 - DATABASE_URL - https://grocr-a694e.firebaseio.com - - diff --git a/Project 29 - Grocr/Grocr/GroceryItem.swift b/Project 29 - Grocr/Grocr/GroceryItem.swift deleted file mode 100644 index d2b517e2..00000000 --- a/Project 29 - Grocr/Grocr/GroceryItem.swift +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright (c) 2015 Razeware LLC - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -import Foundation -import Firebase - -struct GroceryItem { - - let key: String - let name: String - let addedByUser: String - let ref: FIRDatabaseReference? - var completed: Bool - - init(name: String, addedByUser: String, completed: Bool, key: String = "") { - self.key = key - self.name = name - self.addedByUser = addedByUser - self.completed = completed - self.ref = nil - } - - init(snapshot: FIRDataSnapshot) { - key = snapshot.key - let snapshotValue = snapshot.value as! [String: AnyObject] - name = snapshotValue["name"] as! String - addedByUser = snapshotValue["addedByUser"] as! String - completed = snapshotValue["completed"] as! Bool - ref = snapshot.ref - } - - func toAnyObject() -> Any { - return [ - "name": name, - "addedByUser": addedByUser, - "completed": completed - ] - } - -} diff --git a/Project 29 - Grocr/Grocr/GroceryListTableViewController.swift b/Project 29 - Grocr/Grocr/GroceryListTableViewController.swift deleted file mode 100644 index ef3ec83e..00000000 --- a/Project 29 - Grocr/Grocr/GroceryListTableViewController.swift +++ /dev/null @@ -1,183 +0,0 @@ -/* - * Copyright (c) 2015 Razeware LLC - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -import UIKit -import Firebase - -class GroceryListTableViewController: UITableViewController { - - // MARK: Constants - let listToUsers = "ListToUsers" - let ref = FIRDatabase.database().reference(withPath: "grocery-items") - let usersRef = FIRDatabase.database().reference(withPath: "online") - - // MARK: Properties - var items: [GroceryItem] = [] - var user: User! - var userCountBarButtonItem: UIBarButtonItem! - - // MARK: UIViewController Lifecycle - override func viewDidLoad() { - super.viewDidLoad() - - tableView.allowsMultipleSelectionDuringEditing = false - - userCountBarButtonItem = UIBarButtonItem(title: "1", - style: .plain, - target: self, - action: Selector.userCountButtonDidTouch) - userCountBarButtonItem.tintColor = UIColor.white - navigationItem.leftBarButtonItem = userCountBarButtonItem - - user = User(uid: "FakeId", email: "hungry@person.food") - - /// Listen for value type changes - ref.queryOrdered(byChild: "completed").observe(.value, with: { [weak self] snapshot in - var newItems: [GroceryItem] = [] - - for item in snapshot.children { - let groceryItem = GroceryItem(snapshot: item as! FIRDataSnapshot) - newItems.append(groceryItem) - } - - self?.items = newItems - self?.tableView.reloadData() - }) - - /// Monitor User status - FIRAuth.auth()!.addStateDidChangeListener { [weak self] auth, user in - guard let user = user else { - return - } - self?.user = User(authData: user) - - let currentUserRef = self?.usersRef.child(user.uid) - currentUserRef?.setValue(self?.user.email) - /// Removes the value after the connection to Firebase closes - currentUserRef?.onDisconnectRemoveValue() - } - - usersRef.observe(.value, with: { [weak self] snapshot in - if snapshot.exists() { - self?.userCountBarButtonItem?.title = snapshot.childrenCount.description - } else { - self?.userCountBarButtonItem?.title = "0" - } - }) - } - - // MARK: UITableView Delegate methods - override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - return items.count - } - - override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { - let cell = tableView.dequeueReusableCell(withIdentifier: "ItemCell", for: indexPath) - let groceryItem = items[indexPath.row] - - cell.textLabel?.text = groceryItem.name - cell.detailTextLabel?.text = groceryItem.addedByUser - - toggleCellCheckbox(cell, isCompleted: groceryItem.completed) - - return cell - } - - override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool { - return true - } - - override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) { - if editingStyle == .delete { - let groceryItem = items[indexPath.row] - groceryItem.ref?.removeValue() - } - } - - override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { - guard let cell = tableView.cellForRow(at: indexPath) else { - return - } - - let groceryItem = items[indexPath.row] - let toggledCompletion = !groceryItem.completed - - toggleCellCheckbox(cell, isCompleted: toggledCompletion) - groceryItem.ref?.updateChildValues([ - "completed": toggledCompletion - ]) - } - - func toggleCellCheckbox(_ cell: UITableViewCell, isCompleted: Bool) { - if !isCompleted { - cell.accessoryType = .none - cell.textLabel?.textColor = UIColor.black - cell.detailTextLabel?.textColor = UIColor.black - } else { - cell.accessoryType = .checkmark - cell.textLabel?.textColor = UIColor.gray - cell.detailTextLabel?.textColor = UIColor.gray - } - } - - // MARK: Add Item - - @IBAction func addButtonDidTouch(_ sender: AnyObject) { - let alert = UIAlertController(title: "Grocery Item", - message: "Add an Item", - preferredStyle: .alert) - - let saveAction = UIAlertAction(title: "Save", style: .default) { action in - guard let textField = alert.textFields?.first, - let text = textField.text else { - return - } - - let groceryItem = GroceryItem(name: text, - addedByUser: self.user.email, - completed: false) - - let groceryItemRef = self.ref.child(text.lowercased()) - groceryItemRef.setValue(groceryItem.toAnyObject()) - - self.items.append(groceryItem) - } - - let cancelAction = UIAlertAction(title: "Cancel", - style: .default) - - alert.addTextField() - - alert.addAction(saveAction) - alert.addAction(cancelAction) - - present(alert, animated: true, completion: nil) - } - - func userCountButtonDidTouch() { - performSegue(withIdentifier: listToUsers, sender: nil) - } -} - -private extension Selector { - static let userCountButtonDidTouch = #selector(GroceryListTableViewController.userCountButtonDidTouch) -} diff --git a/Project 29 - Grocr/Grocr/Grocr-Bridging-Header.h b/Project 29 - Grocr/Grocr/Grocr-Bridging-Header.h deleted file mode 100644 index 200daac6..00000000 --- a/Project 29 - Grocr/Grocr/Grocr-Bridging-Header.h +++ /dev/null @@ -1,5 +0,0 @@ -// -// Use this file to import your target's public headers that you would like to expose to Swift. -// - -#import diff --git a/Project 29 - Grocr/Grocr/Images.xcassets/AppIcon.appiconset/Icon-60@2x.png b/Project 29 - Grocr/Grocr/Images.xcassets/AppIcon.appiconset/Icon-60@2x.png deleted file mode 100644 index 584b95f3..00000000 Binary files a/Project 29 - Grocr/Grocr/Images.xcassets/AppIcon.appiconset/Icon-60@2x.png and /dev/null differ diff --git a/Project 29 - Grocr/Grocr/Images.xcassets/AppIcon.appiconset/Icon-60@3x.png b/Project 29 - Grocr/Grocr/Images.xcassets/AppIcon.appiconset/Icon-60@3x.png deleted file mode 100644 index fce8df2c..00000000 Binary files a/Project 29 - Grocr/Grocr/Images.xcassets/AppIcon.appiconset/Icon-60@3x.png and /dev/null differ diff --git a/Project 29 - Grocr/Grocr/Images.xcassets/AppIcon.appiconset/Icon-Small-40@3x.png b/Project 29 - Grocr/Grocr/Images.xcassets/AppIcon.appiconset/Icon-Small-40@3x.png deleted file mode 100644 index e89098f8..00000000 Binary files a/Project 29 - Grocr/Grocr/Images.xcassets/AppIcon.appiconset/Icon-Small-40@3x.png and /dev/null differ diff --git a/Project 29 - Grocr/Grocr/Images.xcassets/AppIcon.appiconset/Icon-Small@3x.png b/Project 29 - Grocr/Grocr/Images.xcassets/AppIcon.appiconset/Icon-Small@3x.png deleted file mode 100644 index 27b418c5..00000000 Binary files a/Project 29 - Grocr/Grocr/Images.xcassets/AppIcon.appiconset/Icon-Small@3x.png and /dev/null differ diff --git a/Project 29 - Grocr/Grocr/Images.xcassets/AppIcon.appiconset/Icon.png b/Project 29 - Grocr/Grocr/Images.xcassets/AppIcon.appiconset/Icon.png deleted file mode 100644 index 999a164c..00000000 Binary files a/Project 29 - Grocr/Grocr/Images.xcassets/AppIcon.appiconset/Icon.png and /dev/null differ diff --git a/Project 29 - Grocr/Grocr/Images.xcassets/AppIcon.appiconset/Icon@2x.png b/Project 29 - Grocr/Grocr/Images.xcassets/AppIcon.appiconset/Icon@2x.png deleted file mode 100644 index da985212..00000000 Binary files a/Project 29 - Grocr/Grocr/Images.xcassets/AppIcon.appiconset/Icon@2x.png and /dev/null differ diff --git a/Project 29 - Grocr/Grocr/LoginViewController.swift b/Project 29 - Grocr/Grocr/LoginViewController.swift deleted file mode 100644 index a6def9ed..00000000 --- a/Project 29 - Grocr/Grocr/LoginViewController.swift +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Copyright (c) 2015 Razeware LLC - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -import UIKit -import Firebase - -class LoginViewController: UIViewController { - - // MARK: Constants - let loginToList = "LoginToList" - - // MARK: Outlets - @IBOutlet weak var textFieldLoginEmail: UITextField! - @IBOutlet weak var textFieldLoginPassword: UITextField! - - override func viewDidLoad() { - super.viewDidLoad() - - /// Perform the segue when user has been authenticated - FIRAuth.auth()!.addStateDidChangeListener() { auth, user in - if let _ = user { - self.performSegue(withIdentifier: self.loginToList, sender: nil) - } - } - } - - // MARK: Actions - @IBAction func loginDidTouch(_ sender: AnyObject) { - FIRAuth.auth()!.signIn(withEmail: textFieldLoginEmail.text!, - password: textFieldLoginPassword.text!) - } - - @IBAction func signUpDidTouch(_ sender: AnyObject) { - let alert = UIAlertController(title: "Register", - message: "Register", - preferredStyle: .alert) - - let saveAction = UIAlertAction(title: "Save", style: .default) { action in - guard let email = alert.textFields?[0].text, - let password = alert.textFields?[1].text else { - return - } - - FIRAuth.auth()?.createUser(withEmail: email, password: password) { (user, error) in - if let error = error { - print("Firebase sign up error: " + error.localizedDescription) - fatalError() - } - - FIRAuth.auth()?.signIn(withEmail: email, password: password) - } - } - - let cancelAction = UIAlertAction(title: "Cancel", - style: .default) - - alert.addTextField { textEmail in - textEmail.placeholder = "Enter your email" - } - - alert.addTextField { textPassword in - textPassword.isSecureTextEntry = true - textPassword.placeholder = "Enter your password" - } - - alert.addAction(saveAction) - alert.addAction(cancelAction) - - present(alert, animated: true, completion: nil) - } - -} - -extension LoginViewController: UITextFieldDelegate { - - func textFieldShouldReturn(_ textField: UITextField) -> Bool { - if textField == textFieldLoginEmail { - textFieldLoginPassword.becomeFirstResponder() - } - if textField == textFieldLoginPassword { - textField.resignFirstResponder() - } - return true - } - -} diff --git a/Project 29 - Grocr/Grocr/OnlineUsersTableViewController.swift b/Project 29 - Grocr/Grocr/OnlineUsersTableViewController.swift deleted file mode 100644 index 63e66d75..00000000 --- a/Project 29 - Grocr/Grocr/OnlineUsersTableViewController.swift +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright (c) 2015 Razeware LLC - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -import UIKit -import Firebase - -class OnlineUsersTableViewController: UITableViewController { - - // MARK: Firebase Related - let usersRef = FIRDatabase.database().reference(withPath: "online") - - // MARK: Constants - let userCell = "UserCell" - - // MARK: Properties - var currentUsers: [String] = [] - - // MARK: UIViewController Lifecycle - override func viewDidLoad() { - super.viewDidLoad() - - usersRef.observe(. - childAdded, with: { snapshot in - guard let email = snapshot.value as? String else { - return - } - - self.currentUsers.append(email) - - let row = self.currentUsers.count - 1 - let indexPath = IndexPath(row: row, section: 0) - self.tableView.insertRows(at: [indexPath], with: .top) - }) - - usersRef.observe(.childRemoved, with: { snapshot in - guard let emailToFind = snapshot.value as? String else { - return - } - for (index, email) in self.currentUsers.enumerated() { - if email == emailToFind { - let indexPath = IndexPath(row: index, section: 0) - self.currentUsers.remove(at: index) - self.tableView.deleteRows(at: [indexPath], with: .fade) - } - } - }) - } - - // MARK: UITableView Delegate methods - - override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - return currentUsers.count - } - - override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { - let cell = tableView.dequeueReusableCell(withIdentifier: userCell, for: indexPath) - let onlineUserEmail = currentUsers[indexPath.row] - cell.textLabel?.text = onlineUserEmail - return cell - } - - // MARK: Actions - - @IBAction func signoutButtonPressed(_ sender: AnyObject) { - dismiss(animated: true, completion: nil) - } - -} diff --git a/Project 29 - Grocr/Podfile b/Project 29 - Grocr/Podfile deleted file mode 100644 index 7d0fb050..00000000 --- a/Project 29 - Grocr/Podfile +++ /dev/null @@ -1,5 +0,0 @@ -inhibit_all_warnings! - -pod 'Firebase/Core' -pod 'Firebase/Database' -pod 'Firebase/Auth' \ No newline at end of file diff --git a/Project 29 - Grocr/Podfile.lock b/Project 29 - Grocr/Podfile.lock deleted file mode 100644 index b0a34d1a..00000000 --- a/Project 29 - Grocr/Podfile.lock +++ /dev/null @@ -1,53 +0,0 @@ -PODS: - - Firebase/Analytics (3.3.0): - - FirebaseAnalytics (= 3.2.1) - - Firebase/Auth (3.3.0): - - Firebase/Analytics (= 3.3.0) - - FirebaseAuth (= 3.0.3) - - Firebase/Core (3.3.0): - - Firebase/Analytics (= 3.3.0) - - Firebase/Database (3.3.0): - - Firebase/Analytics (= 3.3.0) - - FirebaseDatabase (= 3.0.2) - - FirebaseAnalytics (3.2.1): - - FirebaseInstanceID (~> 1.0) - - GoogleInterchangeUtilities (~> 1.2) - - GoogleSymbolUtilities (~> 1.1) - - GoogleUtilities (~> 1.3) - - FirebaseAuth (3.0.3): - - FirebaseAnalytics (~> 3.2) - - GoogleNetworkingUtilities (~> 1.2) - - GoogleParsingUtilities (~> 1.1) - - GoogleUtilities (~> 1.3) - - FirebaseDatabase (3.0.2): - - FirebaseAnalytics (~> 3.2) - - FirebaseInstanceID (1.0.7) - - GoogleInterchangeUtilities (1.2.1): - - GoogleSymbolUtilities (~> 1.0) - - GoogleNetworkingUtilities (1.2.1): - - GoogleSymbolUtilities (~> 1.0) - - GoogleParsingUtilities (1.1.1): - - GoogleNetworkingUtilities (~> 1.0) - - GoogleSymbolUtilities (~> 1.0) - - GoogleSymbolUtilities (1.1.1) - - GoogleUtilities (1.3.1): - - GoogleSymbolUtilities (~> 1.0) - -DEPENDENCIES: - - Firebase/Auth - - Firebase/Core - - Firebase/Database - -SPEC CHECKSUMS: - Firebase: 6250071f0e2440a5c4c67b8cb6b868f868237ac3 - FirebaseAnalytics: 0fd6532cb2c3d03cd5cf26ad295ccb091efd3104 - FirebaseAuth: 5efddc3fae47042b73585f083f956462be4f5b8e - FirebaseDatabase: 59bea2e7dfd81b3b8b2f8e396caf1a52c2ced6f7 - FirebaseInstanceID: a9d923f3d0b6fbf9fac89310860357aaadc34be5 - GoogleInterchangeUtilities: def8415a862effc67d549d5b5b0b9c7a2f97d4de - GoogleNetworkingUtilities: 3e83269048cfb498dc7ec83ab36813360965c74f - GoogleParsingUtilities: 30b3896f9ee167dc78747f013d3de157ced1cadf - GoogleSymbolUtilities: 33117db1b5f290c6fbf259585e4885b4c84b98d7 - GoogleUtilities: 56c5ac05b7aa5dc417a1bb85221a9516e04d7032 - -COCOAPODS: 0.39.0 diff --git a/Project 29 - Grocr/Pods/Firebase/Headers/Firebase.h b/Project 29 - Grocr/Pods/Firebase/Headers/Firebase.h deleted file mode 100644 index 025a5f98..00000000 --- a/Project 29 - Grocr/Pods/Firebase/Headers/Firebase.h +++ /dev/null @@ -1,51 +0,0 @@ -#import - -#if !defined(__has_include) - #error "Firebase.h won't import anything if your compiler doesn't support __has_include. Please \ - import the headers individually." -#else - #if __has_include() - #import - #endif - - #if __has_include() - #import - #endif - - #if __has_include() - #import - #endif - - #if __has_include() - #import - #endif - - #if __has_include() - #import - #endif - - #if __has_include() - #import - #endif - - #if __has_include() - #import - #endif - - #if __has_include() - #import - #endif - - #if __has_include() - #import - #endif - - #if __has_include() - #import - #endif - - #if __has_include() - #import - #endif - -#endif // defined(__has_include) diff --git a/Project 29 - Grocr/Pods/Firebase/Headers/module.modulemap b/Project 29 - Grocr/Pods/Firebase/Headers/module.modulemap deleted file mode 100644 index 3685b54a..00000000 --- a/Project 29 - Grocr/Pods/Firebase/Headers/module.modulemap +++ /dev/null @@ -1,4 +0,0 @@ -module Firebase { - export * - header "Firebase.h" -} \ No newline at end of file diff --git a/Project 29 - Grocr/Pods/Firebase/README.md b/Project 29 - Grocr/Pods/Firebase/README.md deleted file mode 100644 index bfc5419b..00000000 --- a/Project 29 - Grocr/Pods/Firebase/README.md +++ /dev/null @@ -1,76 +0,0 @@ -# Firebase APIs for iOS - -Simplify your iOS development, grow your user base, and monetize more -effectively with Firebase services. - -Much more information can be found at [https://firebase.google.com](https://firebase.google.com). - -## Install a Firebase SDK using CocoaPods - -Firebase distributes several iOS specific APIs and SDKs via CocoaPods. -You can install the CocoaPods tool on OS X by running the following command from -the terminal. Detailed information is available in the [Getting Started -guide](https://guides.cocoapods.org/using/getting-started.html#getting-started). - -``` -$ sudo gem install cocoapods -``` - -## Try out an SDK - -You can try any of the SDKs with `pod try`. Run the following command and select -the SDK you are interested in when prompted: - -``` -$ pod try Firebase -``` - -Note that some SDKs may require credentials. More information is available in -the SDK-specific documentation at [https://firebase.google.com/docs/](https://firebase.google.com/docs/). - -## Add a Firebase SDK to your iOS app - -CocoaPods is used to install and manage dependencies in existing Xcode projects. - -1. Create an Xcode project, and save it to your local machine. -2. Create a file named `Podfile` in your project directory. This file defines - your project's dependencies, and is commonly referred to as a Podspec. -3. Open `Podfile`, and add your dependencies. A simple Podspec is shown here: - - ``` - platform :ios, '7.0' - pod 'Firebase' - ``` - -4. Save the file. -5. Open a terminal and `cd` to the directory containing the Podfile. - - ``` - $ cd /project/ - ``` - -6. Run the `pod install` command. This will install the SDKs specified in the - Podspec, along with any dependencies they may have. - - ``` - $ pod install - ``` - -7. Open your app's `.xcworkspace` file to launch Xcode. - Use this file for all development on your app. -8. You can also install other Firebase SDKs by adding the subspecs in the - Podfile. - - ``` - pod 'Firebase/AdMob' - pod 'Firebase/Analytics' - pod 'Firebase/AppIndexing' - pod 'Firebase/Auth' - pod 'Firebase/Crash' - pod 'Firebase/Database' - pod 'Firebase/DynamicLinks' - pod 'Firebase/Invites' - pod 'Firebase/Messaging' - pod 'Firebase/RemoteConfig' - pod 'Firebase/Storage' - ``` diff --git a/Project 29 - Grocr/Pods/FirebaseAnalytics/Frameworks/frameworks/FirebaseAnalytics.framework/FirebaseAnalytics b/Project 29 - Grocr/Pods/FirebaseAnalytics/Frameworks/frameworks/FirebaseAnalytics.framework/FirebaseAnalytics deleted file mode 100755 index c80e7aa5..00000000 Binary files a/Project 29 - Grocr/Pods/FirebaseAnalytics/Frameworks/frameworks/FirebaseAnalytics.framework/FirebaseAnalytics and /dev/null differ diff --git a/Project 29 - Grocr/Pods/FirebaseAnalytics/Frameworks/frameworks/FirebaseAnalytics.framework/Headers/FIRAnalytics+AppDelegate.h b/Project 29 - Grocr/Pods/FirebaseAnalytics/Frameworks/frameworks/FirebaseAnalytics.framework/Headers/FIRAnalytics+AppDelegate.h deleted file mode 100755 index 45ce348c..00000000 --- a/Project 29 - Grocr/Pods/FirebaseAnalytics/Frameworks/frameworks/FirebaseAnalytics.framework/Headers/FIRAnalytics+AppDelegate.h +++ /dev/null @@ -1,57 +0,0 @@ -#import - -#import "FIRAnalytics.h" - -/** - * Provides App Delegate handlers to be used in your App Delegate. - * - * To save time integrating Firebase Analytics in an application, Firebase Analytics does not - * require delegation implementation from the AppDelegate. Instead this is automatically done by - * Firebase Analytics. Should you choose instead to delegate manually, you can turn off the App - * Delegate Proxy by adding FirebaseAppDelegateProxyEnabled into your Info.plist and setting it - * to NO, and adding the methods in this category to corresponding delegation handlers. - * - * To handle Universal Links, you must return YES in - * [UIApplicationDelegate application:didFinishLaunchingWithOptions:]. - */ -@interface FIRAnalytics (AppDelegate) - -/** - * Handles events related to a URL session that are waiting to be processed. - * - * For optimal use of Firebase Analytics, call this method from the - * [UIApplicationDelegate application:handleEventsForBackgroundURLSession:completionHandler] - * method of the app delegate in your app. - * - * @param identifier The identifier of the URL session requiring attention. - * @param completionHandler The completion handler to call when you finish processing the events. - * Calling this completion handler lets the system know that your app's user interface is - * updated and a new snapshot can be taken. - */ -+ (void)handleEventsForBackgroundURLSession:(NSString *)identifier - completionHandler:(void (^)(void))completionHandler; - -/** - * Handles the event when the app is launched by a URL. - * - * Call this method from [UIApplicationDelegate application:openURL:options:] (on iOS 9.0 and - * above), or [UIApplicationDelegate application:openURL:sourceApplication:annotation:] (on iOS 8.x - * and below) in your app. - * - * @param url The URL resource to open. This resource can be a network resource or a file. - */ -+ (void)handleOpenURL:(NSURL *)url; - -/** - * Handles the event when the app receives data associated with user activity that includes a - * Universal Link (on iOS 9.0 and above). - * - * Call this method from [UIApplication continueUserActivity:restorationHandler:] in your app - * delegate (on iOS 9.0 and above). - * - * @param userActivity The activity object containing the data associated with the task the user - * was performing. - */ -+ (void)handleUserActivity:(id)userActivity; - -@end diff --git a/Project 29 - Grocr/Pods/FirebaseAnalytics/Frameworks/frameworks/FirebaseAnalytics.framework/Headers/FIRAnalytics.h b/Project 29 - Grocr/Pods/FirebaseAnalytics/Frameworks/frameworks/FirebaseAnalytics.framework/Headers/FIRAnalytics.h deleted file mode 100755 index 17a6cb54..00000000 --- a/Project 29 - Grocr/Pods/FirebaseAnalytics/Frameworks/frameworks/FirebaseAnalytics.framework/Headers/FIRAnalytics.h +++ /dev/null @@ -1,71 +0,0 @@ -#import - -#import "FIREventNames.h" -#import "FIRParameterNames.h" -#import "FIRUserPropertyNames.h" - -/// The top level Firebase Analytics singleton that provides methods for logging events and setting -/// user properties. See the developer guides for general -/// information on using Firebase Analytics in your apps. -@interface FIRAnalytics : NSObject - -/// Logs an app event. The event can have up to 25 parameters. Events with the same name must have -/// the same parameters. Up to 500 event names are supported. Using predefined events and/or -/// parameters is recommended for optimal reporting. -/// -/// The following event names are reserved and cannot be used: -///
    -///
  • app_clear_data
  • -///
  • app_uninstall
  • -///
  • app_update
  • -///
  • error
  • -///
  • first_open
  • -///
  • in_app_purchase
  • -///
  • notification_dismiss
  • -///
  • notification_foreground
  • -///
  • notification_open
  • -///
  • notification_receive
  • -///
  • os_update
  • -///
  • session_start
  • -///
  • user_engagement
  • -///
-/// -/// @param name The name of the event. Should contain 1 to 32 alphanumeric characters or -/// underscores. The name must start with an alphabetic character. Some event names are -/// reserved. See FIREventNames.h for the list of reserved event names. The "firebase_" prefix -/// is reserved and should not be used. Note that event names are case-sensitive and that -/// logging two events whose names differ only in case will result in two distinct events. -/// @param parameters The dictionary of event parameters. Passing nil indicates that the event has -/// no parameters. Parameter names can be up to 24 characters long and must start with an -/// alphabetic character and contain only alphanumeric characters and underscores. Only NSString -/// and NSNumber (signed 64-bit integer and 64-bit floating-point number) parameter types are -/// supported. NSString parameter values can be up to 36 characters long. The "firebase_" prefix -/// is reserved and should not be used for parameter names. -+ (void)logEventWithName:(nonnull NSString *)name - parameters:(nullable NSDictionary *)parameters; - -/// Sets a user property to a given value. Up to 25 user property names are supported. Once set, -/// user property values persist throughout the app lifecycle and across sessions. -/// -/// The following user property names are reserved and cannot be used: -///
    -///
  • first_open_time
  • -///
  • last_deep_link_referrer
  • -///
  • user_id
  • -///
-/// -/// @param value The value of the user property. Values can be up to 36 characters long. Setting the -/// value to nil removes the user property. -/// @param name The name of the user property to set. Should contain 1 to 24 alphanumeric characters -/// or underscores and must start with an alphabetic character. The "firebase_" prefix is -/// reserved and should not be used for user property names. -+ (void)setUserPropertyString:(nullable NSString *)value forName:(nonnull NSString *)name; - -/// Sets the user ID property. This feature must be used in accordance with -/// Google's Privacy Policy -/// -/// @param userID The user ID to ascribe to the user of this app on this device, which must be -/// non-empty and no more than 36 characters long. Setting userID to nil removes the user ID. -+ (void)setUserID:(nullable NSString *)userID; - -@end diff --git a/Project 29 - Grocr/Pods/FirebaseAnalytics/Frameworks/frameworks/FirebaseAnalytics.framework/Headers/FIRAnalyticsConfiguration.h b/Project 29 - Grocr/Pods/FirebaseAnalytics/Frameworks/frameworks/FirebaseAnalytics.framework/Headers/FIRAnalyticsConfiguration.h deleted file mode 100755 index 667d5a4b..00000000 --- a/Project 29 - Grocr/Pods/FirebaseAnalytics/Frameworks/frameworks/FirebaseAnalytics.framework/Headers/FIRAnalyticsConfiguration.h +++ /dev/null @@ -1,38 +0,0 @@ -#import - -/** - * This class provides configuration fields for Firebase Analytics. - */ -@interface FIRAnalyticsConfiguration : NSObject - -/** - * Returns the shared instance of FIRAnalyticsConfiguration. - */ -+ (FIRAnalyticsConfiguration *)sharedInstance; - -/** - * Sets the minimum engagement time in seconds required to start a new session. The default value - * is 10 seconds. - */ -- (void)setMinimumSessionInterval:(NSTimeInterval)minimumSessionInterval; - -/** - * Sets the interval of inactivity in seconds that terminates the current session. The default - * value is 1800 seconds (30 minutes). - */ -- (void)setSessionTimeoutInterval:(NSTimeInterval)sessionTimeoutInterval; - -/** - * Sets whether analytics collection is enabled for this app on this device. This setting is - * persisted across app sessions. By default it is enabled. - */ -- (void)setAnalyticsCollectionEnabled:(BOOL)analyticsCollectionEnabled; - -/** - * Deprecated. Sets whether measurement and reporting are enabled for this app on this device. By - * default they are enabled. - */ -- (void)setIsEnabled:(BOOL)isEnabled - DEPRECATED_MSG_ATTRIBUTE("Use setAnalyticsCollectionEnabled: instead."); - -@end diff --git a/Project 29 - Grocr/Pods/FirebaseAnalytics/Frameworks/frameworks/FirebaseAnalytics.framework/Headers/FIRApp.h b/Project 29 - Grocr/Pods/FirebaseAnalytics/Frameworks/frameworks/FirebaseAnalytics.framework/Headers/FIRApp.h deleted file mode 100755 index 6b65776a..00000000 --- a/Project 29 - Grocr/Pods/FirebaseAnalytics/Frameworks/frameworks/FirebaseAnalytics.framework/Headers/FIRApp.h +++ /dev/null @@ -1,85 +0,0 @@ -#import -#import - -@class FIROptions; - -NS_ASSUME_NONNULL_BEGIN - -typedef void (^FIRAppVoidBoolCallback)(BOOL success); - -/** - * The entry point of Firebase SDKs. - * - * Initialize and configure FIRApp using [FIRApp configure]; - * Or other customized ways as shown below. - */ -@interface FIRApp : NSObject - -/** - * Configures a default Firebase app. Raises an exception if any configuration step fails. The - * default app is named "__FIRAPP_DEFAULT". This method should be called after the app is launched - * and before using Firebase services. This method is thread safe. - */ -+ (void)configure; - -/** - * Configures the default Firebase app with the provided options. The default app is named - * "__FIRAPP_DEFAULT". Raises an exception if any configuration step fails. This method is thread - * safe. - * - * @param options The Firebase application options used to configure the service. - */ -+ (void)configureWithOptions:(FIROptions *)options; - -/** - * Configures a Firebase app with the given name and options. Raises an exception if any - * configuration step fails. This method is thread safe. - * - * @param name The application's name given by the developer. The name should should only contain - Letters, Numbers and Underscore. - * @param options The Firebase application options used to configure the services. - */ -+ (void)configureWithName:(NSString *)name options:(FIROptions *)options; - -/** - * Returns the default app, or nil if the default app does not exist. - */ -+ (nullable FIRApp *)defaultApp NS_SWIFT_NAME(defaultApp()); - -/** - * Returns a previously created FIRApp instance with the given name, or nil if no such app exists. - * This method is thread safe. - */ -+ (nullable FIRApp *)appNamed:(NSString *)name; - -/** - * Returns the set of all extant FIRApp instances, or nil if there is no FIRApp instance. This - * method is thread safe. - */ -+ (nullable NSDictionary *)allApps; - -/** - * Cleans up the current FIRApp, freeing associated data and returning its name to the pool for - * future use. This method is thread safe in class level. - */ -- (void)deleteApp:(FIRAppVoidBoolCallback)completion; - -/** - * FIRFirebaseApp instances should not be initialized directly. Call |FIRApp configure|, or - * |FIRApp configureWithOptions:|, or |FIRApp configureWithNames:options| directly. - */ -- (nullable instancetype)init NS_UNAVAILABLE; - -/** - * Gets the name of this app. - */ -@property(nonatomic, copy, readonly) NSString *name; - -/** - * Gets the options for this app. - */ -@property(nonatomic, readonly) FIROptions *options; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Project 29 - Grocr/Pods/FirebaseAnalytics/Frameworks/frameworks/FirebaseAnalytics.framework/Headers/FIRConfiguration.h b/Project 29 - Grocr/Pods/FirebaseAnalytics/Frameworks/frameworks/FirebaseAnalytics.framework/Headers/FIRConfiguration.h deleted file mode 100755 index f06526e8..00000000 --- a/Project 29 - Grocr/Pods/FirebaseAnalytics/Frameworks/frameworks/FirebaseAnalytics.framework/Headers/FIRConfiguration.h +++ /dev/null @@ -1,31 +0,0 @@ -#import - -#import "FIRAnalyticsConfiguration.h" - -/** - * The log levels used by FIRConfiguration. - */ -typedef NS_ENUM(NSInteger, FIRLogLevel) { - kFIRLogLevelError = 0, - kFIRLogLevelWarning, - kFIRLogLevelInfo, - kFIRLogLevelDebug, - kFIRLogLevelAssert, - kFIRLogLevelMax = kFIRLogLevelAssert -}; - -/** - * This interface provides global level properties that the developer can tweak, and the singleton - * of each Google service configuration class. - */ -@interface FIRConfiguration : NSObject - -+ (FIRConfiguration *)sharedInstance; - -// The configuration class for Firebase Analytics. -@property(nonatomic, readwrite) FIRAnalyticsConfiguration *analyticsConfiguration; - -// Global log level. Defaults to kFIRLogLevelError. -@property(nonatomic, readwrite, assign) FIRLogLevel logLevel; - -@end diff --git a/Project 29 - Grocr/Pods/FirebaseAnalytics/Frameworks/frameworks/FirebaseAnalytics.framework/Headers/FIREventNames.h b/Project 29 - Grocr/Pods/FirebaseAnalytics/Frameworks/frameworks/FirebaseAnalytics.framework/Headers/FIREventNames.h deleted file mode 100755 index 50a9f838..00000000 --- a/Project 29 - Grocr/Pods/FirebaseAnalytics/Frameworks/frameworks/FirebaseAnalytics.framework/Headers/FIREventNames.h +++ /dev/null @@ -1,311 +0,0 @@ -/// @file FIREventNames.h -/// -/// Predefined event names. -/// -/// An Event is an important occurrence in your app that you want to measure. You can report up to -/// 500 different types of Events per app and you can associate up to 25 unique parameters with each -/// Event type. Some common events are suggested below, but you may also choose to specify custom -/// Event types that are associated with your specific app. Each event type is identified by a -/// unique name. Event names can be up to 32 characters long, may only contain alphanumeric -/// characters and underscores ("_"), and must start with an alphabetic character. The "firebase_" -/// prefix is reserved and should not be used. - -/// Add Payment Info event. This event signifies that a user has submitted their payment information -/// to your app. -static NSString *const kFIREventAddPaymentInfo = @"add_payment_info"; - -/// E-Commerce Add To Cart event. This event signifies that an item was added to a cart for -/// purchase. Add this event to a funnel with kFIREventEcommercePurchase to gauge the effectiveness -/// of your checkout process. Note: If you supply the {@link kFIRParameterValue} parameter, you must -/// also supply the {@link kFIRParameterCurrency} parameter so that revenue metrics can be computed -/// accurately. Params: -/// -///
    -///
  • {@link kFIRParameterQuantity} (signed 64-bit integer as NSNumber)
  • -///
  • {@link kFIRParameterItemID} (NSString)
  • -///
  • {@link kFIRParameterItemName} (NSString)
  • -///
  • {@link kFIRParameterItemCategory} (NSString)
  • -///
  • {@link kFIRParameterItemLocationID} (NSString) (optional)
  • -///
  • {@link kFIRParameterPrice} (double as NSNumber) (optional)
  • -///
  • {@link kFIRParameterCurrency} (NSString) (optional)
  • -///
  • {@link kFIRParameterValue} (double as NSNumber) (optional)
  • -///
  • {@link kFIRParameterOrigin} (NSString) (optional)
  • -///
  • {@link kFIRParameterDestination} (NSString) (optional)
  • -///
  • {@link kFIRParameterStartDate} (NSString) (optional)
  • -///
  • {@link kFIRParameterEndDate} (NSString) (optional)
  • -///
-static NSString *const kFIREventAddToCart = @"add_to_cart"; - -/// E-Commerce Add To Wishlist event. This event signifies that an item was added to a wishlist. -/// Use this event to identify popular gift items in your app. Note: If you supply the -/// {@link kFIRParameterValue} parameter, you must also supply the {@link kFIRParameterCurrency} -/// parameter so that revenue metrics can be computed accurately. Params: -/// -///
    -///
  • {@link kFIRParameterQuantity} (signed 64-bit integer as NSNumber)
  • -///
  • {@link kFIRParameterItemID} (NSString)
  • -///
  • {@link kFIRParameterItemName} (NSString)
  • -///
  • {@link kFIRParameterItemCategory} (NSString)
  • -///
  • {@link kFIRParameterItemLocationID} (NSString) (optional)
  • -///
  • {@link kFIRParameterPrice} (double as NSNumber) (optional)
  • -///
  • {@link kFIRParameterCurrency} (NSString) (optional)
  • -///
  • {@link kFIRParameterValue} (double as NSNumber) (optional)
  • -///
-static NSString *const kFIREventAddToWishlist = @"add_to_wishlist"; - -/// App Open event. By logging this event when an App is moved to the foreground, developers can -/// understand how often users leave and return during the course of a Session. Although Sessions -/// are automatically reported, this event can provide further clarification around the continuous -/// engagement of app-users. -static NSString *const kFIREventAppOpen = @"app_open"; - -/// E-Commerce Begin Checkout event. This event signifies that a user has begun the process of -/// checking out. Add this event to a funnel with your kFIREventEcommercePurchase event to gauge the -/// effectiveness of your checkout process. Note: If you supply the {@link kFIRParameterValue} -/// parameter, you must also supply the {@link kFIRParameterCurrency} parameter so that revenue -/// metrics can be computed accurately. Params: -/// -///
    -///
  • {@link kFIRParameterValue} (double as NSNumber) (optional)
  • -///
  • {@link kFIRParameterCurrency} (NSString) (optional)
  • -///
  • {@link kFIRParameterTransactionID} (NSString) (optional)
  • -///
  • {@link kFIRParameterStartDate} (NSString) (optional)
  • -///
  • {@link kFIRParameterEndDate} (NSString) (optional)
  • -///
  • {@link kFIRParameterNumberOfNights} (signed 64-bit integer as NSNumber) (optional) for -/// hotel bookings
  • -///
  • {@link kFIRParameterNumberOfRooms} (signed 64-bit integer as NSNumber) (optional) for -/// hotel bookings
  • -///
  • {@link kFIRParameterNumberOfPassengers} (signed 64-bit integer as NSNumber) (optional) -/// for travel bookings
  • -///
  • {@link kFIRParameterOrigin} (NSString) (optional)
  • -///
  • {@link kFIRParameterDestination} (NSString) (optional)
  • -///
  • {@link kFIRParameterTravelClass} (NSString) (optional) for travel bookings
  • -///
-static NSString *const kFIREventBeginCheckout = @"begin_checkout"; - -/// E-Commerce Purchase event. This event signifies that an item was purchased by a user. Note: -/// This is different from the in-app purchase event, which is reported automatically for App -/// Store-based apps. Note: If you supply the {@link kFIRParameterValue} parameter, you must also -/// supply the {@link kFIRParameterCurrency} parameter so that revenue metrics can be computed -/// accurately. Params: -/// -///
    -///
  • {@link kFIRParameterCurrency} (NSString) (optional)
  • -///
  • {@link kFIRParameterValue} (double as NSNumber) (optional)
  • -///
  • {@link kFIRParameterTransactionID} (NSString) (optional)
  • -///
  • {@link kFIRParameterTax} (double as NSNumber) (optional)
  • -///
  • {@link kFIRParameterShipping} (double as NSNumber) (optional)
  • -///
  • {@link kFIRParameterCoupon} (NSString) (optional)
  • -///
  • {@link kFIRParameterLocation} (NSString) (optional)
  • -///
  • {@link kFIRParameterStartDate} (NSString) (optional)
  • -///
  • {@link kFIRParameterEndDate} (NSString) (optional)
  • -///
  • {@link kFIRParameterNumberOfNights} (signed 64-bit integer as NSNumber) (optional) for -/// hotel bookings
  • -///
  • {@link kFIRParameterNumberOfRooms} (signed 64-bit integer as NSNumber) (optional) for -/// hotel bookings
  • -///
  • {@link kFIRParameterNumberOfPassengers} (signed 64-bit integer as NSNumber) (optional) -/// for travel bookings
  • -///
  • {@link kFIRParameterOrigin} (NSString) (optional)
  • -///
  • {@link kFIRParameterDestination} (NSString) (optional)
  • -///
  • {@link kFIRParameterTravelClass} (NSString) (optional) for travel bookings
  • -///
-static NSString *const kFIREventEcommercePurchase = @"ecommerce_purchase"; - -/// Generate Lead event. Log this event when a lead has been generated in the app to understand the -/// efficacy of your install and re-engagement campaigns. Note: If you supply the -/// {@link kFIRParameterValue} parameter, you must also supply the {@link kFIRParameterCurrency} -/// parameter so that revenue metrics can be computed accurately. Params: -/// -///
    -///
  • {@link kFIRParameterCurrency} (NSString) (optional)
  • -///
  • {@link kFIRParameterValue} (double as NSNumber) (optional)
  • -///
-static NSString *const kFIREventGenerateLead = @"generate_lead"; - -/// Join Group event. Log this event when a user joins a group such as a guild, team or family. Use -/// this event to analyze how popular certain groups or social features are in your app. Params: -/// -///
    -///
  • {@link kFIRParameterGroupID} (NSString)
  • -///
-static NSString *const kFIREventJoinGroup = @"join_group"; - -/// Level Up event. This event signifies that a player has leveled up in your gaming app. It can -/// help you gauge the level distribution of your userbase and help you identify certain levels that -/// are difficult to pass. Params: -/// -///
    -///
  • {@link kFIRParameterLevel} (signed 64-bit integer as NSNumber)
  • -///
  • {@link kFIRParameterCharacter} (NSString) (optional)
  • -///
-static NSString *const kFIREventLevelUp = @"level_up"; - -/// Login event. Apps with a login feature can report this event to signify that a user has logged -/// in. -static NSString *const kFIREventLogin = @"login"; - -/// Post Score event. Log this event when the user posts a score in your gaming app. This event can -/// help you understand how users are actually performing in your game and it can help you correlate -/// high scores with certain audiences or behaviors. Params: -/// -///
    -///
  • {@link kFIRParameterScore} (signed 64-bit integer as NSNumber)
  • -///
  • {@link kFIRParameterLevel} (signed 64-bit integer as NSNumber) (optional)
  • -///
  • {@link kFIRParameterCharacter} (NSString) (optional)
  • -///
-static NSString *const kFIREventPostScore = @"post_score"; - -/// Present Offer event. This event signifies that the app has presented a purchase offer to a user. -/// Add this event to a funnel with the kFIREventAddToCart and kFIREventEcommercePurchase to gauge -/// your conversion process. Note: If you supply the {@link kFIRParameterValue} parameter, you must -/// also supply the {@link kFIRParameterCurrency} parameter so that revenue metrics can be computed -/// accurately. Params: -/// -///
    -///
  • {@link kFIRParameterQuantity} (signed 64-bit integer as NSNumber)
  • -///
  • {@link kFIRParameterItemID} (NSString)
  • -///
  • {@link kFIRParameterItemName} (NSString)
  • -///
  • {@link kFIRParameterItemCategory} (NSString)
  • -///
  • {@link kFIRParameterItemLocationID} (NSString) (optional)
  • -///
  • {@link kFIRParameterPrice} (double as NSNumber) (optional)
  • -///
  • {@link kFIRParameterCurrency} (NSString) (optional)
  • -///
  • {@link kFIRParameterValue} (double as NSNumber) (optional)
  • -///
-static NSString *const kFIREventPresentOffer = @"present_offer"; - -/// E-Commerce Purchase Refund event. This event signifies that an item purchase was refunded. -/// Note: If you supply the {@link kFIRParameterValue} parameter, you must also supply the -/// {@link kFIRParameterCurrency} parameter so that revenue metrics can be computed accurately. -/// Params: -/// -///
    -///
  • {@link kFIRParameterCurrency} (NSString) (optional)
  • -///
  • {@link kFIRParameterValue} (double as NSNumber) (optional)
  • -///
  • {@link kFIRParameterTransactionID} (NSString) (optional)
  • -///
-static NSString *const kFIREventPurchaseRefund = @"purchase_refund"; - -/// Search event. Apps that support search features can use this event to contextualize search -/// operations by supplying the appropriate, corresponding parameters. This event can help you -/// identify the most popular content in your app. Params: -/// -///
    -///
  • {@link kFIRParameterSearchTerm} (NSString)
  • -///
  • {@link kFIRParameterStartDate} (NSString) (optional)
  • -///
  • {@link kFIRParameterEndDate} (NSString) (optional)
  • -///
  • {@link kFIRParameterNumberOfNights} (signed 64-bit integer as NSNumber) (optional) for -/// hotel bookings
  • -///
  • {@link kFIRParameterNumberOfRooms} (signed 64-bit integer as NSNumber) (optional) for -/// hotel bookings
  • -///
  • {@link kFIRParameterNumberOfPassengers} (signed 64-bit integer as NSNumber) (optional) -/// for travel bookings
  • -///
  • {@link kFIRParameterOrigin} (NSString) (optional)
  • -///
  • {@link kFIRParameterDestination} (NSString) (optional)
  • -///
  • {@link kFIRParameterTravelClass} (NSString) (optional) for travel bookings
  • -///
-static NSString *const kFIREventSearch = @"search"; - -/// Select Content event. This general purpose event signifies that a user has selected some content -/// of a certain type in an app. The content can be any object in your app. This event can help you -/// identify popular content and categories of content in your app. Params: -/// -///
    -///
  • {@link kFIRParameterContentType} (NSString)
  • -///
  • {@link kFIRParameterItemID} (NSString)
  • -///
-static NSString *const kFIREventSelectContent = @"select_content"; - -/// Share event. Apps with social features can log the Share event to identify the most viral -/// content. Params: -/// -///
    -///
  • {@link kFIRParameterContentType} (NSString)
  • -///
  • {@link kFIRParameterItemID} (NSString)
  • -///
-static NSString *const kFIREventShare = @"share"; - -/// Sign Up event. This event indicates that a user has signed up for an account in your app. The -/// parameter signifies the method by which the user signed up. Use this event to understand the -/// different behaviors between logged in and logged out users. Params: -/// -///
    -///
  • {@link kFIRParameterSignUpMethod} (NSString)
  • -///
-static NSString *const kFIREventSignUp = @"sign_up"; - -/// Spend Virtual Currency event. This event tracks the sale of virtual goods in your app and can -/// help you identify which virtual goods are the most popular objects of purchase. Params: -/// -///
    -///
  • {@link kFIRParameterItemName} (NSString)
  • -///
  • {@link kFIRParameterVirtualCurrencyName} (NSString)
  • -///
  • {@link kFIRParameterValue} (signed 64-bit integer or double as NSNumber)
  • -///
-static NSString *const kFIREventSpendVirtualCurrency = @"spend_virtual_currency"; - -/// Tutorial Begin event. This event signifies the start of the on-boarding process in your app. Use -/// this in a funnel with kFIREventTutorialComplete to understand how many users complete this -/// process and move on to the full app experience. -static NSString *const kFIREventTutorialBegin = @"tutorial_begin"; - -/// Tutorial End event. Use this event to signify the user's completion of your app's on-boarding -/// process. Add this to a funnel with kFIREventTutorialBegin to gauge the completion rate of your -/// on-boarding process. -static NSString *const kFIREventTutorialComplete = @"tutorial_complete"; - -/// Unlock Achievement event. Log this event when the user has unlocked an achievement in your -/// game. Since achievements generally represent the breadth of a gaming experience, this event can -/// help you understand how many users are experiencing all that your game has to offer. Params: -/// -///
    -///
  • {@link kFIRParameterAchievementID} (NSString)
  • -///
-static NSString *const kFIREventUnlockAchievement = @"unlock_achievement"; - -/// View Item event. This event signifies that some content was shown to the user. This content may -/// be a product, a webpage or just a simple image or text. Use the appropriate parameters to -/// contextualize the event. Use this event to discover the most popular items viewed in your app. -/// Note: If you supply the {@link kFIRParameterValue} parameter, you must also supply the -/// {@link kFIRParameterCurrency} parameter so that revenue metrics can be computed accurately. -/// Params: -/// -///
    -///
  • {@link kFIRParameterItemID} (NSString)
  • -///
  • {@link kFIRParameterItemName} (NSString)
  • -///
  • {@link kFIRParameterItemCategory} (NSString)
  • -///
  • {@link kFIRParameterItemLocationID} (NSString) (optional)
  • -///
  • {@link kFIRParameterPrice} (double as NSNumber) (optional)
  • -///
  • {@link kFIRParameterQuantity} (signed 64-bit integer as NSNumber) (optional)
  • -///
  • {@link kFIRParameterCurrency} (NSString) (optional)
  • -///
  • {@link kFIRParameterValue} (double as NSNumber) (optional)
  • -///
  • {@link kFIRParameterStartDate} (NSString) (optional)
  • -///
  • {@link kFIRParameterEndDate} (NSString) (optional)
  • -///
  • {@link kFIRParameterFlightNumber} (NSString) (optional) for travel bookings
  • -///
  • {@link kFIRParameterNumberOfPassengers} (signed 64-bit integer as NSNumber) (optional) -/// for travel bookings
  • -///
  • {@link kFIRParameterNumberOfNights} (signed 64-bit integer as NSNumber) (optional) for -/// travel bookings
  • -///
  • {@link kFIRParameterNumberOfRooms} (signed 64-bit integer as NSNumber) (optional) for -/// travel bookings
  • -///
  • {@link kFIRParameterOrigin} (NSString) (optional)
  • -///
  • {@link kFIRParameterDestination} (NSString) (optional)
  • -///
  • {@link kFIRParameterSearchTerm} (NSString) (optional) for travel bookings
  • -///
  • {@link kFIRParameterTravelClass} (NSString) (optional) for travel bookings
  • -///
-static NSString *const kFIREventViewItem = @"view_item"; - -/// View Item List event. Log this event when the user has been presented with a list of items of a -/// certain category. Params: -/// -///
    -///
  • {@link kFIRParameterItemCategory} (NSString)
  • -///
-static NSString *const kFIREventViewItemList = @"view_item_list"; - -/// View Search Results event. Log this event when the user has been presented with the results of a -/// search. Params: -/// -///
    -///
  • {@link kFIRParameterSearchTerm} (NSString)
  • -///
-static NSString *const kFIREventViewSearchResults = @"view_search_results"; diff --git a/Project 29 - Grocr/Pods/FirebaseAnalytics/Frameworks/frameworks/FirebaseAnalytics.framework/Headers/FIROptions.h b/Project 29 - Grocr/Pods/FirebaseAnalytics/Frameworks/frameworks/FirebaseAnalytics.framework/Headers/FIROptions.h deleted file mode 100755 index 82418f69..00000000 --- a/Project 29 - Grocr/Pods/FirebaseAnalytics/Frameworks/frameworks/FirebaseAnalytics.framework/Headers/FIROptions.h +++ /dev/null @@ -1,77 +0,0 @@ -#import - -/** - * This class provides constant fields of Google APIs. - */ -@interface FIROptions : NSObject - -/** - * Returns the default options. - */ -+ (FIROptions *)defaultOptions; - -/** - * An iOS API key used for authenticating requests from your app, e.g. - * @"AIzaSyDdVgKwhZl0sTTTLZ7iTmt1r3N2cJLnaDk", used to identify your app to Google servers. - */ -@property(nonatomic, readonly, copy) NSString *APIKey; - -/** - * The OAuth2 client ID for iOS application used to authenticate Google users, for example - * @"12345.apps.googleusercontent.com", used for signing in with Google. - */ -@property(nonatomic, readonly, copy) NSString *clientID; - -/** - * The tracking ID for Google Analytics, e.g. @"UA-12345678-1", used to configure Google Analytics. - */ -@property(nonatomic, readonly, copy) NSString *trackingID; - -/** - * The Project Number from the Google Developer's console, for example @"012345678901", used to - * configure Google Cloud Messaging. - */ -@property(nonatomic, readonly, copy) NSString *GCMSenderID; - -/** - * The Android client ID used in Google AppInvite when an iOS app has its Android version, for - * example @"12345.apps.googleusercontent.com". - */ -@property(nonatomic, readonly, copy) NSString *androidClientID; - -/** - * The Google App ID that is used to uniquely identify an instance of an app. - */ -@property(nonatomic, readonly, copy) NSString *googleAppID; - -/** - * The database root URL, e.g. @"http://abc-xyz-123.firebaseio.com". - */ -@property(nonatomic, readonly, copy) NSString *databaseURL; - -/** - * The URL scheme used to set up Durable Deep Link service. - */ -@property(nonatomic, readwrite, copy) NSString *deepLinkURLScheme; - -/** - * The Google Cloud Storage bucket name, e.g. @"abc-xyz-123.storage.firebase.com". - */ -@property(nonatomic, readonly, copy) NSString *storageBucket; - -/** - * Initializes a customized instance of FIROptions with keys. googleAppID, bundleID and GCMSenderID - * are required. Other keys may required for configuring specific services. - */ -- (instancetype)initWithGoogleAppID:(NSString *)googleAppID - bundleID:(NSString *)bundleID - GCMSenderID:(NSString *)GCMSenderID - APIKey:(NSString *)APIKey - clientID:(NSString *)clientID - trackingID:(NSString *)trackingID - androidClientID:(NSString *)androidClientID - databaseURL:(NSString *)databaseURL - storageBucket:(NSString *)storageBucket - deepLinkURLScheme:(NSString *)deepLinkURLScheme; - -@end diff --git a/Project 29 - Grocr/Pods/FirebaseAnalytics/Frameworks/frameworks/FirebaseAnalytics.framework/Headers/FIRParameterNames.h b/Project 29 - Grocr/Pods/FirebaseAnalytics/Frameworks/frameworks/FirebaseAnalytics.framework/Headers/FIRParameterNames.h deleted file mode 100755 index 42c0c5e2..00000000 --- a/Project 29 - Grocr/Pods/FirebaseAnalytics/Frameworks/frameworks/FirebaseAnalytics.framework/Headers/FIRParameterNames.h +++ /dev/null @@ -1,304 +0,0 @@ -/// @file FIRParameterNames.h -/// -/// Predefined event parameter names. -/// -/// Params supply information that contextualize Events. You can associate up to 25 unique Params -/// with each Event type. Some Params are suggested below for certain common Events, but you are -/// not limited to these. You may supply extra Params for suggested Events or custom Params for -/// Custom events. Param names can be up to 24 characters long, may only contain alphanumeric -/// characters and underscores ("_"), and must start with an alphabetic character. Param values can -/// be up to 36 characters long. The "firebase_" prefix is reserved and should not be used. - -/// Game achievement ID (NSString). -///
-///     NSDictionary *params = @{
-///       kFIRParameterAchievementID : @"10_matches_won",
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterAchievementID = @"achievement_id"; - -/// Character used in game (NSString). -///
-///     NSDictionary *params = @{
-///       kFIRParameterCharacter : @"beat_boss",
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterCharacter = @"character"; - -/// Type of content selected (NSString). -///
-///     NSDictionary *params = @{
-///       kFIRParameterContentType : @"news article",
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterContentType = @"content_type"; - -/// Coupon code for a purchasable item (NSString). -///
-///     NSDictionary *params = @{
-///       kFIRParameterCoupon : @"zz123",
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterCoupon = @"coupon"; - -/// Purchase currency in 3-letter -/// ISO_4217 format (NSString). -///
-///     NSDictionary *params = @{
-///       kFIRParameterCurrency : @"USD",
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterCurrency = @"currency"; - -/// Flight or Travel destination (NSString). -///
-///     NSDictionary *params = @{
-///       kFIRParameterDestination : @"Mountain View, CA",
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterDestination = @"destination"; - -/// The arrival date, check-out date or rental end date for the item. This should be in -/// YYYY-MM-DD format (NSString). -///
-///     NSDictionary *params = @{
-///       kFIRParameterEndDate : @"2015-09-14",
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterEndDate = @"end_date"; - -/// Flight number for travel events (NSString). -///
-///     NSDictionary *params = @{
-///       kFIRParameterFlightNumber : @"ZZ800",
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterFlightNumber = @"flight_number"; - -/// Group/clan/guild ID (NSString). -///
-///     NSDictionary *params = @{
-///       kFIRParameterGroupID : @"g1",
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterGroupID = @"group_id"; - -/// Item category (NSString). -///
-///     NSDictionary *params = @{
-///       kFIRParameterItemCategory : @"t-shirts",
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterItemCategory = @"item_category"; - -/// Item ID (NSString). -///
-///     NSDictionary *params = @{
-///       kFIRParameterItemID : @"p7654",
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterItemID = @"item_id"; - -/// The Google Place ID (NSString) that -/// corresponds to the associated item. Alternatively, you can supply your own custom Location ID. -///
-///     NSDictionary *params = @{
-///       kFIRParameterItemLocationID : @"ChIJiyj437sx3YAR9kUWC8QkLzQ",
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterItemLocationID = @"item_location_id"; - -/// Item name (NSString). -///
-///     NSDictionary *params = @{
-///       kFIRParameterItemName : @"abc",
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterItemName = @"item_name"; - -/// Level in game (signed 64-bit integer as NSNumber). -///
-///     NSDictionary *params = @{
-///       kFIRParameterLevel : @(42),
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterLevel = @"level"; - -/// Location (NSString). The Google Place ID -/// that corresponds to the associated event. Alternatively, you can supply your own custom -/// Location ID. -///
-///     NSDictionary *params = @{
-///       kFIRParameterLocation : @"ChIJiyj437sx3YAR9kUWC8QkLzQ",
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterLocation = @"location"; - -/// Number of nights staying at hotel (signed 64-bit integer as NSNumber). -///
-///     NSDictionary *params = @{
-///       kFIRParameterNumberOfNights : @(3),
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterNumberOfNights = @"number_of_nights"; - -/// Number of passengers traveling (signed 64-bit integer as NSNumber). -///
-///     NSDictionary *params = @{
-///       kFIRParameterNumberOfPassengers : @(11),
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterNumberOfPassengers = @"number_of_passengers"; - -/// Number of rooms for travel events (signed 64-bit integer as NSNumber). -///
-///     NSDictionary *params = @{
-///       kFIRParameterNumberOfRooms : @(2),
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterNumberOfRooms = @"number_of_rooms"; - -/// Flight or Travel origin (NSString). -///
-///     NSDictionary *params = @{
-///       kFIRParameterOrigin : @"Mountain View, CA",
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterOrigin = @"origin"; - -/// Purchase price (double as NSNumber). -///
-///     NSDictionary *params = @{
-///       kFIRParameterPrice : @(1.0),
-///       kFIRParameterCurrency : @"USD",  // e.g. $1.00 USD
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterPrice = @"price"; - -/// Purchase quantity (signed 64-bit integer as NSNumber). -///
-///     NSDictionary *params = @{
-///       kFIRParameterQuantity : @(1),
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterQuantity = @"quantity"; - -/// Score in game (signed 64-bit integer as NSNumber). -///
-///     NSDictionary *params = @{
-///       kFIRParameterScore : @(4200),
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterScore = @"score"; - -/// The search string/keywords used (NSString). -///
-///     NSDictionary *params = @{
-///       kFIRParameterSearchTerm : @"periodic table",
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterSearchTerm = @"search_term"; - -/// Shipping cost (double as NSNumber). -///
-///     NSDictionary *params = @{
-///       kFIRParameterShipping : @(9.50),
-///       kFIRParameterCurrency : @"USD",  // e.g. $9.50 USD
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterShipping = @"shipping"; - -/// Sign up method (NSString). -///
-///     NSDictionary *params = @{
-///       kFIRParameterSignUpMethod : @"google",
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterSignUpMethod = @"sign_up_method"; - -/// The departure date, check-in date or rental start date for the item. This should be in -/// YYYY-MM-DD format (NSString). -///
-///     NSDictionary *params = @{
-///       kFIRParameterStartDate : @"2015-09-14",
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterStartDate = @"start_date"; - -/// Tax amount (double as NSNumber). -///
-///     NSDictionary *params = @{
-///       kFIRParameterTax : @(1.0),
-///       kFIRParameterCurrency : @"USD",  // e.g. $1.00 USD
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterTax = @"tax"; - -/// A single ID for a ecommerce group transaction (NSString). -///
-///     NSDictionary *params = @{
-///       kFIRParameterTransactionID : @"ab7236dd9823",
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterTransactionID = @"transaction_id"; - -/// Travel class (NSString). -///
-///     NSDictionary *params = @{
-///       kFIRParameterTravelClass : @"business",
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterTravelClass = @"travel_class"; - -/// A context-specific numeric value which is accumulated automatically for each event type. This is -/// a general purpose parameter that is useful for accumulating a key metric that pertains to an -/// event. Examples include revenue, distance, time and points. Value should be specified as signed -/// 64-bit integer or double as NSNumber. Notes: Currency-related values should be supplied using -/// double as NSNumber and must be accompanied by a {@link kFIRParameterCurrency} parameter. The -/// valid range of accumulated values is [-9,223,372,036,854.77, 9,223,372,036,854.77]. -///
-///     NSDictionary *params = @{
-///       kFIRParameterValue : @(3.99),
-///       kFIRParameterCurrency : @"USD",  // e.g. $3.99 USD
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterValue = @"value"; - -/// Name of virtual currency type (NSString). -///
-///     NSDictionary *params = @{
-///       kFIRParameterVirtualCurrencyName : @"virtual_currency_name",
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterVirtualCurrencyName = @"virtual_currency_name"; diff --git a/Project 29 - Grocr/Pods/FirebaseAnalytics/Frameworks/frameworks/FirebaseAnalytics.framework/Headers/FIRUserPropertyNames.h b/Project 29 - Grocr/Pods/FirebaseAnalytics/Frameworks/frameworks/FirebaseAnalytics.framework/Headers/FIRUserPropertyNames.h deleted file mode 100755 index 54cf1c20..00000000 --- a/Project 29 - Grocr/Pods/FirebaseAnalytics/Frameworks/frameworks/FirebaseAnalytics.framework/Headers/FIRUserPropertyNames.h +++ /dev/null @@ -1,13 +0,0 @@ -/// @file FIRUserPropertyNames.h -/// -/// Predefined user property names. -/// -/// A UserProperty is an attribute that describes the app-user. By supplying UserProperties, you can -/// later analyze different behaviors of various segments of your userbase. You may supply up to 25 -/// unique UserProperties per app, and you can use the name and value of your choosing for each one. -/// UserProperty names can be up to 24 characters long, may only contain alphanumeric characters and -/// underscores ("_"), and must start with an alphabetic character. UserProperty values can be up to -/// 36 characters long. The "firebase_" prefix is reserved and should not be used. - -/// The method used to sign in. For example, "google", "facebook" or "twitter". -static NSString *const kFIRUserPropertySignUpMethod = @"sign_up_method"; diff --git a/Project 29 - Grocr/Pods/FirebaseAnalytics/Frameworks/frameworks/FirebaseAnalytics.framework/Headers/FirebaseAnalytics.h b/Project 29 - Grocr/Pods/FirebaseAnalytics/Frameworks/frameworks/FirebaseAnalytics.framework/Headers/FirebaseAnalytics.h deleted file mode 100755 index 02667b30..00000000 --- a/Project 29 - Grocr/Pods/FirebaseAnalytics/Frameworks/frameworks/FirebaseAnalytics.framework/Headers/FirebaseAnalytics.h +++ /dev/null @@ -1,11 +0,0 @@ -// Generated umbrella header for FirebaseAnalytics. - -#import "FIRAnalytics+AppDelegate.h" -#import "FIRAnalytics.h" -#import "FIRAnalyticsConfiguration.h" -#import "FIRApp.h" -#import "FIRConfiguration.h" -#import "FIREventNames.h" -#import "FIROptions.h" -#import "FIRParameterNames.h" -#import "FIRUserPropertyNames.h" diff --git a/Project 29 - Grocr/Pods/FirebaseAnalytics/Frameworks/frameworks/FirebaseAnalytics.framework/Modules/module.modulemap b/Project 29 - Grocr/Pods/FirebaseAnalytics/Frameworks/frameworks/FirebaseAnalytics.framework/Modules/module.modulemap deleted file mode 100755 index 65f7ed9b..00000000 --- a/Project 29 - Grocr/Pods/FirebaseAnalytics/Frameworks/frameworks/FirebaseAnalytics.framework/Modules/module.modulemap +++ /dev/null @@ -1,26 +0,0 @@ -framework module FirebaseAnalytics { - - export * - - umbrella header "FirebaseAnalytics.h" - - header "FIRAnalytics+AppDelegate.h" - header "FIRAnalytics.h" - header "FIRAnalyticsConfiguration.h" - header "FIRApp.h" - header "FIRConfiguration.h" - header "FIREventNames.h" - header "FIROptions.h" - header "FIRParameterNames.h" - header "FIRUserPropertyNames.h" - - link framework "AddressBook" - link framework "AdSupport" - link framework "SafariServices" - link framework "StoreKit" - link framework "SystemConfiguration" - - link "c++" - link "sqlite3" - link "z" -} diff --git a/Project 29 - Grocr/Pods/FirebaseAuth/CHANGELOG.md b/Project 29 - Grocr/Pods/FirebaseAuth/CHANGELOG.md deleted file mode 100755 index e38b5bc6..00000000 --- a/Project 29 - Grocr/Pods/FirebaseAuth/CHANGELOG.md +++ /dev/null @@ -1,10 +0,0 @@ -# 2016-06-20 -- v3.0.3 -- Adds documentation for all possible errors returned by each method. -- Improves error handling and messages for a variety of error conditions. -- Whether or not an user is considered anonymous is now consistent with other - platforms. -- A saved signed in user is now siloed between different Firebase projects - within the same app. - -# 2016-05-18 -- v3.0.2 -- Initial public release. diff --git a/Project 29 - Grocr/Pods/FirebaseAuth/Frameworks/frameworks/FirebaseAuth.framework/FirebaseAuth b/Project 29 - Grocr/Pods/FirebaseAuth/Frameworks/frameworks/FirebaseAuth.framework/FirebaseAuth deleted file mode 100755 index 5b64c21d..00000000 Binary files a/Project 29 - Grocr/Pods/FirebaseAuth/Frameworks/frameworks/FirebaseAuth.framework/FirebaseAuth and /dev/null differ diff --git a/Project 29 - Grocr/Pods/FirebaseAuth/Frameworks/frameworks/FirebaseAuth.framework/Headers/FIRAuth.h b/Project 29 - Grocr/Pods/FirebaseAuth/Frameworks/frameworks/FirebaseAuth.framework/Headers/FIRAuth.h deleted file mode 100755 index e2f90e6c..00000000 --- a/Project 29 - Grocr/Pods/FirebaseAuth/Frameworks/frameworks/FirebaseAuth.framework/Headers/FIRAuth.h +++ /dev/null @@ -1,255 +0,0 @@ -/** @file FIRAuth.h - @brief Firebase Auth SDK - @copyright Copyright 2015 Google Inc. - @remarks Use of this SDK is subject to the Google APIs Terms of Service: - https://developers.google.com/terms/ - */ - -#import - -#import - -@class FIRApp; -@class FIRAuth; -@class FIRAuthCredential; -@class FIRUser; -@protocol FIRAuthStateListener; - -NS_ASSUME_NONNULL_BEGIN - -/** @typedef FIRAuthStateDidChangeListenerHandle - @brief The type of handle returned by @c FIRAuth.addAuthStateDidChangeListener:. - */ -typedef id FIRAuthStateDidChangeListenerHandle; - -/** @typedef FIRAuthStateDidChangeListenerBlock - @brief The type of block which can be registered as a listener for auth state did change events. - @param auth The @c FIRAuth object on which state changes occurred. - @param user Optionally; the current signed in user, if any. - */ -typedef void(^FIRAuthStateDidChangeListenerBlock)(FIRAuth *auth, FIRUser *_Nullable user); - -/** @var FIRAuthStateDidChangeNotification - @brief The name of the @c NSNotificationCenter notification which is posted when the auth state - changes (for example, a new token has been produced, a user signs in or signs out). The - object parameter of the notification is the sender @c FIRAuth instance. - */ -extern NSString *const FIRAuthStateDidChangeNotification; - -/** @typedef FIRAuthResultCallback - @brief The type of block invoked when sign-in related events complete. - @param user Optionally; the signed in user, if any. - @param error Optionally; if an error occurs, this is the NSError object that describes the - problem. Set to nil otherwise. - */ -typedef void (^FIRAuthResultCallback)(FIRUser *_Nullable user, NSError *_Nullable error); - -/** @typedef FIRProviderQueryCallback - @brief The type of block invoked when a list of identity providers for a given email address is - requested. - @param providers Optionally; a list of provider identifiers, if any. - @see FIRGoogleAuthProviderID etc. - @param error Optionally; if an error occurs, this is the NSError object that describes the - problem. Set to nil otherwise. - */ -typedef void (^FIRProviderQueryCallback)(NSArray *_Nullable providers, - NSError *_Nullable error); - -/** @typedef FIRSendPasswordResetCallback - @brief The type of block invoked when initiating a password reset. - @param error Optionally; if an error occurs, this is the NSError object that describes the - problem. Set to nil otherwise. - */ -typedef void (^FIRSendPasswordResetCallback)(NSError *_Nullable error); - -/** @class FIRAuth - @brief Manages authentication for Firebase apps. - @remarks This class is thread-safe. - */ -@interface FIRAuth : NSObject - -/** @fn auth - @brief Gets the auth object for the default Firebase app. - @remarks Thread safe. - */ -+ (nullable FIRAuth *)auth NS_SWIFT_NAME(auth()); - -/** @fn authWithApp: - @brief Gets the auth object for a @c FIRApp. - @param app The @c FIRApp for which to retrieve the associated @c FIRAuth instance. - @return The @c FIRAuth instance associated with the given @c FIRApp. - */ -+ (nullable FIRAuth *)authWithApp:(FIRApp *)app; - -/** @property app - @brief Gets the @c FIRApp object that this auth object is connected to. - */ -@property(nonatomic, weak, readonly, nullable) FIRApp *app; - -/** @property currentUser - @brief Synchronously gets the cached current user, or null if there is none. - */ -@property(nonatomic, strong, readonly, nullable) FIRUser *currentUser; - -/** @fn init - @brief Please access auth instances using @c FIRAuth.auth and @c FIRAuth.authForApp:. - */ -- (nullable instancetype)init NS_UNAVAILABLE; - -/** @fn fetchProvidersForEmail:completion: - @brief Fetches the list of IdPs that can be used for signing in with the provided email address. - Useful for an "identifier-first" sign-in flow. - @param email The email address for which to obtain a list of identity providers. - @param completion Optionally; a block which is invoked when the list of providers for the - specified email address is ready or an error was encountered. Invoked asynchronously on the - main thread in the future. - @remarks Possible error codes: - - @c FIRAuthErrorCodeInvalidEmail - Indicates the email address is malformed. - - See @c FIRAuthErrors for a list of error codes that are common to all API methods. - */ -- (void)fetchProvidersForEmail:(NSString *)email - completion:(nullable FIRProviderQueryCallback)completion; - -/** @fn signInWithEmail:password:completion: - @brief Signs in using an email address and password. - @param email The user's email address. - @param password The user's password. - @param completion Optionally; a block which is invoked when the sign in flow finishes, or is - canceled. Invoked asynchronously on the main thread in the future. - @remarks Possible error codes: - - @c FIRAuthErrorCodeOperationNotAllowed Indicates that email and password accounts are not - enabled. Enable them in the Auth section of the Firebase console. - - @c FIRAuthErrorCodeUserDisabled Indicates the user's account is disabled. - - @c FIRAuthErrorCodeWrongPassword Indicates the user attempted sign in with an incorrect - password. - - See @c FIRAuthErrors for a list of error codes that are common to all API methods. - */ -- (void)signInWithEmail:(NSString *)email - password:(NSString *)password - completion:(nullable FIRAuthResultCallback)completion; - -/** @fn signInWithCredential:completion: - @brief Asynchronously signs in to Firebase with the given 3rd-party credentials (e.g. a Facebook - login Access Token, a Google ID Token/Access Token pair, etc.) - @param credential The credential supplied by the IdP. - @param completion Optionally; a block which is invoked when the sign in flow finishes, or is - canceled. Invoked asynchronously on the main thread in the future. - @remarks Possible error codes: - - @c FIRAuthErrorCodeInvalidCredential Indicates the supplied credential is invalid. This - could happen if it has expired or it is malformed. - - @c FIRAuthErrorCodeOperationNotAllowed Indicates that accounts with the identity provider - represented by the credential are not enabled. Enable them in the Auth section of the - Firebase console. - - @c FIRAuthErrorCodeEmailAlreadyInUse Indicates the email asserted by the credential - (e.g. the email in a Facebook access token) is already in use by an existing account, - that cannot be authenticated with this sign-in method. Call fetchProvidersForEmail for - this user’s email and then prompt them to sign in with any of the sign-in providers - returned. This error will only be thrown if the “One account per email address” - setting is enabled in the Firebase console, under Auth settings. - Please note that the - error code raised in this specific situation may not be the same on Web and Android. - - @c FIRAuthErrorCodeUserDisabled Indicates the user's account is disabled. - - @c FIRAuthErrorCodeWrongPassword Indicates the user attempted sign in with a incorrect - password, if credential is of the type EmailPasswordAuthCredential. - - See @c FIRAuthErrors for a list of error codes that are common to all API methods. - */ -- (void)signInWithCredential:(FIRAuthCredential *)credential - completion:(nullable FIRAuthResultCallback)completion; - -/** @fn signInAnonymouslyWithCompletion: - @brief Asynchronously creates and becomes an anonymous user. - @param completion Optionally; a block which is invoked when the sign in finishes, or is - canceled. Invoked asynchronously on the main thread in the future. - @remarks If there is already an anonymous user signed in, that user will be returned instead. - If there is any other existing user signed in, that user will be signed out. - @remarks Possible error codes: - - @c FIRAuthErrorCodeOperationNotAllowed Indicates that anonymous accounts are not enabled. - Enable them in the Auth section of the Firebase console. - - See @c FIRAuthErrors for a list of error codes that are common to all API methods. - */ -- (void)signInAnonymouslyWithCompletion:(nullable FIRAuthResultCallback)completion; - -/** @fn signInWithCustomToken:completion: - @brief Asynchronously signs in to Firebase with the given Auth token. - @param token A self-signed custom auth token. - @param completion Optionally; a block which is invoked when the sign in finishes, or is - canceled. Invoked asynchronously on the main thread in the future. - @remarks Possible error codes: - - @c FIRAuthErrorCodeInvalidCustomToken Indicates a validation error with the custom token. - - @c FIRAuthErrorCodeCustomTokenMismatch Indicates the service account and the API key - belong to different projects. - - See @c FIRAuthErrors for a list of error codes that are common to all API methods. - */ -- (void)signInWithCustomToken:(NSString *)token - completion:(nullable FIRAuthResultCallback)completion; - -/** @fn createUserWithEmail:password:completion: - @brief Creates and, on success, signs in a user with the given email address and password. - @param email The user's email address. - @param password The user's desired password. - @param completion Optionally; a block which is invoked when the sign up flow finishes, or is - canceled. Invoked asynchronously on the main thread in the future. - @remarks Possible error codes: - - @c FIRAuthErrorCodeInvalidEmail - Indicates the email address is malformed. - - @c FIRAuthErrorCodeEmailAlreadyInUse Indicates the email used to attempt sign up - already exists. Call fetchProvidersForEmail to check which sign-in mechanisms the user - used, and prompt the user to sign in with one of those. - - @c FIRAuthErrorCodeOperationNotAllowed Indicates that email and password accounts are not - enabled. Enable them in the Auth section of the Firebase console. - - @c FIRAuthErrorCodeWeakPassword Indicates an attempt to set a password that is considered - too weak. The NSLocalizedFailureReasonErrorKey field in the NSError.userInfo dictionary - object will contain more detailed explanation that can be shown to the user. - - See @c FIRAuthErrors for a list of error codes that are common to all API methods. - */ -- (void)createUserWithEmail:(NSString *)email - password:(NSString *)password - completion:(nullable FIRAuthResultCallback)completion; - -/** @fn sendPasswordResetWithEmail:completion: - @brief Initiates a password reset for the given email address. - @param email The email address of the user. - @param completion Optionally; a block which is invoked when the request finishes. Invoked - asynchronously on the main thread in the future. - @remarks Possible error codes: - - See @c FIRAuthErrors for a list of error codes that are common to all API methods. - */ -- (void)sendPasswordResetWithEmail:(NSString *)email - completion:(nullable FIRSendPasswordResetCallback)completion; - -/** @fn signOut: - @brief Signs out the current user. - @param error Optionally; if an error occurs, upon return contains an NSError object that - describes the problem; is nil otherwise. - @return @YES when the sign out request was successful. @NO otherwise. - @remarks Possible error codes: - - @c FIRAuthErrorCodeKeychainError Indicated an error occurred when accessing the keychain. - The @c NSLocalizedFailureReasonErrorKey field in the @c NSError.userInfo dictionary - will contain more information about the error encountered. - */ -- (BOOL)signOut:(NSError *_Nullable *_Nullable)error; - -/** @fn addAuthStateDidChangeListener: - @brief Registers a block as an "auth state did change" listener. To be invoked when: - - The block is registered as a listener, - - The current user changes, or, - - The current user's access token changes. - @param listener The block to be invoked. The block is always invoked asynchronously on the main - thread, even for it's initial invocation after having been added as a listener. - @remarks The block is invoked immediately after adding it according to it's standard invocation - semantics, asynchronously on the main thread. Users should pay special attention to - making sure the block does not inadvertently retain objects which should not be retained by - the long-lived block. The block itself will be retained by @c FIRAuth until it is - unregistered or until the @c FIRAuth instance is otherwise deallocated. - @return A handle useful for manually unregistering the block as a listener. - */ -- (FIRAuthStateDidChangeListenerHandle)addAuthStateDidChangeListener: - (FIRAuthStateDidChangeListenerBlock)listener; - -/** @fn removeAuthStateDidChangeListener: - @brief Unregisters a block as an "auth state did change" listener. - @param listenerHandle The handle for the listener. - */ -- (void)removeAuthStateDidChangeListener:(FIRAuthStateDidChangeListenerHandle)listenerHandle; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Project 29 - Grocr/Pods/FirebaseAuth/Frameworks/frameworks/FirebaseAuth.framework/Headers/FIRAuthCredential.h b/Project 29 - Grocr/Pods/FirebaseAuth/Frameworks/frameworks/FirebaseAuth.framework/Headers/FIRAuthCredential.h deleted file mode 100755 index 24959d5e..00000000 --- a/Project 29 - Grocr/Pods/FirebaseAuth/Frameworks/frameworks/FirebaseAuth.framework/Headers/FIRAuthCredential.h +++ /dev/null @@ -1,31 +0,0 @@ -/** @file FIRAuthCredential.h - @brief Firebase Auth SDK - @copyright Copyright 2015 Google Inc. - @remarks Use of this SDK is subject to the Google APIs Terms of Service: - https://developers.google.com/terms/ - */ - -#import - -NS_ASSUME_NONNULL_BEGIN - -/** @class FIRAuthCredential - @brief Represents a credential. - */ -@interface FIRAuthCredential : NSObject - -/** @property provider - @brief Gets the name of the identity provider for the credential. - */ -@property(nonatomic, copy, readonly) NSString *provider; - -/** @fn init - @brief This is an abstract base class. Concrete instances should be created via factory - methods available in the various authentication provider libraries (like the Facebook - provider or the Google provider libraries.) - */ -- (nullable instancetype)init NS_UNAVAILABLE; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Project 29 - Grocr/Pods/FirebaseAuth/Frameworks/frameworks/FirebaseAuth.framework/Headers/FIRAuthErrors.h b/Project 29 - Grocr/Pods/FirebaseAuth/Frameworks/frameworks/FirebaseAuth.framework/Headers/FIRAuthErrors.h deleted file mode 100755 index 9b32328c..00000000 --- a/Project 29 - Grocr/Pods/FirebaseAuth/Frameworks/frameworks/FirebaseAuth.framework/Headers/FIRAuthErrors.h +++ /dev/null @@ -1,166 +0,0 @@ -/** @file FIRAuthErrors.h - @brief Firebase Auth SDK - @copyright Copyright 2015 Google Inc. - @remarks Use of this SDK is subject to the Google APIs Terms of Service: - https://developers.google.com/terms/ - */ - -#import - -/** @class FIRAuthErrors - @remarks Error Codes common to all API Methods: - - FIRAuthErrorCodeNetworkError - Indicates a network error occurred during the operation. - - FIRAuthErrorCodeUserNotFound - Indicates the user account was not found. This could happen - if the user account has been deleted. - - FIRAuthErrorCodeUserTokenExpired - Indicates the current user’s token has expired, for - example, the user may have changed account password on another device. You must prompt - the user to sign in again on this device. - - FIRAuthErrorCodeTooManyRequests - Indicates that the request has been blocked after an - abnormal number of requests have been made from the caller device to the Firebase Auth - servers. Retry again after some time. - - FIRAuthErrorCodeInvalidAPIKey - Indicates the application has been configured with an - invalid API key. - - FIRAuthErrorCodeAppNotAuthorized - Indicates the App is not authorized to use Firebase - Authentication with the provided API Key. Go to the Google API Console and check under - the credentials tab that the API key you are using has your application’s bundle ID - whitelisted. - - FIRAuthErrorCodeKeychainError - Indicates an error occurred while accessing the keychain. - The NSLocalizedFailureReasonErrorKey and NSUnderlyingErrorKey fields in the - NSError.userInfo dictionary will contain more information about the error encountered. - - FIRAuthErrorCodeInternalError - Indicates an internal error occurred. Please report the - error back to us with the entire NSError object. - @remarks Common error codes for FIRUser operations: - - FIRAuthErrorCodeInvalidUserToken - Indicates that the signed-in user's refresh token, - that holds session information, is invalid. You must prompt the user to sign in again - on this device. - - FIRAuthErrorCodeUserDisabled - Indicates the user's account is disabled and can no longer - be used until enabled again from within the Users panel in the Firebase console. - */ -@interface FIRAuthErrors - -/** @var FIRAuthErrorDomain - @brief The Firebase Auth error domain. - */ -extern NSString *const FIRAuthErrorDomain; - -/** @var FIRAuthErrorNameKey - @brief The name of the key for the "error_name" string in the NSError userinfo dictionary. - */ -extern NSString *const FIRAuthErrorNameKey; - -/** @enum FIRAuthErrorCode - @brief Error codes used by Firebase Auth. - */ -typedef NS_ENUM(NSInteger, FIRAuthErrorCode) { - /** Indicates a validation error with the custom token. - */ - FIRAuthErrorCodeInvalidCustomToken = 17000, - - /** Indicates the service account and the API key belong to different projects. - */ - FIRAuthErrorCodeCustomTokenMismatch = 17002, - - /** Indicates the IDP token or requestUri is invalid. - */ - FIRAuthErrorCodeInvalidCredential = 17004, - - /** Indicates the user's account is disabled on the server. - */ - FIRAuthErrorCodeUserDisabled = 17005, - - /** Indicates the administrator disabled sign in with the specified identity provider. - */ - FIRAuthErrorCodeOperationNotAllowed = 17006, - - /** Indicates the email used to attempt a sign up is already in use. - */ - FIRAuthErrorCodeEmailAlreadyInUse = 17007, - - /** Indicates the email is invalid. - */ - FIRAuthErrorCodeInvalidEmail = 17008, - - /** Indicates the user attempted sign in with a wrong password. - */ - FIRAuthErrorCodeWrongPassword = 17009, - - /** Indicates that too many requests were made to a server method. - */ - FIRAuthErrorCodeTooManyRequests = 17010, - - /** Indicates the user account was not found. - */ - FIRAuthErrorCodeUserNotFound = 17011, - - /** Indicates account linking is required. - */ - FIRAuthErrorCodeAccountExistsWithDifferentCredential = 17012, - - /** Same enum as @c FIRAuthErrorCodeAccountExistsWithDifferentCredential , - but with incorrect spelling. Only exists for backwards compatiblity. - */ - FIRAuthErrrorCodeAccountExistsWithDifferentCredential = 17012, - - /** Indicates the user has attemped to change email or password more than 5 minutes after - signing in. - */ - FIRAuthErrorCodeRequiresRecentLogin = 17014, - - /** Indicates an attempt to link a provider to which the account is already linked. - */ - FIRAuthErrorCodeProviderAlreadyLinked = 17015, - - /** Indicates an attempt to unlink a provider that is not linked. - */ - FIRAuthErrorCodeNoSuchProvider = 17016, - - /** Indicates user's saved auth credential is invalid, the user needs to sign in again. - */ - FIRAuthErrorCodeInvalidUserToken = 17017, - - /** Indicates a network error occurred (such as a timeout, interrupted connection, or - unreachable host). These types of errors are often recoverable with a retry. The @c - NSUnderlyingError field in the @c NSError.userInfo dictionary will contain the error - encountered. - */ - FIRAuthErrorCodeNetworkError = 17020, - - /** Indicates the saved token has expired, for example, the user may have changed account - password on another device. The user needs to sign in again on the device that made this - request. - */ - FIRAuthErrorCodeUserTokenExpired = 17021, - - /** Indicates an invalid API key was supplied in the request. - */ - FIRAuthErrorCodeInvalidAPIKey = 17023, - - /** Indicates that an attempt was made to reauthenticate with a user which is not the current - user. - */ - FIRAuthErrorCodeUserMismatch = 17024, - - /** Indicates an attempt to link with a credential that has already been linked with a - different Firebase account - */ - FIRAuthErrorCodeCredentialAlreadyInUse = 17025, - - /** Indicates an attempt to set a password that is considered too weak. - */ - FIRAuthErrorCodeWeakPassword = 17026, - - /** Indicates the App is not authorized to use Firebase Authentication with the - provided API Key. - */ - FIRAuthErrorCodeAppNotAuthorized = 17028, - - /** Indicates an error occurred while attempting to access the keychain. - */ - FIRAuthErrorCodeKeychainError = 17995, - - /** Indicates an internal error occurred. - */ - FIRAuthErrorCodeInternalError = 17999, -}; - -@end diff --git a/Project 29 - Grocr/Pods/FirebaseAuth/Frameworks/frameworks/FirebaseAuth.framework/Headers/FIREmailPasswordAuthProvider.h b/Project 29 - Grocr/Pods/FirebaseAuth/Frameworks/frameworks/FirebaseAuth.framework/Headers/FIREmailPasswordAuthProvider.h deleted file mode 100755 index a1444b9d..00000000 --- a/Project 29 - Grocr/Pods/FirebaseAuth/Frameworks/frameworks/FirebaseAuth.framework/Headers/FIREmailPasswordAuthProvider.h +++ /dev/null @@ -1,39 +0,0 @@ -/** @file FIREmailPasswordAuthProvider.h - @brief Firebase Auth SDK - @copyright Copyright 2016 Google Inc. - @remarks Use of this SDK is subject to the Google APIs Terms of Service: - https://developers.google.com/terms/ - */ - -#import - -@class FIRAuthCredential; - -NS_ASSUME_NONNULL_BEGIN - -/** @var FIREmailPasswordAuthProviderID - @brief A string constant identifying the email & password identity provider. - */ -extern NSString *const FIREmailPasswordAuthProviderID; - -/** @class FIREmailPasswordAuthProvider - @brief A concrete implementation of @c FIRAuthProvider for Email & Password Sign In. - */ -@interface FIREmailPasswordAuthProvider : NSObject - -/** @fn credentialWithEmail:password: - @brief Creates an @c FIRAuthCredential for an email & password sign in. - @param email The user's email address. - @param password The user's password. - @return A @c FIRAuthCredential containing the email & password credential. - */ -+ (FIRAuthCredential *)credentialWithEmail:(NSString *)email password:(NSString *)password; - -/** @fn init - @brief This class is not meant to be initialized. - */ -- (nullable instancetype)init NS_UNAVAILABLE; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Project 29 - Grocr/Pods/FirebaseAuth/Frameworks/frameworks/FirebaseAuth.framework/Headers/FIRFacebookAuthProvider.h b/Project 29 - Grocr/Pods/FirebaseAuth/Frameworks/frameworks/FirebaseAuth.framework/Headers/FIRFacebookAuthProvider.h deleted file mode 100755 index 3b5d28f8..00000000 --- a/Project 29 - Grocr/Pods/FirebaseAuth/Frameworks/frameworks/FirebaseAuth.framework/Headers/FIRFacebookAuthProvider.h +++ /dev/null @@ -1,38 +0,0 @@ -/** @file FIRFacebookAuthProvider.h - @brief Firebase Auth SDK - @copyright Copyright 2016 Google Inc. - @remarks Use of this SDK is subject to the Google APIs Terms of Service: - https://developers.google.com/terms/ - */ - -#import - -@class FIRAuthCredential; - -NS_ASSUME_NONNULL_BEGIN - -/** @var FIRFacebookAuthProviderID - @brief A string constant identifying the Facebook identity provider. - */ -extern NSString *const FIRFacebookAuthProviderID; - -/** @class FIRFacebookAuthProvider - @brief Utility class for constructing Facebook credentials. - */ -@interface FIRFacebookAuthProvider : NSObject - -/** @fn credentialWithAccessToken: - @brief Creates an @c FIRAuthCredential for a Facebook sign in. - @param accessToken The Access Token from Facebook. - @return A @c FIRAuthCredential containing the Facebook credentials. - */ -+ (FIRAuthCredential *)credentialWithAccessToken:(NSString *)accessToken; - -/** @fn init - @brief This class should not be initialized. - */ -- (nullable instancetype)init NS_UNAVAILABLE; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Project 29 - Grocr/Pods/FirebaseAuth/Frameworks/frameworks/FirebaseAuth.framework/Headers/FIRGitHubAuthProvider.h b/Project 29 - Grocr/Pods/FirebaseAuth/Frameworks/frameworks/FirebaseAuth.framework/Headers/FIRGitHubAuthProvider.h deleted file mode 100755 index ce139e3a..00000000 --- a/Project 29 - Grocr/Pods/FirebaseAuth/Frameworks/frameworks/FirebaseAuth.framework/Headers/FIRGitHubAuthProvider.h +++ /dev/null @@ -1,38 +0,0 @@ -/** @file FIRGitHubAuthProvider.h - @brief Firebase Auth SDK - @copyright Copyright 2016 Google Inc. - @remarks Use of this SDK is subject to the Google APIs Terms of Service: - https://developers.google.com/terms/ - */ - -#import - -@class FIRAuthCredential; - -NS_ASSUME_NONNULL_BEGIN - -/** @var FIRGitHubAuthProviderID - @brief A string constant identifying the GitHub identity provider. - */ -extern NSString *const FIRGitHubAuthProviderID; - -/** @class FIRGitHubAuthProvider - @brief Utility class for constructing GitHub credentials. - */ -@interface FIRGitHubAuthProvider : NSObject - -/** @fn credentialWithToken: - @brief Creates an @c FIRAuthCredential for a GitHub sign in. - @param token The GitHub OAuth access token. - @return A @c FIRAuthCredential containing the GitHub credential. - */ -+ (FIRAuthCredential *)credentialWithToken:(NSString *)token; - -/** @fn init - @brief This class is not meant to be initialized. - */ -- (nullable instancetype)init NS_UNAVAILABLE; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Project 29 - Grocr/Pods/FirebaseAuth/Frameworks/frameworks/FirebaseAuth.framework/Headers/FIRGoogleAuthProvider.h b/Project 29 - Grocr/Pods/FirebaseAuth/Frameworks/frameworks/FirebaseAuth.framework/Headers/FIRGoogleAuthProvider.h deleted file mode 100755 index 40b413c2..00000000 --- a/Project 29 - Grocr/Pods/FirebaseAuth/Frameworks/frameworks/FirebaseAuth.framework/Headers/FIRGoogleAuthProvider.h +++ /dev/null @@ -1,40 +0,0 @@ -/** @file FIRGoogleAuthProvider.h - @brief Firebase Auth SDK - @copyright Copyright 2016 Google Inc. - @remarks Use of this SDK is subject to the Google APIs Terms of Service: - https://developers.google.com/terms/ - */ - -#import - -@class FIRAuthCredential; - -NS_ASSUME_NONNULL_BEGIN - -/** @var FIRGoogleAuthProviderID - @brief A string constant identifying the Google identity provider. - */ -extern NSString *const FIRGoogleAuthProviderID; - -/** @class FIRGoogleAuthProvider - @brief Utility class for constructing Google Sign In credentials. - */ -@interface FIRGoogleAuthProvider : NSObject - -/** @fn credentialWithIDToken:accessToken: - @brief Creates an @c FIRAuthCredential for a Google sign in. - @param IDToken The ID Token from Google. - @param accessToken The Access Token from Google. - @return A @c FIRAuthCredential containing the Google credentials. - */ -+ (FIRAuthCredential *)credentialWithIDToken:(NSString *)IDToken - accessToken:(NSString *)accessToken; - -/** @fn init - @brief This class should not be initialized. - */ -- (nullable instancetype)init NS_UNAVAILABLE; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Project 29 - Grocr/Pods/FirebaseAuth/Frameworks/frameworks/FirebaseAuth.framework/Headers/FIRTwitterAuthProvider.h b/Project 29 - Grocr/Pods/FirebaseAuth/Frameworks/frameworks/FirebaseAuth.framework/Headers/FIRTwitterAuthProvider.h deleted file mode 100755 index e3339190..00000000 --- a/Project 29 - Grocr/Pods/FirebaseAuth/Frameworks/frameworks/FirebaseAuth.framework/Headers/FIRTwitterAuthProvider.h +++ /dev/null @@ -1,39 +0,0 @@ -/** @file FIRTwitterAuthProvider.h - @brief Firebase Auth SDK - @copyright Copyright 2016 Google Inc. - @remarks Use of this SDK is subject to the Google APIs Terms of Service: - https://developers.google.com/terms/ - */ - -#import - -@class FIRAuthCredential; - -NS_ASSUME_NONNULL_BEGIN - -/** @var FIRTwitterAuthProviderID - @brief A string constant identifying the Twitter identity provider. - */ -extern NSString *const FIRTwitterAuthProviderID; - -/** @class FIRTwitterAuthProvider - @brief Utility class for constructing Twitter credentials. - */ -@interface FIRTwitterAuthProvider : NSObject - -/** @fn credentialWithToken:secret: - @brief Creates an @c FIRAuthCredential for a Twitter sign in. - @param token The Twitter OAuth token. - @param secret The Twitter OAuth secret. - @return A @c FIRAuthCredential containing the Twitter credential. - */ -+ (FIRAuthCredential *)credentialWithToken:(NSString *)token secret:(NSString *)secret; - -/** @fn init - @brief This class is not meant to be initialized. - */ -- (nullable instancetype)init NS_UNAVAILABLE; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Project 29 - Grocr/Pods/FirebaseAuth/Frameworks/frameworks/FirebaseAuth.framework/Headers/FIRUser.h b/Project 29 - Grocr/Pods/FirebaseAuth/Frameworks/frameworks/FirebaseAuth.framework/Headers/FIRUser.h deleted file mode 100755 index 0f5591ff..00000000 --- a/Project 29 - Grocr/Pods/FirebaseAuth/Frameworks/frameworks/FirebaseAuth.framework/Headers/FIRUser.h +++ /dev/null @@ -1,289 +0,0 @@ -/** @file FIRUser.h - @brief Firebase Auth SDK - @copyright Copyright 2015 Google Inc. - @remarks Use of this SDK is subject to the Google APIs Terms of Service: - https://developers.google.com/terms/ - */ - -#import - -#import -#import - -@class FIRUserProfileChangeRequest; - -NS_ASSUME_NONNULL_BEGIN - -/** @typedef FIRAuthTokenCallback - @brief The type of block called when a token is ready for use. - @see FIRUser.getTokenWithCompletion: - @see FIRUser.getTokenForcingRefresh:withCompletion: - @param token Optionally; an access token if the request was successful. - @param error Optionally; the error which occurred - or nil if the request was successful. - @remarks One of: @c token or @c error will always be non-nil. - */ -typedef void (^FIRAuthTokenCallback)(NSString *_Nullable token, NSError *_Nullable error); - -/** @typedef FIRUserProfileChangeCallback - @brief The type of block called when a user profile change has finished. - @param error Optionally; the error which occurred - or nil if the request was successful. - */ -typedef void (^FIRUserProfileChangeCallback)(NSError *_Nullable error); - -/** @typedef FIRSendEmailVerificationCallback - @brief The type of block called when a request to send an email verification has finished. - @param error Optionally; the error which occurred - or nil if the request was successful. - */ -typedef void (^FIRSendEmailVerificationCallback)(NSError *_Nullable error); - -/** @class FIRUser - @brief Represents a user. - @remarks This class is thread-safe. - */ -@interface FIRUser : NSObject - -/** @property anonymous - @brief Indicates the user represents an anonymous user. - */ -@property(nonatomic, readonly, getter=isAnonymous) BOOL anonymous; - -/** @property emailVerified - @brief Indicates the email address associated with this user has been verified. - */ -@property(nonatomic, readonly, getter=isEmailVerified) BOOL emailVerified; - -/** @property refreshToken - @brief A refresh token; useful for obtaining new access tokens independently. - @remarks This property should only be used for advanced scenarios, and is not typically needed. - */ -@property(nonatomic, readonly, nullable) NSString *refreshToken; - -/** @property providerData - @brief Profile data for each identity provider, if any. - @remarks This data is cached on sign-in and updated when linking or unlinking. - */ -@property(nonatomic, readonly, nonnull) NSArray> *providerData; - -/** @fn init - @brief This class should not be instantiated. - @remarks To retrieve the current user, use @c FIRAuth.currentUser. To sign a user - in or out, use the methods on @c FIRAuth. - */ -- (nullable instancetype)init NS_UNAVAILABLE; - -/** @fn updateEmail:completion: - @brief Updates the email address for the user. On success, the cached user profile data is - updated. - @remarks May fail if there is already an account with this email address that was created using - email and password authentication. - @param email The email address for the user. - @param completion Optionally; the block invoked when the user profile change has finished. - Invoked asynchronously on the main thread in the future. - @remarks Possible error codes: - - @c FIRAuthErrorCodeEmailAlreadyInUse - Indicates the email is already in use by another - account. - - @c FIRAuthErrorCodeInvalidEmail - Indicates the email address is malformed. - - @c FIRAuthErrorCodeRequiresRecentLogin - Updating a user’s email is a security sensitive - operation that requires a recent login from the user. This error indicates the user has - not signed in recently enough. To resolve, reauthenticate the user by invoking - reauthenticateWithCredential:completion: on FIRUser. - - See @c FIRAuthErrors for a list of error codes that are common to all FIRUser operations. - */ -- (void)updateEmail:(NSString *)email completion:(nullable FIRUserProfileChangeCallback)completion; - -/** @fn updatePassword:completion: - @brief Updates the password for the user. On success, the cached user profile data is updated. - @param password The new password for the user. - @param completion Optionally; the block invoked when the user profile change has finished. - Invoked asynchronously on the main thread in the future. - @remarks Possible error codes: - - @c FIRAuthErrorCodeOperationNotAllowed - Indicates the administrator disabled sign in with - the specified identity provider. - - @c FIRAuthErrorCodeRequiresRecentLogin - Updating a user’s password is a security - sensitive operation that requires a recent login from the user. This error indicates the - user has not signed in recently enough. To resolve, reauthenticate the user by invoking - reauthenticateWithCredential:completion: on FIRUser. - - @c FIRAuthErrorCodeWeakPassword - Indicates an attempt to set a password that is - considered too weak. The NSLocalizedFailureReasonErrorKey field in the NSError.userInfo - dictionary object will contain more detailed explanation that can be shown to the user. - - See @c FIRAuthErrors for a list of error codes that are common to all FIRUser operations. - */ -- (void)updatePassword:(NSString *)password - completion:(nullable FIRUserProfileChangeCallback)completion; - -/** @fn profileChangeRequest - @brief Creates an object which may be used to change the user's profile data. - @remarks Set the properties of the returned object, then call - @c FIRUserProfileChangeRequest.commitChangesWithCallback: to perform the updates atomically. - @return An object which may be used to change the user's profile data atomically. - */ -- (FIRUserProfileChangeRequest *)profileChangeRequest; - -/** @fn reloadWithCompletion: - @brief Reloads the user's profile data from the server. - @param completion Optionally; the block invoked when the reload has finished. Invoked - asynchronously on the main thread in the future. - @remarks May fail with a @c FIRAuthErrorCodeCredentialTooOld error code. In this case you should - call @c FIRUser.reauthenticateWithCredential:completion: before re-invoking - @c FIRUser.updateEmail:completion:. - @remarks Possible error codes: - - See @c FIRAuthErrors for a list of error codes that are common to all API methods. - */ -- (void)reloadWithCompletion:(nullable FIRUserProfileChangeCallback)completion; - -/** @fn reauthenticateWithCredential:completion: - @brief Renews the user's authentication tokens by validating a fresh set of credentials supplied - by the user. - @param credential A user-supplied credential, which will be validated by the server. This can be - a successful third-party identity provider sign-in, or an email address and password. - @param completion Optionally; the block invoked when the re-authentication operation has - finished. Invoked asynchronously on the main thread in the future. - @remarks If the user associated with the supplied credential is different from the current user, - or if the validation of the supplied credentials fails; an error is returned and the current - user remains signed in. - @remarks Possible error codes: - - @c FIRAuthErrorCodeInvalidCredential Indicates the supplied credential is invalid. This - could happen if it has expired or it is malformed. - - @c FIRAuthErrorCodeOperationNotAllowed Indicates that accounts with the identity provider - represented by the credential are not enabled. Enable them in the Auth section of the - Firebase console. - - @c FIRAuthErrorCodeEmailAlreadyInUse Indicates the email asserted by the credential - (e.g. the email in a Facebook access token) is already in use by an existing account, - that cannot be authenticated with this method. Call fetchProvidersForEmail for - this user’s email and then prompt them to sign in with any of the sign-in providers - returned. This error will only be thrown if the “One account per email address” - setting is enabled in the Firebase console, under Auth settings. - Please note that the - error code raised in this specific situation may not be the same on Web and Android. - - @c FIRAuthErrorCodeUserDisabled Indicates the user's account is disabled. - - @c FIRAuthErrorCodeWrongPassword Indicates the user attempted reauthentication with an - incorrect password, if credential is of the type EmailPasswordAuthCredential. - - @c FIRAuthErrorCodeUserMismatch Indicates that an attempt was made to reauthenticate with - a user which is not the current user. - - See @c FIRAuthErrors for a list of error codes that are common to all API methods. - */ -- (void)reauthenticateWithCredential:(FIRAuthCredential *)credential - completion:(nullable FIRUserProfileChangeCallback)completion; - -/** @fn getTokenWithCompletion: - @brief Retrieves the Firebase authentication token, possibly refreshing it if it has expired. - @param completion Optionally; the block invoked when the token is available. Invoked - asynchronously on the main thread in the future. - @remarks Possible error codes: - - See @c FIRAuthErrors for a list of error codes that are common to all API methods. - */ -- (void)getTokenWithCompletion:(nullable FIRAuthTokenCallback)completion; - -/** @fn getTokenForcingRefresh:completion: - @brief Retrieves the Firebase authentication token, possibly refreshing it if it has expired. - @param forceRefresh Forces a token refresh. Useful if the token becomes invalid for some reason - other than an expiration. - @param completion Optionally; the block invoked when the token is available. Invoked - asynchronously on the main thread in the future. - @remarks The authentication token will be refreshed (by making a network request) if it has - expired, or if @c forceRefresh is YES. - @remarks Possible error codes: - - See @c FIRAuthErrors for a list of error codes that are common to all API methods. - */ -- (void)getTokenForcingRefresh:(BOOL)forceRefresh - completion:(nullable FIRAuthTokenCallback)completion; - -/** @fn linkWithCredential:completion: - @brief Associates a user account from a third-party identity provider with this user. - @param credential The credential for the identity provider. - @param completion Optionally; the block invoked when the unlinking is complete, or fails. - Invoked asynchronously on the main thread in the future. - @remarks Possible error codes: - - @c FIRAuthErrorCodeProviderAlreadyLinked - Indicates an attempt to link a provider of a - type already linked to this account. - - @c FIRAuthErrorCodeCredentialAlreadyInUse - Indicates an attempt to link with a credential - that has already been linked with a different Firebase account. - - @c FIRAuthErrorCodeOperationNotAllowed - Indicates that accounts with the identity - provider represented by the credential are not enabled. Enable them in the Auth section - of the Firebase console. - - This method may also return error codes associated with updateEmail:completion: and - updatePassword:completion: on FIRUser. - - See @c FIRAuthErrors for a list of error codes that are common to all FIRUser operations. - */ -- (void)linkWithCredential:(FIRAuthCredential *)credential - completion:(nullable FIRAuthResultCallback)completion; - -/** @fn unlinkFromProvider:completion: - @brief Disassociates a user account from a third-party identity provider with this user. - @param provider The provider ID of the provider to unlink. - @param completion Optionally; the block invoked when the unlinking is complete, or fails. - Invoked asynchronously on the main thread in the future. - @remarks Possible error codes: - - @c FIRAuthErrorCodeNoSuchProvider - Indicates an attempt to unlink a provider that is not - linked to the account. - - @c FIRAuthErrorCodeRequiresRecentLogin - Updating email is a security sensitive operation - that requires a recent login from the user. This error indicates the user has not signed - in recently enough. To resolve, reauthenticate the user by invoking - reauthenticateWithCredential:completion: on FIRUser. - - See @c FIRAuthErrors for a list of error codes that are common to all FIRUser operations. - */ -- (void)unlinkFromProvider:(NSString *)provider - completion:(nullable FIRAuthResultCallback)completion; - -/** @fn sendEmailVerificationWithCompletion: - @brief Initiates email verification for the user. - @param completion Optionally; the block invoked when the request to send an email verification - is complete, or fails. Invoked asynchronously on the main thread in the future. - @remarks Possible error codes: - - @c FIRAuthErrorCodeUserNotFound - Indicates the user account was not found. - - See @c FIRAuthErrors for a list of error codes that are common to all FIRUser operations. - */ -- (void)sendEmailVerificationWithCompletion:(nullable FIRSendEmailVerificationCallback)completion; - -/** @fn deleteWithCompletion: - @brief Deletes the user account (also signs out the user, if this was the current user). - @param completion Optionally; the block invoked when the request to delete the account is - complete, or fails. Invoked asynchronously on the main thread in the future. - @remarks Possible error codes: - - @c FIRAuthErrorCodeRequiresRecentLogin - Updating email is a security sensitive operation - that requires a recent login from the user. This error indicates the user has not signed - in recently enough. To resolve, reauthenticate the user by invoking - reauthenticateWithCredential:completion: on FIRUser. - - See @c FIRAuthErrors for a list of error codes that are common to all FIRUser operations. - */ -- (void)deleteWithCompletion:(nullable FIRUserProfileChangeCallback)completion; - -@end - -/** @class FIRUserProfileChangeRequest - @brief Represents an object capable of updating a user's profile data. - @remarks Properties are marked as being part of a profile update when they are set. Setting a - property value to nil is not the same as leaving the property unassigned. - */ -@interface FIRUserProfileChangeRequest : NSObject - -/** @fn init - @brief Please use @c FIRUser.profileChangeRequest - */ -- (nullable instancetype)init NS_UNAVAILABLE; - -/** @property displayName - @brief The user's display name. - @remarks It is an error to set this property after calling - @c FIRUserProfileChangeRequest.commitChangesWithCallback: - */ -@property(nonatomic, copy, nullable) NSString *displayName; - -/** @property photoURL - @brief The user's photo URL. - @remarks It is an error to set this property after calling - @c FIRUserProfileChangeRequest.commitChangesWithCallback: - */ -@property(nonatomic, copy, nullable) NSURL *photoURL; - -/** @fn commitChangesWithCompletion: - @brief Commits any pending changes. - @remarks This method should only be called once. Once called, property values should not be - changed. - @param completion Optionally; the block invoked when the user profile change has been applied. - Invoked asynchronously on the main thread in the future. - */ -- (void)commitChangesWithCompletion:(nullable FIRUserProfileChangeCallback)completion; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Project 29 - Grocr/Pods/FirebaseAuth/Frameworks/frameworks/FirebaseAuth.framework/Headers/FIRUserInfo.h b/Project 29 - Grocr/Pods/FirebaseAuth/Frameworks/frameworks/FirebaseAuth.framework/Headers/FIRUserInfo.h deleted file mode 100755 index 633fb878..00000000 --- a/Project 29 - Grocr/Pods/FirebaseAuth/Frameworks/frameworks/FirebaseAuth.framework/Headers/FIRUserInfo.h +++ /dev/null @@ -1,44 +0,0 @@ -/** @file FIRUserInfo.h - @brief Firebase Auth SDK - @copyright Copyright 2015 Google Inc. - @remarks Use of this SDK is subject to the Google APIs Terms of Service: - https://developers.google.com/terms/ - */ - -#import - -NS_ASSUME_NONNULL_BEGIN - -/** @protocol FIRUserInfo - @brief Represents user data returned from an identity provider. - */ -@protocol FIRUserInfo - -/** @property providerID - @brief The provider identifier. - */ -@property(nonatomic, copy, readonly) NSString *providerID; - -/** @property uid - @brief The provider's user ID for the user. - */ -@property(nonatomic, copy, readonly) NSString *uid; - -/** @property displayName - @brief The name of the user. - */ -@property(nonatomic, copy, readonly, nullable) NSString *displayName; - -/** @property photoURL - @brief The URL of the user's profile photo. - */ -@property(nonatomic, copy, readonly, nullable) NSURL *photoURL; - -/** @property email - @brief The user's email address. - */ -@property(nonatomic, copy, readonly, nullable) NSString *email; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Project 29 - Grocr/Pods/FirebaseAuth/Frameworks/frameworks/FirebaseAuth.framework/Headers/FirebaseAuth.h b/Project 29 - Grocr/Pods/FirebaseAuth/Frameworks/frameworks/FirebaseAuth.framework/Headers/FirebaseAuth.h deleted file mode 100755 index 0e7e80af..00000000 --- a/Project 29 - Grocr/Pods/FirebaseAuth/Frameworks/frameworks/FirebaseAuth.framework/Headers/FirebaseAuth.h +++ /dev/null @@ -1,27 +0,0 @@ -/** @file FirebaseAuth.h - @brief Firebase Auth SDK - @copyright Copyright 2015 Google Inc. - @remarks Use of this SDK is subject to the Google APIs Terms of Service: - https://developers.google.com/terms/ - */ - -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import - -/** @var FirebaseAuthVersionNumber - @brief Version number for FirebaseAuth. - */ -extern const double FirebaseAuthVersionNumber; - -/** @var FirebaseAuthVersionString - @brief Version string for FirebaseAuth. - */ -extern const unsigned char *const FirebaseAuthVersionString; diff --git a/Project 29 - Grocr/Pods/FirebaseAuth/Frameworks/frameworks/FirebaseAuth.framework/Modules/module.modulemap b/Project 29 - Grocr/Pods/FirebaseAuth/Frameworks/frameworks/FirebaseAuth.framework/Modules/module.modulemap deleted file mode 100755 index 00c1f4ef..00000000 --- a/Project 29 - Grocr/Pods/FirebaseAuth/Frameworks/frameworks/FirebaseAuth.framework/Modules/module.modulemap +++ /dev/null @@ -1,20 +0,0 @@ -framework module FirebaseAuth { - umbrella header "FirebaseAuth.h" - - export * - - header "FIRAuth.h" - header "FIRAuthCredential.h" - header "FIRAuthErrors.h" - header "FIREmailPasswordAuthProvider.h" - header "FIRFacebookAuthProvider.h" - header "FIRGitHubAuthProvider.h" - header "FIRGoogleAuthProvider.h" - header "FIRTwitterAuthProvider.h" - header "FIRUser.h" - header "FIRUserInfo.h" - - link framework "Security" - - use FirebaseAnalytics -} diff --git a/Project 29 - Grocr/Pods/FirebaseAuth/README.md b/Project 29 - Grocr/Pods/FirebaseAuth/README.md deleted file mode 100755 index e7669492..00000000 --- a/Project 29 - Grocr/Pods/FirebaseAuth/README.md +++ /dev/null @@ -1,8 +0,0 @@ -# Firebase Auth for iOS - -Firebase Auth enables apps to easily support multiple authentication options -for their end users. - -Please visit [our developer site](https://developers.google.com/) for -integration instructions, documentation, support information, and terms of -service. diff --git a/Project 29 - Grocr/Pods/FirebaseDatabase/Frameworks/FirebaseDatabase.framework/Headers/FIRDataEventType.h b/Project 29 - Grocr/Pods/FirebaseDatabase/Frameworks/FirebaseDatabase.framework/Headers/FIRDataEventType.h deleted file mode 100755 index d940f9ba..00000000 --- a/Project 29 - Grocr/Pods/FirebaseDatabase/Frameworks/FirebaseDatabase.framework/Headers/FIRDataEventType.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Firebase iOS Client Library - * - * Copyright © 2013 Firebase - All Rights Reserved - * https://www.firebase.com - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binaryform must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY FIREBASE AS IS AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO - * EVENT SHALL FIREBASE BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef Firebase_FIRDataEventType_h -#define Firebase_FIRDataEventType_h - -/** - * This enum is the set of events that you can observe at a Firebase Database location. - */ -typedef NS_ENUM(NSInteger, FIRDataEventType) { - FIRDataEventTypeChildAdded, // 0, fired when a new child node is added to a location - FIRDataEventTypeChildRemoved, // 1, fired when a child node is removed from a location - FIRDataEventTypeChildChanged, // 2, fired when a child node at a location changes - FIRDataEventTypeChildMoved, // 3, fired when a child node moves relative to the other child nodes at a location - FIRDataEventTypeValue // 4, fired when any data changes at a location and, recursively, any children -}; - -#endif diff --git a/Project 29 - Grocr/Pods/FirebaseDatabase/Frameworks/FirebaseDatabase.framework/Headers/FIRDataSnapshot.h b/Project 29 - Grocr/Pods/FirebaseDatabase/Frameworks/FirebaseDatabase.framework/Headers/FIRDataSnapshot.h deleted file mode 100755 index 79531028..00000000 --- a/Project 29 - Grocr/Pods/FirebaseDatabase/Frameworks/FirebaseDatabase.framework/Headers/FIRDataSnapshot.h +++ /dev/null @@ -1,158 +0,0 @@ -/* - * Firebase iOS Client Library - * - * Copyright © 2013 Firebase - All Rights Reserved - * https://www.firebase.com - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binaryform must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY FIREBASE AS IS AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO - * EVENT SHALL FIREBASE BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#import - -NS_ASSUME_NONNULL_BEGIN - -@class FIRDatabaseReference; - -/** - * A FIRDataSnapshot contains data from a Firebase Database location. Any time you read - * Firebase data, you receive the data as a FIRDataSnapshot. - * - * FIRDataSnapshots are passed to the blocks you attach with observeEventType:withBlock: or observeSingleEvent:withBlock:. - * They are efficiently-generated immutable copies of the data at a Firebase Database location. - * They can't be modified and will never change. To modify data at a location, - * use a FIRDatabaseReference (e.g. with setValue:). - */ -@interface FIRDataSnapshot : NSObject - - -/** @name Navigating and inspecting a snapshot */ - -/** - * Gets a FIRDataSnapshot for the location at the specified relative path. - * The relative path can either be a simple child key (e.g. 'fred') - * or a deeper slash-separated path (e.g. 'fred/name/first'). If the child - * location has no data, an empty FIRDataSnapshot is returned. - * - * @param childPathString A relative path to the location of child data. - * @return The FIRDataSnapshot for the child location. - */ -- (FIRDataSnapshot *)childSnapshotForPath:(NSString *)childPathString; - - -/** - * Return YES if the specified child exists. - * - * @param childPathString A relative path to the location of a potential child. - * @return YES if data exists at the specified childPathString, else NO. - */ -- (BOOL) hasChild:(NSString *)childPathString; - - -/** - * Return YES if the DataSnapshot has any children. - * - * @return YES if this snapshot has any children, else NO. - */ -- (BOOL) hasChildren; - - -/** - * Return YES if the DataSnapshot contains a non-null value. - * - * @return YES if this snapshot contains a non-null value, else NO. - */ -- (BOOL) exists; - - -/** @name Data export */ - -/** - * Returns the raw value at this location, coupled with any metadata, such as priority. - * - * Priorities, where they exist, are accessible under the ".priority" key in instances of NSDictionary. - * For leaf locations with priorities, the value will be under the ".value" key. - */ -- (id __nullable) valueInExportFormat; - - -/** @name Properties */ - -/** - * Returns the contents of this data snapshot as native types. - * - * Data types returned: - * * NSDictionary - * * NSArray - * * NSNumber (also includes booleans) - * * NSString - * - * @return The data as a native object. - */ -@property (strong, readonly, nonatomic, nullable) id value; - - -/** - * Gets the number of children for this DataSnapshot. - * - * @return An integer indicating the number of children. - */ -@property (readonly, nonatomic) NSUInteger childrenCount; - - -/** - * Gets a FIRDatabaseReference for the location that this data came from - * - * @return A FIRDatabaseReference instance for the location of this data - */ -@property (nonatomic, readonly, strong) FIRDatabaseReference * ref; - - -/** - * The key of the location that generated this FIRDataSnapshot. - * - * @return An NSString containing the key for the location of this FIRDataSnapshot. - */ -@property (strong, readonly, nonatomic) NSString* key; - - -/** - * An iterator for snapshots of the child nodes in this snapshot. - * You can use the native for..in syntax: - * - * for (FIRDataSnapshot* child in snapshot.children) { - * ... - * } - * - * @return An NSEnumerator of the children - */ -@property (strong, readonly, nonatomic) NSEnumerator* children; - -/** - * The priority of the data in this FIRDataSnapshot. - * - * @return The priority as a string, or nil if no priority was set. - */ -@property (strong, readonly, nonatomic, nullable) id priority; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Project 29 - Grocr/Pods/FirebaseDatabase/Frameworks/FirebaseDatabase.framework/Headers/FIRDatabase.h b/Project 29 - Grocr/Pods/FirebaseDatabase/Frameworks/FirebaseDatabase.framework/Headers/FIRDatabase.h deleted file mode 100755 index fece3e68..00000000 --- a/Project 29 - Grocr/Pods/FirebaseDatabase/Frameworks/FirebaseDatabase.framework/Headers/FIRDatabase.h +++ /dev/null @@ -1,138 +0,0 @@ -/* - * Firebase iOS Client Library - * - * Copyright © 2013 Firebase - All Rights Reserved - * https://www.firebase.com - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binaryform must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY FIREBASE AS IS AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO - * EVENT SHALL FIREBASE BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#import -#import "FIRDatabaseReference.h" - -@class FIRApp; - -NS_ASSUME_NONNULL_BEGIN - -/** - * The entry point for accessing a Firebase Database. You can get an instance by calling - * [FIRDatabase database]. To access a location in the database and read or write data, - * use [FIRDatabase reference]. - */ -@interface FIRDatabase : NSObject - -/** - * Gets the instance of FIRDatabase for the default FIRApp. - * - * @return A FIRDatabase instance. - */ -+ (FIRDatabase *) database NS_SWIFT_NAME(database()); - -/** - * Gets an instance of FIRDatabase for a specific FIRApp. - * - * @param app The FIRApp to get a FIRDatabase for. - * @return A FIRDatabase instance. - */ -+ (FIRDatabase *) databaseForApp:(FIRApp*)app NS_SWIFT_NAME(database(app:)); - -/** The FIRApp instance to which this FIRDatabase belongs. */ -@property (weak, readonly, nonatomic) FIRApp *app; - -/** - * Gets a FIRDatabaseReference for the root of your Firebase Database. - */ -- (FIRDatabaseReference *) reference; - -/** - * Gets a FIRDatabaseReference for the provided path. - * - * @param path Path to a location in your Firebase Database. - * @return A FIRDatabaseReference pointing to the specified path. - */ -- (FIRDatabaseReference *) referenceWithPath:(NSString *)path; - -/** - * Gets a FIRDatabaseReference for the provided URL. The URL must be a URL to a path - * within this Firebase Database. To create a FIRDatabaseReference to a different database, - * create a FIRApp} with a FIROptions object configured with the appropriate database URL. - * - * @param url A URL to a path within your database. - * @return A FIRDatabaseReference for the provided URL. -*/ -- (FIRDatabaseReference *) referenceFromURL:(NSString *)databaseUrl; - -/** - * The Firebase Database client automatically queues writes and sends them to the server at the earliest opportunity, - * depending on network connectivity. In some cases (e.g. offline usage) there may be a large number of writes - * waiting to be sent. Calling this method will purge all outstanding writes so they are abandoned. - * - * All writes will be purged, including transactions and onDisconnect writes. The writes will - * be rolled back locally, perhaps triggering events for affected event listeners, and the client will not - * (re-)send them to the Firebase Database backend. - */ -- (void)purgeOutstandingWrites; - -/** - * Shuts down our connection to the Firebase Database backend until goOnline is called. - */ -- (void)goOffline; - -/** - * Resumes our connection to the Firebase Database backend after a previous goOffline call. - */ -- (void)goOnline; - -/** - * The Firebase Database client will cache synchronized data and keep track of all writes you've - * initiated while your application is running. It seamlessly handles intermittent network - * connections and re-sends write operations when the network connection is restored. - * - * However by default your write operations and cached data are only stored in-memory and will - * be lost when your app restarts. By setting this value to `YES`, the data will be persisted - * to on-device (disk) storage and will thus be available again when the app is restarted - * (even when there is no network connectivity at that time). Note that this property must be - * set before creating your first Database reference and only needs to be called once per - * application. - * - */ -@property (nonatomic) BOOL persistenceEnabled; - -/** - * Sets the dispatch queue on which all events are raised. The default queue is the main queue. - * - * Note that this must be set before creating your first Database reference. - */ -@property (nonatomic, strong) dispatch_queue_t callbackQueue; - -/** - * Enables verbose diagnostic logging. - * @param enabled YES to enable logging, NO to disable. - */ -+ (void) setLoggingEnabled:(BOOL)enabled; - -/** Retrieve the Firebase Database SDK version. */ -+ (NSString *) sdkVersion; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Project 29 - Grocr/Pods/FirebaseDatabase/Frameworks/FirebaseDatabase.framework/Headers/FIRDatabaseQuery.h b/Project 29 - Grocr/Pods/FirebaseDatabase/Frameworks/FirebaseDatabase.framework/Headers/FIRDatabaseQuery.h deleted file mode 100755 index a70aadb6..00000000 --- a/Project 29 - Grocr/Pods/FirebaseDatabase/Frameworks/FirebaseDatabase.framework/Headers/FIRDatabaseQuery.h +++ /dev/null @@ -1,318 +0,0 @@ -/* - * Firebase iOS Client Library - * - * Copyright © 2013 Firebase - All Rights Reserved - * https://www.firebase.com - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binaryform must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY FIREBASE AS IS AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO - * EVENT SHALL FIREBASE BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#import -#import "FIRDataEventType.h" -#import "FIRDataSnapshot.h" - -NS_ASSUME_NONNULL_BEGIN - -typedef NSUInteger FIRDatabaseHandle; - -/** - * A FIRDatabaseQuery instance represents a query over the data at a particular location. - * - * You create one by calling one of the query methods (queryOrderedByChild:, queryStartingAtValue:, etc.) - * on a FIRDatabaseReference. The query methods can be chained to further specify the data you are interested in - * observing - */ -@interface FIRDatabaseQuery : NSObject - - -/** @name Attach observers to read data */ - -/** - * observeEventType:withBlock: is used to listen for data changes at a particular location. - * This is the primary way to read data from the Firebase Database. Your block will be triggered - * for the initial data and again whenever the data changes. - * - * Use removeObserverWithHandle: to stop receiving updates. - * @param eventType The type of event to listen for. - * @param block The block that should be called with initial data and updates. It is passed the data as a FIRDataSnapshot. - * @return A handle used to unregister this block later using removeObserverWithHandle: - */ -- (FIRDatabaseHandle)observeEventType:(FIRDataEventType)eventType withBlock:(void (^)(FIRDataSnapshot *snapshot))block; - - -/** - * observeEventType:andPreviousSiblingKeyWithBlock: is used to listen for data changes at a particular location. - * This is the primary way to read data from the Firebase Database. Your block will be triggered - * for the initial data and again whenever the data changes. In addition, for FIRDataEventTypeChildAdded, FIRDataEventTypeChildMoved, and - * FIRDataEventTypeChildChanged events, your block will be passed the key of the previous node by priority order. - * - * Use removeObserverWithHandle: to stop receiving updates. - * - * @param eventType The type of event to listen for. - * @param block The block that should be called with initial data and updates. It is passed the data as a FIRDataSnapshot - * and the previous child's key. - * @return A handle used to unregister this block later using removeObserverWithHandle: - */ -- (FIRDatabaseHandle)observeEventType:(FIRDataEventType)eventType andPreviousSiblingKeyWithBlock:(void (^)(FIRDataSnapshot *snapshot, NSString *__nullable prevKey))block; - - -/** - * observeEventType:withBlock: is used to listen for data changes at a particular location. - * This is the primary way to read data from the Firebase Database. Your block will be triggered - * for the initial data and again whenever the data changes. - * - * The cancelBlock will be called if you will no longer receive new events due to no longer having permission. - * - * Use removeObserverWithHandle: to stop receiving updates. - * - * @param eventType The type of event to listen for. - * @param block The block that should be called with initial data and updates. It is passed the data as a FIRDataSnapshot. - * @param cancelBlock The block that should be called if this client no longer has permission to receive these events - * @return A handle used to unregister this block later using removeObserverWithHandle: - */ -- (FIRDatabaseHandle)observeEventType:(FIRDataEventType)eventType withBlock:(void (^)(FIRDataSnapshot *snapshot))block withCancelBlock:(nullable void (^)(NSError* error))cancelBlock; - - -/** - * observeEventType:andPreviousSiblingKeyWithBlock: is used to listen for data changes at a particular location. - * This is the primary way to read data from the Firebase Database. Your block will be triggered - * for the initial data and again whenever the data changes. In addition, for FIRDataEventTypeChildAdded, FIRDataEventTypeChildMoved, and - * FIRDataEventTypeChildChanged events, your block will be passed the key of the previous node by priority order. - * - * The cancelBlock will be called if you will no longer receive new events due to no longer having permission. - * - * Use removeObserverWithHandle: to stop receiving updates. - * - * @param eventType The type of event to listen for. - * @param block The block that should be called with initial data and updates. It is passed the data as a FIRDataSnapshot - * and the previous child's key. - * @param cancelBlock The block that should be called if this client no longer has permission to receive these events - * @return A handle used to unregister this block later using removeObserverWithHandle: - */ -- (FIRDatabaseHandle)observeEventType:(FIRDataEventType)eventType andPreviousSiblingKeyWithBlock:(void (^)(FIRDataSnapshot *snapshot, NSString *__nullable prevKey))block withCancelBlock:(nullable void (^)(NSError* error))cancelBlock; - - -/** - * This is equivalent to observeEventType:withBlock:, except the block is immediately canceled after the initial data is returned. - * - * @param eventType The type of event to listen for. - * @param block The block that should be called. It is passed the data as a FIRDataSnapshot. - */ -- (void)observeSingleEventOfType:(FIRDataEventType)eventType withBlock:(void (^)(FIRDataSnapshot *snapshot))block; - - -/** - * This is equivalent to observeEventType:withBlock:, except the block is immediately canceled after the initial data is returned. In addition, for FIRDataEventTypeChildAdded, FIRDataEventTypeChildMoved, and - * FIRDataEventTypeChildChanged events, your block will be passed the key of the previous node by priority order. - * - * @param eventType The type of event to listen for. - * @param block The block that should be called. It is passed the data as a FIRDataSnapshot and the previous child's key. - */ -- (void)observeSingleEventOfType:(FIRDataEventType)eventType andPreviousSiblingKeyWithBlock:(void (^)(FIRDataSnapshot *snapshot, NSString *__nullable prevKey))block; - - -/** - * This is equivalent to observeEventType:withBlock:, except the block is immediately canceled after the initial data is returned. - * - * The cancelBlock will be called if you do not have permission to read data at this location. - * - * @param eventType The type of event to listen for. - * @param block The block that should be called. It is passed the data as a FIRDataSnapshot. - * @param cancelBlock The block that will be called if you don't have permission to access this data - */ -- (void)observeSingleEventOfType:(FIRDataEventType)eventType withBlock:(void (^)(FIRDataSnapshot *snapshot))block withCancelBlock:(nullable void (^)(NSError* error))cancelBlock; - - -/** - * This is equivalent to observeEventType:withBlock:, except the block is immediately canceled after the initial data is returned. In addition, for FIRDataEventTypeChildAdded, FIRDataEventTypeChildMoved, and - * FIRDataEventTypeChildChanged events, your block will be passed the key of the previous node by priority order. - * - * The cancelBlock will be called if you do not have permission to read data at this location. - * - * @param eventType The type of event to listen for. - * @param block The block that should be called. It is passed the data as a FIRDataSnapshot and the previous child's key. - * @param cancelBlock The block that will be called if you don't have permission to access this data - */ -- (void)observeSingleEventOfType:(FIRDataEventType)eventType andPreviousSiblingKeyWithBlock:(void (^)(FIRDataSnapshot *snapshot, NSString *__nullable prevKey))block withCancelBlock:(nullable void (^)(NSError* error))cancelBlock; - -/** @name Detaching observers */ - -/** - * Detach a block previously attached with observeEventType:withBlock:. - * - * @param handle The handle returned by the call to observeEventType:withBlock: which we are trying to remove. - */ -- (void) removeObserverWithHandle:(FIRDatabaseHandle)handle; - - -/** - * Detach all blocks previously attached to this Firebase Database location with observeEventType:withBlock: - */ -- (void) removeAllObservers; - -/** - * By calling `keepSynced:YES` on a location, the data for that location will automatically be downloaded and - * kept in sync, even when no listeners are attached for that location. Additionally, while a location is kept - * synced, it will not be evicted from the persistent disk cache. - * - * @param keepSynced Pass YES to keep this location synchronized, pass NO to stop synchronization. -*/ - - (void) keepSynced:(BOOL)keepSynced; - - -/** @name Querying and limiting */ - - -/** -* queryLimitedToFirst: is used to generate a reference to a limited view of the data at this location. -* The FIRDatabaseQuery instance returned by queryLimitedToFirst: will respond to at most the first limit child nodes. -* -* @param limit The upper bound, inclusive, for the number of child nodes to receive events for -* @return A FIRDatabaseQuery instance, limited to at most limit child nodes. -*/ -- (FIRDatabaseQuery *)queryLimitedToFirst:(NSUInteger)limit; - - -/** -* queryLimitedToLast: is used to generate a reference to a limited view of the data at this location. -* The FIRDatabaseQuery instance returned by queryLimitedToLast: will respond to at most the last limit child nodes. -* -* @param limit The upper bound, inclusive, for the number of child nodes to receive events for -* @return A FIRDatabaseQuery instance, limited to at most limit child nodes. -*/ -- (FIRDatabaseQuery *)queryLimitedToLast:(NSUInteger)limit; - -/** -* queryOrderBy: is used to generate a reference to a view of the data that's been sorted by the values of -* a particular child key. This method is intended to be used in combination with queryStartingAtValue:, -* queryEndingAtValue:, or queryEqualToValue:. -* - * @param key The child key to use in ordering data visible to the returned FIRDatabaseQuery - * @return A FIRDatabaseQuery instance, ordered by the values of the specified child key. -*/ -- (FIRDatabaseQuery *)queryOrderedByChild:(NSString *)key; - -/** - * queryOrderedByKey: is used to generate a reference to a view of the data that's been sorted by child key. - * This method is intended to be used in combination with queryStartingAtValue:, queryEndingAtValue:, - * or queryEqualToValue:. - * - * @return A FIRDatabaseQuery instance, ordered by child keys. - */ -- (FIRDatabaseQuery *) queryOrderedByKey; - -/** - * queryOrderedByValue: is used to generate a reference to a view of the data that's been sorted by child value. - * This method is intended to be used in combination with queryStartingAtValue:, queryEndingAtValue:, - * or queryEqualToValue:. - * - * @return A FIRDatabaseQuery instance, ordered by child value. - */ -- (FIRDatabaseQuery *) queryOrderedByValue; - -/** - * queryOrderedByPriority: is used to generate a reference to a view of the data that's been sorted by child - * priority. This method is intended to be used in combination with queryStartingAtValue:, queryEndingAtValue:, - * or queryEqualToValue:. - * - * @return A FIRDatabaseQuery instance, ordered by child priorities. - */ -- (FIRDatabaseQuery *) queryOrderedByPriority; - -/** - * queryStartingAtValue: is used to generate a reference to a limited view of the data at this location. - * The FIRDatabaseQuery instance returned by queryStartingAtValue: will respond to events at nodes with a value - * greater than or equal to startValue. - * - * @param startValue The lower bound, inclusive, for the value of data visible to the returned FIRDatabaseQuery - * @return A FIRDatabaseQuery instance, limited to data with value greater than or equal to startValue - */ -- (FIRDatabaseQuery *)queryStartingAtValue:(nullable id)startValue; - -/** - * queryStartingAtValue:childKey: is used to generate a reference to a limited view of the data at this location. - * The FIRDatabaseQuery instance returned by queryStartingAtValue:childKey will respond to events at nodes with a value - * greater than startValue, or equal to startValue and with a key greater than or equal to childKey. - * - * @param startValue The lower bound, inclusive, for the value of data visible to the returned FIRDatabaseQuery - * @param childKey The lower bound, inclusive, for the key of nodes with value equal to startValue - * @return A FIRDatabaseQuery instance, limited to data with value greater than or equal to startValue - */ -- (FIRDatabaseQuery *)queryStartingAtValue:(nullable id)startValue childKey:(nullable NSString *)childKey; - -/** - * queryEndingAtValue: is used to generate a reference to a limited view of the data at this location. - * The FIRDatabaseQuery instance returned by queryEndingAtValue: will respond to events at nodes with a value - * less than or equal to endValue. - * - * @param endValue The upper bound, inclusive, for the value of data visible to the returned FIRDatabaseQuery - * @return A FIRDatabaseQuery instance, limited to data with value less than or equal to endValue - */ -- (FIRDatabaseQuery *)queryEndingAtValue:(nullable id)endValue; - -/** - * queryEndingAtValue:childKey: is used to generate a reference to a limited view of the data at this location. - * The FIRDatabaseQuery instance returned by queryEndingAtValue:childKey will respond to events at nodes with a value - * less than endValue, or equal to endValue and with a key less than or equal to childKey. - * - * @param endValue The upper bound, inclusive, for the value of data visible to the returned FIRDatabaseQuery - * @param childKey The upper bound, inclusive, for the key of nodes with value equal to endValue - * @return A FIRDatabaseQuery instance, limited to data with value less than or equal to endValue - */ -- (FIRDatabaseQuery *)queryEndingAtValue:(nullable id)endValue childKey:(nullable NSString *)childKey; - -/** - * queryEqualToValue: is used to generate a reference to a limited view of the data at this location. - * The FIRDatabaseQuery instance returned by queryEqualToValue: will respond to events at nodes with a value equal - * to the supplied argument. - * - * @param value The value that the data returned by this FIRDatabaseQuery will have - * @return A FIRDatabaseQuery instance, limited to data with the supplied value. - */ -- (FIRDatabaseQuery *)queryEqualToValue:(nullable id)value; - -/** - * queryEqualToValue:childKey: is used to generate a reference to a limited view of the data at this location. - * The FIRDatabaseQuery instance returned by queryEqualToValue:childKey will respond to events at nodes with a value - * equal to the supplied argument with a name equal to childKey. There will be at most one node that matches because - * child keys are unique. - * - * @param value The value that the data returned by this FIRDatabaseQuery will have - * @param childKey The name of nodes with the right value - * @return A FIRDatabaseQuery instance, limited to data with the supplied value and the key. - */ -- (FIRDatabaseQuery *)queryEqualToValue:(nullable id)value childKey:(nullable NSString *)childKey; - - -/** @name Properties */ - - -/** -* Gets a FIRDatabaseReference for the location of this query. -* -* @return A FIRDatabaseReference for the location of this query. -*/ -@property (nonatomic, readonly, strong) FIRDatabaseReference * ref; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Project 29 - Grocr/Pods/FirebaseDatabase/Frameworks/FirebaseDatabase.framework/Headers/FIRDatabaseReference.h b/Project 29 - Grocr/Pods/FirebaseDatabase/Frameworks/FirebaseDatabase.framework/Headers/FIRDatabaseReference.h deleted file mode 100755 index 5f847b62..00000000 --- a/Project 29 - Grocr/Pods/FirebaseDatabase/Frameworks/FirebaseDatabase.framework/Headers/FIRDatabaseReference.h +++ /dev/null @@ -1,730 +0,0 @@ -/* - * Firebase iOS Client Library - * - * Copyright © 2013 Firebase - All Rights Reserved - * https://www.firebase.com - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binaryform must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY FIREBASE AS IS AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO - * EVENT SHALL FIREBASE BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - - -#import -#import "FIRDatabaseQuery.h" -#import "FIRDatabase.h" -#import "FIRDataSnapshot.h" -#import "FIRMutableData.h" -#import "FIRTransactionResult.h" -#import "FIRServerValue.h" - -NS_ASSUME_NONNULL_BEGIN - -@class FIRDatabase; - -/** - * A FIRDatabaseReference represents a particular location in your Firebase Database - * and can be used for reading or writing data to that Firebase Database location. - * - * This class is the starting point for all Firebase Database operations. After you've - * initialized it with initWithUrl: you can use it - * to read data (ie. observeEventType:withBlock:), write data (ie. setValue:), and to create new - * FIRDatabaseReferences (ie. child:). - */ -@interface FIRDatabaseReference : FIRDatabaseQuery - - -/** @name Getting references to children locations */ - -/** - * Gets a FIRDatabaseReference for the location at the specified relative path. - * The relative path can either be a simple child key (e.g. 'fred') or a - * deeper slash-separated path (e.g. 'fred/name/first'). - * - * @param pathString A relative path from this location to the desired child location. - * @return A FIRDatabaseReference for the specified relative path. - */ -- (FIRDatabaseReference *)child:(NSString *)pathString; - -/** - * childByAppendingPath: is deprecated, use child: instead. - */ -- (FIRDatabaseReference *)childByAppendingPath:(NSString *)pathString __deprecated_msg("use child: instead"); - -/** - * childByAutoId generates a new child location using a unique key and returns a - * FIRDatabaseReference to it. This is useful when the children of a Firebase Database - * location represent a list of items. - * - * The unique key generated by childByAutoId: is prefixed with a client-generated - * timestamp so that the resulting list will be chronologically-sorted. - * - * @return A FIRDatabaseReference for the generated location. - */ -- (FIRDatabaseReference *) childByAutoId; - - -/** @name Writing data */ - -/** Write data to this Firebase Database location. - -This will overwrite any data at this location and all child locations. - -Data types that can be set are: - -- NSString -- @"Hello World" -- NSNumber (also includes boolean) -- @YES, @43, @4.333 -- NSDictionary -- @{@"key": @"value", @"nested": @{@"another": @"value"} } -- NSArray - -The effect of the write will be visible immediately and the corresponding -events will be triggered. Synchronization of the data to the Firebase Database -servers will also be started. - -Passing null for the new value is equivalent to calling remove:; -all data at this location or any child location will be deleted. - -Note that setValue: will remove any priority stored at this location, so if priority -is meant to be preserved, you should use setValue:andPriority: instead. - -@param value The value to be written. - */ -- (void) setValue:(nullable id)value; - - -/** - * The same as setValue: with a block that gets triggered after the write operation has - * been committed to the Firebase Database servers. - * - * @param value The value to be written. - * @param block The block to be called after the write has been committed to the Firebase Database servers. - */ -- (void) setValue:(nullable id)value withCompletionBlock:(void (^)(NSError *__nullable error, FIRDatabaseReference * ref))block; - - -/** - * The same as setValue: with an additional priority to be attached to the data being written. - * Priorities are used to order items. - * - * @param value The value to be written. - * @param priority The priority to be attached to that data. - */ -- (void) setValue:(nullable id)value andPriority:(nullable id)priority; - - -/** - * The same as setValue:andPriority: with a block that gets triggered after the write operation has - * been committed to the Firebase Database servers. - * - * @param value The value to be written. - * @param priority The priority to be attached to that data. - * @param block The block to be called after the write has been committed to the Firebase Database servers. - */ -- (void) setValue:(nullable id)value andPriority:(nullable id)priority withCompletionBlock:(void (^)(NSError *__nullable error, FIRDatabaseReference * ref))block; - - -/** - * Remove the data at this Firebase Database location. Any data at child locations will also be deleted. - * - * The effect of the delete will be visible immediately and the corresponding events - * will be triggered. Synchronization of the delete to the Firebase Database servers will - * also be started. - * - * remove: is equivalent to calling setValue:nil - */ -- (void) removeValue; - - -/** - * The same as remove: with a block that gets triggered after the remove operation has - * been committed to the Firebase Database servers. - * - * @param block The block to be called after the remove has been committed to the Firebase Database servers. - */ -- (void) removeValueWithCompletionBlock:(void (^)(NSError *__nullable error, FIRDatabaseReference * ref))block; - -/** - * Sets a priority for the data at this Firebase Database location. - * Priorities can be used to provide a custom ordering for the children at a location - * (if no priorities are specified, the children are ordered by key). - * - * You cannot set a priority on an empty location. For this reason - * setValue:andPriority: should be used when setting initial data with a specific priority - * and setPriority: should be used when updating the priority of existing data. - * - * Children are sorted based on this priority using the following rules: - * - * Children with no priority come first. - * Children with a number as their priority come next. They are sorted numerically by priority (small to large). - * Children with a string as their priority come last. They are sorted lexicographically by priority. - * Whenever two children have the same priority (including no priority), they are sorted by key. Numeric - * keys come first (sorted numerically), followed by the remaining keys (sorted lexicographically). - * - * Note that priorities are parsed and ordered as IEEE 754 double-precision floating-point numbers. - * Keys are always stored as strings and are treated as numbers only when they can be parsed as a - * 32-bit integer - * - * @param priority The priority to set at the specified location. - */ -- (void) setPriority:(nullable id)priority; - - -/** - * The same as setPriority: with a block that is called once the priority has - * been committed to the Firebase Database servers. - * - * @param priority The priority to set at the specified location. - * @param block The block that is triggered after the priority has been written on the servers. - */ -- (void) setPriority:(nullable id)priority withCompletionBlock:(void (^)(NSError *__nullable error, FIRDatabaseReference * ref))block; - -/** - * Updates the values at the specified paths in the dictionary without overwriting other - * keys at this location. - * - * @param values A dictionary of the keys to change and their new values - */ -- (void) updateChildValues:(NSDictionary *)values; - -/** - * The same as update: with a block that is called once the update has been committed to the - * Firebase Database servers - * - * @param values A dictionary of the keys to change and their new values - * @param block The block that is triggered after the update has been written on the Firebase Database servers - */ -- (void) updateChildValues:(NSDictionary *)values withCompletionBlock:(void (^)(NSError *__nullable error, FIRDatabaseReference * ref))block; - - -/** @name Attaching observers to read data */ - -/** - * observeEventType:withBlock: is used to listen for data changes at a particular location. - * This is the primary way to read data from the Firebase Database. Your block will be triggered - * for the initial data and again whenever the data changes. - * - * Use removeObserverWithHandle: to stop receiving updates. - * @param eventType The type of event to listen for. - * @param block The block that should be called with initial data and updates. It is passed the data as a FIRDataSnapshot. - * @return A handle used to unregister this block later using removeObserverWithHandle: - */ -- (FIRDatabaseHandle)observeEventType:(FIRDataEventType)eventType withBlock:(void (^)(FIRDataSnapshot *snapshot))block; - - -/** - * observeEventType:andPreviousSiblingKeyWithBlock: is used to listen for data changes at a particular location. - * This is the primary way to read data from the Firebase Database. Your block will be triggered - * for the initial data and again whenever the data changes. In addition, for FIRDataEventTypeChildAdded, FIRDataEventTypeChildMoved, and - * FIRDataEventTypeChildChanged events, your block will be passed the key of the previous node by priority order. - * - * Use removeObserverWithHandle: to stop receiving updates. - * - * @param eventType The type of event to listen for. - * @param block The block that should be called with initial data and updates. It is passed the data as a FIRDataSnapshot - * and the previous child's key. - * @return A handle used to unregister this block later using removeObserverWithHandle: - */ -- (FIRDatabaseHandle)observeEventType:(FIRDataEventType)eventType andPreviousSiblingKeyWithBlock:(void (^)(FIRDataSnapshot *snapshot, NSString *__nullable prevKey))block; - - -/** - * observeEventType:withBlock: is used to listen for data changes at a particular location. - * This is the primary way to read data from the Firebase Database. Your block will be triggered - * for the initial data and again whenever the data changes. - * - * The cancelBlock will be called if you will no longer receive new events due to no longer having permission. - * - * Use removeObserverWithHandle: to stop receiving updates. - * - * @param eventType The type of event to listen for. - * @param block The block that should be called with initial data and updates. It is passed the data as a FIRDataSnapshot. - * @param cancelBlock The block that should be called if this client no longer has permission to receive these events - * @return A handle used to unregister this block later using removeObserverWithHandle: - */ -- (FIRDatabaseHandle)observeEventType:(FIRDataEventType)eventType withBlock:(void (^)(FIRDataSnapshot *snapshot))block withCancelBlock:(nullable void (^)(NSError* error))cancelBlock; - - -/** - * observeEventType:andPreviousSiblingKeyWithBlock: is used to listen for data changes at a particular location. - * This is the primary way to read data from the Firebase Database. Your block will be triggered - * for the initial data and again whenever the data changes. In addition, for FIRDataEventTypeChildAdded, FIRDataEventTypeChildMoved, and - * FIRDataEventTypeChildChanged events, your block will be passed the key of the previous node by priority order. - * - * The cancelBlock will be called if you will no longer receive new events due to no longer having permission. - * - * Use removeObserverWithHandle: to stop receiving updates. - * - * @param eventType The type of event to listen for. - * @param block The block that should be called with initial data and updates. It is passed the data as a FIRDataSnapshot - * and the previous child's key. - * @param cancelBlock The block that should be called if this client no longer has permission to receive these events - * @return A handle used to unregister this block later using removeObserverWithHandle: - */ -- (FIRDatabaseHandle)observeEventType:(FIRDataEventType)eventType andPreviousSiblingKeyWithBlock:(void (^)(FIRDataSnapshot *snapshot, NSString *__nullable prevKey))block withCancelBlock:(nullable void (^)(NSError* error))cancelBlock; - - -/** - * This is equivalent to observeEventType:withBlock:, except the block is immediately canceled after the initial data is returned. - * - * @param eventType The type of event to listen for. - * @param block The block that should be called. It is passed the data as a FIRDataSnapshot. - */ -- (void)observeSingleEventOfType:(FIRDataEventType)eventType withBlock:(void (^)(FIRDataSnapshot *snapshot))block; - - -/** - * This is equivalent to observeEventType:withBlock:, except the block is immediately canceled after the initial data is returned. In addition, for FIRDataEventTypeChildAdded, FIRDataEventTypeChildMoved, and - * FIRDataEventTypeChildChanged events, your block will be passed the key of the previous node by priority order. - * - * @param eventType The type of event to listen for. - * @param block The block that should be called. It is passed the data as a FIRDataSnapshot and the previous child's key. - */ -- (void)observeSingleEventOfType:(FIRDataEventType)eventType andPreviousSiblingKeyWithBlock:(void (^)(FIRDataSnapshot *snapshot, NSString *__nullable prevKey))block; - - -/** - * This is equivalent to observeEventType:withBlock:, except the block is immediately canceled after the initial data is returned. - * - * The cancelBlock will be called if you do not have permission to read data at this location. - * - * @param eventType The type of event to listen for. - * @param block The block that should be called. It is passed the data as a FIRDataSnapshot. - * @param cancelBlock The block that will be called if you don't have permission to access this data - */ -- (void)observeSingleEventOfType:(FIRDataEventType)eventType withBlock:(void (^)(FIRDataSnapshot *snapshot))block withCancelBlock:(nullable void (^)(NSError* error))cancelBlock; - - -/** - * This is equivalent to observeEventType:withBlock:, except the block is immediately canceled after the initial data is returned. In addition, for FIRDataEventTypeChildAdded, FIRDataEventTypeChildMoved, and - * FIRDataEventTypeChildChanged events, your block will be passed the key of the previous node by priority order. - * - * The cancelBlock will be called if you do not have permission to read data at this location. - * - * @param eventType The type of event to listen for. - * @param block The block that should be called. It is passed the data as a FIRDataSnapshot and the previous child's key. - * @param cancelBlock The block that will be called if you don't have permission to access this data - */ -- (void)observeSingleEventOfType:(FIRDataEventType)eventType andPreviousSiblingKeyWithBlock:(void (^)(FIRDataSnapshot *snapshot, NSString *__nullable prevKey))block withCancelBlock:(nullable void (^)(NSError* error))cancelBlock; - -/** @name Detaching observers */ - -/** - * Detach a block previously attached with observeEventType:withBlock:. - * - * @param handle The handle returned by the call to observeEventType:withBlock: which we are trying to remove. - */ -- (void) removeObserverWithHandle:(FIRDatabaseHandle)handle; - -/** - * By calling `keepSynced:YES` on a location, the data for that location will automatically be downloaded and - * kept in sync, even when no listeners are attached for that location. Additionally, while a location is kept - * synced, it will not be evicted from the persistent disk cache. - * - * @param keepSynced Pass YES to keep this location synchronized, pass NO to stop synchronization. - */ -- (void) keepSynced:(BOOL)keepSynced; - - -/** - * Removes all observers at the current reference, but does not remove any observers at child references. - * removeAllObservers must be called again for each child reference where a listener was established to remove the observers. - */ -- (void) removeAllObservers; - -/** @name Querying and limiting */ - - -/** - * queryLimitedToFirst: is used to generate a reference to a limited view of the data at this location. - * The FIRDatabaseQuery instance returned by queryLimitedToFirst: will respond to at most the first limit child nodes. - * - * @param limit The upper bound, inclusive, for the number of child nodes to receive events for - * @return A FIRDatabaseQuery instance, limited to at most limit child nodes. - */ -- (FIRDatabaseQuery *)queryLimitedToFirst:(NSUInteger)limit; - - -/** - * queryLimitedToLast: is used to generate a reference to a limited view of the data at this location. - * The FIRDatabaseQuery instance returned by queryLimitedToLast: will respond to at most the last limit child nodes. - * - * @param limit The upper bound, inclusive, for the number of child nodes to receive events for - * @return A FIRDatabaseQuery instance, limited to at most limit child nodes. - */ -- (FIRDatabaseQuery *)queryLimitedToLast:(NSUInteger)limit; - -/** - * queryOrderBy: is used to generate a reference to a view of the data that's been sorted by the values of - * a particular child key. This method is intended to be used in combination with queryStartingAtValue:, - * queryEndingAtValue:, or queryEqualToValue:. - * - * @param key The child key to use in ordering data visible to the returned FIRDatabaseQuery - * @return A FIRDatabaseQuery instance, ordered by the values of the specified child key. - */ -- (FIRDatabaseQuery *)queryOrderedByChild:(NSString *)key; - -/** - * queryOrderedByKey: is used to generate a reference to a view of the data that's been sorted by child key. - * This method is intended to be used in combination with queryStartingAtValue:, queryEndingAtValue:, - * or queryEqualToValue:. - * - * @return A FIRDatabaseQuery instance, ordered by child keys. - */ -- (FIRDatabaseQuery *) queryOrderedByKey; - -/** - * queryOrderedByPriority: is used to generate a reference to a view of the data that's been sorted by child - * priority. This method is intended to be used in combination with queryStartingAtValue:, queryEndingAtValue:, - * or queryEqualToValue:. - * - * @return A FIRDatabaseQuery instance, ordered by child priorities. - */ -- (FIRDatabaseQuery *) queryOrderedByPriority; - -/** - * queryStartingAtValue: is used to generate a reference to a limited view of the data at this location. - * The FIRDatabaseQuery instance returned by queryStartingAtValue: will respond to events at nodes with a value - * greater than or equal to startValue. - * - * @param startValue The lower bound, inclusive, for the value of data visible to the returned FIRDatabaseQuery - * @return A FIRDatabaseQuery instance, limited to data with value greater than or equal to startValue - */ -- (FIRDatabaseQuery *)queryStartingAtValue:(nullable id)startValue; - -/** - * queryStartingAtValue:childKey: is used to generate a reference to a limited view of the data at this location. - * The FIRDatabaseQuery instance returned by queryStartingAtValue:childKey will respond to events at nodes with a value - * greater than startValue, or equal to startValue and with a key greater than or equal to childKey. - * - * @param startValue The lower bound, inclusive, for the value of data visible to the returned FIRDatabaseQuery - * @param childKey The lower bound, inclusive, for the key of nodes with value equal to startValue - * @return A FIRDatabaseQuery instance, limited to data with value greater than or equal to startValue - */ -- (FIRDatabaseQuery *)queryStartingAtValue:(nullable id)startValue childKey:(nullable NSString *)childKey; - -/** - * queryEndingAtValue: is used to generate a reference to a limited view of the data at this location. - * The FIRDatabaseQuery instance returned by queryEndingAtValue: will respond to events at nodes with a value - * less than or equal to endValue. - * - * @param endValue The upper bound, inclusive, for the value of data visible to the returned FIRDatabaseQuery - * @return A FIRDatabaseQuery instance, limited to data with value less than or equal to endValue - */ -- (FIRDatabaseQuery *)queryEndingAtValue:(nullable id)endValue; - -/** - * queryEndingAtValue:childKey: is used to generate a reference to a limited view of the data at this location. - * The FIRDatabaseQuery instance returned by queryEndingAtValue:childKey will respond to events at nodes with a value - * less than endValue, or equal to endValue and with a key less than or equal to childKey. - * - * @param endValue The upper bound, inclusive, for the value of data visible to the returned FIRDatabaseQuery - * @param childKey The upper bound, inclusive, for the key of nodes with value equal to endValue - * @return A FIRDatabaseQuery instance, limited to data with value less than or equal to endValue - */ -- (FIRDatabaseQuery *)queryEndingAtValue:(nullable id)endValue childKey:(nullable NSString *)childKey; - -/** - * queryEqualToValue: is used to generate a reference to a limited view of the data at this location. - * The FIRDatabaseQuery instance returned by queryEqualToValue: will respond to events at nodes with a value equal - * to the supplied argument. - * - * @param value The value that the data returned by this FIRDatabaseQuery will have - * @return A FIRDatabaseQuery instance, limited to data with the supplied value. - */ -- (FIRDatabaseQuery *)queryEqualToValue:(nullable id)value; - -/** - * queryEqualToValue:childKey: is used to generate a reference to a limited view of the data at this location. - * The FIRDatabaseQuery instance returned by queryEqualToValue:childKey will respond to events at nodes with a value - * equal to the supplied argument with a key equal to childKey. There will be at most one node that matches because - * child keys are unique. - * - * @param value The value that the data returned by this FIRDatabaseQuery will have - * @param childKey The key of nodes with the right value - * @return A FIRDatabaseQuery instance, limited to data with the supplied value and the key. - */ -- (FIRDatabaseQuery *)queryEqualToValue:(nullable id)value childKey:(nullable NSString *)childKey; - -/** @name Managing presence */ - -/** - * Ensure the data at this location is set to the specified value when - * the client is disconnected (due to closing the browser, navigating - * to a new page, or network issues). - * - * onDisconnectSetValue: is especially useful for implementing "presence" systems, - * where a value should be changed or cleared when a user disconnects - * so that he appears "offline" to other users. - * - * @param value The value to be set after the connection is lost. - */ -- (void) onDisconnectSetValue:(nullable id)value; - - -/** - * Ensure the data at this location is set to the specified value when - * the client is disconnected (due to closing the browser, navigating - * to a new page, or network issues). - * - * The completion block will be triggered when the operation has been successfully queued up on the Firebase Database servers - * - * @param value The value to be set after the connection is lost. - * @param block Block to be triggered when the operation has been queued up on the Firebase Database servers - */ -- (void) onDisconnectSetValue:(nullable id)value withCompletionBlock:(void (^)(NSError *__nullable error, FIRDatabaseReference * ref))block; - - -/** - * Ensure the data at this location is set to the specified value and priority when - * the client is disconnected (due to closing the browser, navigating - * to a new page, or network issues). - * - * @param value The value to be set after the connection is lost. - * @param priority The priority to be set after the connection is lost. - */ -- (void) onDisconnectSetValue:(nullable id)value andPriority:(id)priority; - - -/** - * Ensure the data at this location is set to the specified value and priority when - * the client is disconnected (due to closing the browser, navigating - * to a new page, or network issues). - * - * The completion block will be triggered when the operation has been successfully queued up on the Firebase Database servers - * - * @param value The value to be set after the connection is lost. - * @param priority The priority to be set after the connection is lost. - * @param block Block to be triggered when the operation has been queued up on the Firebase Database servers - */ -- (void) onDisconnectSetValue:(nullable id)value andPriority:(nullable id)priority withCompletionBlock:(void (^)(NSError *__nullable error, FIRDatabaseReference * ref))block; - - -/** - * Ensure the data at this location is removed when - * the client is disconnected (due to closing the app, navigating - * to a new page, or network issues). - * - * onDisconnectRemoveValue is especially useful for implementing "presence" systems. - */ -- (void) onDisconnectRemoveValue; - - -/** - * Ensure the data at this location is removed when - * the client is disconnected (due to closing the app, navigating - * to a new page, or network issues). - * - * onDisconnectRemoveValueWithCompletionBlock: is especially useful for implementing "presence" systems. - * - * @param block Block to be triggered when the operation has been queued up on the Firebase Database servers - */ -- (void) onDisconnectRemoveValueWithCompletionBlock:(void (^)(NSError *__nullable error, FIRDatabaseReference * ref))block; - - - -/** - * Ensure the data has the specified child values updated when - * the client is disconnected (due to closing the browser, navigating - * to a new page, or network issues). - * - * - * @param values A dictionary of child node keys and the values to set them to after the connection is lost. - */ -- (void) onDisconnectUpdateChildValues:(NSDictionary *)values; - - -/** - * Ensure the data has the specified child values updated when - * the client is disconnected (due to closing the browser, navigating - * to a new page, or network issues). - * - * - * @param values A dictionary of child node keys and the values to set them to after the connection is lost. - * @param block A block that will be called once the operation has been queued up on the Firebase Database servers - */ -- (void) onDisconnectUpdateChildValues:(NSDictionary *)values withCompletionBlock:(void (^)(NSError *__nullable error, FIRDatabaseReference * ref))block; - - -/** - * Cancel any operations that are set to run on disconnect. If you previously called onDisconnectSetValue:, - * onDisconnectRemoveValue:, or onDisconnectUpdateChildValues:, and no longer want the values updated when the - * connection is lost, call cancelDisconnectOperations: - */ -- (void) cancelDisconnectOperations; - - -/** - * Cancel any operations that are set to run on disconnect. If you previously called onDisconnectSetValue:, - * onDisconnectRemoveValue:, or onDisconnectUpdateChildValues:, and no longer want the values updated when the - * connection is lost, call cancelDisconnectOperations: - * - * @param block A block that will be triggered once the Firebase Database servers have acknowledged the cancel request. - */ -- (void) cancelDisconnectOperationsWithCompletionBlock:(nullable void (^)(NSError *__nullable error, FIRDatabaseReference * ref))block; - - -/** @name Manual Connection Management */ - -/** - * Manually disconnect the Firebase Database client from the server and disable automatic reconnection. - * - * The Firebase Database client automatically maintains a persistent connection to the Firebase Database server, - * which will remain active indefinitely and reconnect when disconnected. However, the goOffline( ) - * and goOnline( ) methods may be used to manually control the client connection in cases where - * a persistent connection is undesirable. - * - * While offline, the Firebase Database client will no longer receive data updates from the server. However, - * all database operations performed locally will continue to immediately fire events, allowing - * your application to continue behaving normally. Additionally, each operation performed locally - * will automatically be queued and retried upon reconnection to the Firebase Database server. - * - * To reconnect to the Firebase Database server and begin receiving remote events, see goOnline( ). - * Once the connection is reestablished, the Firebase Database client will transmit the appropriate data - * and fire the appropriate events so that your client "catches up" automatically. - * - * Note: Invoking this method will impact all Firebase Database connections. - */ -+ (void) goOffline; - -/** - * Manually reestablish a connection to the Firebase Database server and enable automatic reconnection. - * - * The Firebase Database client automatically maintains a persistent connection to the Firebase Database server, - * which will remain active indefinitely and reconnect when disconnected. However, the goOffline( ) - * and goOnline( ) methods may be used to manually control the client connection in cases where - * a persistent connection is undesirable. - * - * This method should be used after invoking goOffline( ) to disable the active connection. - * Once reconnected, the Firebase Database client will automatically transmit the proper data and fire - * the appropriate events so that your client "catches up" automatically. - * - * To disconnect from the Firebase Database server, see goOffline( ). - * - * Note: Invoking this method will impact all Firebase Database connections. - */ -+ (void) goOnline; - - -/** @name Transactions */ - -/** - * Performs an optimistic-concurrency transactional update to the data at this location. Your block will be called with a FIRMutableData - * instance that contains the current data at this location. Your block should update this data to the value you - * wish to write to this location, and then return an instance of FIRTransactionResult with the new data. - * - * If, when the operation reaches the server, it turns out that this client had stale data, your block will be run - * again with the latest data from the server. - * - * When your block is run, you may decide to abort the transaction by returning [FIRTransactionResult abort]. - * - * @param block This block receives the current data at this location and must return an instance of FIRTransactionResult - */ -- (void) runTransactionBlock:(FIRTransactionResult * (^) (FIRMutableData* currentData))block; - - -/** - * Performs an optimistic-concurrency transactional update to the data at this location. Your block will be called with a FIRMutableData - * instance that contains the current data at this location. Your block should update this data to the value you - * wish to write to this location, and then return an instance of FIRTransactionResult with the new data. - * - * If, when the operation reaches the server, it turns out that this client had stale data, your block will be run - * again with the latest data from the server. - * - * When your block is run, you may decide to abort the transaction by returning [FIRTransactionResult abort]. - * - * @param block This block receives the current data at this location and must return an instance of FIRTransactionResult - * @param completionBlock This block will be triggered once the transaction is complete, whether it was successful or not. It will indicate if there was an error, whether or not the data was committed, and what the current value of the data at this location is. - */ -- (void)runTransactionBlock:(FIRTransactionResult * (^) (FIRMutableData* currentData))block andCompletionBlock:(void (^) (NSError *__nullable error, BOOL committed, FIRDataSnapshot *__nullable snapshot))completionBlock; - - - -/** - * Performs an optimistic-concurrency transactional update to the data at this location. Your block will be called with a FIRMutableData - * instance that contains the current data at this location. Your block should update this data to the value you - * wish to write to this location, and then return an instance of FIRTransactionResult with the new data. - * - * If, when the operation reaches the server, it turns out that this client had stale data, your block will be run - * again with the latest data from the server. - * - * When your block is run, you may decide to abort the transaction by return [FIRTransactionResult abort]. - * - * Since your block may be run multiple times, this client could see several immediate states that don't exist on the server. You can suppress those immediate states until the server confirms the final state of the transaction. - * - * @param block This block receives the current data at this location and must return an instance of FIRTransactionResult - * @param completionBlock This block will be triggered once the transaction is complete, whether it was successful or not. It will indicate if there was an error, whether or not the data was committed, and what the current value of the data at this location is. - * @param localEvents Set this to NO to suppress events raised for intermediate states, and only get events based on the final state of the transaction. - */ -- (void)runTransactionBlock:(FIRTransactionResult * (^) (FIRMutableData* currentData))block andCompletionBlock:(nullable void (^) (NSError *__nullable error, BOOL committed, FIRDataSnapshot *__nullable snapshot))completionBlock withLocalEvents:(BOOL)localEvents; - - -/** @name Retrieving String Representation */ - -/** - * Gets the absolute URL of this Firebase Database location. - * - * @return The absolute URL of the referenced Firebase Database location. - */ -- (NSString *) description; - -/** @name Properties */ - -/** - * Gets a FIRDatabaseReference for the parent location. - * If this instance refers to the root of your Firebase Database, it has no parent, - * and therefore parent( ) will return null. - * - * @return A FIRDatabaseReference for the parent location. - */ -@property (strong, readonly, nonatomic, nullable) FIRDatabaseReference * parent; - - -/** - * Gets a FIRDatabaseReference for the root location - * - * @return A new FIRDatabaseReference to root location. - */ -@property (strong, readonly, nonatomic) FIRDatabaseReference * root; - - -/** - * Gets the last token in a Firebase Database location (e.g. 'fred' in https://SampleChat.firebaseIO-demo.com/users/fred) - * - * @return The key of the location this reference points to. - */ -@property (strong, readonly, nonatomic) NSString* key; - -/** - * Gets the URL for the Firebase Database location referenced by this FIRDatabaseReference. - * - * @return The url of the location this reference points to. - */ -@property (strong, readonly, nonatomic) NSString* URL; - -/** - * Gets the FIRDatabase instance associated with this reference. - * - * @return The FIRDatabase object for this reference. - */ -@property (strong, readonly, nonatomic) FIRDatabase *database; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Project 29 - Grocr/Pods/FirebaseDatabase/Frameworks/FirebaseDatabase.framework/Headers/FIRMutableData.h b/Project 29 - Grocr/Pods/FirebaseDatabase/Frameworks/FirebaseDatabase.framework/Headers/FIRMutableData.h deleted file mode 100755 index 252f9f4f..00000000 --- a/Project 29 - Grocr/Pods/FirebaseDatabase/Frameworks/FirebaseDatabase.framework/Headers/FIRMutableData.h +++ /dev/null @@ -1,139 +0,0 @@ -/* - * Firebase iOS Client Library - * - * Copyright © 2013 Firebase - All Rights Reserved - * https://www.firebase.com - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binaryform must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY FIREBASE AS IS AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO - * EVENT SHALL FIREBASE BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#import - -NS_ASSUME_NONNULL_BEGIN - -/** - * A FIRMutableData instance is populated with data from a Firebase Database location. - * When you are using runTransactionBlock:, you will be given an instance containing the current - * data at that location. Your block will be responsible for updating that instance to the data - * you wish to save at that location, and then returning using [FIRTransactionResult successWithValue:]. - * - * To modify the data, set its value property to any of the native types support by Firebase Database: - * * NSNumber (includes BOOL) - * * NSDictionary - * * NSArray - * * NSString - * * nil / NSNull to remove the data - * - * Note that changes made to a child FIRMutableData instance will be visible to the parent. - */ -@interface FIRMutableData : NSObject - - -/** @name Inspecting and navigating the data */ - - -/** - * Returns boolean indicating whether this mutable data has children. - * - * @return YES if this data contains child nodes. - */ -- (BOOL) hasChildren; - - -/** - * Indicates whether this mutable data has a child at the given path. - * - * @param path A path string, consisting either of a single segment, like 'child', or multiple segments, 'a/deeper/child' - * @return YES if this data contains a child at the specified relative path - */ -- (BOOL) hasChildAtPath:(NSString *)path; - - -/** - * Used to obtain a FIRMutableData instance that encapsulates the data at the given relative path. - * Note that changes made to the child will be visible to the parent. - * - * @param path A path string, consisting either of a single segment, like 'child', or multiple segments, 'a/deeper/child' - * @return A FIRMutableData instance containing the data at the given path - */ -- (FIRMutableData *)childDataByAppendingPath:(NSString *)path; - - -/** @name Properties */ - - -/** - * To modify the data contained by this instance of FIRMutableData, set this to any of the native types supported by Firebase Database: - * - * * NSNumber (includes BOOL) - * * NSDictionary - * * NSArray - * * NSString - * * nil / NSNull to remove the data - * - * Note that setting this value will override the priority at this location. - * - * @return The current data at this location as a native object - */ -@property (strong, nonatomic, nullable) id value; - - -/** - * Set this property to update the priority of the data at this location. Can be set to the following types: - * - * * NSNumber - * * NSString - * * nil / NSNull to remove the priority - * - * @return The priority of the data at this location - */ -@property (strong, nonatomic, nullable) id priority; - - -/** - * @return The number of child nodes at this location - */ -@property (readonly, nonatomic) NSUInteger childrenCount; - - -/** - * Used to iterate over the children at this location. You can use the native for .. in syntax: - * - * for (FIRMutableData* child in data.children) { - * ... - * } - * - * Note that this enumerator operates on an immutable copy of the child list. So, you can modify the instance - * during iteration, but the new additions will not be visible until you get a new enumerator. - */ -@property (readonly, nonatomic, strong) NSEnumerator* children; - - -/** - * @return The key name of this node, or nil if it is the top-most location - */ -@property (readonly, nonatomic, strong, nullable) NSString* key; - - -@end - -NS_ASSUME_NONNULL_END diff --git a/Project 29 - Grocr/Pods/FirebaseDatabase/Frameworks/FirebaseDatabase.framework/Headers/FIRServerValue.h b/Project 29 - Grocr/Pods/FirebaseDatabase/Frameworks/FirebaseDatabase.framework/Headers/FIRServerValue.h deleted file mode 100755 index c93a5240..00000000 --- a/Project 29 - Grocr/Pods/FirebaseDatabase/Frameworks/FirebaseDatabase.framework/Headers/FIRServerValue.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Firebase iOS Client Library - * - * Copyright © 2013 Firebase - All Rights Reserved - * https://www.firebase.com - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binaryform must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY FIREBASE AS IS AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO - * EVENT SHALL FIREBASE BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -NS_ASSUME_NONNULL_BEGIN - -/** - * Placeholder values you may write into Firebase Database as a value or priority - * that will automatically be populated by the Firebase Database server. - */ -@interface FIRServerValue : NSObject - -/** - * Placeholder value for the number of milliseconds since the Unix epoch - */ -+ (NSDictionary *) timestamp; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Project 29 - Grocr/Pods/FirebaseDatabase/Frameworks/FirebaseDatabase.framework/Headers/FIRTransactionResult.h b/Project 29 - Grocr/Pods/FirebaseDatabase/Frameworks/FirebaseDatabase.framework/Headers/FIRTransactionResult.h deleted file mode 100755 index 07439e1a..00000000 --- a/Project 29 - Grocr/Pods/FirebaseDatabase/Frameworks/FirebaseDatabase.framework/Headers/FIRTransactionResult.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Firebase iOS Client Library - * - * Copyright © 2013 Firebase - All Rights Reserved - * https://www.firebase.com - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binaryform must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY FIREBASE AS IS AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO - * EVENT SHALL FIREBASE BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#import -#import "FIRMutableData.h" - -NS_ASSUME_NONNULL_BEGIN - -/** - * Used for runTransactionBlock:. An FIRTransactionResult instance is a container for the results of the transaction. - */ -@interface FIRTransactionResult : NSObject - -/** - * Used for runTransactionBlock:. Indicates that the new value should be saved at this location - * - * @param value A FIRMutableData instance containing the new value to be set - * @return An FIRTransactionResult instance that can be used as a return value from the block given to runTransactionBlock: - */ -+ (FIRTransactionResult *)successWithValue:(FIRMutableData *)value; - - -/** - * Used for runTransactionBlock:. Indicates that the current transaction should no longer proceed. - * - * @return An FIRTransactionResult instance that can be used as a return value from the block given to runTransactionBlock: - */ -+ (FIRTransactionResult *) abort; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Project 29 - Grocr/Pods/FirebaseDatabase/Frameworks/FirebaseDatabase.framework/Headers/FirebaseDatabase.h b/Project 29 - Grocr/Pods/FirebaseDatabase/Frameworks/FirebaseDatabase.framework/Headers/FirebaseDatabase.h deleted file mode 100755 index d903c1b9..00000000 --- a/Project 29 - Grocr/Pods/FirebaseDatabase/Frameworks/FirebaseDatabase.framework/Headers/FirebaseDatabase.h +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Firebase iOS Client Library - * - * Copyright © 2016 Firebase - All Rights Reserved - * https://www.firebase.com - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binaryform must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY FIREBASE AS IS AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO - * EVENT SHALL FIREBASE BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef FirebaseDatabase_h -#define FirebaseDatabase_h - -#import "FIRDatabase.h" -#import "FIRDatabaseQuery.h" -#import "FIRDatabaseReference.h" -#import "FIRDataEventType.h" -#import "FIRDataSnapshot.h" -#import "FIRMutableData.h" -#import "FIRServerValue.h" -#import "FIRTransactionResult.h" - -#endif /* FirebaseDatabase_h */ diff --git a/Project 29 - Grocr/Pods/FirebaseDatabase/Frameworks/FirebaseDatabase.framework/Info.plist b/Project 29 - Grocr/Pods/FirebaseDatabase/Frameworks/FirebaseDatabase.framework/Info.plist deleted file mode 100755 index 9c9020ae..00000000 Binary files a/Project 29 - Grocr/Pods/FirebaseDatabase/Frameworks/FirebaseDatabase.framework/Info.plist and /dev/null differ diff --git a/Project 29 - Grocr/Pods/FirebaseDatabase/Frameworks/FirebaseDatabase.framework/Modules/module.modulemap b/Project 29 - Grocr/Pods/FirebaseDatabase/Frameworks/FirebaseDatabase.framework/Modules/module.modulemap deleted file mode 100755 index 28b323eb..00000000 --- a/Project 29 - Grocr/Pods/FirebaseDatabase/Frameworks/FirebaseDatabase.framework/Modules/module.modulemap +++ /dev/null @@ -1,13 +0,0 @@ -framework module FirebaseDatabase { - umbrella header "FirebaseDatabase.h" - - export * - module * { export * } - - link framework "CFNetwork" - link framework "Security" - link framework "SystemConfiguration" - - link "c++" - link "icucore" -} diff --git a/Project 29 - Grocr/Pods/FirebaseDatabase/Frameworks/FirebaseDatabase.framework/NOTICE b/Project 29 - Grocr/Pods/FirebaseDatabase/Frameworks/FirebaseDatabase.framework/NOTICE deleted file mode 100755 index 410cbd69..00000000 --- a/Project 29 - Grocr/Pods/FirebaseDatabase/Frameworks/FirebaseDatabase.framework/NOTICE +++ /dev/null @@ -1,47 +0,0 @@ -Google LevelDB -Copyright (c) 2011 The LevelDB Authors. All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - -* Neither the name of Google Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - --- - -Square Socket Rocket -Copyright 2012 Square Inc. - -Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - --- - -APLevelDB -Created by Adam Preble on 1/23/12. -Copyright (c) 2012 Adam Preble. All rights reserved. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/Project 29 - Grocr/Pods/FirebaseInstanceID/CHANGELOG.md b/Project 29 - Grocr/Pods/FirebaseInstanceID/CHANGELOG.md deleted file mode 100644 index d3f6dfda..00000000 --- a/Project 29 - Grocr/Pods/FirebaseInstanceID/CHANGELOG.md +++ /dev/null @@ -1,25 +0,0 @@ -# 2016-06-19 -- v1.0.7 - -- Fix remote-notifications warning on app submission. - -# 2016-05-16 -- v1.0.6 - -- Fix CocoaPod linter issues for InstanceID pod. - -# 2016-05-13 -- v1.0.5 - -- Fix Authorization errors for InstanceID tokens. - -# 2016-05-11 -- v1.0.4 - -- Reduce wait for InstanceID token during parallel requests. - -# 2016-04-18 -- v1.0.3 - -- Change flag to disable swizzling to *FirebaseAppDelegateProxyEnabled*. -- Fix incessant Keychain errors while accessing InstanceID. -- Fix max retries for fetching IID token. - -# 2016-04-18 -- v1.0.2 - -- Register for remote notifications on iOS8+ in the SDK itself. diff --git a/Project 29 - Grocr/Pods/FirebaseInstanceID/Frameworks/FirebaseInstanceID.framework/FirebaseInstanceID b/Project 29 - Grocr/Pods/FirebaseInstanceID/Frameworks/FirebaseInstanceID.framework/FirebaseInstanceID deleted file mode 100755 index 3f3b280d..00000000 Binary files a/Project 29 - Grocr/Pods/FirebaseInstanceID/Frameworks/FirebaseInstanceID.framework/FirebaseInstanceID and /dev/null differ diff --git a/Project 29 - Grocr/Pods/FirebaseInstanceID/Frameworks/FirebaseInstanceID.framework/Headers/FIRInstanceID.h b/Project 29 - Grocr/Pods/FirebaseInstanceID/Frameworks/FirebaseInstanceID.framework/Headers/FIRInstanceID.h deleted file mode 100644 index 717e290a..00000000 --- a/Project 29 - Grocr/Pods/FirebaseInstanceID/Frameworks/FirebaseInstanceID.framework/Headers/FIRInstanceID.h +++ /dev/null @@ -1,245 +0,0 @@ -#import - -/** - * @memberof FIRInstanceID - * - * The scope to be used when fetching/deleting a token for Firebase Messaging. - */ -FOUNDATION_EXPORT NSString * __nonnull const kFIRInstanceIDScopeFirebaseMessaging; - -/** - * Called when the system determines that tokens need to be refreshed. - * This method is also called if Instance ID has been reset in which - * case, tokens and FCM topic subscriptions also need to be refreshed. - * - * Instance ID service will throttle the refresh event across all devices - * to control the rate of token updates on application servers. - */ -FOUNDATION_EXPORT NSString * __nonnull const kFIRInstanceIDTokenRefreshNotification; - -/** - * @related FIRInstanceID - * - * The completion handler invoked when the InstanceID token returns. If - * the call fails we return the appropriate `error code` as described below. - * - * @param token The valid token as returned by InstanceID backend. - * - * @param error The error describing why generating a new token - * failed. See the error codes below for a more detailed - * description. - */ -typedef void(^FIRInstanceIDTokenHandler)( NSString * __nullable token, NSError * __nullable error); - - -/** - * @related FIRInstanceID - * - * The completion handler invoked when the InstanceID `deleteToken` returns. If - * the call fails we return the appropriate `error code` as described below - * - * @param error The error describing why deleting the token failed. - * See the error codes below for a more detailed description. - */ -typedef void(^FIRInstanceIDDeleteTokenHandler)(NSError * __nullable error); - -/** - * @related FIRInstanceID - * - * The completion handler invoked when the app identity is created. If the - * identity wasn't created for some reason we return the appropriate error code. - * - * @param identity A valid identity for the app instance, nil if there was an error - * while creating an identity. - * @param error The error if fetching the identity fails else nil. - */ -typedef void(^FIRInstanceIDHandler)(NSString * __nullable identity, NSError * __nullable error); - -/** - * @related FIRInstanceID - * - * The completion handler invoked when the app identity and all the tokens associated - * with it are deleted. Returns a valid error object in case of failure else nil. - * - * @param error The error if deleting the identity and all the tokens associated with - * it fails else nil. - */ -typedef void(^FIRInstanceIDDeleteHandler)(NSError * __nullable error); - -/** - * @enum FIRInstanceIDError - */ -typedef NS_ENUM(NSUInteger, FIRInstanceIDError) { - // Http related errors. - - /// Unknown error. - FIRInstanceIDErrorUnknown = 0, - - /// Auth Error -- GCM couldn't validate request from this client. - FIRInstanceIDErrorAuthentication = 1, - - /// NoAccess -- InstanceID service cannot be accessed. - FIRInstanceIDErrorNoAccess = 2, - - /// Timeout -- Request to InstanceID backend timed out. - FIRInstanceIDErrorTimeout = 3, - - /// Network -- No network available to reach the servers. - FIRInstanceIDErrorNetwork = 4, - - /// OperationInProgress -- Another similar operation in progress, - /// bailing this one. - FIRInstanceIDErrorOperationInProgress = 5, - - /// InvalidRequest -- Some parameters of the request were invalid. - FIRInstanceIDErrorInvalidRequest = 7, -}; - -/** - * The APNS token type for the app. If the token type is set to `UNKNOWN` - * InstanceID will implicitly try to figure out what the actual token type - * is from the provisioning profile. - */ -typedef NS_ENUM(NSInteger, FIRInstanceIDAPNSTokenType) { - /// Unknown token type. - FIRInstanceIDAPNSTokenTypeUnknown, - /// Sandbox token type. - FIRInstanceIDAPNSTokenTypeSandbox, - /// Production token type. - FIRInstanceIDAPNSTokenTypeProd, -}; - -/** - * Instance ID provides a unique identifier for each app instance and a mechanism - * to authenticate and authorize actions (for example, sending a GCM message). - * - * Instance ID is long lived but, may be reset if the device is not used for - * a long time or the Instance ID service detects a problem. - * If Instance ID is reset, the app will be notified with a `com.firebase.iid.token-refresh` - * notification. - * - * If the Instance ID has become invalid, the app can request a new one and - * send it to the app server. - * To prove ownership of Instance ID and to allow servers to access data or - * services associated with the app, call - * `[FIRInstanceID tokenWithAuthorizedEntity:scope:options:handler]`. - */ -@interface FIRInstanceID : NSObject - -/** - * FIRInstanceID. - * - * @return A shared instance of FIRInstanceID. - */ -+ (nonnull instancetype)instanceID NS_SWIFT_NAME(instanceID()); - -/** - * Unavailable. Use +instanceID instead. - */ -- (nonnull instancetype)init __attribute__((unavailable("Use +instanceID instead."))); - -/** - * Set APNS token for the application. This APNS token will be used to register - * with Firebase Messaging using `token` or - * `tokenWithAuthorizedEntity:scope:options:handler`. If the token type is set to - * `FIRInstanceIDAPNSTokenTypeUnknown` InstanceID will read the provisioning profile - * to find out the token type. - * - * @param token The APNS token for the application. - * @param type The APNS token type for the above token. - */ -- (void)setAPNSToken:(nonnull NSData *)token - type:(FIRInstanceIDAPNSTokenType)type; - -#pragma mark - Tokens - -/** - * Returns a Firebase Messaging scoped token for the firebase app. - * - * @return Null Returns null if the device has not yet been registerd with - * Firebase Message else returns a valid token. - */ -- (nullable NSString *)token; - -/** - * Returns a token that authorizes an Entity (example: cloud service) to perform - * an action on behalf of the application identified by Instance ID. - * - * This is similar to an OAuth2 token except, it applies to the - * application instance instead of a user. - * - * This is an asynchronous call. If the token fetching fails for some reason - * we invoke the completion callback with nil `token` and the appropriate - * error. - * - * Note, you can only have one `token` or `deleteToken` call for a given - * authorizedEntity and scope at any point of time. Making another such call with the - * same authorizedEntity and scope before the last one finishes will result in an - * error with code `OperationInProgress`. - * - * @see FIRInstanceID deleteTokenWithAuthorizedEntity:scope:handler: - * - * @param authorizedEntity Entity authorized by the token. - * @param scope Action authorized for authorizedEntity. - * @param options The extra options to be sent with your token request. The - * value for the `apns_token` should be the NSData object - * passed to UIApplication's - * `didRegisterForRemoteNotificationsWithDeviceToken` method. - * All other keys and values in the options dict need to be - * instances of NSString or else they will be discarded. Bundle - * keys starting with 'GCM.' and 'GOOGLE.' are reserved. - * @param handler The callback handler which is invoked when the token is - * successfully fetched. In case of success a valid `token` and - * `nil` error are returned. In case of any error the `token` - * is nil and a valid `error` is returned. The valid error - * codes have been documented above. - */ -- (void)tokenWithAuthorizedEntity:(nonnull NSString *)authorizedEntity - scope:(nonnull NSString *)scope - options:(nullable NSDictionary *)options - handler:(nonnull FIRInstanceIDTokenHandler)handler; - -/** - * Revokes access to a scope (action) for an entity previously - * authorized by `[FIRInstanceID tokenWithAuthorizedEntity:scope:options:handler]`. - * - * This is an asynchronous call. Call this on the main thread since InstanceID lib - * is not thread safe. In case token deletion fails for some reason we invoke the - * `handler` callback passed in with the appropriate error code. - * - * Note, you can only have one `token` or `deleteToken` call for a given - * authorizedEntity and scope at a point of time. Making another such call with the - * same authorizedEntity and scope before the last one finishes will result in an error - * with code `OperationInProgress`. - * - * @param authorizedEntity Entity that must no longer have access. - * @param scope Action that entity is no longer authorized to perform. - * @param handler The handler that is invoked once the unsubscribe call ends. - * In case of error an appropriate error object is returned - * else error is nil. - */ -- (void)deleteTokenWithAuthorizedEntity:(nonnull NSString *)authorizedEntity - scope:(nonnull NSString *)scope - handler:(nonnull FIRInstanceIDDeleteTokenHandler)handler; - -#pragma mark - Identity - -/** - * Asynchronously fetch a stable identifier that uniquely identifies the app - * instance. If the identifier has been revoked or has expired, this method will - * return a new identifier. - * - * - * @param handler The handler to invoke once the identifier has been fetched. - * In case of error an appropriate error object is returned else - * a valid identifier is returned and a valid identifier for the - * application instance. - */ -- (void)getIDWithHandler:(nonnull FIRInstanceIDHandler)handler; - -/** - * Resets Instance ID and revokes all tokens. - */ -- (void)deleteIDWithHandler:(nonnull FIRInstanceIDDeleteHandler)handler; - -@end diff --git a/Project 29 - Grocr/Pods/FirebaseInstanceID/Frameworks/FirebaseInstanceID.framework/Headers/FirebaseInstanceID.h b/Project 29 - Grocr/Pods/FirebaseInstanceID/Frameworks/FirebaseInstanceID.framework/Headers/FirebaseInstanceID.h deleted file mode 100644 index 053ec2b1..00000000 --- a/Project 29 - Grocr/Pods/FirebaseInstanceID/Frameworks/FirebaseInstanceID.framework/Headers/FirebaseInstanceID.h +++ /dev/null @@ -1 +0,0 @@ -#import "FIRInstanceID.h" diff --git a/Project 29 - Grocr/Pods/FirebaseInstanceID/Frameworks/FirebaseInstanceID.framework/Modules/module.modulemap b/Project 29 - Grocr/Pods/FirebaseInstanceID/Frameworks/FirebaseInstanceID.framework/Modules/module.modulemap deleted file mode 100644 index b4a5b5e3..00000000 --- a/Project 29 - Grocr/Pods/FirebaseInstanceID/Frameworks/FirebaseInstanceID.framework/Modules/module.modulemap +++ /dev/null @@ -1,8 +0,0 @@ -framework module FirebaseInstanceID { - - export * - - umbrella header "FirebaseInstanceID.h" - - header "FIRInstanceID.h" -} diff --git a/Project 29 - Grocr/Pods/FirebaseInstanceID/Headers/Public/FIRInstanceID.h b/Project 29 - Grocr/Pods/FirebaseInstanceID/Headers/Public/FIRInstanceID.h deleted file mode 100644 index e3782f8c..00000000 --- a/Project 29 - Grocr/Pods/FirebaseInstanceID/Headers/Public/FIRInstanceID.h +++ /dev/null @@ -1,237 +0,0 @@ -#import - -/** - * @memberof FIRInstanceID - * - * The scope to be used when fetching/deleting a token for Firebase Messaging. - */ -FOUNDATION_EXPORT NSString * __nonnull const kFIRInstanceIDScopeFirebaseMessaging; - -/** - * Called when the system determines that tokens need to be refreshed. - * This method is also called if Instance ID has been reset in which - * case, tokens and FCM topic subscriptions also need to be refreshed. - * - * Instance ID service will throttle the refresh event across all devices - * to control the rate of token updates on application servers. - */ -FOUNDATION_EXPORT NSString * __nonnull const kFIRInstanceIDTokenRefreshNotification; - -/** - * @related FIRInstanceID - * - * The completion handler invoked when the InstanceID token returns. If - * the call fails we return the appropriate `error code` as described below. - * - * @param token The valid token as returned by InstanceID backend. - * - * @param error The error describing why generating a new token - * failed. See the error codes below for a more detailed - * description. - */ -typedef void(^FIRInstanceIDTokenHandler)(NSString * __nullable token, NSError * __nullable error); - - -/** - * @related FIRInstanceID - * - * The completion handler invoked when the InstanceID `deleteToken` returns. If - * the call fails we return the appropriate `error code` as described below - * - * @param error The error describing why deleting the token failed. - * See the error codes below for a more detailed description. - */ -typedef void(^FIRInstanceIDDeleteTokenHandler)(NSError * __nullable error); - -/** - * @related FIRInstanceID - * - * The completion handler invoked when the app identity is created. If the - * identity wasn't created for some reason we return the appropriate error code. - * - * @param identity A valid identity for the app instance, nil if there was an error - * while creating an identity. - * @param error The error if fetching the identity fails else nil. - */ -typedef void(^FIRInstanceIDHandler)(NSString * __nullable identity, NSError * __nullable error); - -/** - * @related FIRInstanceID - * - * The completion handler invoked when the app identity and all the tokens associated - * with it are deleted. Returns a valid error object in case of failure else nil. - * - * @param error The error if deleting the identity and all the tokens associated with - * it fails else nil. - */ -typedef void(^FIRInstanceIDDeleteHandler)(NSError * __nullable error); - -/** - * @enum FIRInstanceIDError - */ -typedef NS_ENUM(NSUInteger, FIRInstanceIDError) { - /// Unknown error. - FIRInstanceIDErrorUnknown = 0, - - /// Auth Error -- FCM couldn't validate request from this client. - FIRInstanceIDErrorAuthentication = 1, - - /// NoAccess -- InstanceID service cannot be accessed. - FIRInstanceIDErrorNoAccess = 2, - - /// Timeout -- Request to InstanceID backend timed out. - FIRInstanceIDErrorTimeout = 3, - - /// Network -- No network available to reach the servers. - FIRInstanceIDErrorNetwork = 4, - - /// OperationInProgress -- Another similar operation in progress, - /// bailing this one. - FIRInstanceIDErrorOperationInProgress = 5, - - /// InvalidRequest -- Some parameters of the request were invalid. - FIRInstanceIDErrorInvalidRequest = 7, -}; - -/** - * The APNS token type for the app. If the token type is set to `UNKNOWN` - * InstanceID will implicitly try to figure out what the actual token type - * is from the provisioning profile. - */ -typedef NS_ENUM(NSInteger, FIRInstanceIDAPNSTokenType) { - /// Unknown token type. - FIRInstanceIDAPNSTokenTypeUnknown, - /// Sandbox token type. - FIRInstanceIDAPNSTokenTypeSandbox, - /// Production token type. - FIRInstanceIDAPNSTokenTypeProd, -}; - -/** - * Instance ID provides a unique identifier for each app instance and a mechanism - * to authenticate and authorize actions (for example, sending a GCM message). - * - * Instance ID is long lived but, may be reset if the device is not used for - * a long time or the Instance ID service detects a problem. - * If Instance ID is reset, the app will be notified with a `com.firebase.iid.token-refresh` - * notification. - * - * If the Instance ID has become invalid, the app can request a new one and - * send it to the app server. - * To prove ownership of Instance ID and to allow servers to access data or - * services associated with the app, call - * `[FIRInstanceID tokenWithAuthorizedEntity:scope:options:handler]`. - */ -@interface FIRInstanceID : NSObject - -/** - * FIRInstanceID. - * - * @return A shared instance of FIRInstanceID. - */ -+ (nonnull instancetype)instanceID; - -/** - * Set APNS token for the application. This APNS token will be used to register - * with Firebase Messaging using `token` or - * `tokenWithAuthorizedEntity:scope:options:handler`. If the token type is set to - * `FIRInstanceIDAPNSTokenTypeUnknown` InstanceID will read the provisioning profile - * to find out the token type. - * - * @param token The APNS token for the application. - * @param type The APNS token type for the above token. - */ -- (void)setAPNSToken:(nonnull NSData *)token type:(FIRInstanceIDAPNSTokenType)type; - -#pragma mark - Tokens - -/** - * Returns a Firebase Messaging scoped token for the firebase app. - * - * @return Null Returns null if the device has not yet been registerd with - * Firebase Message else returns a valid token. - */ -- (nullable NSString *)token; - -/** - * Returns a token that authorizes an Entity (example: cloud service) to perform - * an action on behalf of the application identified by Instance ID. - * - * This is similar to an OAuth2 token except, it applies to the - * application instance instead of a user. - * - * This is an asynchronous call. If the token fetching fails for some reason - * we invoke the completion callback with nil `token` and the appropriate - * error. - * - * Note, you can only have one `token` or `deleteToken` call for a given - * authorizedEntity and scope at any point of time. Making another such call with the - * same authorizedEntity and scope before the last one finishes will result in an - * error with code `OperationInProgress`. - * - * @see FIRInstanceID deleteTokenWithAuthorizedEntity:scope:handler: - * - * @param authorizedEntity Entity authorized by the token. - * @param scope Action authorized for authorizedEntity. - * @param options The extra options to be sent with your token request. The - * value for the `apns_token` should be the NSData object - * passed to UIApplication's - * `didRegisterForRemoteNotificationsWithDeviceToken` method. - * All other keys and values in the options dict need to be - * instances of NSString or else they will be discarded. Bundle - * keys starting with 'GCM.' and 'GOOGLE.' are reserved. - * @param handler The callback handler which is invoked when the token is - * successfully fetched. In case of success a valid `token` and - * `nil` error are returned. In case of any error the `token` - * is nil and a valid `error` is returned. The valid error - * codes have been documented above. - */ -- (void)tokenWithAuthorizedEntity:(nonnull NSString *)authorizedEntity - scope:(nonnull NSString *)scope - options:(nonnull NSDictionary *)options - handler:(nonnull FIRInstanceIDTokenHandler)handler; - -/** - * Revokes access to a scope (action) for an entity previously - * authorized by `[FIRInstanceID tokenWithAuthorizedEntity:scope:options:handler]`. - * - * This is an asynchronous call. Call this on the main thread since InstanceID lib - * is not thread safe. In case token deletion fails for some reason we invoke the - * `handler` callback passed in with the appropriate error code. - * - * Note, you can only have one `token` or `deleteToken` call for a given - * authorizedEntity and scope at a point of time. Making another such call with the - * same authorizedEntity and scope before the last one finishes will result in an error - * with code `OperationInProgress`. - * - * @param authorizedEntity Entity that must no longer have access. - * @param scope Action that entity is no longer authorized to perform. - * @param handler The handler that is invoked once the unsubscribe call ends. - * In case of error an appropriate error object is returned - * else error is nil. - */ -- (void)deleteTokenWithAuthorizedEntity:(nonnull NSString *)authorizedEntity - scope:(nonnull NSString *)scope - handler:(nonnull FIRInstanceIDDeleteTokenHandler)handler; - -#pragma mark - Identity - -/** - * Asynchronously fetch a stable identifier that uniquely identifies the app - * instance. If the identifier has been revoked or has expired, this method will - * return a new identifier. - * - * - * @param handler The handler to invoke once the identifier has been fetched. - * In case of error an appropriate error object is returned else - * a valid identifier is returned and a valid identifier for the - * application instance. - */ -- (void)getIDWithHandler:(nonnull FIRInstanceIDHandler)handler; - -/** - * Resets Instance ID and revokes all tokens. - */ -- (void)deleteIDWithHandler:(nonnull FIRInstanceIDDeleteHandler)handler; - -@end diff --git a/Project 29 - Grocr/Pods/FirebaseInstanceID/README.md b/Project 29 - Grocr/Pods/FirebaseInstanceID/README.md deleted file mode 100644 index e6fb90db..00000000 --- a/Project 29 - Grocr/Pods/FirebaseInstanceID/README.md +++ /dev/null @@ -1,10 +0,0 @@ -# InstanceID SDK for iOS - -Instance ID provides a unique ID per instance of your apps and also provides a -mechanism to authenticate and authorize actions, like sending messages via -Google Cloud Messaging (GCM). - - -Please visit [our developer -site](https://developers.google.com/instance-id/) for integration instructions, -documentation, support information, and terms of service. diff --git a/Project 29 - Grocr/Pods/GoogleInterchangeUtilities/Frameworks/GoogleInterchangeUtilities.framework/GoogleInterchangeUtilities b/Project 29 - Grocr/Pods/GoogleInterchangeUtilities/Frameworks/GoogleInterchangeUtilities.framework/GoogleInterchangeUtilities deleted file mode 100644 index dc653b30..00000000 Binary files a/Project 29 - Grocr/Pods/GoogleInterchangeUtilities/Frameworks/GoogleInterchangeUtilities.framework/GoogleInterchangeUtilities and /dev/null differ diff --git a/Project 29 - Grocr/Pods/GoogleNetworkingUtilities/Frameworks/GoogleNetworkingUtilities.framework/GoogleNetworkingUtilities b/Project 29 - Grocr/Pods/GoogleNetworkingUtilities/Frameworks/GoogleNetworkingUtilities.framework/GoogleNetworkingUtilities deleted file mode 100644 index 500af270..00000000 Binary files a/Project 29 - Grocr/Pods/GoogleNetworkingUtilities/Frameworks/GoogleNetworkingUtilities.framework/GoogleNetworkingUtilities and /dev/null differ diff --git a/Project 29 - Grocr/Pods/GoogleParsingUtilities/Frameworks/GoogleParsingUtilities.framework/GoogleParsingUtilities b/Project 29 - Grocr/Pods/GoogleParsingUtilities/Frameworks/GoogleParsingUtilities.framework/GoogleParsingUtilities deleted file mode 100644 index 7ce65998..00000000 Binary files a/Project 29 - Grocr/Pods/GoogleParsingUtilities/Frameworks/GoogleParsingUtilities.framework/GoogleParsingUtilities and /dev/null differ diff --git a/Project 29 - Grocr/Pods/GoogleSymbolUtilities/Frameworks/GoogleSymbolUtilities.framework/GoogleSymbolUtilities b/Project 29 - Grocr/Pods/GoogleSymbolUtilities/Frameworks/GoogleSymbolUtilities.framework/GoogleSymbolUtilities deleted file mode 100644 index 016a5249..00000000 Binary files a/Project 29 - Grocr/Pods/GoogleSymbolUtilities/Frameworks/GoogleSymbolUtilities.framework/GoogleSymbolUtilities and /dev/null differ diff --git a/Project 29 - Grocr/Pods/GoogleUtilities/Frameworks/GoogleUtilities.framework/GoogleUtilities b/Project 29 - Grocr/Pods/GoogleUtilities/Frameworks/GoogleUtilities.framework/GoogleUtilities deleted file mode 100644 index 31efbac4..00000000 Binary files a/Project 29 - Grocr/Pods/GoogleUtilities/Frameworks/GoogleUtilities.framework/GoogleUtilities and /dev/null differ diff --git a/Project 29 - Grocr/Pods/Headers/Private/Firebase/Firebase.h b/Project 29 - Grocr/Pods/Headers/Private/Firebase/Firebase.h deleted file mode 100644 index 025a5f98..00000000 --- a/Project 29 - Grocr/Pods/Headers/Private/Firebase/Firebase.h +++ /dev/null @@ -1,51 +0,0 @@ -#import - -#if !defined(__has_include) - #error "Firebase.h won't import anything if your compiler doesn't support __has_include. Please \ - import the headers individually." -#else - #if __has_include() - #import - #endif - - #if __has_include() - #import - #endif - - #if __has_include() - #import - #endif - - #if __has_include() - #import - #endif - - #if __has_include() - #import - #endif - - #if __has_include() - #import - #endif - - #if __has_include() - #import - #endif - - #if __has_include() - #import - #endif - - #if __has_include() - #import - #endif - - #if __has_include() - #import - #endif - - #if __has_include() - #import - #endif - -#endif // defined(__has_include) diff --git a/Project 29 - Grocr/Pods/Headers/Private/FirebaseInstanceID/FIRInstanceID.h b/Project 29 - Grocr/Pods/Headers/Private/FirebaseInstanceID/FIRInstanceID.h deleted file mode 100644 index e3782f8c..00000000 --- a/Project 29 - Grocr/Pods/Headers/Private/FirebaseInstanceID/FIRInstanceID.h +++ /dev/null @@ -1,237 +0,0 @@ -#import - -/** - * @memberof FIRInstanceID - * - * The scope to be used when fetching/deleting a token for Firebase Messaging. - */ -FOUNDATION_EXPORT NSString * __nonnull const kFIRInstanceIDScopeFirebaseMessaging; - -/** - * Called when the system determines that tokens need to be refreshed. - * This method is also called if Instance ID has been reset in which - * case, tokens and FCM topic subscriptions also need to be refreshed. - * - * Instance ID service will throttle the refresh event across all devices - * to control the rate of token updates on application servers. - */ -FOUNDATION_EXPORT NSString * __nonnull const kFIRInstanceIDTokenRefreshNotification; - -/** - * @related FIRInstanceID - * - * The completion handler invoked when the InstanceID token returns. If - * the call fails we return the appropriate `error code` as described below. - * - * @param token The valid token as returned by InstanceID backend. - * - * @param error The error describing why generating a new token - * failed. See the error codes below for a more detailed - * description. - */ -typedef void(^FIRInstanceIDTokenHandler)(NSString * __nullable token, NSError * __nullable error); - - -/** - * @related FIRInstanceID - * - * The completion handler invoked when the InstanceID `deleteToken` returns. If - * the call fails we return the appropriate `error code` as described below - * - * @param error The error describing why deleting the token failed. - * See the error codes below for a more detailed description. - */ -typedef void(^FIRInstanceIDDeleteTokenHandler)(NSError * __nullable error); - -/** - * @related FIRInstanceID - * - * The completion handler invoked when the app identity is created. If the - * identity wasn't created for some reason we return the appropriate error code. - * - * @param identity A valid identity for the app instance, nil if there was an error - * while creating an identity. - * @param error The error if fetching the identity fails else nil. - */ -typedef void(^FIRInstanceIDHandler)(NSString * __nullable identity, NSError * __nullable error); - -/** - * @related FIRInstanceID - * - * The completion handler invoked when the app identity and all the tokens associated - * with it are deleted. Returns a valid error object in case of failure else nil. - * - * @param error The error if deleting the identity and all the tokens associated with - * it fails else nil. - */ -typedef void(^FIRInstanceIDDeleteHandler)(NSError * __nullable error); - -/** - * @enum FIRInstanceIDError - */ -typedef NS_ENUM(NSUInteger, FIRInstanceIDError) { - /// Unknown error. - FIRInstanceIDErrorUnknown = 0, - - /// Auth Error -- FCM couldn't validate request from this client. - FIRInstanceIDErrorAuthentication = 1, - - /// NoAccess -- InstanceID service cannot be accessed. - FIRInstanceIDErrorNoAccess = 2, - - /// Timeout -- Request to InstanceID backend timed out. - FIRInstanceIDErrorTimeout = 3, - - /// Network -- No network available to reach the servers. - FIRInstanceIDErrorNetwork = 4, - - /// OperationInProgress -- Another similar operation in progress, - /// bailing this one. - FIRInstanceIDErrorOperationInProgress = 5, - - /// InvalidRequest -- Some parameters of the request were invalid. - FIRInstanceIDErrorInvalidRequest = 7, -}; - -/** - * The APNS token type for the app. If the token type is set to `UNKNOWN` - * InstanceID will implicitly try to figure out what the actual token type - * is from the provisioning profile. - */ -typedef NS_ENUM(NSInteger, FIRInstanceIDAPNSTokenType) { - /// Unknown token type. - FIRInstanceIDAPNSTokenTypeUnknown, - /// Sandbox token type. - FIRInstanceIDAPNSTokenTypeSandbox, - /// Production token type. - FIRInstanceIDAPNSTokenTypeProd, -}; - -/** - * Instance ID provides a unique identifier for each app instance and a mechanism - * to authenticate and authorize actions (for example, sending a GCM message). - * - * Instance ID is long lived but, may be reset if the device is not used for - * a long time or the Instance ID service detects a problem. - * If Instance ID is reset, the app will be notified with a `com.firebase.iid.token-refresh` - * notification. - * - * If the Instance ID has become invalid, the app can request a new one and - * send it to the app server. - * To prove ownership of Instance ID and to allow servers to access data or - * services associated with the app, call - * `[FIRInstanceID tokenWithAuthorizedEntity:scope:options:handler]`. - */ -@interface FIRInstanceID : NSObject - -/** - * FIRInstanceID. - * - * @return A shared instance of FIRInstanceID. - */ -+ (nonnull instancetype)instanceID; - -/** - * Set APNS token for the application. This APNS token will be used to register - * with Firebase Messaging using `token` or - * `tokenWithAuthorizedEntity:scope:options:handler`. If the token type is set to - * `FIRInstanceIDAPNSTokenTypeUnknown` InstanceID will read the provisioning profile - * to find out the token type. - * - * @param token The APNS token for the application. - * @param type The APNS token type for the above token. - */ -- (void)setAPNSToken:(nonnull NSData *)token type:(FIRInstanceIDAPNSTokenType)type; - -#pragma mark - Tokens - -/** - * Returns a Firebase Messaging scoped token for the firebase app. - * - * @return Null Returns null if the device has not yet been registerd with - * Firebase Message else returns a valid token. - */ -- (nullable NSString *)token; - -/** - * Returns a token that authorizes an Entity (example: cloud service) to perform - * an action on behalf of the application identified by Instance ID. - * - * This is similar to an OAuth2 token except, it applies to the - * application instance instead of a user. - * - * This is an asynchronous call. If the token fetching fails for some reason - * we invoke the completion callback with nil `token` and the appropriate - * error. - * - * Note, you can only have one `token` or `deleteToken` call for a given - * authorizedEntity and scope at any point of time. Making another such call with the - * same authorizedEntity and scope before the last one finishes will result in an - * error with code `OperationInProgress`. - * - * @see FIRInstanceID deleteTokenWithAuthorizedEntity:scope:handler: - * - * @param authorizedEntity Entity authorized by the token. - * @param scope Action authorized for authorizedEntity. - * @param options The extra options to be sent with your token request. The - * value for the `apns_token` should be the NSData object - * passed to UIApplication's - * `didRegisterForRemoteNotificationsWithDeviceToken` method. - * All other keys and values in the options dict need to be - * instances of NSString or else they will be discarded. Bundle - * keys starting with 'GCM.' and 'GOOGLE.' are reserved. - * @param handler The callback handler which is invoked when the token is - * successfully fetched. In case of success a valid `token` and - * `nil` error are returned. In case of any error the `token` - * is nil and a valid `error` is returned. The valid error - * codes have been documented above. - */ -- (void)tokenWithAuthorizedEntity:(nonnull NSString *)authorizedEntity - scope:(nonnull NSString *)scope - options:(nonnull NSDictionary *)options - handler:(nonnull FIRInstanceIDTokenHandler)handler; - -/** - * Revokes access to a scope (action) for an entity previously - * authorized by `[FIRInstanceID tokenWithAuthorizedEntity:scope:options:handler]`. - * - * This is an asynchronous call. Call this on the main thread since InstanceID lib - * is not thread safe. In case token deletion fails for some reason we invoke the - * `handler` callback passed in with the appropriate error code. - * - * Note, you can only have one `token` or `deleteToken` call for a given - * authorizedEntity and scope at a point of time. Making another such call with the - * same authorizedEntity and scope before the last one finishes will result in an error - * with code `OperationInProgress`. - * - * @param authorizedEntity Entity that must no longer have access. - * @param scope Action that entity is no longer authorized to perform. - * @param handler The handler that is invoked once the unsubscribe call ends. - * In case of error an appropriate error object is returned - * else error is nil. - */ -- (void)deleteTokenWithAuthorizedEntity:(nonnull NSString *)authorizedEntity - scope:(nonnull NSString *)scope - handler:(nonnull FIRInstanceIDDeleteTokenHandler)handler; - -#pragma mark - Identity - -/** - * Asynchronously fetch a stable identifier that uniquely identifies the app - * instance. If the identifier has been revoked or has expired, this method will - * return a new identifier. - * - * - * @param handler The handler to invoke once the identifier has been fetched. - * In case of error an appropriate error object is returned else - * a valid identifier is returned and a valid identifier for the - * application instance. - */ -- (void)getIDWithHandler:(nonnull FIRInstanceIDHandler)handler; - -/** - * Resets Instance ID and revokes all tokens. - */ -- (void)deleteIDWithHandler:(nonnull FIRInstanceIDDeleteHandler)handler; - -@end diff --git a/Project 29 - Grocr/Pods/Headers/Public/Firebase/Firebase.h b/Project 29 - Grocr/Pods/Headers/Public/Firebase/Firebase.h deleted file mode 100644 index 025a5f98..00000000 --- a/Project 29 - Grocr/Pods/Headers/Public/Firebase/Firebase.h +++ /dev/null @@ -1,51 +0,0 @@ -#import - -#if !defined(__has_include) - #error "Firebase.h won't import anything if your compiler doesn't support __has_include. Please \ - import the headers individually." -#else - #if __has_include() - #import - #endif - - #if __has_include() - #import - #endif - - #if __has_include() - #import - #endif - - #if __has_include() - #import - #endif - - #if __has_include() - #import - #endif - - #if __has_include() - #import - #endif - - #if __has_include() - #import - #endif - - #if __has_include() - #import - #endif - - #if __has_include() - #import - #endif - - #if __has_include() - #import - #endif - - #if __has_include() - #import - #endif - -#endif // defined(__has_include) diff --git a/Project 29 - Grocr/Pods/Headers/Public/FirebaseAnalytics/FirebaseAnalytics/FIRAnalytics+AppDelegate.h b/Project 29 - Grocr/Pods/Headers/Public/FirebaseAnalytics/FirebaseAnalytics/FIRAnalytics+AppDelegate.h deleted file mode 100755 index 45ce348c..00000000 --- a/Project 29 - Grocr/Pods/Headers/Public/FirebaseAnalytics/FirebaseAnalytics/FIRAnalytics+AppDelegate.h +++ /dev/null @@ -1,57 +0,0 @@ -#import - -#import "FIRAnalytics.h" - -/** - * Provides App Delegate handlers to be used in your App Delegate. - * - * To save time integrating Firebase Analytics in an application, Firebase Analytics does not - * require delegation implementation from the AppDelegate. Instead this is automatically done by - * Firebase Analytics. Should you choose instead to delegate manually, you can turn off the App - * Delegate Proxy by adding FirebaseAppDelegateProxyEnabled into your Info.plist and setting it - * to NO, and adding the methods in this category to corresponding delegation handlers. - * - * To handle Universal Links, you must return YES in - * [UIApplicationDelegate application:didFinishLaunchingWithOptions:]. - */ -@interface FIRAnalytics (AppDelegate) - -/** - * Handles events related to a URL session that are waiting to be processed. - * - * For optimal use of Firebase Analytics, call this method from the - * [UIApplicationDelegate application:handleEventsForBackgroundURLSession:completionHandler] - * method of the app delegate in your app. - * - * @param identifier The identifier of the URL session requiring attention. - * @param completionHandler The completion handler to call when you finish processing the events. - * Calling this completion handler lets the system know that your app's user interface is - * updated and a new snapshot can be taken. - */ -+ (void)handleEventsForBackgroundURLSession:(NSString *)identifier - completionHandler:(void (^)(void))completionHandler; - -/** - * Handles the event when the app is launched by a URL. - * - * Call this method from [UIApplicationDelegate application:openURL:options:] (on iOS 9.0 and - * above), or [UIApplicationDelegate application:openURL:sourceApplication:annotation:] (on iOS 8.x - * and below) in your app. - * - * @param url The URL resource to open. This resource can be a network resource or a file. - */ -+ (void)handleOpenURL:(NSURL *)url; - -/** - * Handles the event when the app receives data associated with user activity that includes a - * Universal Link (on iOS 9.0 and above). - * - * Call this method from [UIApplication continueUserActivity:restorationHandler:] in your app - * delegate (on iOS 9.0 and above). - * - * @param userActivity The activity object containing the data associated with the task the user - * was performing. - */ -+ (void)handleUserActivity:(id)userActivity; - -@end diff --git a/Project 29 - Grocr/Pods/Headers/Public/FirebaseAnalytics/FirebaseAnalytics/FIRAnalytics.h b/Project 29 - Grocr/Pods/Headers/Public/FirebaseAnalytics/FirebaseAnalytics/FIRAnalytics.h deleted file mode 100755 index 17a6cb54..00000000 --- a/Project 29 - Grocr/Pods/Headers/Public/FirebaseAnalytics/FirebaseAnalytics/FIRAnalytics.h +++ /dev/null @@ -1,71 +0,0 @@ -#import - -#import "FIREventNames.h" -#import "FIRParameterNames.h" -#import "FIRUserPropertyNames.h" - -/// The top level Firebase Analytics singleton that provides methods for logging events and setting -/// user properties. See the developer guides for general -/// information on using Firebase Analytics in your apps. -@interface FIRAnalytics : NSObject - -/// Logs an app event. The event can have up to 25 parameters. Events with the same name must have -/// the same parameters. Up to 500 event names are supported. Using predefined events and/or -/// parameters is recommended for optimal reporting. -/// -/// The following event names are reserved and cannot be used: -///
    -///
  • app_clear_data
  • -///
  • app_uninstall
  • -///
  • app_update
  • -///
  • error
  • -///
  • first_open
  • -///
  • in_app_purchase
  • -///
  • notification_dismiss
  • -///
  • notification_foreground
  • -///
  • notification_open
  • -///
  • notification_receive
  • -///
  • os_update
  • -///
  • session_start
  • -///
  • user_engagement
  • -///
-/// -/// @param name The name of the event. Should contain 1 to 32 alphanumeric characters or -/// underscores. The name must start with an alphabetic character. Some event names are -/// reserved. See FIREventNames.h for the list of reserved event names. The "firebase_" prefix -/// is reserved and should not be used. Note that event names are case-sensitive and that -/// logging two events whose names differ only in case will result in two distinct events. -/// @param parameters The dictionary of event parameters. Passing nil indicates that the event has -/// no parameters. Parameter names can be up to 24 characters long and must start with an -/// alphabetic character and contain only alphanumeric characters and underscores. Only NSString -/// and NSNumber (signed 64-bit integer and 64-bit floating-point number) parameter types are -/// supported. NSString parameter values can be up to 36 characters long. The "firebase_" prefix -/// is reserved and should not be used for parameter names. -+ (void)logEventWithName:(nonnull NSString *)name - parameters:(nullable NSDictionary *)parameters; - -/// Sets a user property to a given value. Up to 25 user property names are supported. Once set, -/// user property values persist throughout the app lifecycle and across sessions. -/// -/// The following user property names are reserved and cannot be used: -///
    -///
  • first_open_time
  • -///
  • last_deep_link_referrer
  • -///
  • user_id
  • -///
-/// -/// @param value The value of the user property. Values can be up to 36 characters long. Setting the -/// value to nil removes the user property. -/// @param name The name of the user property to set. Should contain 1 to 24 alphanumeric characters -/// or underscores and must start with an alphabetic character. The "firebase_" prefix is -/// reserved and should not be used for user property names. -+ (void)setUserPropertyString:(nullable NSString *)value forName:(nonnull NSString *)name; - -/// Sets the user ID property. This feature must be used in accordance with -/// Google's Privacy Policy -/// -/// @param userID The user ID to ascribe to the user of this app on this device, which must be -/// non-empty and no more than 36 characters long. Setting userID to nil removes the user ID. -+ (void)setUserID:(nullable NSString *)userID; - -@end diff --git a/Project 29 - Grocr/Pods/Headers/Public/FirebaseAnalytics/FirebaseAnalytics/FIRAnalyticsConfiguration.h b/Project 29 - Grocr/Pods/Headers/Public/FirebaseAnalytics/FirebaseAnalytics/FIRAnalyticsConfiguration.h deleted file mode 100755 index 667d5a4b..00000000 --- a/Project 29 - Grocr/Pods/Headers/Public/FirebaseAnalytics/FirebaseAnalytics/FIRAnalyticsConfiguration.h +++ /dev/null @@ -1,38 +0,0 @@ -#import - -/** - * This class provides configuration fields for Firebase Analytics. - */ -@interface FIRAnalyticsConfiguration : NSObject - -/** - * Returns the shared instance of FIRAnalyticsConfiguration. - */ -+ (FIRAnalyticsConfiguration *)sharedInstance; - -/** - * Sets the minimum engagement time in seconds required to start a new session. The default value - * is 10 seconds. - */ -- (void)setMinimumSessionInterval:(NSTimeInterval)minimumSessionInterval; - -/** - * Sets the interval of inactivity in seconds that terminates the current session. The default - * value is 1800 seconds (30 minutes). - */ -- (void)setSessionTimeoutInterval:(NSTimeInterval)sessionTimeoutInterval; - -/** - * Sets whether analytics collection is enabled for this app on this device. This setting is - * persisted across app sessions. By default it is enabled. - */ -- (void)setAnalyticsCollectionEnabled:(BOOL)analyticsCollectionEnabled; - -/** - * Deprecated. Sets whether measurement and reporting are enabled for this app on this device. By - * default they are enabled. - */ -- (void)setIsEnabled:(BOOL)isEnabled - DEPRECATED_MSG_ATTRIBUTE("Use setAnalyticsCollectionEnabled: instead."); - -@end diff --git a/Project 29 - Grocr/Pods/Headers/Public/FirebaseAnalytics/FirebaseAnalytics/FIRApp.h b/Project 29 - Grocr/Pods/Headers/Public/FirebaseAnalytics/FirebaseAnalytics/FIRApp.h deleted file mode 100755 index 6b65776a..00000000 --- a/Project 29 - Grocr/Pods/Headers/Public/FirebaseAnalytics/FirebaseAnalytics/FIRApp.h +++ /dev/null @@ -1,85 +0,0 @@ -#import -#import - -@class FIROptions; - -NS_ASSUME_NONNULL_BEGIN - -typedef void (^FIRAppVoidBoolCallback)(BOOL success); - -/** - * The entry point of Firebase SDKs. - * - * Initialize and configure FIRApp using [FIRApp configure]; - * Or other customized ways as shown below. - */ -@interface FIRApp : NSObject - -/** - * Configures a default Firebase app. Raises an exception if any configuration step fails. The - * default app is named "__FIRAPP_DEFAULT". This method should be called after the app is launched - * and before using Firebase services. This method is thread safe. - */ -+ (void)configure; - -/** - * Configures the default Firebase app with the provided options. The default app is named - * "__FIRAPP_DEFAULT". Raises an exception if any configuration step fails. This method is thread - * safe. - * - * @param options The Firebase application options used to configure the service. - */ -+ (void)configureWithOptions:(FIROptions *)options; - -/** - * Configures a Firebase app with the given name and options. Raises an exception if any - * configuration step fails. This method is thread safe. - * - * @param name The application's name given by the developer. The name should should only contain - Letters, Numbers and Underscore. - * @param options The Firebase application options used to configure the services. - */ -+ (void)configureWithName:(NSString *)name options:(FIROptions *)options; - -/** - * Returns the default app, or nil if the default app does not exist. - */ -+ (nullable FIRApp *)defaultApp NS_SWIFT_NAME(defaultApp()); - -/** - * Returns a previously created FIRApp instance with the given name, or nil if no such app exists. - * This method is thread safe. - */ -+ (nullable FIRApp *)appNamed:(NSString *)name; - -/** - * Returns the set of all extant FIRApp instances, or nil if there is no FIRApp instance. This - * method is thread safe. - */ -+ (nullable NSDictionary *)allApps; - -/** - * Cleans up the current FIRApp, freeing associated data and returning its name to the pool for - * future use. This method is thread safe in class level. - */ -- (void)deleteApp:(FIRAppVoidBoolCallback)completion; - -/** - * FIRFirebaseApp instances should not be initialized directly. Call |FIRApp configure|, or - * |FIRApp configureWithOptions:|, or |FIRApp configureWithNames:options| directly. - */ -- (nullable instancetype)init NS_UNAVAILABLE; - -/** - * Gets the name of this app. - */ -@property(nonatomic, copy, readonly) NSString *name; - -/** - * Gets the options for this app. - */ -@property(nonatomic, readonly) FIROptions *options; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Project 29 - Grocr/Pods/Headers/Public/FirebaseAnalytics/FirebaseAnalytics/FIRConfiguration.h b/Project 29 - Grocr/Pods/Headers/Public/FirebaseAnalytics/FirebaseAnalytics/FIRConfiguration.h deleted file mode 100755 index f06526e8..00000000 --- a/Project 29 - Grocr/Pods/Headers/Public/FirebaseAnalytics/FirebaseAnalytics/FIRConfiguration.h +++ /dev/null @@ -1,31 +0,0 @@ -#import - -#import "FIRAnalyticsConfiguration.h" - -/** - * The log levels used by FIRConfiguration. - */ -typedef NS_ENUM(NSInteger, FIRLogLevel) { - kFIRLogLevelError = 0, - kFIRLogLevelWarning, - kFIRLogLevelInfo, - kFIRLogLevelDebug, - kFIRLogLevelAssert, - kFIRLogLevelMax = kFIRLogLevelAssert -}; - -/** - * This interface provides global level properties that the developer can tweak, and the singleton - * of each Google service configuration class. - */ -@interface FIRConfiguration : NSObject - -+ (FIRConfiguration *)sharedInstance; - -// The configuration class for Firebase Analytics. -@property(nonatomic, readwrite) FIRAnalyticsConfiguration *analyticsConfiguration; - -// Global log level. Defaults to kFIRLogLevelError. -@property(nonatomic, readwrite, assign) FIRLogLevel logLevel; - -@end diff --git a/Project 29 - Grocr/Pods/Headers/Public/FirebaseAnalytics/FirebaseAnalytics/FIREventNames.h b/Project 29 - Grocr/Pods/Headers/Public/FirebaseAnalytics/FirebaseAnalytics/FIREventNames.h deleted file mode 100755 index 50a9f838..00000000 --- a/Project 29 - Grocr/Pods/Headers/Public/FirebaseAnalytics/FirebaseAnalytics/FIREventNames.h +++ /dev/null @@ -1,311 +0,0 @@ -/// @file FIREventNames.h -/// -/// Predefined event names. -/// -/// An Event is an important occurrence in your app that you want to measure. You can report up to -/// 500 different types of Events per app and you can associate up to 25 unique parameters with each -/// Event type. Some common events are suggested below, but you may also choose to specify custom -/// Event types that are associated with your specific app. Each event type is identified by a -/// unique name. Event names can be up to 32 characters long, may only contain alphanumeric -/// characters and underscores ("_"), and must start with an alphabetic character. The "firebase_" -/// prefix is reserved and should not be used. - -/// Add Payment Info event. This event signifies that a user has submitted their payment information -/// to your app. -static NSString *const kFIREventAddPaymentInfo = @"add_payment_info"; - -/// E-Commerce Add To Cart event. This event signifies that an item was added to a cart for -/// purchase. Add this event to a funnel with kFIREventEcommercePurchase to gauge the effectiveness -/// of your checkout process. Note: If you supply the {@link kFIRParameterValue} parameter, you must -/// also supply the {@link kFIRParameterCurrency} parameter so that revenue metrics can be computed -/// accurately. Params: -/// -///
    -///
  • {@link kFIRParameterQuantity} (signed 64-bit integer as NSNumber)
  • -///
  • {@link kFIRParameterItemID} (NSString)
  • -///
  • {@link kFIRParameterItemName} (NSString)
  • -///
  • {@link kFIRParameterItemCategory} (NSString)
  • -///
  • {@link kFIRParameterItemLocationID} (NSString) (optional)
  • -///
  • {@link kFIRParameterPrice} (double as NSNumber) (optional)
  • -///
  • {@link kFIRParameterCurrency} (NSString) (optional)
  • -///
  • {@link kFIRParameterValue} (double as NSNumber) (optional)
  • -///
  • {@link kFIRParameterOrigin} (NSString) (optional)
  • -///
  • {@link kFIRParameterDestination} (NSString) (optional)
  • -///
  • {@link kFIRParameterStartDate} (NSString) (optional)
  • -///
  • {@link kFIRParameterEndDate} (NSString) (optional)
  • -///
-static NSString *const kFIREventAddToCart = @"add_to_cart"; - -/// E-Commerce Add To Wishlist event. This event signifies that an item was added to a wishlist. -/// Use this event to identify popular gift items in your app. Note: If you supply the -/// {@link kFIRParameterValue} parameter, you must also supply the {@link kFIRParameterCurrency} -/// parameter so that revenue metrics can be computed accurately. Params: -/// -///
    -///
  • {@link kFIRParameterQuantity} (signed 64-bit integer as NSNumber)
  • -///
  • {@link kFIRParameterItemID} (NSString)
  • -///
  • {@link kFIRParameterItemName} (NSString)
  • -///
  • {@link kFIRParameterItemCategory} (NSString)
  • -///
  • {@link kFIRParameterItemLocationID} (NSString) (optional)
  • -///
  • {@link kFIRParameterPrice} (double as NSNumber) (optional)
  • -///
  • {@link kFIRParameterCurrency} (NSString) (optional)
  • -///
  • {@link kFIRParameterValue} (double as NSNumber) (optional)
  • -///
-static NSString *const kFIREventAddToWishlist = @"add_to_wishlist"; - -/// App Open event. By logging this event when an App is moved to the foreground, developers can -/// understand how often users leave and return during the course of a Session. Although Sessions -/// are automatically reported, this event can provide further clarification around the continuous -/// engagement of app-users. -static NSString *const kFIREventAppOpen = @"app_open"; - -/// E-Commerce Begin Checkout event. This event signifies that a user has begun the process of -/// checking out. Add this event to a funnel with your kFIREventEcommercePurchase event to gauge the -/// effectiveness of your checkout process. Note: If you supply the {@link kFIRParameterValue} -/// parameter, you must also supply the {@link kFIRParameterCurrency} parameter so that revenue -/// metrics can be computed accurately. Params: -/// -///
    -///
  • {@link kFIRParameterValue} (double as NSNumber) (optional)
  • -///
  • {@link kFIRParameterCurrency} (NSString) (optional)
  • -///
  • {@link kFIRParameterTransactionID} (NSString) (optional)
  • -///
  • {@link kFIRParameterStartDate} (NSString) (optional)
  • -///
  • {@link kFIRParameterEndDate} (NSString) (optional)
  • -///
  • {@link kFIRParameterNumberOfNights} (signed 64-bit integer as NSNumber) (optional) for -/// hotel bookings
  • -///
  • {@link kFIRParameterNumberOfRooms} (signed 64-bit integer as NSNumber) (optional) for -/// hotel bookings
  • -///
  • {@link kFIRParameterNumberOfPassengers} (signed 64-bit integer as NSNumber) (optional) -/// for travel bookings
  • -///
  • {@link kFIRParameterOrigin} (NSString) (optional)
  • -///
  • {@link kFIRParameterDestination} (NSString) (optional)
  • -///
  • {@link kFIRParameterTravelClass} (NSString) (optional) for travel bookings
  • -///
-static NSString *const kFIREventBeginCheckout = @"begin_checkout"; - -/// E-Commerce Purchase event. This event signifies that an item was purchased by a user. Note: -/// This is different from the in-app purchase event, which is reported automatically for App -/// Store-based apps. Note: If you supply the {@link kFIRParameterValue} parameter, you must also -/// supply the {@link kFIRParameterCurrency} parameter so that revenue metrics can be computed -/// accurately. Params: -/// -///
    -///
  • {@link kFIRParameterCurrency} (NSString) (optional)
  • -///
  • {@link kFIRParameterValue} (double as NSNumber) (optional)
  • -///
  • {@link kFIRParameterTransactionID} (NSString) (optional)
  • -///
  • {@link kFIRParameterTax} (double as NSNumber) (optional)
  • -///
  • {@link kFIRParameterShipping} (double as NSNumber) (optional)
  • -///
  • {@link kFIRParameterCoupon} (NSString) (optional)
  • -///
  • {@link kFIRParameterLocation} (NSString) (optional)
  • -///
  • {@link kFIRParameterStartDate} (NSString) (optional)
  • -///
  • {@link kFIRParameterEndDate} (NSString) (optional)
  • -///
  • {@link kFIRParameterNumberOfNights} (signed 64-bit integer as NSNumber) (optional) for -/// hotel bookings
  • -///
  • {@link kFIRParameterNumberOfRooms} (signed 64-bit integer as NSNumber) (optional) for -/// hotel bookings
  • -///
  • {@link kFIRParameterNumberOfPassengers} (signed 64-bit integer as NSNumber) (optional) -/// for travel bookings
  • -///
  • {@link kFIRParameterOrigin} (NSString) (optional)
  • -///
  • {@link kFIRParameterDestination} (NSString) (optional)
  • -///
  • {@link kFIRParameterTravelClass} (NSString) (optional) for travel bookings
  • -///
-static NSString *const kFIREventEcommercePurchase = @"ecommerce_purchase"; - -/// Generate Lead event. Log this event when a lead has been generated in the app to understand the -/// efficacy of your install and re-engagement campaigns. Note: If you supply the -/// {@link kFIRParameterValue} parameter, you must also supply the {@link kFIRParameterCurrency} -/// parameter so that revenue metrics can be computed accurately. Params: -/// -///
    -///
  • {@link kFIRParameterCurrency} (NSString) (optional)
  • -///
  • {@link kFIRParameterValue} (double as NSNumber) (optional)
  • -///
-static NSString *const kFIREventGenerateLead = @"generate_lead"; - -/// Join Group event. Log this event when a user joins a group such as a guild, team or family. Use -/// this event to analyze how popular certain groups or social features are in your app. Params: -/// -///
    -///
  • {@link kFIRParameterGroupID} (NSString)
  • -///
-static NSString *const kFIREventJoinGroup = @"join_group"; - -/// Level Up event. This event signifies that a player has leveled up in your gaming app. It can -/// help you gauge the level distribution of your userbase and help you identify certain levels that -/// are difficult to pass. Params: -/// -///
    -///
  • {@link kFIRParameterLevel} (signed 64-bit integer as NSNumber)
  • -///
  • {@link kFIRParameterCharacter} (NSString) (optional)
  • -///
-static NSString *const kFIREventLevelUp = @"level_up"; - -/// Login event. Apps with a login feature can report this event to signify that a user has logged -/// in. -static NSString *const kFIREventLogin = @"login"; - -/// Post Score event. Log this event when the user posts a score in your gaming app. This event can -/// help you understand how users are actually performing in your game and it can help you correlate -/// high scores with certain audiences or behaviors. Params: -/// -///
    -///
  • {@link kFIRParameterScore} (signed 64-bit integer as NSNumber)
  • -///
  • {@link kFIRParameterLevel} (signed 64-bit integer as NSNumber) (optional)
  • -///
  • {@link kFIRParameterCharacter} (NSString) (optional)
  • -///
-static NSString *const kFIREventPostScore = @"post_score"; - -/// Present Offer event. This event signifies that the app has presented a purchase offer to a user. -/// Add this event to a funnel with the kFIREventAddToCart and kFIREventEcommercePurchase to gauge -/// your conversion process. Note: If you supply the {@link kFIRParameterValue} parameter, you must -/// also supply the {@link kFIRParameterCurrency} parameter so that revenue metrics can be computed -/// accurately. Params: -/// -///
    -///
  • {@link kFIRParameterQuantity} (signed 64-bit integer as NSNumber)
  • -///
  • {@link kFIRParameterItemID} (NSString)
  • -///
  • {@link kFIRParameterItemName} (NSString)
  • -///
  • {@link kFIRParameterItemCategory} (NSString)
  • -///
  • {@link kFIRParameterItemLocationID} (NSString) (optional)
  • -///
  • {@link kFIRParameterPrice} (double as NSNumber) (optional)
  • -///
  • {@link kFIRParameterCurrency} (NSString) (optional)
  • -///
  • {@link kFIRParameterValue} (double as NSNumber) (optional)
  • -///
-static NSString *const kFIREventPresentOffer = @"present_offer"; - -/// E-Commerce Purchase Refund event. This event signifies that an item purchase was refunded. -/// Note: If you supply the {@link kFIRParameterValue} parameter, you must also supply the -/// {@link kFIRParameterCurrency} parameter so that revenue metrics can be computed accurately. -/// Params: -/// -///
    -///
  • {@link kFIRParameterCurrency} (NSString) (optional)
  • -///
  • {@link kFIRParameterValue} (double as NSNumber) (optional)
  • -///
  • {@link kFIRParameterTransactionID} (NSString) (optional)
  • -///
-static NSString *const kFIREventPurchaseRefund = @"purchase_refund"; - -/// Search event. Apps that support search features can use this event to contextualize search -/// operations by supplying the appropriate, corresponding parameters. This event can help you -/// identify the most popular content in your app. Params: -/// -///
    -///
  • {@link kFIRParameterSearchTerm} (NSString)
  • -///
  • {@link kFIRParameterStartDate} (NSString) (optional)
  • -///
  • {@link kFIRParameterEndDate} (NSString) (optional)
  • -///
  • {@link kFIRParameterNumberOfNights} (signed 64-bit integer as NSNumber) (optional) for -/// hotel bookings
  • -///
  • {@link kFIRParameterNumberOfRooms} (signed 64-bit integer as NSNumber) (optional) for -/// hotel bookings
  • -///
  • {@link kFIRParameterNumberOfPassengers} (signed 64-bit integer as NSNumber) (optional) -/// for travel bookings
  • -///
  • {@link kFIRParameterOrigin} (NSString) (optional)
  • -///
  • {@link kFIRParameterDestination} (NSString) (optional)
  • -///
  • {@link kFIRParameterTravelClass} (NSString) (optional) for travel bookings
  • -///
-static NSString *const kFIREventSearch = @"search"; - -/// Select Content event. This general purpose event signifies that a user has selected some content -/// of a certain type in an app. The content can be any object in your app. This event can help you -/// identify popular content and categories of content in your app. Params: -/// -///
    -///
  • {@link kFIRParameterContentType} (NSString)
  • -///
  • {@link kFIRParameterItemID} (NSString)
  • -///
-static NSString *const kFIREventSelectContent = @"select_content"; - -/// Share event. Apps with social features can log the Share event to identify the most viral -/// content. Params: -/// -///
    -///
  • {@link kFIRParameterContentType} (NSString)
  • -///
  • {@link kFIRParameterItemID} (NSString)
  • -///
-static NSString *const kFIREventShare = @"share"; - -/// Sign Up event. This event indicates that a user has signed up for an account in your app. The -/// parameter signifies the method by which the user signed up. Use this event to understand the -/// different behaviors between logged in and logged out users. Params: -/// -///
    -///
  • {@link kFIRParameterSignUpMethod} (NSString)
  • -///
-static NSString *const kFIREventSignUp = @"sign_up"; - -/// Spend Virtual Currency event. This event tracks the sale of virtual goods in your app and can -/// help you identify which virtual goods are the most popular objects of purchase. Params: -/// -///
    -///
  • {@link kFIRParameterItemName} (NSString)
  • -///
  • {@link kFIRParameterVirtualCurrencyName} (NSString)
  • -///
  • {@link kFIRParameterValue} (signed 64-bit integer or double as NSNumber)
  • -///
-static NSString *const kFIREventSpendVirtualCurrency = @"spend_virtual_currency"; - -/// Tutorial Begin event. This event signifies the start of the on-boarding process in your app. Use -/// this in a funnel with kFIREventTutorialComplete to understand how many users complete this -/// process and move on to the full app experience. -static NSString *const kFIREventTutorialBegin = @"tutorial_begin"; - -/// Tutorial End event. Use this event to signify the user's completion of your app's on-boarding -/// process. Add this to a funnel with kFIREventTutorialBegin to gauge the completion rate of your -/// on-boarding process. -static NSString *const kFIREventTutorialComplete = @"tutorial_complete"; - -/// Unlock Achievement event. Log this event when the user has unlocked an achievement in your -/// game. Since achievements generally represent the breadth of a gaming experience, this event can -/// help you understand how many users are experiencing all that your game has to offer. Params: -/// -///
    -///
  • {@link kFIRParameterAchievementID} (NSString)
  • -///
-static NSString *const kFIREventUnlockAchievement = @"unlock_achievement"; - -/// View Item event. This event signifies that some content was shown to the user. This content may -/// be a product, a webpage or just a simple image or text. Use the appropriate parameters to -/// contextualize the event. Use this event to discover the most popular items viewed in your app. -/// Note: If you supply the {@link kFIRParameterValue} parameter, you must also supply the -/// {@link kFIRParameterCurrency} parameter so that revenue metrics can be computed accurately. -/// Params: -/// -///
    -///
  • {@link kFIRParameterItemID} (NSString)
  • -///
  • {@link kFIRParameterItemName} (NSString)
  • -///
  • {@link kFIRParameterItemCategory} (NSString)
  • -///
  • {@link kFIRParameterItemLocationID} (NSString) (optional)
  • -///
  • {@link kFIRParameterPrice} (double as NSNumber) (optional)
  • -///
  • {@link kFIRParameterQuantity} (signed 64-bit integer as NSNumber) (optional)
  • -///
  • {@link kFIRParameterCurrency} (NSString) (optional)
  • -///
  • {@link kFIRParameterValue} (double as NSNumber) (optional)
  • -///
  • {@link kFIRParameterStartDate} (NSString) (optional)
  • -///
  • {@link kFIRParameterEndDate} (NSString) (optional)
  • -///
  • {@link kFIRParameterFlightNumber} (NSString) (optional) for travel bookings
  • -///
  • {@link kFIRParameterNumberOfPassengers} (signed 64-bit integer as NSNumber) (optional) -/// for travel bookings
  • -///
  • {@link kFIRParameterNumberOfNights} (signed 64-bit integer as NSNumber) (optional) for -/// travel bookings
  • -///
  • {@link kFIRParameterNumberOfRooms} (signed 64-bit integer as NSNumber) (optional) for -/// travel bookings
  • -///
  • {@link kFIRParameterOrigin} (NSString) (optional)
  • -///
  • {@link kFIRParameterDestination} (NSString) (optional)
  • -///
  • {@link kFIRParameterSearchTerm} (NSString) (optional) for travel bookings
  • -///
  • {@link kFIRParameterTravelClass} (NSString) (optional) for travel bookings
  • -///
-static NSString *const kFIREventViewItem = @"view_item"; - -/// View Item List event. Log this event when the user has been presented with a list of items of a -/// certain category. Params: -/// -///
    -///
  • {@link kFIRParameterItemCategory} (NSString)
  • -///
-static NSString *const kFIREventViewItemList = @"view_item_list"; - -/// View Search Results event. Log this event when the user has been presented with the results of a -/// search. Params: -/// -///
    -///
  • {@link kFIRParameterSearchTerm} (NSString)
  • -///
-static NSString *const kFIREventViewSearchResults = @"view_search_results"; diff --git a/Project 29 - Grocr/Pods/Headers/Public/FirebaseAnalytics/FirebaseAnalytics/FIROptions.h b/Project 29 - Grocr/Pods/Headers/Public/FirebaseAnalytics/FirebaseAnalytics/FIROptions.h deleted file mode 100755 index 82418f69..00000000 --- a/Project 29 - Grocr/Pods/Headers/Public/FirebaseAnalytics/FirebaseAnalytics/FIROptions.h +++ /dev/null @@ -1,77 +0,0 @@ -#import - -/** - * This class provides constant fields of Google APIs. - */ -@interface FIROptions : NSObject - -/** - * Returns the default options. - */ -+ (FIROptions *)defaultOptions; - -/** - * An iOS API key used for authenticating requests from your app, e.g. - * @"AIzaSyDdVgKwhZl0sTTTLZ7iTmt1r3N2cJLnaDk", used to identify your app to Google servers. - */ -@property(nonatomic, readonly, copy) NSString *APIKey; - -/** - * The OAuth2 client ID for iOS application used to authenticate Google users, for example - * @"12345.apps.googleusercontent.com", used for signing in with Google. - */ -@property(nonatomic, readonly, copy) NSString *clientID; - -/** - * The tracking ID for Google Analytics, e.g. @"UA-12345678-1", used to configure Google Analytics. - */ -@property(nonatomic, readonly, copy) NSString *trackingID; - -/** - * The Project Number from the Google Developer's console, for example @"012345678901", used to - * configure Google Cloud Messaging. - */ -@property(nonatomic, readonly, copy) NSString *GCMSenderID; - -/** - * The Android client ID used in Google AppInvite when an iOS app has its Android version, for - * example @"12345.apps.googleusercontent.com". - */ -@property(nonatomic, readonly, copy) NSString *androidClientID; - -/** - * The Google App ID that is used to uniquely identify an instance of an app. - */ -@property(nonatomic, readonly, copy) NSString *googleAppID; - -/** - * The database root URL, e.g. @"http://abc-xyz-123.firebaseio.com". - */ -@property(nonatomic, readonly, copy) NSString *databaseURL; - -/** - * The URL scheme used to set up Durable Deep Link service. - */ -@property(nonatomic, readwrite, copy) NSString *deepLinkURLScheme; - -/** - * The Google Cloud Storage bucket name, e.g. @"abc-xyz-123.storage.firebase.com". - */ -@property(nonatomic, readonly, copy) NSString *storageBucket; - -/** - * Initializes a customized instance of FIROptions with keys. googleAppID, bundleID and GCMSenderID - * are required. Other keys may required for configuring specific services. - */ -- (instancetype)initWithGoogleAppID:(NSString *)googleAppID - bundleID:(NSString *)bundleID - GCMSenderID:(NSString *)GCMSenderID - APIKey:(NSString *)APIKey - clientID:(NSString *)clientID - trackingID:(NSString *)trackingID - androidClientID:(NSString *)androidClientID - databaseURL:(NSString *)databaseURL - storageBucket:(NSString *)storageBucket - deepLinkURLScheme:(NSString *)deepLinkURLScheme; - -@end diff --git a/Project 29 - Grocr/Pods/Headers/Public/FirebaseAnalytics/FirebaseAnalytics/FIRParameterNames.h b/Project 29 - Grocr/Pods/Headers/Public/FirebaseAnalytics/FirebaseAnalytics/FIRParameterNames.h deleted file mode 100755 index 42c0c5e2..00000000 --- a/Project 29 - Grocr/Pods/Headers/Public/FirebaseAnalytics/FirebaseAnalytics/FIRParameterNames.h +++ /dev/null @@ -1,304 +0,0 @@ -/// @file FIRParameterNames.h -/// -/// Predefined event parameter names. -/// -/// Params supply information that contextualize Events. You can associate up to 25 unique Params -/// with each Event type. Some Params are suggested below for certain common Events, but you are -/// not limited to these. You may supply extra Params for suggested Events or custom Params for -/// Custom events. Param names can be up to 24 characters long, may only contain alphanumeric -/// characters and underscores ("_"), and must start with an alphabetic character. Param values can -/// be up to 36 characters long. The "firebase_" prefix is reserved and should not be used. - -/// Game achievement ID (NSString). -///
-///     NSDictionary *params = @{
-///       kFIRParameterAchievementID : @"10_matches_won",
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterAchievementID = @"achievement_id"; - -/// Character used in game (NSString). -///
-///     NSDictionary *params = @{
-///       kFIRParameterCharacter : @"beat_boss",
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterCharacter = @"character"; - -/// Type of content selected (NSString). -///
-///     NSDictionary *params = @{
-///       kFIRParameterContentType : @"news article",
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterContentType = @"content_type"; - -/// Coupon code for a purchasable item (NSString). -///
-///     NSDictionary *params = @{
-///       kFIRParameterCoupon : @"zz123",
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterCoupon = @"coupon"; - -/// Purchase currency in 3-letter -/// ISO_4217 format (NSString). -///
-///     NSDictionary *params = @{
-///       kFIRParameterCurrency : @"USD",
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterCurrency = @"currency"; - -/// Flight or Travel destination (NSString). -///
-///     NSDictionary *params = @{
-///       kFIRParameterDestination : @"Mountain View, CA",
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterDestination = @"destination"; - -/// The arrival date, check-out date or rental end date for the item. This should be in -/// YYYY-MM-DD format (NSString). -///
-///     NSDictionary *params = @{
-///       kFIRParameterEndDate : @"2015-09-14",
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterEndDate = @"end_date"; - -/// Flight number for travel events (NSString). -///
-///     NSDictionary *params = @{
-///       kFIRParameterFlightNumber : @"ZZ800",
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterFlightNumber = @"flight_number"; - -/// Group/clan/guild ID (NSString). -///
-///     NSDictionary *params = @{
-///       kFIRParameterGroupID : @"g1",
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterGroupID = @"group_id"; - -/// Item category (NSString). -///
-///     NSDictionary *params = @{
-///       kFIRParameterItemCategory : @"t-shirts",
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterItemCategory = @"item_category"; - -/// Item ID (NSString). -///
-///     NSDictionary *params = @{
-///       kFIRParameterItemID : @"p7654",
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterItemID = @"item_id"; - -/// The Google Place ID (NSString) that -/// corresponds to the associated item. Alternatively, you can supply your own custom Location ID. -///
-///     NSDictionary *params = @{
-///       kFIRParameterItemLocationID : @"ChIJiyj437sx3YAR9kUWC8QkLzQ",
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterItemLocationID = @"item_location_id"; - -/// Item name (NSString). -///
-///     NSDictionary *params = @{
-///       kFIRParameterItemName : @"abc",
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterItemName = @"item_name"; - -/// Level in game (signed 64-bit integer as NSNumber). -///
-///     NSDictionary *params = @{
-///       kFIRParameterLevel : @(42),
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterLevel = @"level"; - -/// Location (NSString). The Google Place ID -/// that corresponds to the associated event. Alternatively, you can supply your own custom -/// Location ID. -///
-///     NSDictionary *params = @{
-///       kFIRParameterLocation : @"ChIJiyj437sx3YAR9kUWC8QkLzQ",
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterLocation = @"location"; - -/// Number of nights staying at hotel (signed 64-bit integer as NSNumber). -///
-///     NSDictionary *params = @{
-///       kFIRParameterNumberOfNights : @(3),
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterNumberOfNights = @"number_of_nights"; - -/// Number of passengers traveling (signed 64-bit integer as NSNumber). -///
-///     NSDictionary *params = @{
-///       kFIRParameterNumberOfPassengers : @(11),
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterNumberOfPassengers = @"number_of_passengers"; - -/// Number of rooms for travel events (signed 64-bit integer as NSNumber). -///
-///     NSDictionary *params = @{
-///       kFIRParameterNumberOfRooms : @(2),
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterNumberOfRooms = @"number_of_rooms"; - -/// Flight or Travel origin (NSString). -///
-///     NSDictionary *params = @{
-///       kFIRParameterOrigin : @"Mountain View, CA",
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterOrigin = @"origin"; - -/// Purchase price (double as NSNumber). -///
-///     NSDictionary *params = @{
-///       kFIRParameterPrice : @(1.0),
-///       kFIRParameterCurrency : @"USD",  // e.g. $1.00 USD
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterPrice = @"price"; - -/// Purchase quantity (signed 64-bit integer as NSNumber). -///
-///     NSDictionary *params = @{
-///       kFIRParameterQuantity : @(1),
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterQuantity = @"quantity"; - -/// Score in game (signed 64-bit integer as NSNumber). -///
-///     NSDictionary *params = @{
-///       kFIRParameterScore : @(4200),
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterScore = @"score"; - -/// The search string/keywords used (NSString). -///
-///     NSDictionary *params = @{
-///       kFIRParameterSearchTerm : @"periodic table",
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterSearchTerm = @"search_term"; - -/// Shipping cost (double as NSNumber). -///
-///     NSDictionary *params = @{
-///       kFIRParameterShipping : @(9.50),
-///       kFIRParameterCurrency : @"USD",  // e.g. $9.50 USD
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterShipping = @"shipping"; - -/// Sign up method (NSString). -///
-///     NSDictionary *params = @{
-///       kFIRParameterSignUpMethod : @"google",
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterSignUpMethod = @"sign_up_method"; - -/// The departure date, check-in date or rental start date for the item. This should be in -/// YYYY-MM-DD format (NSString). -///
-///     NSDictionary *params = @{
-///       kFIRParameterStartDate : @"2015-09-14",
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterStartDate = @"start_date"; - -/// Tax amount (double as NSNumber). -///
-///     NSDictionary *params = @{
-///       kFIRParameterTax : @(1.0),
-///       kFIRParameterCurrency : @"USD",  // e.g. $1.00 USD
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterTax = @"tax"; - -/// A single ID for a ecommerce group transaction (NSString). -///
-///     NSDictionary *params = @{
-///       kFIRParameterTransactionID : @"ab7236dd9823",
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterTransactionID = @"transaction_id"; - -/// Travel class (NSString). -///
-///     NSDictionary *params = @{
-///       kFIRParameterTravelClass : @"business",
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterTravelClass = @"travel_class"; - -/// A context-specific numeric value which is accumulated automatically for each event type. This is -/// a general purpose parameter that is useful for accumulating a key metric that pertains to an -/// event. Examples include revenue, distance, time and points. Value should be specified as signed -/// 64-bit integer or double as NSNumber. Notes: Currency-related values should be supplied using -/// double as NSNumber and must be accompanied by a {@link kFIRParameterCurrency} parameter. The -/// valid range of accumulated values is [-9,223,372,036,854.77, 9,223,372,036,854.77]. -///
-///     NSDictionary *params = @{
-///       kFIRParameterValue : @(3.99),
-///       kFIRParameterCurrency : @"USD",  // e.g. $3.99 USD
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterValue = @"value"; - -/// Name of virtual currency type (NSString). -///
-///     NSDictionary *params = @{
-///       kFIRParameterVirtualCurrencyName : @"virtual_currency_name",
-///       // ...
-///     };
-/// 
-static NSString *const kFIRParameterVirtualCurrencyName = @"virtual_currency_name"; diff --git a/Project 29 - Grocr/Pods/Headers/Public/FirebaseAnalytics/FirebaseAnalytics/FIRUserPropertyNames.h b/Project 29 - Grocr/Pods/Headers/Public/FirebaseAnalytics/FirebaseAnalytics/FIRUserPropertyNames.h deleted file mode 100755 index 54cf1c20..00000000 --- a/Project 29 - Grocr/Pods/Headers/Public/FirebaseAnalytics/FirebaseAnalytics/FIRUserPropertyNames.h +++ /dev/null @@ -1,13 +0,0 @@ -/// @file FIRUserPropertyNames.h -/// -/// Predefined user property names. -/// -/// A UserProperty is an attribute that describes the app-user. By supplying UserProperties, you can -/// later analyze different behaviors of various segments of your userbase. You may supply up to 25 -/// unique UserProperties per app, and you can use the name and value of your choosing for each one. -/// UserProperty names can be up to 24 characters long, may only contain alphanumeric characters and -/// underscores ("_"), and must start with an alphabetic character. UserProperty values can be up to -/// 36 characters long. The "firebase_" prefix is reserved and should not be used. - -/// The method used to sign in. For example, "google", "facebook" or "twitter". -static NSString *const kFIRUserPropertySignUpMethod = @"sign_up_method"; diff --git a/Project 29 - Grocr/Pods/Headers/Public/FirebaseAnalytics/FirebaseAnalytics/FirebaseAnalytics.h b/Project 29 - Grocr/Pods/Headers/Public/FirebaseAnalytics/FirebaseAnalytics/FirebaseAnalytics.h deleted file mode 100755 index 02667b30..00000000 --- a/Project 29 - Grocr/Pods/Headers/Public/FirebaseAnalytics/FirebaseAnalytics/FirebaseAnalytics.h +++ /dev/null @@ -1,11 +0,0 @@ -// Generated umbrella header for FirebaseAnalytics. - -#import "FIRAnalytics+AppDelegate.h" -#import "FIRAnalytics.h" -#import "FIRAnalyticsConfiguration.h" -#import "FIRApp.h" -#import "FIRConfiguration.h" -#import "FIREventNames.h" -#import "FIROptions.h" -#import "FIRParameterNames.h" -#import "FIRUserPropertyNames.h" diff --git a/Project 29 - Grocr/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FIRAuth.h b/Project 29 - Grocr/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FIRAuth.h deleted file mode 100755 index e2f90e6c..00000000 --- a/Project 29 - Grocr/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FIRAuth.h +++ /dev/null @@ -1,255 +0,0 @@ -/** @file FIRAuth.h - @brief Firebase Auth SDK - @copyright Copyright 2015 Google Inc. - @remarks Use of this SDK is subject to the Google APIs Terms of Service: - https://developers.google.com/terms/ - */ - -#import - -#import - -@class FIRApp; -@class FIRAuth; -@class FIRAuthCredential; -@class FIRUser; -@protocol FIRAuthStateListener; - -NS_ASSUME_NONNULL_BEGIN - -/** @typedef FIRAuthStateDidChangeListenerHandle - @brief The type of handle returned by @c FIRAuth.addAuthStateDidChangeListener:. - */ -typedef id FIRAuthStateDidChangeListenerHandle; - -/** @typedef FIRAuthStateDidChangeListenerBlock - @brief The type of block which can be registered as a listener for auth state did change events. - @param auth The @c FIRAuth object on which state changes occurred. - @param user Optionally; the current signed in user, if any. - */ -typedef void(^FIRAuthStateDidChangeListenerBlock)(FIRAuth *auth, FIRUser *_Nullable user); - -/** @var FIRAuthStateDidChangeNotification - @brief The name of the @c NSNotificationCenter notification which is posted when the auth state - changes (for example, a new token has been produced, a user signs in or signs out). The - object parameter of the notification is the sender @c FIRAuth instance. - */ -extern NSString *const FIRAuthStateDidChangeNotification; - -/** @typedef FIRAuthResultCallback - @brief The type of block invoked when sign-in related events complete. - @param user Optionally; the signed in user, if any. - @param error Optionally; if an error occurs, this is the NSError object that describes the - problem. Set to nil otherwise. - */ -typedef void (^FIRAuthResultCallback)(FIRUser *_Nullable user, NSError *_Nullable error); - -/** @typedef FIRProviderQueryCallback - @brief The type of block invoked when a list of identity providers for a given email address is - requested. - @param providers Optionally; a list of provider identifiers, if any. - @see FIRGoogleAuthProviderID etc. - @param error Optionally; if an error occurs, this is the NSError object that describes the - problem. Set to nil otherwise. - */ -typedef void (^FIRProviderQueryCallback)(NSArray *_Nullable providers, - NSError *_Nullable error); - -/** @typedef FIRSendPasswordResetCallback - @brief The type of block invoked when initiating a password reset. - @param error Optionally; if an error occurs, this is the NSError object that describes the - problem. Set to nil otherwise. - */ -typedef void (^FIRSendPasswordResetCallback)(NSError *_Nullable error); - -/** @class FIRAuth - @brief Manages authentication for Firebase apps. - @remarks This class is thread-safe. - */ -@interface FIRAuth : NSObject - -/** @fn auth - @brief Gets the auth object for the default Firebase app. - @remarks Thread safe. - */ -+ (nullable FIRAuth *)auth NS_SWIFT_NAME(auth()); - -/** @fn authWithApp: - @brief Gets the auth object for a @c FIRApp. - @param app The @c FIRApp for which to retrieve the associated @c FIRAuth instance. - @return The @c FIRAuth instance associated with the given @c FIRApp. - */ -+ (nullable FIRAuth *)authWithApp:(FIRApp *)app; - -/** @property app - @brief Gets the @c FIRApp object that this auth object is connected to. - */ -@property(nonatomic, weak, readonly, nullable) FIRApp *app; - -/** @property currentUser - @brief Synchronously gets the cached current user, or null if there is none. - */ -@property(nonatomic, strong, readonly, nullable) FIRUser *currentUser; - -/** @fn init - @brief Please access auth instances using @c FIRAuth.auth and @c FIRAuth.authForApp:. - */ -- (nullable instancetype)init NS_UNAVAILABLE; - -/** @fn fetchProvidersForEmail:completion: - @brief Fetches the list of IdPs that can be used for signing in with the provided email address. - Useful for an "identifier-first" sign-in flow. - @param email The email address for which to obtain a list of identity providers. - @param completion Optionally; a block which is invoked when the list of providers for the - specified email address is ready or an error was encountered. Invoked asynchronously on the - main thread in the future. - @remarks Possible error codes: - - @c FIRAuthErrorCodeInvalidEmail - Indicates the email address is malformed. - - See @c FIRAuthErrors for a list of error codes that are common to all API methods. - */ -- (void)fetchProvidersForEmail:(NSString *)email - completion:(nullable FIRProviderQueryCallback)completion; - -/** @fn signInWithEmail:password:completion: - @brief Signs in using an email address and password. - @param email The user's email address. - @param password The user's password. - @param completion Optionally; a block which is invoked when the sign in flow finishes, or is - canceled. Invoked asynchronously on the main thread in the future. - @remarks Possible error codes: - - @c FIRAuthErrorCodeOperationNotAllowed Indicates that email and password accounts are not - enabled. Enable them in the Auth section of the Firebase console. - - @c FIRAuthErrorCodeUserDisabled Indicates the user's account is disabled. - - @c FIRAuthErrorCodeWrongPassword Indicates the user attempted sign in with an incorrect - password. - - See @c FIRAuthErrors for a list of error codes that are common to all API methods. - */ -- (void)signInWithEmail:(NSString *)email - password:(NSString *)password - completion:(nullable FIRAuthResultCallback)completion; - -/** @fn signInWithCredential:completion: - @brief Asynchronously signs in to Firebase with the given 3rd-party credentials (e.g. a Facebook - login Access Token, a Google ID Token/Access Token pair, etc.) - @param credential The credential supplied by the IdP. - @param completion Optionally; a block which is invoked when the sign in flow finishes, or is - canceled. Invoked asynchronously on the main thread in the future. - @remarks Possible error codes: - - @c FIRAuthErrorCodeInvalidCredential Indicates the supplied credential is invalid. This - could happen if it has expired or it is malformed. - - @c FIRAuthErrorCodeOperationNotAllowed Indicates that accounts with the identity provider - represented by the credential are not enabled. Enable them in the Auth section of the - Firebase console. - - @c FIRAuthErrorCodeEmailAlreadyInUse Indicates the email asserted by the credential - (e.g. the email in a Facebook access token) is already in use by an existing account, - that cannot be authenticated with this sign-in method. Call fetchProvidersForEmail for - this user’s email and then prompt them to sign in with any of the sign-in providers - returned. This error will only be thrown if the “One account per email address” - setting is enabled in the Firebase console, under Auth settings. - Please note that the - error code raised in this specific situation may not be the same on Web and Android. - - @c FIRAuthErrorCodeUserDisabled Indicates the user's account is disabled. - - @c FIRAuthErrorCodeWrongPassword Indicates the user attempted sign in with a incorrect - password, if credential is of the type EmailPasswordAuthCredential. - - See @c FIRAuthErrors for a list of error codes that are common to all API methods. - */ -- (void)signInWithCredential:(FIRAuthCredential *)credential - completion:(nullable FIRAuthResultCallback)completion; - -/** @fn signInAnonymouslyWithCompletion: - @brief Asynchronously creates and becomes an anonymous user. - @param completion Optionally; a block which is invoked when the sign in finishes, or is - canceled. Invoked asynchronously on the main thread in the future. - @remarks If there is already an anonymous user signed in, that user will be returned instead. - If there is any other existing user signed in, that user will be signed out. - @remarks Possible error codes: - - @c FIRAuthErrorCodeOperationNotAllowed Indicates that anonymous accounts are not enabled. - Enable them in the Auth section of the Firebase console. - - See @c FIRAuthErrors for a list of error codes that are common to all API methods. - */ -- (void)signInAnonymouslyWithCompletion:(nullable FIRAuthResultCallback)completion; - -/** @fn signInWithCustomToken:completion: - @brief Asynchronously signs in to Firebase with the given Auth token. - @param token A self-signed custom auth token. - @param completion Optionally; a block which is invoked when the sign in finishes, or is - canceled. Invoked asynchronously on the main thread in the future. - @remarks Possible error codes: - - @c FIRAuthErrorCodeInvalidCustomToken Indicates a validation error with the custom token. - - @c FIRAuthErrorCodeCustomTokenMismatch Indicates the service account and the API key - belong to different projects. - - See @c FIRAuthErrors for a list of error codes that are common to all API methods. - */ -- (void)signInWithCustomToken:(NSString *)token - completion:(nullable FIRAuthResultCallback)completion; - -/** @fn createUserWithEmail:password:completion: - @brief Creates and, on success, signs in a user with the given email address and password. - @param email The user's email address. - @param password The user's desired password. - @param completion Optionally; a block which is invoked when the sign up flow finishes, or is - canceled. Invoked asynchronously on the main thread in the future. - @remarks Possible error codes: - - @c FIRAuthErrorCodeInvalidEmail - Indicates the email address is malformed. - - @c FIRAuthErrorCodeEmailAlreadyInUse Indicates the email used to attempt sign up - already exists. Call fetchProvidersForEmail to check which sign-in mechanisms the user - used, and prompt the user to sign in with one of those. - - @c FIRAuthErrorCodeOperationNotAllowed Indicates that email and password accounts are not - enabled. Enable them in the Auth section of the Firebase console. - - @c FIRAuthErrorCodeWeakPassword Indicates an attempt to set a password that is considered - too weak. The NSLocalizedFailureReasonErrorKey field in the NSError.userInfo dictionary - object will contain more detailed explanation that can be shown to the user. - - See @c FIRAuthErrors for a list of error codes that are common to all API methods. - */ -- (void)createUserWithEmail:(NSString *)email - password:(NSString *)password - completion:(nullable FIRAuthResultCallback)completion; - -/** @fn sendPasswordResetWithEmail:completion: - @brief Initiates a password reset for the given email address. - @param email The email address of the user. - @param completion Optionally; a block which is invoked when the request finishes. Invoked - asynchronously on the main thread in the future. - @remarks Possible error codes: - - See @c FIRAuthErrors for a list of error codes that are common to all API methods. - */ -- (void)sendPasswordResetWithEmail:(NSString *)email - completion:(nullable FIRSendPasswordResetCallback)completion; - -/** @fn signOut: - @brief Signs out the current user. - @param error Optionally; if an error occurs, upon return contains an NSError object that - describes the problem; is nil otherwise. - @return @YES when the sign out request was successful. @NO otherwise. - @remarks Possible error codes: - - @c FIRAuthErrorCodeKeychainError Indicated an error occurred when accessing the keychain. - The @c NSLocalizedFailureReasonErrorKey field in the @c NSError.userInfo dictionary - will contain more information about the error encountered. - */ -- (BOOL)signOut:(NSError *_Nullable *_Nullable)error; - -/** @fn addAuthStateDidChangeListener: - @brief Registers a block as an "auth state did change" listener. To be invoked when: - - The block is registered as a listener, - - The current user changes, or, - - The current user's access token changes. - @param listener The block to be invoked. The block is always invoked asynchronously on the main - thread, even for it's initial invocation after having been added as a listener. - @remarks The block is invoked immediately after adding it according to it's standard invocation - semantics, asynchronously on the main thread. Users should pay special attention to - making sure the block does not inadvertently retain objects which should not be retained by - the long-lived block. The block itself will be retained by @c FIRAuth until it is - unregistered or until the @c FIRAuth instance is otherwise deallocated. - @return A handle useful for manually unregistering the block as a listener. - */ -- (FIRAuthStateDidChangeListenerHandle)addAuthStateDidChangeListener: - (FIRAuthStateDidChangeListenerBlock)listener; - -/** @fn removeAuthStateDidChangeListener: - @brief Unregisters a block as an "auth state did change" listener. - @param listenerHandle The handle for the listener. - */ -- (void)removeAuthStateDidChangeListener:(FIRAuthStateDidChangeListenerHandle)listenerHandle; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Project 29 - Grocr/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FIRAuthCredential.h b/Project 29 - Grocr/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FIRAuthCredential.h deleted file mode 100755 index 24959d5e..00000000 --- a/Project 29 - Grocr/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FIRAuthCredential.h +++ /dev/null @@ -1,31 +0,0 @@ -/** @file FIRAuthCredential.h - @brief Firebase Auth SDK - @copyright Copyright 2015 Google Inc. - @remarks Use of this SDK is subject to the Google APIs Terms of Service: - https://developers.google.com/terms/ - */ - -#import - -NS_ASSUME_NONNULL_BEGIN - -/** @class FIRAuthCredential - @brief Represents a credential. - */ -@interface FIRAuthCredential : NSObject - -/** @property provider - @brief Gets the name of the identity provider for the credential. - */ -@property(nonatomic, copy, readonly) NSString *provider; - -/** @fn init - @brief This is an abstract base class. Concrete instances should be created via factory - methods available in the various authentication provider libraries (like the Facebook - provider or the Google provider libraries.) - */ -- (nullable instancetype)init NS_UNAVAILABLE; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Project 29 - Grocr/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FIRAuthErrors.h b/Project 29 - Grocr/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FIRAuthErrors.h deleted file mode 100755 index 9b32328c..00000000 --- a/Project 29 - Grocr/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FIRAuthErrors.h +++ /dev/null @@ -1,166 +0,0 @@ -/** @file FIRAuthErrors.h - @brief Firebase Auth SDK - @copyright Copyright 2015 Google Inc. - @remarks Use of this SDK is subject to the Google APIs Terms of Service: - https://developers.google.com/terms/ - */ - -#import - -/** @class FIRAuthErrors - @remarks Error Codes common to all API Methods: - - FIRAuthErrorCodeNetworkError - Indicates a network error occurred during the operation. - - FIRAuthErrorCodeUserNotFound - Indicates the user account was not found. This could happen - if the user account has been deleted. - - FIRAuthErrorCodeUserTokenExpired - Indicates the current user’s token has expired, for - example, the user may have changed account password on another device. You must prompt - the user to sign in again on this device. - - FIRAuthErrorCodeTooManyRequests - Indicates that the request has been blocked after an - abnormal number of requests have been made from the caller device to the Firebase Auth - servers. Retry again after some time. - - FIRAuthErrorCodeInvalidAPIKey - Indicates the application has been configured with an - invalid API key. - - FIRAuthErrorCodeAppNotAuthorized - Indicates the App is not authorized to use Firebase - Authentication with the provided API Key. Go to the Google API Console and check under - the credentials tab that the API key you are using has your application’s bundle ID - whitelisted. - - FIRAuthErrorCodeKeychainError - Indicates an error occurred while accessing the keychain. - The NSLocalizedFailureReasonErrorKey and NSUnderlyingErrorKey fields in the - NSError.userInfo dictionary will contain more information about the error encountered. - - FIRAuthErrorCodeInternalError - Indicates an internal error occurred. Please report the - error back to us with the entire NSError object. - @remarks Common error codes for FIRUser operations: - - FIRAuthErrorCodeInvalidUserToken - Indicates that the signed-in user's refresh token, - that holds session information, is invalid. You must prompt the user to sign in again - on this device. - - FIRAuthErrorCodeUserDisabled - Indicates the user's account is disabled and can no longer - be used until enabled again from within the Users panel in the Firebase console. - */ -@interface FIRAuthErrors - -/** @var FIRAuthErrorDomain - @brief The Firebase Auth error domain. - */ -extern NSString *const FIRAuthErrorDomain; - -/** @var FIRAuthErrorNameKey - @brief The name of the key for the "error_name" string in the NSError userinfo dictionary. - */ -extern NSString *const FIRAuthErrorNameKey; - -/** @enum FIRAuthErrorCode - @brief Error codes used by Firebase Auth. - */ -typedef NS_ENUM(NSInteger, FIRAuthErrorCode) { - /** Indicates a validation error with the custom token. - */ - FIRAuthErrorCodeInvalidCustomToken = 17000, - - /** Indicates the service account and the API key belong to different projects. - */ - FIRAuthErrorCodeCustomTokenMismatch = 17002, - - /** Indicates the IDP token or requestUri is invalid. - */ - FIRAuthErrorCodeInvalidCredential = 17004, - - /** Indicates the user's account is disabled on the server. - */ - FIRAuthErrorCodeUserDisabled = 17005, - - /** Indicates the administrator disabled sign in with the specified identity provider. - */ - FIRAuthErrorCodeOperationNotAllowed = 17006, - - /** Indicates the email used to attempt a sign up is already in use. - */ - FIRAuthErrorCodeEmailAlreadyInUse = 17007, - - /** Indicates the email is invalid. - */ - FIRAuthErrorCodeInvalidEmail = 17008, - - /** Indicates the user attempted sign in with a wrong password. - */ - FIRAuthErrorCodeWrongPassword = 17009, - - /** Indicates that too many requests were made to a server method. - */ - FIRAuthErrorCodeTooManyRequests = 17010, - - /** Indicates the user account was not found. - */ - FIRAuthErrorCodeUserNotFound = 17011, - - /** Indicates account linking is required. - */ - FIRAuthErrorCodeAccountExistsWithDifferentCredential = 17012, - - /** Same enum as @c FIRAuthErrorCodeAccountExistsWithDifferentCredential , - but with incorrect spelling. Only exists for backwards compatiblity. - */ - FIRAuthErrrorCodeAccountExistsWithDifferentCredential = 17012, - - /** Indicates the user has attemped to change email or password more than 5 minutes after - signing in. - */ - FIRAuthErrorCodeRequiresRecentLogin = 17014, - - /** Indicates an attempt to link a provider to which the account is already linked. - */ - FIRAuthErrorCodeProviderAlreadyLinked = 17015, - - /** Indicates an attempt to unlink a provider that is not linked. - */ - FIRAuthErrorCodeNoSuchProvider = 17016, - - /** Indicates user's saved auth credential is invalid, the user needs to sign in again. - */ - FIRAuthErrorCodeInvalidUserToken = 17017, - - /** Indicates a network error occurred (such as a timeout, interrupted connection, or - unreachable host). These types of errors are often recoverable with a retry. The @c - NSUnderlyingError field in the @c NSError.userInfo dictionary will contain the error - encountered. - */ - FIRAuthErrorCodeNetworkError = 17020, - - /** Indicates the saved token has expired, for example, the user may have changed account - password on another device. The user needs to sign in again on the device that made this - request. - */ - FIRAuthErrorCodeUserTokenExpired = 17021, - - /** Indicates an invalid API key was supplied in the request. - */ - FIRAuthErrorCodeInvalidAPIKey = 17023, - - /** Indicates that an attempt was made to reauthenticate with a user which is not the current - user. - */ - FIRAuthErrorCodeUserMismatch = 17024, - - /** Indicates an attempt to link with a credential that has already been linked with a - different Firebase account - */ - FIRAuthErrorCodeCredentialAlreadyInUse = 17025, - - /** Indicates an attempt to set a password that is considered too weak. - */ - FIRAuthErrorCodeWeakPassword = 17026, - - /** Indicates the App is not authorized to use Firebase Authentication with the - provided API Key. - */ - FIRAuthErrorCodeAppNotAuthorized = 17028, - - /** Indicates an error occurred while attempting to access the keychain. - */ - FIRAuthErrorCodeKeychainError = 17995, - - /** Indicates an internal error occurred. - */ - FIRAuthErrorCodeInternalError = 17999, -}; - -@end diff --git a/Project 29 - Grocr/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FIREmailPasswordAuthProvider.h b/Project 29 - Grocr/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FIREmailPasswordAuthProvider.h deleted file mode 100755 index a1444b9d..00000000 --- a/Project 29 - Grocr/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FIREmailPasswordAuthProvider.h +++ /dev/null @@ -1,39 +0,0 @@ -/** @file FIREmailPasswordAuthProvider.h - @brief Firebase Auth SDK - @copyright Copyright 2016 Google Inc. - @remarks Use of this SDK is subject to the Google APIs Terms of Service: - https://developers.google.com/terms/ - */ - -#import - -@class FIRAuthCredential; - -NS_ASSUME_NONNULL_BEGIN - -/** @var FIREmailPasswordAuthProviderID - @brief A string constant identifying the email & password identity provider. - */ -extern NSString *const FIREmailPasswordAuthProviderID; - -/** @class FIREmailPasswordAuthProvider - @brief A concrete implementation of @c FIRAuthProvider for Email & Password Sign In. - */ -@interface FIREmailPasswordAuthProvider : NSObject - -/** @fn credentialWithEmail:password: - @brief Creates an @c FIRAuthCredential for an email & password sign in. - @param email The user's email address. - @param password The user's password. - @return A @c FIRAuthCredential containing the email & password credential. - */ -+ (FIRAuthCredential *)credentialWithEmail:(NSString *)email password:(NSString *)password; - -/** @fn init - @brief This class is not meant to be initialized. - */ -- (nullable instancetype)init NS_UNAVAILABLE; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Project 29 - Grocr/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FIRFacebookAuthProvider.h b/Project 29 - Grocr/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FIRFacebookAuthProvider.h deleted file mode 100755 index 3b5d28f8..00000000 --- a/Project 29 - Grocr/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FIRFacebookAuthProvider.h +++ /dev/null @@ -1,38 +0,0 @@ -/** @file FIRFacebookAuthProvider.h - @brief Firebase Auth SDK - @copyright Copyright 2016 Google Inc. - @remarks Use of this SDK is subject to the Google APIs Terms of Service: - https://developers.google.com/terms/ - */ - -#import - -@class FIRAuthCredential; - -NS_ASSUME_NONNULL_BEGIN - -/** @var FIRFacebookAuthProviderID - @brief A string constant identifying the Facebook identity provider. - */ -extern NSString *const FIRFacebookAuthProviderID; - -/** @class FIRFacebookAuthProvider - @brief Utility class for constructing Facebook credentials. - */ -@interface FIRFacebookAuthProvider : NSObject - -/** @fn credentialWithAccessToken: - @brief Creates an @c FIRAuthCredential for a Facebook sign in. - @param accessToken The Access Token from Facebook. - @return A @c FIRAuthCredential containing the Facebook credentials. - */ -+ (FIRAuthCredential *)credentialWithAccessToken:(NSString *)accessToken; - -/** @fn init - @brief This class should not be initialized. - */ -- (nullable instancetype)init NS_UNAVAILABLE; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Project 29 - Grocr/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FIRGitHubAuthProvider.h b/Project 29 - Grocr/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FIRGitHubAuthProvider.h deleted file mode 100755 index ce139e3a..00000000 --- a/Project 29 - Grocr/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FIRGitHubAuthProvider.h +++ /dev/null @@ -1,38 +0,0 @@ -/** @file FIRGitHubAuthProvider.h - @brief Firebase Auth SDK - @copyright Copyright 2016 Google Inc. - @remarks Use of this SDK is subject to the Google APIs Terms of Service: - https://developers.google.com/terms/ - */ - -#import - -@class FIRAuthCredential; - -NS_ASSUME_NONNULL_BEGIN - -/** @var FIRGitHubAuthProviderID - @brief A string constant identifying the GitHub identity provider. - */ -extern NSString *const FIRGitHubAuthProviderID; - -/** @class FIRGitHubAuthProvider - @brief Utility class for constructing GitHub credentials. - */ -@interface FIRGitHubAuthProvider : NSObject - -/** @fn credentialWithToken: - @brief Creates an @c FIRAuthCredential for a GitHub sign in. - @param token The GitHub OAuth access token. - @return A @c FIRAuthCredential containing the GitHub credential. - */ -+ (FIRAuthCredential *)credentialWithToken:(NSString *)token; - -/** @fn init - @brief This class is not meant to be initialized. - */ -- (nullable instancetype)init NS_UNAVAILABLE; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Project 29 - Grocr/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FIRGoogleAuthProvider.h b/Project 29 - Grocr/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FIRGoogleAuthProvider.h deleted file mode 100755 index 40b413c2..00000000 --- a/Project 29 - Grocr/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FIRGoogleAuthProvider.h +++ /dev/null @@ -1,40 +0,0 @@ -/** @file FIRGoogleAuthProvider.h - @brief Firebase Auth SDK - @copyright Copyright 2016 Google Inc. - @remarks Use of this SDK is subject to the Google APIs Terms of Service: - https://developers.google.com/terms/ - */ - -#import - -@class FIRAuthCredential; - -NS_ASSUME_NONNULL_BEGIN - -/** @var FIRGoogleAuthProviderID - @brief A string constant identifying the Google identity provider. - */ -extern NSString *const FIRGoogleAuthProviderID; - -/** @class FIRGoogleAuthProvider - @brief Utility class for constructing Google Sign In credentials. - */ -@interface FIRGoogleAuthProvider : NSObject - -/** @fn credentialWithIDToken:accessToken: - @brief Creates an @c FIRAuthCredential for a Google sign in. - @param IDToken The ID Token from Google. - @param accessToken The Access Token from Google. - @return A @c FIRAuthCredential containing the Google credentials. - */ -+ (FIRAuthCredential *)credentialWithIDToken:(NSString *)IDToken - accessToken:(NSString *)accessToken; - -/** @fn init - @brief This class should not be initialized. - */ -- (nullable instancetype)init NS_UNAVAILABLE; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Project 29 - Grocr/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FIRTwitterAuthProvider.h b/Project 29 - Grocr/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FIRTwitterAuthProvider.h deleted file mode 100755 index e3339190..00000000 --- a/Project 29 - Grocr/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FIRTwitterAuthProvider.h +++ /dev/null @@ -1,39 +0,0 @@ -/** @file FIRTwitterAuthProvider.h - @brief Firebase Auth SDK - @copyright Copyright 2016 Google Inc. - @remarks Use of this SDK is subject to the Google APIs Terms of Service: - https://developers.google.com/terms/ - */ - -#import - -@class FIRAuthCredential; - -NS_ASSUME_NONNULL_BEGIN - -/** @var FIRTwitterAuthProviderID - @brief A string constant identifying the Twitter identity provider. - */ -extern NSString *const FIRTwitterAuthProviderID; - -/** @class FIRTwitterAuthProvider - @brief Utility class for constructing Twitter credentials. - */ -@interface FIRTwitterAuthProvider : NSObject - -/** @fn credentialWithToken:secret: - @brief Creates an @c FIRAuthCredential for a Twitter sign in. - @param token The Twitter OAuth token. - @param secret The Twitter OAuth secret. - @return A @c FIRAuthCredential containing the Twitter credential. - */ -+ (FIRAuthCredential *)credentialWithToken:(NSString *)token secret:(NSString *)secret; - -/** @fn init - @brief This class is not meant to be initialized. - */ -- (nullable instancetype)init NS_UNAVAILABLE; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Project 29 - Grocr/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FIRUser.h b/Project 29 - Grocr/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FIRUser.h deleted file mode 100755 index 0f5591ff..00000000 --- a/Project 29 - Grocr/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FIRUser.h +++ /dev/null @@ -1,289 +0,0 @@ -/** @file FIRUser.h - @brief Firebase Auth SDK - @copyright Copyright 2015 Google Inc. - @remarks Use of this SDK is subject to the Google APIs Terms of Service: - https://developers.google.com/terms/ - */ - -#import - -#import -#import - -@class FIRUserProfileChangeRequest; - -NS_ASSUME_NONNULL_BEGIN - -/** @typedef FIRAuthTokenCallback - @brief The type of block called when a token is ready for use. - @see FIRUser.getTokenWithCompletion: - @see FIRUser.getTokenForcingRefresh:withCompletion: - @param token Optionally; an access token if the request was successful. - @param error Optionally; the error which occurred - or nil if the request was successful. - @remarks One of: @c token or @c error will always be non-nil. - */ -typedef void (^FIRAuthTokenCallback)(NSString *_Nullable token, NSError *_Nullable error); - -/** @typedef FIRUserProfileChangeCallback - @brief The type of block called when a user profile change has finished. - @param error Optionally; the error which occurred - or nil if the request was successful. - */ -typedef void (^FIRUserProfileChangeCallback)(NSError *_Nullable error); - -/** @typedef FIRSendEmailVerificationCallback - @brief The type of block called when a request to send an email verification has finished. - @param error Optionally; the error which occurred - or nil if the request was successful. - */ -typedef void (^FIRSendEmailVerificationCallback)(NSError *_Nullable error); - -/** @class FIRUser - @brief Represents a user. - @remarks This class is thread-safe. - */ -@interface FIRUser : NSObject - -/** @property anonymous - @brief Indicates the user represents an anonymous user. - */ -@property(nonatomic, readonly, getter=isAnonymous) BOOL anonymous; - -/** @property emailVerified - @brief Indicates the email address associated with this user has been verified. - */ -@property(nonatomic, readonly, getter=isEmailVerified) BOOL emailVerified; - -/** @property refreshToken - @brief A refresh token; useful for obtaining new access tokens independently. - @remarks This property should only be used for advanced scenarios, and is not typically needed. - */ -@property(nonatomic, readonly, nullable) NSString *refreshToken; - -/** @property providerData - @brief Profile data for each identity provider, if any. - @remarks This data is cached on sign-in and updated when linking or unlinking. - */ -@property(nonatomic, readonly, nonnull) NSArray> *providerData; - -/** @fn init - @brief This class should not be instantiated. - @remarks To retrieve the current user, use @c FIRAuth.currentUser. To sign a user - in or out, use the methods on @c FIRAuth. - */ -- (nullable instancetype)init NS_UNAVAILABLE; - -/** @fn updateEmail:completion: - @brief Updates the email address for the user. On success, the cached user profile data is - updated. - @remarks May fail if there is already an account with this email address that was created using - email and password authentication. - @param email The email address for the user. - @param completion Optionally; the block invoked when the user profile change has finished. - Invoked asynchronously on the main thread in the future. - @remarks Possible error codes: - - @c FIRAuthErrorCodeEmailAlreadyInUse - Indicates the email is already in use by another - account. - - @c FIRAuthErrorCodeInvalidEmail - Indicates the email address is malformed. - - @c FIRAuthErrorCodeRequiresRecentLogin - Updating a user’s email is a security sensitive - operation that requires a recent login from the user. This error indicates the user has - not signed in recently enough. To resolve, reauthenticate the user by invoking - reauthenticateWithCredential:completion: on FIRUser. - - See @c FIRAuthErrors for a list of error codes that are common to all FIRUser operations. - */ -- (void)updateEmail:(NSString *)email completion:(nullable FIRUserProfileChangeCallback)completion; - -/** @fn updatePassword:completion: - @brief Updates the password for the user. On success, the cached user profile data is updated. - @param password The new password for the user. - @param completion Optionally; the block invoked when the user profile change has finished. - Invoked asynchronously on the main thread in the future. - @remarks Possible error codes: - - @c FIRAuthErrorCodeOperationNotAllowed - Indicates the administrator disabled sign in with - the specified identity provider. - - @c FIRAuthErrorCodeRequiresRecentLogin - Updating a user’s password is a security - sensitive operation that requires a recent login from the user. This error indicates the - user has not signed in recently enough. To resolve, reauthenticate the user by invoking - reauthenticateWithCredential:completion: on FIRUser. - - @c FIRAuthErrorCodeWeakPassword - Indicates an attempt to set a password that is - considered too weak. The NSLocalizedFailureReasonErrorKey field in the NSError.userInfo - dictionary object will contain more detailed explanation that can be shown to the user. - - See @c FIRAuthErrors for a list of error codes that are common to all FIRUser operations. - */ -- (void)updatePassword:(NSString *)password - completion:(nullable FIRUserProfileChangeCallback)completion; - -/** @fn profileChangeRequest - @brief Creates an object which may be used to change the user's profile data. - @remarks Set the properties of the returned object, then call - @c FIRUserProfileChangeRequest.commitChangesWithCallback: to perform the updates atomically. - @return An object which may be used to change the user's profile data atomically. - */ -- (FIRUserProfileChangeRequest *)profileChangeRequest; - -/** @fn reloadWithCompletion: - @brief Reloads the user's profile data from the server. - @param completion Optionally; the block invoked when the reload has finished. Invoked - asynchronously on the main thread in the future. - @remarks May fail with a @c FIRAuthErrorCodeCredentialTooOld error code. In this case you should - call @c FIRUser.reauthenticateWithCredential:completion: before re-invoking - @c FIRUser.updateEmail:completion:. - @remarks Possible error codes: - - See @c FIRAuthErrors for a list of error codes that are common to all API methods. - */ -- (void)reloadWithCompletion:(nullable FIRUserProfileChangeCallback)completion; - -/** @fn reauthenticateWithCredential:completion: - @brief Renews the user's authentication tokens by validating a fresh set of credentials supplied - by the user. - @param credential A user-supplied credential, which will be validated by the server. This can be - a successful third-party identity provider sign-in, or an email address and password. - @param completion Optionally; the block invoked when the re-authentication operation has - finished. Invoked asynchronously on the main thread in the future. - @remarks If the user associated with the supplied credential is different from the current user, - or if the validation of the supplied credentials fails; an error is returned and the current - user remains signed in. - @remarks Possible error codes: - - @c FIRAuthErrorCodeInvalidCredential Indicates the supplied credential is invalid. This - could happen if it has expired or it is malformed. - - @c FIRAuthErrorCodeOperationNotAllowed Indicates that accounts with the identity provider - represented by the credential are not enabled. Enable them in the Auth section of the - Firebase console. - - @c FIRAuthErrorCodeEmailAlreadyInUse Indicates the email asserted by the credential - (e.g. the email in a Facebook access token) is already in use by an existing account, - that cannot be authenticated with this method. Call fetchProvidersForEmail for - this user’s email and then prompt them to sign in with any of the sign-in providers - returned. This error will only be thrown if the “One account per email address” - setting is enabled in the Firebase console, under Auth settings. - Please note that the - error code raised in this specific situation may not be the same on Web and Android. - - @c FIRAuthErrorCodeUserDisabled Indicates the user's account is disabled. - - @c FIRAuthErrorCodeWrongPassword Indicates the user attempted reauthentication with an - incorrect password, if credential is of the type EmailPasswordAuthCredential. - - @c FIRAuthErrorCodeUserMismatch Indicates that an attempt was made to reauthenticate with - a user which is not the current user. - - See @c FIRAuthErrors for a list of error codes that are common to all API methods. - */ -- (void)reauthenticateWithCredential:(FIRAuthCredential *)credential - completion:(nullable FIRUserProfileChangeCallback)completion; - -/** @fn getTokenWithCompletion: - @brief Retrieves the Firebase authentication token, possibly refreshing it if it has expired. - @param completion Optionally; the block invoked when the token is available. Invoked - asynchronously on the main thread in the future. - @remarks Possible error codes: - - See @c FIRAuthErrors for a list of error codes that are common to all API methods. - */ -- (void)getTokenWithCompletion:(nullable FIRAuthTokenCallback)completion; - -/** @fn getTokenForcingRefresh:completion: - @brief Retrieves the Firebase authentication token, possibly refreshing it if it has expired. - @param forceRefresh Forces a token refresh. Useful if the token becomes invalid for some reason - other than an expiration. - @param completion Optionally; the block invoked when the token is available. Invoked - asynchronously on the main thread in the future. - @remarks The authentication token will be refreshed (by making a network request) if it has - expired, or if @c forceRefresh is YES. - @remarks Possible error codes: - - See @c FIRAuthErrors for a list of error codes that are common to all API methods. - */ -- (void)getTokenForcingRefresh:(BOOL)forceRefresh - completion:(nullable FIRAuthTokenCallback)completion; - -/** @fn linkWithCredential:completion: - @brief Associates a user account from a third-party identity provider with this user. - @param credential The credential for the identity provider. - @param completion Optionally; the block invoked when the unlinking is complete, or fails. - Invoked asynchronously on the main thread in the future. - @remarks Possible error codes: - - @c FIRAuthErrorCodeProviderAlreadyLinked - Indicates an attempt to link a provider of a - type already linked to this account. - - @c FIRAuthErrorCodeCredentialAlreadyInUse - Indicates an attempt to link with a credential - that has already been linked with a different Firebase account. - - @c FIRAuthErrorCodeOperationNotAllowed - Indicates that accounts with the identity - provider represented by the credential are not enabled. Enable them in the Auth section - of the Firebase console. - - This method may also return error codes associated with updateEmail:completion: and - updatePassword:completion: on FIRUser. - - See @c FIRAuthErrors for a list of error codes that are common to all FIRUser operations. - */ -- (void)linkWithCredential:(FIRAuthCredential *)credential - completion:(nullable FIRAuthResultCallback)completion; - -/** @fn unlinkFromProvider:completion: - @brief Disassociates a user account from a third-party identity provider with this user. - @param provider The provider ID of the provider to unlink. - @param completion Optionally; the block invoked when the unlinking is complete, or fails. - Invoked asynchronously on the main thread in the future. - @remarks Possible error codes: - - @c FIRAuthErrorCodeNoSuchProvider - Indicates an attempt to unlink a provider that is not - linked to the account. - - @c FIRAuthErrorCodeRequiresRecentLogin - Updating email is a security sensitive operation - that requires a recent login from the user. This error indicates the user has not signed - in recently enough. To resolve, reauthenticate the user by invoking - reauthenticateWithCredential:completion: on FIRUser. - - See @c FIRAuthErrors for a list of error codes that are common to all FIRUser operations. - */ -- (void)unlinkFromProvider:(NSString *)provider - completion:(nullable FIRAuthResultCallback)completion; - -/** @fn sendEmailVerificationWithCompletion: - @brief Initiates email verification for the user. - @param completion Optionally; the block invoked when the request to send an email verification - is complete, or fails. Invoked asynchronously on the main thread in the future. - @remarks Possible error codes: - - @c FIRAuthErrorCodeUserNotFound - Indicates the user account was not found. - - See @c FIRAuthErrors for a list of error codes that are common to all FIRUser operations. - */ -- (void)sendEmailVerificationWithCompletion:(nullable FIRSendEmailVerificationCallback)completion; - -/** @fn deleteWithCompletion: - @brief Deletes the user account (also signs out the user, if this was the current user). - @param completion Optionally; the block invoked when the request to delete the account is - complete, or fails. Invoked asynchronously on the main thread in the future. - @remarks Possible error codes: - - @c FIRAuthErrorCodeRequiresRecentLogin - Updating email is a security sensitive operation - that requires a recent login from the user. This error indicates the user has not signed - in recently enough. To resolve, reauthenticate the user by invoking - reauthenticateWithCredential:completion: on FIRUser. - - See @c FIRAuthErrors for a list of error codes that are common to all FIRUser operations. - */ -- (void)deleteWithCompletion:(nullable FIRUserProfileChangeCallback)completion; - -@end - -/** @class FIRUserProfileChangeRequest - @brief Represents an object capable of updating a user's profile data. - @remarks Properties are marked as being part of a profile update when they are set. Setting a - property value to nil is not the same as leaving the property unassigned. - */ -@interface FIRUserProfileChangeRequest : NSObject - -/** @fn init - @brief Please use @c FIRUser.profileChangeRequest - */ -- (nullable instancetype)init NS_UNAVAILABLE; - -/** @property displayName - @brief The user's display name. - @remarks It is an error to set this property after calling - @c FIRUserProfileChangeRequest.commitChangesWithCallback: - */ -@property(nonatomic, copy, nullable) NSString *displayName; - -/** @property photoURL - @brief The user's photo URL. - @remarks It is an error to set this property after calling - @c FIRUserProfileChangeRequest.commitChangesWithCallback: - */ -@property(nonatomic, copy, nullable) NSURL *photoURL; - -/** @fn commitChangesWithCompletion: - @brief Commits any pending changes. - @remarks This method should only be called once. Once called, property values should not be - changed. - @param completion Optionally; the block invoked when the user profile change has been applied. - Invoked asynchronously on the main thread in the future. - */ -- (void)commitChangesWithCompletion:(nullable FIRUserProfileChangeCallback)completion; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Project 29 - Grocr/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FIRUserInfo.h b/Project 29 - Grocr/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FIRUserInfo.h deleted file mode 100755 index 633fb878..00000000 --- a/Project 29 - Grocr/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FIRUserInfo.h +++ /dev/null @@ -1,44 +0,0 @@ -/** @file FIRUserInfo.h - @brief Firebase Auth SDK - @copyright Copyright 2015 Google Inc. - @remarks Use of this SDK is subject to the Google APIs Terms of Service: - https://developers.google.com/terms/ - */ - -#import - -NS_ASSUME_NONNULL_BEGIN - -/** @protocol FIRUserInfo - @brief Represents user data returned from an identity provider. - */ -@protocol FIRUserInfo - -/** @property providerID - @brief The provider identifier. - */ -@property(nonatomic, copy, readonly) NSString *providerID; - -/** @property uid - @brief The provider's user ID for the user. - */ -@property(nonatomic, copy, readonly) NSString *uid; - -/** @property displayName - @brief The name of the user. - */ -@property(nonatomic, copy, readonly, nullable) NSString *displayName; - -/** @property photoURL - @brief The URL of the user's profile photo. - */ -@property(nonatomic, copy, readonly, nullable) NSURL *photoURL; - -/** @property email - @brief The user's email address. - */ -@property(nonatomic, copy, readonly, nullable) NSString *email; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Project 29 - Grocr/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FirebaseAuth.h b/Project 29 - Grocr/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FirebaseAuth.h deleted file mode 100755 index 0e7e80af..00000000 --- a/Project 29 - Grocr/Pods/Headers/Public/FirebaseAuth/FirebaseAuth/FirebaseAuth.h +++ /dev/null @@ -1,27 +0,0 @@ -/** @file FirebaseAuth.h - @brief Firebase Auth SDK - @copyright Copyright 2015 Google Inc. - @remarks Use of this SDK is subject to the Google APIs Terms of Service: - https://developers.google.com/terms/ - */ - -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import - -/** @var FirebaseAuthVersionNumber - @brief Version number for FirebaseAuth. - */ -extern const double FirebaseAuthVersionNumber; - -/** @var FirebaseAuthVersionString - @brief Version string for FirebaseAuth. - */ -extern const unsigned char *const FirebaseAuthVersionString; diff --git a/Project 29 - Grocr/Pods/Headers/Public/FirebaseDatabase/FirebaseDatabase/FIRDataEventType.h b/Project 29 - Grocr/Pods/Headers/Public/FirebaseDatabase/FirebaseDatabase/FIRDataEventType.h deleted file mode 100755 index d940f9ba..00000000 --- a/Project 29 - Grocr/Pods/Headers/Public/FirebaseDatabase/FirebaseDatabase/FIRDataEventType.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Firebase iOS Client Library - * - * Copyright © 2013 Firebase - All Rights Reserved - * https://www.firebase.com - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binaryform must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY FIREBASE AS IS AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO - * EVENT SHALL FIREBASE BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef Firebase_FIRDataEventType_h -#define Firebase_FIRDataEventType_h - -/** - * This enum is the set of events that you can observe at a Firebase Database location. - */ -typedef NS_ENUM(NSInteger, FIRDataEventType) { - FIRDataEventTypeChildAdded, // 0, fired when a new child node is added to a location - FIRDataEventTypeChildRemoved, // 1, fired when a child node is removed from a location - FIRDataEventTypeChildChanged, // 2, fired when a child node at a location changes - FIRDataEventTypeChildMoved, // 3, fired when a child node moves relative to the other child nodes at a location - FIRDataEventTypeValue // 4, fired when any data changes at a location and, recursively, any children -}; - -#endif diff --git a/Project 29 - Grocr/Pods/Headers/Public/FirebaseDatabase/FirebaseDatabase/FIRDataSnapshot.h b/Project 29 - Grocr/Pods/Headers/Public/FirebaseDatabase/FirebaseDatabase/FIRDataSnapshot.h deleted file mode 100755 index 79531028..00000000 --- a/Project 29 - Grocr/Pods/Headers/Public/FirebaseDatabase/FirebaseDatabase/FIRDataSnapshot.h +++ /dev/null @@ -1,158 +0,0 @@ -/* - * Firebase iOS Client Library - * - * Copyright © 2013 Firebase - All Rights Reserved - * https://www.firebase.com - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binaryform must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY FIREBASE AS IS AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO - * EVENT SHALL FIREBASE BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#import - -NS_ASSUME_NONNULL_BEGIN - -@class FIRDatabaseReference; - -/** - * A FIRDataSnapshot contains data from a Firebase Database location. Any time you read - * Firebase data, you receive the data as a FIRDataSnapshot. - * - * FIRDataSnapshots are passed to the blocks you attach with observeEventType:withBlock: or observeSingleEvent:withBlock:. - * They are efficiently-generated immutable copies of the data at a Firebase Database location. - * They can't be modified and will never change. To modify data at a location, - * use a FIRDatabaseReference (e.g. with setValue:). - */ -@interface FIRDataSnapshot : NSObject - - -/** @name Navigating and inspecting a snapshot */ - -/** - * Gets a FIRDataSnapshot for the location at the specified relative path. - * The relative path can either be a simple child key (e.g. 'fred') - * or a deeper slash-separated path (e.g. 'fred/name/first'). If the child - * location has no data, an empty FIRDataSnapshot is returned. - * - * @param childPathString A relative path to the location of child data. - * @return The FIRDataSnapshot for the child location. - */ -- (FIRDataSnapshot *)childSnapshotForPath:(NSString *)childPathString; - - -/** - * Return YES if the specified child exists. - * - * @param childPathString A relative path to the location of a potential child. - * @return YES if data exists at the specified childPathString, else NO. - */ -- (BOOL) hasChild:(NSString *)childPathString; - - -/** - * Return YES if the DataSnapshot has any children. - * - * @return YES if this snapshot has any children, else NO. - */ -- (BOOL) hasChildren; - - -/** - * Return YES if the DataSnapshot contains a non-null value. - * - * @return YES if this snapshot contains a non-null value, else NO. - */ -- (BOOL) exists; - - -/** @name Data export */ - -/** - * Returns the raw value at this location, coupled with any metadata, such as priority. - * - * Priorities, where they exist, are accessible under the ".priority" key in instances of NSDictionary. - * For leaf locations with priorities, the value will be under the ".value" key. - */ -- (id __nullable) valueInExportFormat; - - -/** @name Properties */ - -/** - * Returns the contents of this data snapshot as native types. - * - * Data types returned: - * * NSDictionary - * * NSArray - * * NSNumber (also includes booleans) - * * NSString - * - * @return The data as a native object. - */ -@property (strong, readonly, nonatomic, nullable) id value; - - -/** - * Gets the number of children for this DataSnapshot. - * - * @return An integer indicating the number of children. - */ -@property (readonly, nonatomic) NSUInteger childrenCount; - - -/** - * Gets a FIRDatabaseReference for the location that this data came from - * - * @return A FIRDatabaseReference instance for the location of this data - */ -@property (nonatomic, readonly, strong) FIRDatabaseReference * ref; - - -/** - * The key of the location that generated this FIRDataSnapshot. - * - * @return An NSString containing the key for the location of this FIRDataSnapshot. - */ -@property (strong, readonly, nonatomic) NSString* key; - - -/** - * An iterator for snapshots of the child nodes in this snapshot. - * You can use the native for..in syntax: - * - * for (FIRDataSnapshot* child in snapshot.children) { - * ... - * } - * - * @return An NSEnumerator of the children - */ -@property (strong, readonly, nonatomic) NSEnumerator* children; - -/** - * The priority of the data in this FIRDataSnapshot. - * - * @return The priority as a string, or nil if no priority was set. - */ -@property (strong, readonly, nonatomic, nullable) id priority; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Project 29 - Grocr/Pods/Headers/Public/FirebaseDatabase/FirebaseDatabase/FIRDatabase.h b/Project 29 - Grocr/Pods/Headers/Public/FirebaseDatabase/FirebaseDatabase/FIRDatabase.h deleted file mode 100755 index fece3e68..00000000 --- a/Project 29 - Grocr/Pods/Headers/Public/FirebaseDatabase/FirebaseDatabase/FIRDatabase.h +++ /dev/null @@ -1,138 +0,0 @@ -/* - * Firebase iOS Client Library - * - * Copyright © 2013 Firebase - All Rights Reserved - * https://www.firebase.com - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binaryform must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY FIREBASE AS IS AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO - * EVENT SHALL FIREBASE BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#import -#import "FIRDatabaseReference.h" - -@class FIRApp; - -NS_ASSUME_NONNULL_BEGIN - -/** - * The entry point for accessing a Firebase Database. You can get an instance by calling - * [FIRDatabase database]. To access a location in the database and read or write data, - * use [FIRDatabase reference]. - */ -@interface FIRDatabase : NSObject - -/** - * Gets the instance of FIRDatabase for the default FIRApp. - * - * @return A FIRDatabase instance. - */ -+ (FIRDatabase *) database NS_SWIFT_NAME(database()); - -/** - * Gets an instance of FIRDatabase for a specific FIRApp. - * - * @param app The FIRApp to get a FIRDatabase for. - * @return A FIRDatabase instance. - */ -+ (FIRDatabase *) databaseForApp:(FIRApp*)app NS_SWIFT_NAME(database(app:)); - -/** The FIRApp instance to which this FIRDatabase belongs. */ -@property (weak, readonly, nonatomic) FIRApp *app; - -/** - * Gets a FIRDatabaseReference for the root of your Firebase Database. - */ -- (FIRDatabaseReference *) reference; - -/** - * Gets a FIRDatabaseReference for the provided path. - * - * @param path Path to a location in your Firebase Database. - * @return A FIRDatabaseReference pointing to the specified path. - */ -- (FIRDatabaseReference *) referenceWithPath:(NSString *)path; - -/** - * Gets a FIRDatabaseReference for the provided URL. The URL must be a URL to a path - * within this Firebase Database. To create a FIRDatabaseReference to a different database, - * create a FIRApp} with a FIROptions object configured with the appropriate database URL. - * - * @param url A URL to a path within your database. - * @return A FIRDatabaseReference for the provided URL. -*/ -- (FIRDatabaseReference *) referenceFromURL:(NSString *)databaseUrl; - -/** - * The Firebase Database client automatically queues writes and sends them to the server at the earliest opportunity, - * depending on network connectivity. In some cases (e.g. offline usage) there may be a large number of writes - * waiting to be sent. Calling this method will purge all outstanding writes so they are abandoned. - * - * All writes will be purged, including transactions and onDisconnect writes. The writes will - * be rolled back locally, perhaps triggering events for affected event listeners, and the client will not - * (re-)send them to the Firebase Database backend. - */ -- (void)purgeOutstandingWrites; - -/** - * Shuts down our connection to the Firebase Database backend until goOnline is called. - */ -- (void)goOffline; - -/** - * Resumes our connection to the Firebase Database backend after a previous goOffline call. - */ -- (void)goOnline; - -/** - * The Firebase Database client will cache synchronized data and keep track of all writes you've - * initiated while your application is running. It seamlessly handles intermittent network - * connections and re-sends write operations when the network connection is restored. - * - * However by default your write operations and cached data are only stored in-memory and will - * be lost when your app restarts. By setting this value to `YES`, the data will be persisted - * to on-device (disk) storage and will thus be available again when the app is restarted - * (even when there is no network connectivity at that time). Note that this property must be - * set before creating your first Database reference and only needs to be called once per - * application. - * - */ -@property (nonatomic) BOOL persistenceEnabled; - -/** - * Sets the dispatch queue on which all events are raised. The default queue is the main queue. - * - * Note that this must be set before creating your first Database reference. - */ -@property (nonatomic, strong) dispatch_queue_t callbackQueue; - -/** - * Enables verbose diagnostic logging. - * @param enabled YES to enable logging, NO to disable. - */ -+ (void) setLoggingEnabled:(BOOL)enabled; - -/** Retrieve the Firebase Database SDK version. */ -+ (NSString *) sdkVersion; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Project 29 - Grocr/Pods/Headers/Public/FirebaseDatabase/FirebaseDatabase/FIRDatabaseQuery.h b/Project 29 - Grocr/Pods/Headers/Public/FirebaseDatabase/FirebaseDatabase/FIRDatabaseQuery.h deleted file mode 100755 index a70aadb6..00000000 --- a/Project 29 - Grocr/Pods/Headers/Public/FirebaseDatabase/FirebaseDatabase/FIRDatabaseQuery.h +++ /dev/null @@ -1,318 +0,0 @@ -/* - * Firebase iOS Client Library - * - * Copyright © 2013 Firebase - All Rights Reserved - * https://www.firebase.com - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binaryform must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY FIREBASE AS IS AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO - * EVENT SHALL FIREBASE BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#import -#import "FIRDataEventType.h" -#import "FIRDataSnapshot.h" - -NS_ASSUME_NONNULL_BEGIN - -typedef NSUInteger FIRDatabaseHandle; - -/** - * A FIRDatabaseQuery instance represents a query over the data at a particular location. - * - * You create one by calling one of the query methods (queryOrderedByChild:, queryStartingAtValue:, etc.) - * on a FIRDatabaseReference. The query methods can be chained to further specify the data you are interested in - * observing - */ -@interface FIRDatabaseQuery : NSObject - - -/** @name Attach observers to read data */ - -/** - * observeEventType:withBlock: is used to listen for data changes at a particular location. - * This is the primary way to read data from the Firebase Database. Your block will be triggered - * for the initial data and again whenever the data changes. - * - * Use removeObserverWithHandle: to stop receiving updates. - * @param eventType The type of event to listen for. - * @param block The block that should be called with initial data and updates. It is passed the data as a FIRDataSnapshot. - * @return A handle used to unregister this block later using removeObserverWithHandle: - */ -- (FIRDatabaseHandle)observeEventType:(FIRDataEventType)eventType withBlock:(void (^)(FIRDataSnapshot *snapshot))block; - - -/** - * observeEventType:andPreviousSiblingKeyWithBlock: is used to listen for data changes at a particular location. - * This is the primary way to read data from the Firebase Database. Your block will be triggered - * for the initial data and again whenever the data changes. In addition, for FIRDataEventTypeChildAdded, FIRDataEventTypeChildMoved, and - * FIRDataEventTypeChildChanged events, your block will be passed the key of the previous node by priority order. - * - * Use removeObserverWithHandle: to stop receiving updates. - * - * @param eventType The type of event to listen for. - * @param block The block that should be called with initial data and updates. It is passed the data as a FIRDataSnapshot - * and the previous child's key. - * @return A handle used to unregister this block later using removeObserverWithHandle: - */ -- (FIRDatabaseHandle)observeEventType:(FIRDataEventType)eventType andPreviousSiblingKeyWithBlock:(void (^)(FIRDataSnapshot *snapshot, NSString *__nullable prevKey))block; - - -/** - * observeEventType:withBlock: is used to listen for data changes at a particular location. - * This is the primary way to read data from the Firebase Database. Your block will be triggered - * for the initial data and again whenever the data changes. - * - * The cancelBlock will be called if you will no longer receive new events due to no longer having permission. - * - * Use removeObserverWithHandle: to stop receiving updates. - * - * @param eventType The type of event to listen for. - * @param block The block that should be called with initial data and updates. It is passed the data as a FIRDataSnapshot. - * @param cancelBlock The block that should be called if this client no longer has permission to receive these events - * @return A handle used to unregister this block later using removeObserverWithHandle: - */ -- (FIRDatabaseHandle)observeEventType:(FIRDataEventType)eventType withBlock:(void (^)(FIRDataSnapshot *snapshot))block withCancelBlock:(nullable void (^)(NSError* error))cancelBlock; - - -/** - * observeEventType:andPreviousSiblingKeyWithBlock: is used to listen for data changes at a particular location. - * This is the primary way to read data from the Firebase Database. Your block will be triggered - * for the initial data and again whenever the data changes. In addition, for FIRDataEventTypeChildAdded, FIRDataEventTypeChildMoved, and - * FIRDataEventTypeChildChanged events, your block will be passed the key of the previous node by priority order. - * - * The cancelBlock will be called if you will no longer receive new events due to no longer having permission. - * - * Use removeObserverWithHandle: to stop receiving updates. - * - * @param eventType The type of event to listen for. - * @param block The block that should be called with initial data and updates. It is passed the data as a FIRDataSnapshot - * and the previous child's key. - * @param cancelBlock The block that should be called if this client no longer has permission to receive these events - * @return A handle used to unregister this block later using removeObserverWithHandle: - */ -- (FIRDatabaseHandle)observeEventType:(FIRDataEventType)eventType andPreviousSiblingKeyWithBlock:(void (^)(FIRDataSnapshot *snapshot, NSString *__nullable prevKey))block withCancelBlock:(nullable void (^)(NSError* error))cancelBlock; - - -/** - * This is equivalent to observeEventType:withBlock:, except the block is immediately canceled after the initial data is returned. - * - * @param eventType The type of event to listen for. - * @param block The block that should be called. It is passed the data as a FIRDataSnapshot. - */ -- (void)observeSingleEventOfType:(FIRDataEventType)eventType withBlock:(void (^)(FIRDataSnapshot *snapshot))block; - - -/** - * This is equivalent to observeEventType:withBlock:, except the block is immediately canceled after the initial data is returned. In addition, for FIRDataEventTypeChildAdded, FIRDataEventTypeChildMoved, and - * FIRDataEventTypeChildChanged events, your block will be passed the key of the previous node by priority order. - * - * @param eventType The type of event to listen for. - * @param block The block that should be called. It is passed the data as a FIRDataSnapshot and the previous child's key. - */ -- (void)observeSingleEventOfType:(FIRDataEventType)eventType andPreviousSiblingKeyWithBlock:(void (^)(FIRDataSnapshot *snapshot, NSString *__nullable prevKey))block; - - -/** - * This is equivalent to observeEventType:withBlock:, except the block is immediately canceled after the initial data is returned. - * - * The cancelBlock will be called if you do not have permission to read data at this location. - * - * @param eventType The type of event to listen for. - * @param block The block that should be called. It is passed the data as a FIRDataSnapshot. - * @param cancelBlock The block that will be called if you don't have permission to access this data - */ -- (void)observeSingleEventOfType:(FIRDataEventType)eventType withBlock:(void (^)(FIRDataSnapshot *snapshot))block withCancelBlock:(nullable void (^)(NSError* error))cancelBlock; - - -/** - * This is equivalent to observeEventType:withBlock:, except the block is immediately canceled after the initial data is returned. In addition, for FIRDataEventTypeChildAdded, FIRDataEventTypeChildMoved, and - * FIRDataEventTypeChildChanged events, your block will be passed the key of the previous node by priority order. - * - * The cancelBlock will be called if you do not have permission to read data at this location. - * - * @param eventType The type of event to listen for. - * @param block The block that should be called. It is passed the data as a FIRDataSnapshot and the previous child's key. - * @param cancelBlock The block that will be called if you don't have permission to access this data - */ -- (void)observeSingleEventOfType:(FIRDataEventType)eventType andPreviousSiblingKeyWithBlock:(void (^)(FIRDataSnapshot *snapshot, NSString *__nullable prevKey))block withCancelBlock:(nullable void (^)(NSError* error))cancelBlock; - -/** @name Detaching observers */ - -/** - * Detach a block previously attached with observeEventType:withBlock:. - * - * @param handle The handle returned by the call to observeEventType:withBlock: which we are trying to remove. - */ -- (void) removeObserverWithHandle:(FIRDatabaseHandle)handle; - - -/** - * Detach all blocks previously attached to this Firebase Database location with observeEventType:withBlock: - */ -- (void) removeAllObservers; - -/** - * By calling `keepSynced:YES` on a location, the data for that location will automatically be downloaded and - * kept in sync, even when no listeners are attached for that location. Additionally, while a location is kept - * synced, it will not be evicted from the persistent disk cache. - * - * @param keepSynced Pass YES to keep this location synchronized, pass NO to stop synchronization. -*/ - - (void) keepSynced:(BOOL)keepSynced; - - -/** @name Querying and limiting */ - - -/** -* queryLimitedToFirst: is used to generate a reference to a limited view of the data at this location. -* The FIRDatabaseQuery instance returned by queryLimitedToFirst: will respond to at most the first limit child nodes. -* -* @param limit The upper bound, inclusive, for the number of child nodes to receive events for -* @return A FIRDatabaseQuery instance, limited to at most limit child nodes. -*/ -- (FIRDatabaseQuery *)queryLimitedToFirst:(NSUInteger)limit; - - -/** -* queryLimitedToLast: is used to generate a reference to a limited view of the data at this location. -* The FIRDatabaseQuery instance returned by queryLimitedToLast: will respond to at most the last limit child nodes. -* -* @param limit The upper bound, inclusive, for the number of child nodes to receive events for -* @return A FIRDatabaseQuery instance, limited to at most limit child nodes. -*/ -- (FIRDatabaseQuery *)queryLimitedToLast:(NSUInteger)limit; - -/** -* queryOrderBy: is used to generate a reference to a view of the data that's been sorted by the values of -* a particular child key. This method is intended to be used in combination with queryStartingAtValue:, -* queryEndingAtValue:, or queryEqualToValue:. -* - * @param key The child key to use in ordering data visible to the returned FIRDatabaseQuery - * @return A FIRDatabaseQuery instance, ordered by the values of the specified child key. -*/ -- (FIRDatabaseQuery *)queryOrderedByChild:(NSString *)key; - -/** - * queryOrderedByKey: is used to generate a reference to a view of the data that's been sorted by child key. - * This method is intended to be used in combination with queryStartingAtValue:, queryEndingAtValue:, - * or queryEqualToValue:. - * - * @return A FIRDatabaseQuery instance, ordered by child keys. - */ -- (FIRDatabaseQuery *) queryOrderedByKey; - -/** - * queryOrderedByValue: is used to generate a reference to a view of the data that's been sorted by child value. - * This method is intended to be used in combination with queryStartingAtValue:, queryEndingAtValue:, - * or queryEqualToValue:. - * - * @return A FIRDatabaseQuery instance, ordered by child value. - */ -- (FIRDatabaseQuery *) queryOrderedByValue; - -/** - * queryOrderedByPriority: is used to generate a reference to a view of the data that's been sorted by child - * priority. This method is intended to be used in combination with queryStartingAtValue:, queryEndingAtValue:, - * or queryEqualToValue:. - * - * @return A FIRDatabaseQuery instance, ordered by child priorities. - */ -- (FIRDatabaseQuery *) queryOrderedByPriority; - -/** - * queryStartingAtValue: is used to generate a reference to a limited view of the data at this location. - * The FIRDatabaseQuery instance returned by queryStartingAtValue: will respond to events at nodes with a value - * greater than or equal to startValue. - * - * @param startValue The lower bound, inclusive, for the value of data visible to the returned FIRDatabaseQuery - * @return A FIRDatabaseQuery instance, limited to data with value greater than or equal to startValue - */ -- (FIRDatabaseQuery *)queryStartingAtValue:(nullable id)startValue; - -/** - * queryStartingAtValue:childKey: is used to generate a reference to a limited view of the data at this location. - * The FIRDatabaseQuery instance returned by queryStartingAtValue:childKey will respond to events at nodes with a value - * greater than startValue, or equal to startValue and with a key greater than or equal to childKey. - * - * @param startValue The lower bound, inclusive, for the value of data visible to the returned FIRDatabaseQuery - * @param childKey The lower bound, inclusive, for the key of nodes with value equal to startValue - * @return A FIRDatabaseQuery instance, limited to data with value greater than or equal to startValue - */ -- (FIRDatabaseQuery *)queryStartingAtValue:(nullable id)startValue childKey:(nullable NSString *)childKey; - -/** - * queryEndingAtValue: is used to generate a reference to a limited view of the data at this location. - * The FIRDatabaseQuery instance returned by queryEndingAtValue: will respond to events at nodes with a value - * less than or equal to endValue. - * - * @param endValue The upper bound, inclusive, for the value of data visible to the returned FIRDatabaseQuery - * @return A FIRDatabaseQuery instance, limited to data with value less than or equal to endValue - */ -- (FIRDatabaseQuery *)queryEndingAtValue:(nullable id)endValue; - -/** - * queryEndingAtValue:childKey: is used to generate a reference to a limited view of the data at this location. - * The FIRDatabaseQuery instance returned by queryEndingAtValue:childKey will respond to events at nodes with a value - * less than endValue, or equal to endValue and with a key less than or equal to childKey. - * - * @param endValue The upper bound, inclusive, for the value of data visible to the returned FIRDatabaseQuery - * @param childKey The upper bound, inclusive, for the key of nodes with value equal to endValue - * @return A FIRDatabaseQuery instance, limited to data with value less than or equal to endValue - */ -- (FIRDatabaseQuery *)queryEndingAtValue:(nullable id)endValue childKey:(nullable NSString *)childKey; - -/** - * queryEqualToValue: is used to generate a reference to a limited view of the data at this location. - * The FIRDatabaseQuery instance returned by queryEqualToValue: will respond to events at nodes with a value equal - * to the supplied argument. - * - * @param value The value that the data returned by this FIRDatabaseQuery will have - * @return A FIRDatabaseQuery instance, limited to data with the supplied value. - */ -- (FIRDatabaseQuery *)queryEqualToValue:(nullable id)value; - -/** - * queryEqualToValue:childKey: is used to generate a reference to a limited view of the data at this location. - * The FIRDatabaseQuery instance returned by queryEqualToValue:childKey will respond to events at nodes with a value - * equal to the supplied argument with a name equal to childKey. There will be at most one node that matches because - * child keys are unique. - * - * @param value The value that the data returned by this FIRDatabaseQuery will have - * @param childKey The name of nodes with the right value - * @return A FIRDatabaseQuery instance, limited to data with the supplied value and the key. - */ -- (FIRDatabaseQuery *)queryEqualToValue:(nullable id)value childKey:(nullable NSString *)childKey; - - -/** @name Properties */ - - -/** -* Gets a FIRDatabaseReference for the location of this query. -* -* @return A FIRDatabaseReference for the location of this query. -*/ -@property (nonatomic, readonly, strong) FIRDatabaseReference * ref; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Project 29 - Grocr/Pods/Headers/Public/FirebaseDatabase/FirebaseDatabase/FIRDatabaseReference.h b/Project 29 - Grocr/Pods/Headers/Public/FirebaseDatabase/FirebaseDatabase/FIRDatabaseReference.h deleted file mode 100755 index 5f847b62..00000000 --- a/Project 29 - Grocr/Pods/Headers/Public/FirebaseDatabase/FirebaseDatabase/FIRDatabaseReference.h +++ /dev/null @@ -1,730 +0,0 @@ -/* - * Firebase iOS Client Library - * - * Copyright © 2013 Firebase - All Rights Reserved - * https://www.firebase.com - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binaryform must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY FIREBASE AS IS AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO - * EVENT SHALL FIREBASE BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - - -#import -#import "FIRDatabaseQuery.h" -#import "FIRDatabase.h" -#import "FIRDataSnapshot.h" -#import "FIRMutableData.h" -#import "FIRTransactionResult.h" -#import "FIRServerValue.h" - -NS_ASSUME_NONNULL_BEGIN - -@class FIRDatabase; - -/** - * A FIRDatabaseReference represents a particular location in your Firebase Database - * and can be used for reading or writing data to that Firebase Database location. - * - * This class is the starting point for all Firebase Database operations. After you've - * initialized it with initWithUrl: you can use it - * to read data (ie. observeEventType:withBlock:), write data (ie. setValue:), and to create new - * FIRDatabaseReferences (ie. child:). - */ -@interface FIRDatabaseReference : FIRDatabaseQuery - - -/** @name Getting references to children locations */ - -/** - * Gets a FIRDatabaseReference for the location at the specified relative path. - * The relative path can either be a simple child key (e.g. 'fred') or a - * deeper slash-separated path (e.g. 'fred/name/first'). - * - * @param pathString A relative path from this location to the desired child location. - * @return A FIRDatabaseReference for the specified relative path. - */ -- (FIRDatabaseReference *)child:(NSString *)pathString; - -/** - * childByAppendingPath: is deprecated, use child: instead. - */ -- (FIRDatabaseReference *)childByAppendingPath:(NSString *)pathString __deprecated_msg("use child: instead"); - -/** - * childByAutoId generates a new child location using a unique key and returns a - * FIRDatabaseReference to it. This is useful when the children of a Firebase Database - * location represent a list of items. - * - * The unique key generated by childByAutoId: is prefixed with a client-generated - * timestamp so that the resulting list will be chronologically-sorted. - * - * @return A FIRDatabaseReference for the generated location. - */ -- (FIRDatabaseReference *) childByAutoId; - - -/** @name Writing data */ - -/** Write data to this Firebase Database location. - -This will overwrite any data at this location and all child locations. - -Data types that can be set are: - -- NSString -- @"Hello World" -- NSNumber (also includes boolean) -- @YES, @43, @4.333 -- NSDictionary -- @{@"key": @"value", @"nested": @{@"another": @"value"} } -- NSArray - -The effect of the write will be visible immediately and the corresponding -events will be triggered. Synchronization of the data to the Firebase Database -servers will also be started. - -Passing null for the new value is equivalent to calling remove:; -all data at this location or any child location will be deleted. - -Note that setValue: will remove any priority stored at this location, so if priority -is meant to be preserved, you should use setValue:andPriority: instead. - -@param value The value to be written. - */ -- (void) setValue:(nullable id)value; - - -/** - * The same as setValue: with a block that gets triggered after the write operation has - * been committed to the Firebase Database servers. - * - * @param value The value to be written. - * @param block The block to be called after the write has been committed to the Firebase Database servers. - */ -- (void) setValue:(nullable id)value withCompletionBlock:(void (^)(NSError *__nullable error, FIRDatabaseReference * ref))block; - - -/** - * The same as setValue: with an additional priority to be attached to the data being written. - * Priorities are used to order items. - * - * @param value The value to be written. - * @param priority The priority to be attached to that data. - */ -- (void) setValue:(nullable id)value andPriority:(nullable id)priority; - - -/** - * The same as setValue:andPriority: with a block that gets triggered after the write operation has - * been committed to the Firebase Database servers. - * - * @param value The value to be written. - * @param priority The priority to be attached to that data. - * @param block The block to be called after the write has been committed to the Firebase Database servers. - */ -- (void) setValue:(nullable id)value andPriority:(nullable id)priority withCompletionBlock:(void (^)(NSError *__nullable error, FIRDatabaseReference * ref))block; - - -/** - * Remove the data at this Firebase Database location. Any data at child locations will also be deleted. - * - * The effect of the delete will be visible immediately and the corresponding events - * will be triggered. Synchronization of the delete to the Firebase Database servers will - * also be started. - * - * remove: is equivalent to calling setValue:nil - */ -- (void) removeValue; - - -/** - * The same as remove: with a block that gets triggered after the remove operation has - * been committed to the Firebase Database servers. - * - * @param block The block to be called after the remove has been committed to the Firebase Database servers. - */ -- (void) removeValueWithCompletionBlock:(void (^)(NSError *__nullable error, FIRDatabaseReference * ref))block; - -/** - * Sets a priority for the data at this Firebase Database location. - * Priorities can be used to provide a custom ordering for the children at a location - * (if no priorities are specified, the children are ordered by key). - * - * You cannot set a priority on an empty location. For this reason - * setValue:andPriority: should be used when setting initial data with a specific priority - * and setPriority: should be used when updating the priority of existing data. - * - * Children are sorted based on this priority using the following rules: - * - * Children with no priority come first. - * Children with a number as their priority come next. They are sorted numerically by priority (small to large). - * Children with a string as their priority come last. They are sorted lexicographically by priority. - * Whenever two children have the same priority (including no priority), they are sorted by key. Numeric - * keys come first (sorted numerically), followed by the remaining keys (sorted lexicographically). - * - * Note that priorities are parsed and ordered as IEEE 754 double-precision floating-point numbers. - * Keys are always stored as strings and are treated as numbers only when they can be parsed as a - * 32-bit integer - * - * @param priority The priority to set at the specified location. - */ -- (void) setPriority:(nullable id)priority; - - -/** - * The same as setPriority: with a block that is called once the priority has - * been committed to the Firebase Database servers. - * - * @param priority The priority to set at the specified location. - * @param block The block that is triggered after the priority has been written on the servers. - */ -- (void) setPriority:(nullable id)priority withCompletionBlock:(void (^)(NSError *__nullable error, FIRDatabaseReference * ref))block; - -/** - * Updates the values at the specified paths in the dictionary without overwriting other - * keys at this location. - * - * @param values A dictionary of the keys to change and their new values - */ -- (void) updateChildValues:(NSDictionary *)values; - -/** - * The same as update: with a block that is called once the update has been committed to the - * Firebase Database servers - * - * @param values A dictionary of the keys to change and their new values - * @param block The block that is triggered after the update has been written on the Firebase Database servers - */ -- (void) updateChildValues:(NSDictionary *)values withCompletionBlock:(void (^)(NSError *__nullable error, FIRDatabaseReference * ref))block; - - -/** @name Attaching observers to read data */ - -/** - * observeEventType:withBlock: is used to listen for data changes at a particular location. - * This is the primary way to read data from the Firebase Database. Your block will be triggered - * for the initial data and again whenever the data changes. - * - * Use removeObserverWithHandle: to stop receiving updates. - * @param eventType The type of event to listen for. - * @param block The block that should be called with initial data and updates. It is passed the data as a FIRDataSnapshot. - * @return A handle used to unregister this block later using removeObserverWithHandle: - */ -- (FIRDatabaseHandle)observeEventType:(FIRDataEventType)eventType withBlock:(void (^)(FIRDataSnapshot *snapshot))block; - - -/** - * observeEventType:andPreviousSiblingKeyWithBlock: is used to listen for data changes at a particular location. - * This is the primary way to read data from the Firebase Database. Your block will be triggered - * for the initial data and again whenever the data changes. In addition, for FIRDataEventTypeChildAdded, FIRDataEventTypeChildMoved, and - * FIRDataEventTypeChildChanged events, your block will be passed the key of the previous node by priority order. - * - * Use removeObserverWithHandle: to stop receiving updates. - * - * @param eventType The type of event to listen for. - * @param block The block that should be called with initial data and updates. It is passed the data as a FIRDataSnapshot - * and the previous child's key. - * @return A handle used to unregister this block later using removeObserverWithHandle: - */ -- (FIRDatabaseHandle)observeEventType:(FIRDataEventType)eventType andPreviousSiblingKeyWithBlock:(void (^)(FIRDataSnapshot *snapshot, NSString *__nullable prevKey))block; - - -/** - * observeEventType:withBlock: is used to listen for data changes at a particular location. - * This is the primary way to read data from the Firebase Database. Your block will be triggered - * for the initial data and again whenever the data changes. - * - * The cancelBlock will be called if you will no longer receive new events due to no longer having permission. - * - * Use removeObserverWithHandle: to stop receiving updates. - * - * @param eventType The type of event to listen for. - * @param block The block that should be called with initial data and updates. It is passed the data as a FIRDataSnapshot. - * @param cancelBlock The block that should be called if this client no longer has permission to receive these events - * @return A handle used to unregister this block later using removeObserverWithHandle: - */ -- (FIRDatabaseHandle)observeEventType:(FIRDataEventType)eventType withBlock:(void (^)(FIRDataSnapshot *snapshot))block withCancelBlock:(nullable void (^)(NSError* error))cancelBlock; - - -/** - * observeEventType:andPreviousSiblingKeyWithBlock: is used to listen for data changes at a particular location. - * This is the primary way to read data from the Firebase Database. Your block will be triggered - * for the initial data and again whenever the data changes. In addition, for FIRDataEventTypeChildAdded, FIRDataEventTypeChildMoved, and - * FIRDataEventTypeChildChanged events, your block will be passed the key of the previous node by priority order. - * - * The cancelBlock will be called if you will no longer receive new events due to no longer having permission. - * - * Use removeObserverWithHandle: to stop receiving updates. - * - * @param eventType The type of event to listen for. - * @param block The block that should be called with initial data and updates. It is passed the data as a FIRDataSnapshot - * and the previous child's key. - * @param cancelBlock The block that should be called if this client no longer has permission to receive these events - * @return A handle used to unregister this block later using removeObserverWithHandle: - */ -- (FIRDatabaseHandle)observeEventType:(FIRDataEventType)eventType andPreviousSiblingKeyWithBlock:(void (^)(FIRDataSnapshot *snapshot, NSString *__nullable prevKey))block withCancelBlock:(nullable void (^)(NSError* error))cancelBlock; - - -/** - * This is equivalent to observeEventType:withBlock:, except the block is immediately canceled after the initial data is returned. - * - * @param eventType The type of event to listen for. - * @param block The block that should be called. It is passed the data as a FIRDataSnapshot. - */ -- (void)observeSingleEventOfType:(FIRDataEventType)eventType withBlock:(void (^)(FIRDataSnapshot *snapshot))block; - - -/** - * This is equivalent to observeEventType:withBlock:, except the block is immediately canceled after the initial data is returned. In addition, for FIRDataEventTypeChildAdded, FIRDataEventTypeChildMoved, and - * FIRDataEventTypeChildChanged events, your block will be passed the key of the previous node by priority order. - * - * @param eventType The type of event to listen for. - * @param block The block that should be called. It is passed the data as a FIRDataSnapshot and the previous child's key. - */ -- (void)observeSingleEventOfType:(FIRDataEventType)eventType andPreviousSiblingKeyWithBlock:(void (^)(FIRDataSnapshot *snapshot, NSString *__nullable prevKey))block; - - -/** - * This is equivalent to observeEventType:withBlock:, except the block is immediately canceled after the initial data is returned. - * - * The cancelBlock will be called if you do not have permission to read data at this location. - * - * @param eventType The type of event to listen for. - * @param block The block that should be called. It is passed the data as a FIRDataSnapshot. - * @param cancelBlock The block that will be called if you don't have permission to access this data - */ -- (void)observeSingleEventOfType:(FIRDataEventType)eventType withBlock:(void (^)(FIRDataSnapshot *snapshot))block withCancelBlock:(nullable void (^)(NSError* error))cancelBlock; - - -/** - * This is equivalent to observeEventType:withBlock:, except the block is immediately canceled after the initial data is returned. In addition, for FIRDataEventTypeChildAdded, FIRDataEventTypeChildMoved, and - * FIRDataEventTypeChildChanged events, your block will be passed the key of the previous node by priority order. - * - * The cancelBlock will be called if you do not have permission to read data at this location. - * - * @param eventType The type of event to listen for. - * @param block The block that should be called. It is passed the data as a FIRDataSnapshot and the previous child's key. - * @param cancelBlock The block that will be called if you don't have permission to access this data - */ -- (void)observeSingleEventOfType:(FIRDataEventType)eventType andPreviousSiblingKeyWithBlock:(void (^)(FIRDataSnapshot *snapshot, NSString *__nullable prevKey))block withCancelBlock:(nullable void (^)(NSError* error))cancelBlock; - -/** @name Detaching observers */ - -/** - * Detach a block previously attached with observeEventType:withBlock:. - * - * @param handle The handle returned by the call to observeEventType:withBlock: which we are trying to remove. - */ -- (void) removeObserverWithHandle:(FIRDatabaseHandle)handle; - -/** - * By calling `keepSynced:YES` on a location, the data for that location will automatically be downloaded and - * kept in sync, even when no listeners are attached for that location. Additionally, while a location is kept - * synced, it will not be evicted from the persistent disk cache. - * - * @param keepSynced Pass YES to keep this location synchronized, pass NO to stop synchronization. - */ -- (void) keepSynced:(BOOL)keepSynced; - - -/** - * Removes all observers at the current reference, but does not remove any observers at child references. - * removeAllObservers must be called again for each child reference where a listener was established to remove the observers. - */ -- (void) removeAllObservers; - -/** @name Querying and limiting */ - - -/** - * queryLimitedToFirst: is used to generate a reference to a limited view of the data at this location. - * The FIRDatabaseQuery instance returned by queryLimitedToFirst: will respond to at most the first limit child nodes. - * - * @param limit The upper bound, inclusive, for the number of child nodes to receive events for - * @return A FIRDatabaseQuery instance, limited to at most limit child nodes. - */ -- (FIRDatabaseQuery *)queryLimitedToFirst:(NSUInteger)limit; - - -/** - * queryLimitedToLast: is used to generate a reference to a limited view of the data at this location. - * The FIRDatabaseQuery instance returned by queryLimitedToLast: will respond to at most the last limit child nodes. - * - * @param limit The upper bound, inclusive, for the number of child nodes to receive events for - * @return A FIRDatabaseQuery instance, limited to at most limit child nodes. - */ -- (FIRDatabaseQuery *)queryLimitedToLast:(NSUInteger)limit; - -/** - * queryOrderBy: is used to generate a reference to a view of the data that's been sorted by the values of - * a particular child key. This method is intended to be used in combination with queryStartingAtValue:, - * queryEndingAtValue:, or queryEqualToValue:. - * - * @param key The child key to use in ordering data visible to the returned FIRDatabaseQuery - * @return A FIRDatabaseQuery instance, ordered by the values of the specified child key. - */ -- (FIRDatabaseQuery *)queryOrderedByChild:(NSString *)key; - -/** - * queryOrderedByKey: is used to generate a reference to a view of the data that's been sorted by child key. - * This method is intended to be used in combination with queryStartingAtValue:, queryEndingAtValue:, - * or queryEqualToValue:. - * - * @return A FIRDatabaseQuery instance, ordered by child keys. - */ -- (FIRDatabaseQuery *) queryOrderedByKey; - -/** - * queryOrderedByPriority: is used to generate a reference to a view of the data that's been sorted by child - * priority. This method is intended to be used in combination with queryStartingAtValue:, queryEndingAtValue:, - * or queryEqualToValue:. - * - * @return A FIRDatabaseQuery instance, ordered by child priorities. - */ -- (FIRDatabaseQuery *) queryOrderedByPriority; - -/** - * queryStartingAtValue: is used to generate a reference to a limited view of the data at this location. - * The FIRDatabaseQuery instance returned by queryStartingAtValue: will respond to events at nodes with a value - * greater than or equal to startValue. - * - * @param startValue The lower bound, inclusive, for the value of data visible to the returned FIRDatabaseQuery - * @return A FIRDatabaseQuery instance, limited to data with value greater than or equal to startValue - */ -- (FIRDatabaseQuery *)queryStartingAtValue:(nullable id)startValue; - -/** - * queryStartingAtValue:childKey: is used to generate a reference to a limited view of the data at this location. - * The FIRDatabaseQuery instance returned by queryStartingAtValue:childKey will respond to events at nodes with a value - * greater than startValue, or equal to startValue and with a key greater than or equal to childKey. - * - * @param startValue The lower bound, inclusive, for the value of data visible to the returned FIRDatabaseQuery - * @param childKey The lower bound, inclusive, for the key of nodes with value equal to startValue - * @return A FIRDatabaseQuery instance, limited to data with value greater than or equal to startValue - */ -- (FIRDatabaseQuery *)queryStartingAtValue:(nullable id)startValue childKey:(nullable NSString *)childKey; - -/** - * queryEndingAtValue: is used to generate a reference to a limited view of the data at this location. - * The FIRDatabaseQuery instance returned by queryEndingAtValue: will respond to events at nodes with a value - * less than or equal to endValue. - * - * @param endValue The upper bound, inclusive, for the value of data visible to the returned FIRDatabaseQuery - * @return A FIRDatabaseQuery instance, limited to data with value less than or equal to endValue - */ -- (FIRDatabaseQuery *)queryEndingAtValue:(nullable id)endValue; - -/** - * queryEndingAtValue:childKey: is used to generate a reference to a limited view of the data at this location. - * The FIRDatabaseQuery instance returned by queryEndingAtValue:childKey will respond to events at nodes with a value - * less than endValue, or equal to endValue and with a key less than or equal to childKey. - * - * @param endValue The upper bound, inclusive, for the value of data visible to the returned FIRDatabaseQuery - * @param childKey The upper bound, inclusive, for the key of nodes with value equal to endValue - * @return A FIRDatabaseQuery instance, limited to data with value less than or equal to endValue - */ -- (FIRDatabaseQuery *)queryEndingAtValue:(nullable id)endValue childKey:(nullable NSString *)childKey; - -/** - * queryEqualToValue: is used to generate a reference to a limited view of the data at this location. - * The FIRDatabaseQuery instance returned by queryEqualToValue: will respond to events at nodes with a value equal - * to the supplied argument. - * - * @param value The value that the data returned by this FIRDatabaseQuery will have - * @return A FIRDatabaseQuery instance, limited to data with the supplied value. - */ -- (FIRDatabaseQuery *)queryEqualToValue:(nullable id)value; - -/** - * queryEqualToValue:childKey: is used to generate a reference to a limited view of the data at this location. - * The FIRDatabaseQuery instance returned by queryEqualToValue:childKey will respond to events at nodes with a value - * equal to the supplied argument with a key equal to childKey. There will be at most one node that matches because - * child keys are unique. - * - * @param value The value that the data returned by this FIRDatabaseQuery will have - * @param childKey The key of nodes with the right value - * @return A FIRDatabaseQuery instance, limited to data with the supplied value and the key. - */ -- (FIRDatabaseQuery *)queryEqualToValue:(nullable id)value childKey:(nullable NSString *)childKey; - -/** @name Managing presence */ - -/** - * Ensure the data at this location is set to the specified value when - * the client is disconnected (due to closing the browser, navigating - * to a new page, or network issues). - * - * onDisconnectSetValue: is especially useful for implementing "presence" systems, - * where a value should be changed or cleared when a user disconnects - * so that he appears "offline" to other users. - * - * @param value The value to be set after the connection is lost. - */ -- (void) onDisconnectSetValue:(nullable id)value; - - -/** - * Ensure the data at this location is set to the specified value when - * the client is disconnected (due to closing the browser, navigating - * to a new page, or network issues). - * - * The completion block will be triggered when the operation has been successfully queued up on the Firebase Database servers - * - * @param value The value to be set after the connection is lost. - * @param block Block to be triggered when the operation has been queued up on the Firebase Database servers - */ -- (void) onDisconnectSetValue:(nullable id)value withCompletionBlock:(void (^)(NSError *__nullable error, FIRDatabaseReference * ref))block; - - -/** - * Ensure the data at this location is set to the specified value and priority when - * the client is disconnected (due to closing the browser, navigating - * to a new page, or network issues). - * - * @param value The value to be set after the connection is lost. - * @param priority The priority to be set after the connection is lost. - */ -- (void) onDisconnectSetValue:(nullable id)value andPriority:(id)priority; - - -/** - * Ensure the data at this location is set to the specified value and priority when - * the client is disconnected (due to closing the browser, navigating - * to a new page, or network issues). - * - * The completion block will be triggered when the operation has been successfully queued up on the Firebase Database servers - * - * @param value The value to be set after the connection is lost. - * @param priority The priority to be set after the connection is lost. - * @param block Block to be triggered when the operation has been queued up on the Firebase Database servers - */ -- (void) onDisconnectSetValue:(nullable id)value andPriority:(nullable id)priority withCompletionBlock:(void (^)(NSError *__nullable error, FIRDatabaseReference * ref))block; - - -/** - * Ensure the data at this location is removed when - * the client is disconnected (due to closing the app, navigating - * to a new page, or network issues). - * - * onDisconnectRemoveValue is especially useful for implementing "presence" systems. - */ -- (void) onDisconnectRemoveValue; - - -/** - * Ensure the data at this location is removed when - * the client is disconnected (due to closing the app, navigating - * to a new page, or network issues). - * - * onDisconnectRemoveValueWithCompletionBlock: is especially useful for implementing "presence" systems. - * - * @param block Block to be triggered when the operation has been queued up on the Firebase Database servers - */ -- (void) onDisconnectRemoveValueWithCompletionBlock:(void (^)(NSError *__nullable error, FIRDatabaseReference * ref))block; - - - -/** - * Ensure the data has the specified child values updated when - * the client is disconnected (due to closing the browser, navigating - * to a new page, or network issues). - * - * - * @param values A dictionary of child node keys and the values to set them to after the connection is lost. - */ -- (void) onDisconnectUpdateChildValues:(NSDictionary *)values; - - -/** - * Ensure the data has the specified child values updated when - * the client is disconnected (due to closing the browser, navigating - * to a new page, or network issues). - * - * - * @param values A dictionary of child node keys and the values to set them to after the connection is lost. - * @param block A block that will be called once the operation has been queued up on the Firebase Database servers - */ -- (void) onDisconnectUpdateChildValues:(NSDictionary *)values withCompletionBlock:(void (^)(NSError *__nullable error, FIRDatabaseReference * ref))block; - - -/** - * Cancel any operations that are set to run on disconnect. If you previously called onDisconnectSetValue:, - * onDisconnectRemoveValue:, or onDisconnectUpdateChildValues:, and no longer want the values updated when the - * connection is lost, call cancelDisconnectOperations: - */ -- (void) cancelDisconnectOperations; - - -/** - * Cancel any operations that are set to run on disconnect. If you previously called onDisconnectSetValue:, - * onDisconnectRemoveValue:, or onDisconnectUpdateChildValues:, and no longer want the values updated when the - * connection is lost, call cancelDisconnectOperations: - * - * @param block A block that will be triggered once the Firebase Database servers have acknowledged the cancel request. - */ -- (void) cancelDisconnectOperationsWithCompletionBlock:(nullable void (^)(NSError *__nullable error, FIRDatabaseReference * ref))block; - - -/** @name Manual Connection Management */ - -/** - * Manually disconnect the Firebase Database client from the server and disable automatic reconnection. - * - * The Firebase Database client automatically maintains a persistent connection to the Firebase Database server, - * which will remain active indefinitely and reconnect when disconnected. However, the goOffline( ) - * and goOnline( ) methods may be used to manually control the client connection in cases where - * a persistent connection is undesirable. - * - * While offline, the Firebase Database client will no longer receive data updates from the server. However, - * all database operations performed locally will continue to immediately fire events, allowing - * your application to continue behaving normally. Additionally, each operation performed locally - * will automatically be queued and retried upon reconnection to the Firebase Database server. - * - * To reconnect to the Firebase Database server and begin receiving remote events, see goOnline( ). - * Once the connection is reestablished, the Firebase Database client will transmit the appropriate data - * and fire the appropriate events so that your client "catches up" automatically. - * - * Note: Invoking this method will impact all Firebase Database connections. - */ -+ (void) goOffline; - -/** - * Manually reestablish a connection to the Firebase Database server and enable automatic reconnection. - * - * The Firebase Database client automatically maintains a persistent connection to the Firebase Database server, - * which will remain active indefinitely and reconnect when disconnected. However, the goOffline( ) - * and goOnline( ) methods may be used to manually control the client connection in cases where - * a persistent connection is undesirable. - * - * This method should be used after invoking goOffline( ) to disable the active connection. - * Once reconnected, the Firebase Database client will automatically transmit the proper data and fire - * the appropriate events so that your client "catches up" automatically. - * - * To disconnect from the Firebase Database server, see goOffline( ). - * - * Note: Invoking this method will impact all Firebase Database connections. - */ -+ (void) goOnline; - - -/** @name Transactions */ - -/** - * Performs an optimistic-concurrency transactional update to the data at this location. Your block will be called with a FIRMutableData - * instance that contains the current data at this location. Your block should update this data to the value you - * wish to write to this location, and then return an instance of FIRTransactionResult with the new data. - * - * If, when the operation reaches the server, it turns out that this client had stale data, your block will be run - * again with the latest data from the server. - * - * When your block is run, you may decide to abort the transaction by returning [FIRTransactionResult abort]. - * - * @param block This block receives the current data at this location and must return an instance of FIRTransactionResult - */ -- (void) runTransactionBlock:(FIRTransactionResult * (^) (FIRMutableData* currentData))block; - - -/** - * Performs an optimistic-concurrency transactional update to the data at this location. Your block will be called with a FIRMutableData - * instance that contains the current data at this location. Your block should update this data to the value you - * wish to write to this location, and then return an instance of FIRTransactionResult with the new data. - * - * If, when the operation reaches the server, it turns out that this client had stale data, your block will be run - * again with the latest data from the server. - * - * When your block is run, you may decide to abort the transaction by returning [FIRTransactionResult abort]. - * - * @param block This block receives the current data at this location and must return an instance of FIRTransactionResult - * @param completionBlock This block will be triggered once the transaction is complete, whether it was successful or not. It will indicate if there was an error, whether or not the data was committed, and what the current value of the data at this location is. - */ -- (void)runTransactionBlock:(FIRTransactionResult * (^) (FIRMutableData* currentData))block andCompletionBlock:(void (^) (NSError *__nullable error, BOOL committed, FIRDataSnapshot *__nullable snapshot))completionBlock; - - - -/** - * Performs an optimistic-concurrency transactional update to the data at this location. Your block will be called with a FIRMutableData - * instance that contains the current data at this location. Your block should update this data to the value you - * wish to write to this location, and then return an instance of FIRTransactionResult with the new data. - * - * If, when the operation reaches the server, it turns out that this client had stale data, your block will be run - * again with the latest data from the server. - * - * When your block is run, you may decide to abort the transaction by return [FIRTransactionResult abort]. - * - * Since your block may be run multiple times, this client could see several immediate states that don't exist on the server. You can suppress those immediate states until the server confirms the final state of the transaction. - * - * @param block This block receives the current data at this location and must return an instance of FIRTransactionResult - * @param completionBlock This block will be triggered once the transaction is complete, whether it was successful or not. It will indicate if there was an error, whether or not the data was committed, and what the current value of the data at this location is. - * @param localEvents Set this to NO to suppress events raised for intermediate states, and only get events based on the final state of the transaction. - */ -- (void)runTransactionBlock:(FIRTransactionResult * (^) (FIRMutableData* currentData))block andCompletionBlock:(nullable void (^) (NSError *__nullable error, BOOL committed, FIRDataSnapshot *__nullable snapshot))completionBlock withLocalEvents:(BOOL)localEvents; - - -/** @name Retrieving String Representation */ - -/** - * Gets the absolute URL of this Firebase Database location. - * - * @return The absolute URL of the referenced Firebase Database location. - */ -- (NSString *) description; - -/** @name Properties */ - -/** - * Gets a FIRDatabaseReference for the parent location. - * If this instance refers to the root of your Firebase Database, it has no parent, - * and therefore parent( ) will return null. - * - * @return A FIRDatabaseReference for the parent location. - */ -@property (strong, readonly, nonatomic, nullable) FIRDatabaseReference * parent; - - -/** - * Gets a FIRDatabaseReference for the root location - * - * @return A new FIRDatabaseReference to root location. - */ -@property (strong, readonly, nonatomic) FIRDatabaseReference * root; - - -/** - * Gets the last token in a Firebase Database location (e.g. 'fred' in https://SampleChat.firebaseIO-demo.com/users/fred) - * - * @return The key of the location this reference points to. - */ -@property (strong, readonly, nonatomic) NSString* key; - -/** - * Gets the URL for the Firebase Database location referenced by this FIRDatabaseReference. - * - * @return The url of the location this reference points to. - */ -@property (strong, readonly, nonatomic) NSString* URL; - -/** - * Gets the FIRDatabase instance associated with this reference. - * - * @return The FIRDatabase object for this reference. - */ -@property (strong, readonly, nonatomic) FIRDatabase *database; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Project 29 - Grocr/Pods/Headers/Public/FirebaseDatabase/FirebaseDatabase/FIRMutableData.h b/Project 29 - Grocr/Pods/Headers/Public/FirebaseDatabase/FirebaseDatabase/FIRMutableData.h deleted file mode 100755 index 252f9f4f..00000000 --- a/Project 29 - Grocr/Pods/Headers/Public/FirebaseDatabase/FirebaseDatabase/FIRMutableData.h +++ /dev/null @@ -1,139 +0,0 @@ -/* - * Firebase iOS Client Library - * - * Copyright © 2013 Firebase - All Rights Reserved - * https://www.firebase.com - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binaryform must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY FIREBASE AS IS AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO - * EVENT SHALL FIREBASE BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#import - -NS_ASSUME_NONNULL_BEGIN - -/** - * A FIRMutableData instance is populated with data from a Firebase Database location. - * When you are using runTransactionBlock:, you will be given an instance containing the current - * data at that location. Your block will be responsible for updating that instance to the data - * you wish to save at that location, and then returning using [FIRTransactionResult successWithValue:]. - * - * To modify the data, set its value property to any of the native types support by Firebase Database: - * * NSNumber (includes BOOL) - * * NSDictionary - * * NSArray - * * NSString - * * nil / NSNull to remove the data - * - * Note that changes made to a child FIRMutableData instance will be visible to the parent. - */ -@interface FIRMutableData : NSObject - - -/** @name Inspecting and navigating the data */ - - -/** - * Returns boolean indicating whether this mutable data has children. - * - * @return YES if this data contains child nodes. - */ -- (BOOL) hasChildren; - - -/** - * Indicates whether this mutable data has a child at the given path. - * - * @param path A path string, consisting either of a single segment, like 'child', or multiple segments, 'a/deeper/child' - * @return YES if this data contains a child at the specified relative path - */ -- (BOOL) hasChildAtPath:(NSString *)path; - - -/** - * Used to obtain a FIRMutableData instance that encapsulates the data at the given relative path. - * Note that changes made to the child will be visible to the parent. - * - * @param path A path string, consisting either of a single segment, like 'child', or multiple segments, 'a/deeper/child' - * @return A FIRMutableData instance containing the data at the given path - */ -- (FIRMutableData *)childDataByAppendingPath:(NSString *)path; - - -/** @name Properties */ - - -/** - * To modify the data contained by this instance of FIRMutableData, set this to any of the native types supported by Firebase Database: - * - * * NSNumber (includes BOOL) - * * NSDictionary - * * NSArray - * * NSString - * * nil / NSNull to remove the data - * - * Note that setting this value will override the priority at this location. - * - * @return The current data at this location as a native object - */ -@property (strong, nonatomic, nullable) id value; - - -/** - * Set this property to update the priority of the data at this location. Can be set to the following types: - * - * * NSNumber - * * NSString - * * nil / NSNull to remove the priority - * - * @return The priority of the data at this location - */ -@property (strong, nonatomic, nullable) id priority; - - -/** - * @return The number of child nodes at this location - */ -@property (readonly, nonatomic) NSUInteger childrenCount; - - -/** - * Used to iterate over the children at this location. You can use the native for .. in syntax: - * - * for (FIRMutableData* child in data.children) { - * ... - * } - * - * Note that this enumerator operates on an immutable copy of the child list. So, you can modify the instance - * during iteration, but the new additions will not be visible until you get a new enumerator. - */ -@property (readonly, nonatomic, strong) NSEnumerator* children; - - -/** - * @return The key name of this node, or nil if it is the top-most location - */ -@property (readonly, nonatomic, strong, nullable) NSString* key; - - -@end - -NS_ASSUME_NONNULL_END diff --git a/Project 29 - Grocr/Pods/Headers/Public/FirebaseDatabase/FirebaseDatabase/FIRServerValue.h b/Project 29 - Grocr/Pods/Headers/Public/FirebaseDatabase/FirebaseDatabase/FIRServerValue.h deleted file mode 100755 index c93a5240..00000000 --- a/Project 29 - Grocr/Pods/Headers/Public/FirebaseDatabase/FirebaseDatabase/FIRServerValue.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Firebase iOS Client Library - * - * Copyright © 2013 Firebase - All Rights Reserved - * https://www.firebase.com - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binaryform must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY FIREBASE AS IS AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO - * EVENT SHALL FIREBASE BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -NS_ASSUME_NONNULL_BEGIN - -/** - * Placeholder values you may write into Firebase Database as a value or priority - * that will automatically be populated by the Firebase Database server. - */ -@interface FIRServerValue : NSObject - -/** - * Placeholder value for the number of milliseconds since the Unix epoch - */ -+ (NSDictionary *) timestamp; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Project 29 - Grocr/Pods/Headers/Public/FirebaseDatabase/FirebaseDatabase/FIRTransactionResult.h b/Project 29 - Grocr/Pods/Headers/Public/FirebaseDatabase/FirebaseDatabase/FIRTransactionResult.h deleted file mode 100755 index 07439e1a..00000000 --- a/Project 29 - Grocr/Pods/Headers/Public/FirebaseDatabase/FirebaseDatabase/FIRTransactionResult.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Firebase iOS Client Library - * - * Copyright © 2013 Firebase - All Rights Reserved - * https://www.firebase.com - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binaryform must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY FIREBASE AS IS AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO - * EVENT SHALL FIREBASE BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#import -#import "FIRMutableData.h" - -NS_ASSUME_NONNULL_BEGIN - -/** - * Used for runTransactionBlock:. An FIRTransactionResult instance is a container for the results of the transaction. - */ -@interface FIRTransactionResult : NSObject - -/** - * Used for runTransactionBlock:. Indicates that the new value should be saved at this location - * - * @param value A FIRMutableData instance containing the new value to be set - * @return An FIRTransactionResult instance that can be used as a return value from the block given to runTransactionBlock: - */ -+ (FIRTransactionResult *)successWithValue:(FIRMutableData *)value; - - -/** - * Used for runTransactionBlock:. Indicates that the current transaction should no longer proceed. - * - * @return An FIRTransactionResult instance that can be used as a return value from the block given to runTransactionBlock: - */ -+ (FIRTransactionResult *) abort; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Project 29 - Grocr/Pods/Headers/Public/FirebaseDatabase/FirebaseDatabase/FirebaseDatabase.h b/Project 29 - Grocr/Pods/Headers/Public/FirebaseDatabase/FirebaseDatabase/FirebaseDatabase.h deleted file mode 100755 index d903c1b9..00000000 --- a/Project 29 - Grocr/Pods/Headers/Public/FirebaseDatabase/FirebaseDatabase/FirebaseDatabase.h +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Firebase iOS Client Library - * - * Copyright © 2016 Firebase - All Rights Reserved - * https://www.firebase.com - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - * 2. Redistributions in binaryform must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY FIREBASE AS IS AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO - * EVENT SHALL FIREBASE BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE - * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef FirebaseDatabase_h -#define FirebaseDatabase_h - -#import "FIRDatabase.h" -#import "FIRDatabaseQuery.h" -#import "FIRDatabaseReference.h" -#import "FIRDataEventType.h" -#import "FIRDataSnapshot.h" -#import "FIRMutableData.h" -#import "FIRServerValue.h" -#import "FIRTransactionResult.h" - -#endif /* FirebaseDatabase_h */ diff --git a/Project 29 - Grocr/Pods/Headers/Public/FirebaseInstanceID/FIRInstanceID.h b/Project 29 - Grocr/Pods/Headers/Public/FirebaseInstanceID/FIRInstanceID.h deleted file mode 100644 index e3782f8c..00000000 --- a/Project 29 - Grocr/Pods/Headers/Public/FirebaseInstanceID/FIRInstanceID.h +++ /dev/null @@ -1,237 +0,0 @@ -#import - -/** - * @memberof FIRInstanceID - * - * The scope to be used when fetching/deleting a token for Firebase Messaging. - */ -FOUNDATION_EXPORT NSString * __nonnull const kFIRInstanceIDScopeFirebaseMessaging; - -/** - * Called when the system determines that tokens need to be refreshed. - * This method is also called if Instance ID has been reset in which - * case, tokens and FCM topic subscriptions also need to be refreshed. - * - * Instance ID service will throttle the refresh event across all devices - * to control the rate of token updates on application servers. - */ -FOUNDATION_EXPORT NSString * __nonnull const kFIRInstanceIDTokenRefreshNotification; - -/** - * @related FIRInstanceID - * - * The completion handler invoked when the InstanceID token returns. If - * the call fails we return the appropriate `error code` as described below. - * - * @param token The valid token as returned by InstanceID backend. - * - * @param error The error describing why generating a new token - * failed. See the error codes below for a more detailed - * description. - */ -typedef void(^FIRInstanceIDTokenHandler)(NSString * __nullable token, NSError * __nullable error); - - -/** - * @related FIRInstanceID - * - * The completion handler invoked when the InstanceID `deleteToken` returns. If - * the call fails we return the appropriate `error code` as described below - * - * @param error The error describing why deleting the token failed. - * See the error codes below for a more detailed description. - */ -typedef void(^FIRInstanceIDDeleteTokenHandler)(NSError * __nullable error); - -/** - * @related FIRInstanceID - * - * The completion handler invoked when the app identity is created. If the - * identity wasn't created for some reason we return the appropriate error code. - * - * @param identity A valid identity for the app instance, nil if there was an error - * while creating an identity. - * @param error The error if fetching the identity fails else nil. - */ -typedef void(^FIRInstanceIDHandler)(NSString * __nullable identity, NSError * __nullable error); - -/** - * @related FIRInstanceID - * - * The completion handler invoked when the app identity and all the tokens associated - * with it are deleted. Returns a valid error object in case of failure else nil. - * - * @param error The error if deleting the identity and all the tokens associated with - * it fails else nil. - */ -typedef void(^FIRInstanceIDDeleteHandler)(NSError * __nullable error); - -/** - * @enum FIRInstanceIDError - */ -typedef NS_ENUM(NSUInteger, FIRInstanceIDError) { - /// Unknown error. - FIRInstanceIDErrorUnknown = 0, - - /// Auth Error -- FCM couldn't validate request from this client. - FIRInstanceIDErrorAuthentication = 1, - - /// NoAccess -- InstanceID service cannot be accessed. - FIRInstanceIDErrorNoAccess = 2, - - /// Timeout -- Request to InstanceID backend timed out. - FIRInstanceIDErrorTimeout = 3, - - /// Network -- No network available to reach the servers. - FIRInstanceIDErrorNetwork = 4, - - /// OperationInProgress -- Another similar operation in progress, - /// bailing this one. - FIRInstanceIDErrorOperationInProgress = 5, - - /// InvalidRequest -- Some parameters of the request were invalid. - FIRInstanceIDErrorInvalidRequest = 7, -}; - -/** - * The APNS token type for the app. If the token type is set to `UNKNOWN` - * InstanceID will implicitly try to figure out what the actual token type - * is from the provisioning profile. - */ -typedef NS_ENUM(NSInteger, FIRInstanceIDAPNSTokenType) { - /// Unknown token type. - FIRInstanceIDAPNSTokenTypeUnknown, - /// Sandbox token type. - FIRInstanceIDAPNSTokenTypeSandbox, - /// Production token type. - FIRInstanceIDAPNSTokenTypeProd, -}; - -/** - * Instance ID provides a unique identifier for each app instance and a mechanism - * to authenticate and authorize actions (for example, sending a GCM message). - * - * Instance ID is long lived but, may be reset if the device is not used for - * a long time or the Instance ID service detects a problem. - * If Instance ID is reset, the app will be notified with a `com.firebase.iid.token-refresh` - * notification. - * - * If the Instance ID has become invalid, the app can request a new one and - * send it to the app server. - * To prove ownership of Instance ID and to allow servers to access data or - * services associated with the app, call - * `[FIRInstanceID tokenWithAuthorizedEntity:scope:options:handler]`. - */ -@interface FIRInstanceID : NSObject - -/** - * FIRInstanceID. - * - * @return A shared instance of FIRInstanceID. - */ -+ (nonnull instancetype)instanceID; - -/** - * Set APNS token for the application. This APNS token will be used to register - * with Firebase Messaging using `token` or - * `tokenWithAuthorizedEntity:scope:options:handler`. If the token type is set to - * `FIRInstanceIDAPNSTokenTypeUnknown` InstanceID will read the provisioning profile - * to find out the token type. - * - * @param token The APNS token for the application. - * @param type The APNS token type for the above token. - */ -- (void)setAPNSToken:(nonnull NSData *)token type:(FIRInstanceIDAPNSTokenType)type; - -#pragma mark - Tokens - -/** - * Returns a Firebase Messaging scoped token for the firebase app. - * - * @return Null Returns null if the device has not yet been registerd with - * Firebase Message else returns a valid token. - */ -- (nullable NSString *)token; - -/** - * Returns a token that authorizes an Entity (example: cloud service) to perform - * an action on behalf of the application identified by Instance ID. - * - * This is similar to an OAuth2 token except, it applies to the - * application instance instead of a user. - * - * This is an asynchronous call. If the token fetching fails for some reason - * we invoke the completion callback with nil `token` and the appropriate - * error. - * - * Note, you can only have one `token` or `deleteToken` call for a given - * authorizedEntity and scope at any point of time. Making another such call with the - * same authorizedEntity and scope before the last one finishes will result in an - * error with code `OperationInProgress`. - * - * @see FIRInstanceID deleteTokenWithAuthorizedEntity:scope:handler: - * - * @param authorizedEntity Entity authorized by the token. - * @param scope Action authorized for authorizedEntity. - * @param options The extra options to be sent with your token request. The - * value for the `apns_token` should be the NSData object - * passed to UIApplication's - * `didRegisterForRemoteNotificationsWithDeviceToken` method. - * All other keys and values in the options dict need to be - * instances of NSString or else they will be discarded. Bundle - * keys starting with 'GCM.' and 'GOOGLE.' are reserved. - * @param handler The callback handler which is invoked when the token is - * successfully fetched. In case of success a valid `token` and - * `nil` error are returned. In case of any error the `token` - * is nil and a valid `error` is returned. The valid error - * codes have been documented above. - */ -- (void)tokenWithAuthorizedEntity:(nonnull NSString *)authorizedEntity - scope:(nonnull NSString *)scope - options:(nonnull NSDictionary *)options - handler:(nonnull FIRInstanceIDTokenHandler)handler; - -/** - * Revokes access to a scope (action) for an entity previously - * authorized by `[FIRInstanceID tokenWithAuthorizedEntity:scope:options:handler]`. - * - * This is an asynchronous call. Call this on the main thread since InstanceID lib - * is not thread safe. In case token deletion fails for some reason we invoke the - * `handler` callback passed in with the appropriate error code. - * - * Note, you can only have one `token` or `deleteToken` call for a given - * authorizedEntity and scope at a point of time. Making another such call with the - * same authorizedEntity and scope before the last one finishes will result in an error - * with code `OperationInProgress`. - * - * @param authorizedEntity Entity that must no longer have access. - * @param scope Action that entity is no longer authorized to perform. - * @param handler The handler that is invoked once the unsubscribe call ends. - * In case of error an appropriate error object is returned - * else error is nil. - */ -- (void)deleteTokenWithAuthorizedEntity:(nonnull NSString *)authorizedEntity - scope:(nonnull NSString *)scope - handler:(nonnull FIRInstanceIDDeleteTokenHandler)handler; - -#pragma mark - Identity - -/** - * Asynchronously fetch a stable identifier that uniquely identifies the app - * instance. If the identifier has been revoked or has expired, this method will - * return a new identifier. - * - * - * @param handler The handler to invoke once the identifier has been fetched. - * In case of error an appropriate error object is returned else - * a valid identifier is returned and a valid identifier for the - * application instance. - */ -- (void)getIDWithHandler:(nonnull FIRInstanceIDHandler)handler; - -/** - * Resets Instance ID and revokes all tokens. - */ -- (void)deleteIDWithHandler:(nonnull FIRInstanceIDDeleteHandler)handler; - -@end diff --git a/Project 29 - Grocr/Pods/Headers/Public/FirebaseInstanceID/FirebaseInstanceID/FIRInstanceID.h b/Project 29 - Grocr/Pods/Headers/Public/FirebaseInstanceID/FirebaseInstanceID/FIRInstanceID.h deleted file mode 100644 index 717e290a..00000000 --- a/Project 29 - Grocr/Pods/Headers/Public/FirebaseInstanceID/FirebaseInstanceID/FIRInstanceID.h +++ /dev/null @@ -1,245 +0,0 @@ -#import - -/** - * @memberof FIRInstanceID - * - * The scope to be used when fetching/deleting a token for Firebase Messaging. - */ -FOUNDATION_EXPORT NSString * __nonnull const kFIRInstanceIDScopeFirebaseMessaging; - -/** - * Called when the system determines that tokens need to be refreshed. - * This method is also called if Instance ID has been reset in which - * case, tokens and FCM topic subscriptions also need to be refreshed. - * - * Instance ID service will throttle the refresh event across all devices - * to control the rate of token updates on application servers. - */ -FOUNDATION_EXPORT NSString * __nonnull const kFIRInstanceIDTokenRefreshNotification; - -/** - * @related FIRInstanceID - * - * The completion handler invoked when the InstanceID token returns. If - * the call fails we return the appropriate `error code` as described below. - * - * @param token The valid token as returned by InstanceID backend. - * - * @param error The error describing why generating a new token - * failed. See the error codes below for a more detailed - * description. - */ -typedef void(^FIRInstanceIDTokenHandler)( NSString * __nullable token, NSError * __nullable error); - - -/** - * @related FIRInstanceID - * - * The completion handler invoked when the InstanceID `deleteToken` returns. If - * the call fails we return the appropriate `error code` as described below - * - * @param error The error describing why deleting the token failed. - * See the error codes below for a more detailed description. - */ -typedef void(^FIRInstanceIDDeleteTokenHandler)(NSError * __nullable error); - -/** - * @related FIRInstanceID - * - * The completion handler invoked when the app identity is created. If the - * identity wasn't created for some reason we return the appropriate error code. - * - * @param identity A valid identity for the app instance, nil if there was an error - * while creating an identity. - * @param error The error if fetching the identity fails else nil. - */ -typedef void(^FIRInstanceIDHandler)(NSString * __nullable identity, NSError * __nullable error); - -/** - * @related FIRInstanceID - * - * The completion handler invoked when the app identity and all the tokens associated - * with it are deleted. Returns a valid error object in case of failure else nil. - * - * @param error The error if deleting the identity and all the tokens associated with - * it fails else nil. - */ -typedef void(^FIRInstanceIDDeleteHandler)(NSError * __nullable error); - -/** - * @enum FIRInstanceIDError - */ -typedef NS_ENUM(NSUInteger, FIRInstanceIDError) { - // Http related errors. - - /// Unknown error. - FIRInstanceIDErrorUnknown = 0, - - /// Auth Error -- GCM couldn't validate request from this client. - FIRInstanceIDErrorAuthentication = 1, - - /// NoAccess -- InstanceID service cannot be accessed. - FIRInstanceIDErrorNoAccess = 2, - - /// Timeout -- Request to InstanceID backend timed out. - FIRInstanceIDErrorTimeout = 3, - - /// Network -- No network available to reach the servers. - FIRInstanceIDErrorNetwork = 4, - - /// OperationInProgress -- Another similar operation in progress, - /// bailing this one. - FIRInstanceIDErrorOperationInProgress = 5, - - /// InvalidRequest -- Some parameters of the request were invalid. - FIRInstanceIDErrorInvalidRequest = 7, -}; - -/** - * The APNS token type for the app. If the token type is set to `UNKNOWN` - * InstanceID will implicitly try to figure out what the actual token type - * is from the provisioning profile. - */ -typedef NS_ENUM(NSInteger, FIRInstanceIDAPNSTokenType) { - /// Unknown token type. - FIRInstanceIDAPNSTokenTypeUnknown, - /// Sandbox token type. - FIRInstanceIDAPNSTokenTypeSandbox, - /// Production token type. - FIRInstanceIDAPNSTokenTypeProd, -}; - -/** - * Instance ID provides a unique identifier for each app instance and a mechanism - * to authenticate and authorize actions (for example, sending a GCM message). - * - * Instance ID is long lived but, may be reset if the device is not used for - * a long time or the Instance ID service detects a problem. - * If Instance ID is reset, the app will be notified with a `com.firebase.iid.token-refresh` - * notification. - * - * If the Instance ID has become invalid, the app can request a new one and - * send it to the app server. - * To prove ownership of Instance ID and to allow servers to access data or - * services associated with the app, call - * `[FIRInstanceID tokenWithAuthorizedEntity:scope:options:handler]`. - */ -@interface FIRInstanceID : NSObject - -/** - * FIRInstanceID. - * - * @return A shared instance of FIRInstanceID. - */ -+ (nonnull instancetype)instanceID NS_SWIFT_NAME(instanceID()); - -/** - * Unavailable. Use +instanceID instead. - */ -- (nonnull instancetype)init __attribute__((unavailable("Use +instanceID instead."))); - -/** - * Set APNS token for the application. This APNS token will be used to register - * with Firebase Messaging using `token` or - * `tokenWithAuthorizedEntity:scope:options:handler`. If the token type is set to - * `FIRInstanceIDAPNSTokenTypeUnknown` InstanceID will read the provisioning profile - * to find out the token type. - * - * @param token The APNS token for the application. - * @param type The APNS token type for the above token. - */ -- (void)setAPNSToken:(nonnull NSData *)token - type:(FIRInstanceIDAPNSTokenType)type; - -#pragma mark - Tokens - -/** - * Returns a Firebase Messaging scoped token for the firebase app. - * - * @return Null Returns null if the device has not yet been registerd with - * Firebase Message else returns a valid token. - */ -- (nullable NSString *)token; - -/** - * Returns a token that authorizes an Entity (example: cloud service) to perform - * an action on behalf of the application identified by Instance ID. - * - * This is similar to an OAuth2 token except, it applies to the - * application instance instead of a user. - * - * This is an asynchronous call. If the token fetching fails for some reason - * we invoke the completion callback with nil `token` and the appropriate - * error. - * - * Note, you can only have one `token` or `deleteToken` call for a given - * authorizedEntity and scope at any point of time. Making another such call with the - * same authorizedEntity and scope before the last one finishes will result in an - * error with code `OperationInProgress`. - * - * @see FIRInstanceID deleteTokenWithAuthorizedEntity:scope:handler: - * - * @param authorizedEntity Entity authorized by the token. - * @param scope Action authorized for authorizedEntity. - * @param options The extra options to be sent with your token request. The - * value for the `apns_token` should be the NSData object - * passed to UIApplication's - * `didRegisterForRemoteNotificationsWithDeviceToken` method. - * All other keys and values in the options dict need to be - * instances of NSString or else they will be discarded. Bundle - * keys starting with 'GCM.' and 'GOOGLE.' are reserved. - * @param handler The callback handler which is invoked when the token is - * successfully fetched. In case of success a valid `token` and - * `nil` error are returned. In case of any error the `token` - * is nil and a valid `error` is returned. The valid error - * codes have been documented above. - */ -- (void)tokenWithAuthorizedEntity:(nonnull NSString *)authorizedEntity - scope:(nonnull NSString *)scope - options:(nullable NSDictionary *)options - handler:(nonnull FIRInstanceIDTokenHandler)handler; - -/** - * Revokes access to a scope (action) for an entity previously - * authorized by `[FIRInstanceID tokenWithAuthorizedEntity:scope:options:handler]`. - * - * This is an asynchronous call. Call this on the main thread since InstanceID lib - * is not thread safe. In case token deletion fails for some reason we invoke the - * `handler` callback passed in with the appropriate error code. - * - * Note, you can only have one `token` or `deleteToken` call for a given - * authorizedEntity and scope at a point of time. Making another such call with the - * same authorizedEntity and scope before the last one finishes will result in an error - * with code `OperationInProgress`. - * - * @param authorizedEntity Entity that must no longer have access. - * @param scope Action that entity is no longer authorized to perform. - * @param handler The handler that is invoked once the unsubscribe call ends. - * In case of error an appropriate error object is returned - * else error is nil. - */ -- (void)deleteTokenWithAuthorizedEntity:(nonnull NSString *)authorizedEntity - scope:(nonnull NSString *)scope - handler:(nonnull FIRInstanceIDDeleteTokenHandler)handler; - -#pragma mark - Identity - -/** - * Asynchronously fetch a stable identifier that uniquely identifies the app - * instance. If the identifier has been revoked or has expired, this method will - * return a new identifier. - * - * - * @param handler The handler to invoke once the identifier has been fetched. - * In case of error an appropriate error object is returned else - * a valid identifier is returned and a valid identifier for the - * application instance. - */ -- (void)getIDWithHandler:(nonnull FIRInstanceIDHandler)handler; - -/** - * Resets Instance ID and revokes all tokens. - */ -- (void)deleteIDWithHandler:(nonnull FIRInstanceIDDeleteHandler)handler; - -@end diff --git a/Project 29 - Grocr/Pods/Headers/Public/FirebaseInstanceID/FirebaseInstanceID/FirebaseInstanceID.h b/Project 29 - Grocr/Pods/Headers/Public/FirebaseInstanceID/FirebaseInstanceID/FirebaseInstanceID.h deleted file mode 100644 index 053ec2b1..00000000 --- a/Project 29 - Grocr/Pods/Headers/Public/FirebaseInstanceID/FirebaseInstanceID/FirebaseInstanceID.h +++ /dev/null @@ -1 +0,0 @@ -#import "FIRInstanceID.h" diff --git a/Project 29 - Grocr/Pods/Manifest.lock b/Project 29 - Grocr/Pods/Manifest.lock deleted file mode 100644 index b0a34d1a..00000000 --- a/Project 29 - Grocr/Pods/Manifest.lock +++ /dev/null @@ -1,53 +0,0 @@ -PODS: - - Firebase/Analytics (3.3.0): - - FirebaseAnalytics (= 3.2.1) - - Firebase/Auth (3.3.0): - - Firebase/Analytics (= 3.3.0) - - FirebaseAuth (= 3.0.3) - - Firebase/Core (3.3.0): - - Firebase/Analytics (= 3.3.0) - - Firebase/Database (3.3.0): - - Firebase/Analytics (= 3.3.0) - - FirebaseDatabase (= 3.0.2) - - FirebaseAnalytics (3.2.1): - - FirebaseInstanceID (~> 1.0) - - GoogleInterchangeUtilities (~> 1.2) - - GoogleSymbolUtilities (~> 1.1) - - GoogleUtilities (~> 1.3) - - FirebaseAuth (3.0.3): - - FirebaseAnalytics (~> 3.2) - - GoogleNetworkingUtilities (~> 1.2) - - GoogleParsingUtilities (~> 1.1) - - GoogleUtilities (~> 1.3) - - FirebaseDatabase (3.0.2): - - FirebaseAnalytics (~> 3.2) - - FirebaseInstanceID (1.0.7) - - GoogleInterchangeUtilities (1.2.1): - - GoogleSymbolUtilities (~> 1.0) - - GoogleNetworkingUtilities (1.2.1): - - GoogleSymbolUtilities (~> 1.0) - - GoogleParsingUtilities (1.1.1): - - GoogleNetworkingUtilities (~> 1.0) - - GoogleSymbolUtilities (~> 1.0) - - GoogleSymbolUtilities (1.1.1) - - GoogleUtilities (1.3.1): - - GoogleSymbolUtilities (~> 1.0) - -DEPENDENCIES: - - Firebase/Auth - - Firebase/Core - - Firebase/Database - -SPEC CHECKSUMS: - Firebase: 6250071f0e2440a5c4c67b8cb6b868f868237ac3 - FirebaseAnalytics: 0fd6532cb2c3d03cd5cf26ad295ccb091efd3104 - FirebaseAuth: 5efddc3fae47042b73585f083f956462be4f5b8e - FirebaseDatabase: 59bea2e7dfd81b3b8b2f8e396caf1a52c2ced6f7 - FirebaseInstanceID: a9d923f3d0b6fbf9fac89310860357aaadc34be5 - GoogleInterchangeUtilities: def8415a862effc67d549d5b5b0b9c7a2f97d4de - GoogleNetworkingUtilities: 3e83269048cfb498dc7ec83ab36813360965c74f - GoogleParsingUtilities: 30b3896f9ee167dc78747f013d3de157ced1cadf - GoogleSymbolUtilities: 33117db1b5f290c6fbf259585e4885b4c84b98d7 - GoogleUtilities: 56c5ac05b7aa5dc417a1bb85221a9516e04d7032 - -COCOAPODS: 0.39.0 diff --git a/Project 29 - Grocr/Pods/Pods.xcodeproj/project.pbxproj b/Project 29 - Grocr/Pods/Pods.xcodeproj/project.pbxproj deleted file mode 100644 index 3a36eddf..00000000 --- a/Project 29 - Grocr/Pods/Pods.xcodeproj/project.pbxproj +++ /dev/null @@ -1,1026 +0,0 @@ - - - - - archiveVersion - 1 - classes - - objectVersion - 46 - objects - - 012C860C878E6DDA29E3E53FF2BB3B98 - - isa - PBXFileReference - lastKnownFileType - wrapper.framework - name - FirebaseInstanceID.framework - path - Frameworks/FirebaseInstanceID.framework - sourceTree - <group> - - 037C0CA694176A3C0915F62C9D20B3E6 - - children - - B3D1D13E0C6553800746CB8FD61CF946 - - isa - PBXGroup - name - Targets Support Files - sourceTree - <group> - - 0890A1688208A28DD9B7369FC1633AC1 - - children - - 85A726589F1C1B9DC08D00894A4A8D38 - F6DFF932C5710D959872647F8D2E7670 - - isa - PBXGroup - name - FirebaseInstanceID - path - FirebaseInstanceID - sourceTree - <group> - - 0AD1568E830A0DBD6CA6DCD4EEB8261D - - isa - PBXFileReference - lastKnownFileType - wrapper.framework - name - FirebaseDatabase.framework - path - Frameworks/FirebaseDatabase.framework - sourceTree - <group> - - 10834806BD7B412BC24F347361FA2C8E - - includeInIndex - 1 - isa - PBXFileReference - lastKnownFileType - text.plist.xml - path - Pods-acknowledgements.plist - sourceTree - <group> - - 1469924FC52F60B0068FA24EEFCB3EFC - - buildConfigurationList - 5C358AA8BB91700063133597D41C4E0E - buildPhases - - 60DB2522D6809309FA2F3B04848E7536 - 2E78C4AC537A1782BCFD134B2B8940E0 - - buildRules - - dependencies - - isa - PBXNativeTarget - name - Pods - productName - Pods - productReference - BFDCEDF11CC5329E8A2F6885DA7FBE21 - productType - com.apple.product-type.library.static - - 1546ED4A2B55C0A278488955D7688CDA - - children - - F5D95B9F58DFC78F78E36B6302656AAF - - isa - PBXGroup - name - FirebaseAnalytics - path - FirebaseAnalytics - sourceTree - <group> - - 1CB6890C5928A0ABD9DF237DB4D6E4BC - - children - - 37E7AEDDB7925A9E39351B87EB4A27CE - - isa - PBXGroup - name - Frameworks - sourceTree - <group> - - 1F0B9F713A13B4F29BE0C0E7483B187B - - children - - BFDCEDF11CC5329E8A2F6885DA7FBE21 - - isa - PBXGroup - name - Products - sourceTree - <group> - - 21682BA27A4EBB2926BB5210B6780883 - - children - - 35E175B5673FE4D2E0C1F76826E42F7C - - isa - PBXGroup - name - Analytics - sourceTree - <group> - - 21A2C8BC661C678B137E3A3D2B8BD254 - - children - - E74246C4A74C8411630C6ECF322475BD - - isa - PBXGroup - name - GoogleUtilities - path - GoogleUtilities - sourceTree - <group> - - 254CC2549EC5EFDA48F0A788DA320609 - - children - - 1CB6890C5928A0ABD9DF237DB4D6E4BC - - isa - PBXGroup - name - GoogleNetworkingUtilities - path - GoogleNetworkingUtilities - sourceTree - <group> - - 272643F56613CA0D336AE3DBF19DC404 - - includeInIndex - 1 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.objc - path - Pods-dummy.m - sourceTree - <group> - - 2D8E8EC45A3A1A1D94AE762CB5028504 - - buildConfigurations - - 5CE5176205D06FF3FFE3DDDA9291E44B - 74857149DC1E0D599B8A01A78349A926 - - defaultConfigurationIsVisible - 0 - defaultConfigurationName - Release - isa - XCConfigurationList - - 2E78C4AC537A1782BCFD134B2B8940E0 - - buildActionMask - 2147483647 - files - - 6E579FF358AF2261C8682A7FA383EAA6 - - isa - PBXFrameworksBuildPhase - runOnlyForDeploymentPostprocessing - 0 - - 35E175B5673FE4D2E0C1F76826E42F7C - - includeInIndex - 1 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - name - Firebase.h - path - Headers/Firebase.h - sourceTree - <group> - - 37DB56D75062CC75FCB0966E1C6E8A8E - - includeInIndex - 1 - isa - PBXFileReference - lastKnownFileType - text - path - Pods-acknowledgements.markdown - sourceTree - <group> - - 37E7AEDDB7925A9E39351B87EB4A27CE - - isa - PBXFileReference - lastKnownFileType - wrapper.framework - name - GoogleNetworkingUtilities.framework - path - Frameworks/GoogleNetworkingUtilities.framework - sourceTree - <group> - - 3E4E89230EF59BC255123B67864ACF77 - - isa - PBXFileReference - lastKnownFileType - wrapper.framework - name - Foundation.framework - path - Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.0.sdk/System/Library/Frameworks/Foundation.framework - sourceTree - DEVELOPER_DIR - - 4CE51720A521314D5E46F1780D087B05 - - children - - C5FD6B0D0FADFE345EE4C12522AEE235 - - isa - PBXGroup - name - Frameworks - sourceTree - <group> - - 4E762F23EC34ED4A6FF3312D84E33A40 - - includeInIndex - 1 - isa - PBXFileReference - lastKnownFileType - text.xcconfig - path - Pods.debug.xcconfig - sourceTree - <group> - - 5010F559BAF4B581A2D0BBAD609AC228 - - children - - 21682BA27A4EBB2926BB5210B6780883 - - isa - PBXGroup - name - Firebase - path - Firebase - sourceTree - <group> - - 5C358AA8BB91700063133597D41C4E0E - - buildConfigurations - - 6E2AD5B821A62E102564319D42EA2C7D - BA1562965E3B6B9CD7EB0EC76CC631BE - - defaultConfigurationIsVisible - 0 - defaultConfigurationName - Release - isa - XCConfigurationList - - 5CE5176205D06FF3FFE3DDDA9291E44B - - buildSettings - - ALWAYS_SEARCH_USER_PATHS - NO - CLANG_CXX_LANGUAGE_STANDARD - gnu++0x - CLANG_CXX_LIBRARY - libc++ - CLANG_ENABLE_MODULES - YES - CLANG_ENABLE_OBJC_ARC - YES - CLANG_WARN_BOOL_CONVERSION - YES - CLANG_WARN_CONSTANT_CONVERSION - YES - CLANG_WARN_DIRECT_OBJC_ISA_USAGE - YES - CLANG_WARN_EMPTY_BODY - YES - CLANG_WARN_ENUM_CONVERSION - YES - CLANG_WARN_INT_CONVERSION - YES - CLANG_WARN_OBJC_ROOT_CLASS - YES - CLANG_WARN_UNREACHABLE_CODE - YES - CLANG_WARN__DUPLICATE_METHOD_MATCH - YES - COPY_PHASE_STRIP - NO - GCC_C_LANGUAGE_STANDARD - gnu99 - GCC_DYNAMIC_NO_PIC - NO - GCC_OPTIMIZATION_LEVEL - 0 - GCC_PREPROCESSOR_DEFINITIONS - - DEBUG=1 - $(inherited) - - GCC_SYMBOLS_PRIVATE_EXTERN - NO - GCC_WARN_64_TO_32_BIT_CONVERSION - YES - GCC_WARN_ABOUT_RETURN_TYPE - YES - GCC_WARN_UNDECLARED_SELECTOR - YES - GCC_WARN_UNINITIALIZED_AUTOS - YES - GCC_WARN_UNUSED_FUNCTION - YES - GCC_WARN_UNUSED_VARIABLE - YES - IPHONEOS_DEPLOYMENT_TARGET - 9.0 - ONLY_ACTIVE_ARCH - YES - STRIP_INSTALLED_PRODUCT - NO - SYMROOT - ${SRCROOT}/../build - - isa - XCBuildConfiguration - name - Debug - - 60DB2522D6809309FA2F3B04848E7536 - - buildActionMask - 2147483647 - files - - B991A49F4C12A4F8462C02B69D83DB11 - - isa - PBXSourcesBuildPhase - runOnlyForDeploymentPostprocessing - 0 - - 662BF7D9F557AC9425935F9A211470AD - - isa - PBXFileReference - lastKnownFileType - wrapper.framework - name - GoogleSymbolUtilities.framework - path - Frameworks/GoogleSymbolUtilities.framework - sourceTree - <group> - - 6911BECA35E7518D864239B7E898EEF3 - - includeInIndex - 1 - isa - PBXFileReference - lastKnownFileType - text.script.sh - path - Pods-frameworks.sh - sourceTree - <group> - - 6E2AD5B821A62E102564319D42EA2C7D - - baseConfigurationReference - 4E762F23EC34ED4A6FF3312D84E33A40 - buildSettings - - ENABLE_STRICT_OBJC_MSGSEND - YES - IPHONEOS_DEPLOYMENT_TARGET - 9.0 - MACH_O_TYPE - staticlib - MTL_ENABLE_DEBUG_INFO - YES - OTHER_LDFLAGS - - OTHER_LIBTOOLFLAGS - - PODS_ROOT - $(SRCROOT) - PRODUCT_NAME - $(TARGET_NAME) - SDKROOT - iphoneos - SKIP_INSTALL - YES - - isa - XCBuildConfiguration - name - Debug - - 6E579FF358AF2261C8682A7FA383EAA6 - - fileRef - 3E4E89230EF59BC255123B67864ACF77 - isa - PBXBuildFile - - 6EBA67C730923027B77F6CC4FEE999B3 - - children - - 0AD1568E830A0DBD6CA6DCD4EEB8261D - - isa - PBXGroup - name - Frameworks - sourceTree - <group> - - 732B7AC4B7BF5A35D30561E0DC7F356E - - children - - 6EBA67C730923027B77F6CC4FEE999B3 - - isa - PBXGroup - name - FirebaseDatabase - path - FirebaseDatabase - sourceTree - <group> - - 74857149DC1E0D599B8A01A78349A926 - - buildSettings - - ALWAYS_SEARCH_USER_PATHS - NO - CLANG_CXX_LANGUAGE_STANDARD - gnu++0x - CLANG_CXX_LIBRARY - libc++ - CLANG_ENABLE_MODULES - YES - CLANG_ENABLE_OBJC_ARC - YES - CLANG_WARN_BOOL_CONVERSION - YES - CLANG_WARN_CONSTANT_CONVERSION - YES - CLANG_WARN_DIRECT_OBJC_ISA_USAGE - YES - CLANG_WARN_EMPTY_BODY - YES - CLANG_WARN_ENUM_CONVERSION - YES - CLANG_WARN_INT_CONVERSION - YES - CLANG_WARN_OBJC_ROOT_CLASS - YES - CLANG_WARN_UNREACHABLE_CODE - YES - CLANG_WARN__DUPLICATE_METHOD_MATCH - YES - COPY_PHASE_STRIP - YES - ENABLE_NS_ASSERTIONS - NO - GCC_C_LANGUAGE_STANDARD - gnu99 - GCC_PREPROCESSOR_DEFINITIONS - - RELEASE=1 - - GCC_WARN_64_TO_32_BIT_CONVERSION - YES - GCC_WARN_ABOUT_RETURN_TYPE - YES - GCC_WARN_UNDECLARED_SELECTOR - YES - GCC_WARN_UNINITIALIZED_AUTOS - YES - GCC_WARN_UNUSED_FUNCTION - YES - GCC_WARN_UNUSED_VARIABLE - YES - IPHONEOS_DEPLOYMENT_TARGET - 9.0 - STRIP_INSTALLED_PRODUCT - NO - SYMROOT - ${SRCROOT}/../build - VALIDATE_PRODUCT - YES - - isa - XCBuildConfiguration - name - Release - - 7AFEFA9CAC2E0695A643A6FE109745CB - - children - - CB440934A214E7B1A28A640A5178B5CF - - isa - PBXGroup - name - FirebaseAuth - path - FirebaseAuth - sourceTree - <group> - - 7DB346D0F39D3F0E887471402A8071AB - - children - - BA6428E9F66FD5A23C0A2E06ED26CD2F - BC3CA7F9E30CC8F7E2DD044DD34432FC - DFAEE58E41FEB79E2A095B402D1F99FA - 1F0B9F713A13B4F29BE0C0E7483B187B - 037C0CA694176A3C0915F62C9D20B3E6 - - isa - PBXGroup - sourceTree - <group> - - 85A726589F1C1B9DC08D00894A4A8D38 - - includeInIndex - 1 - isa - PBXFileReference - lastKnownFileType - sourcecode.c.h - name - FIRInstanceID.h - path - Headers/Public/FIRInstanceID.h - sourceTree - <group> - - 8CE86DD4F8BA2FDE545816D21D94DC79 - - children - - A3F18049928ABBBC6BB92196EFADD047 - - isa - PBXGroup - name - GoogleParsingUtilities - path - GoogleParsingUtilities - sourceTree - <group> - - 9655B9A8A0F40AD128DF4CBCA02C90B1 - - isa - PBXFileReference - lastKnownFileType - wrapper.framework - name - GoogleParsingUtilities.framework - path - Frameworks/GoogleParsingUtilities.framework - sourceTree - <group> - - 98C98CDFB3F20F2925F6CD1F141BB14F - - includeInIndex - 1 - isa - PBXFileReference - lastKnownFileType - text.xcconfig - path - Pods.release.xcconfig - sourceTree - <group> - - 99809E3440D851732861B083AEE89981 - - children - - 662BF7D9F557AC9425935F9A211470AD - - isa - PBXGroup - name - Frameworks - sourceTree - <group> - - A1A36D34413696BE466E2CA0AFF194DA - - includeInIndex - 1 - isa - PBXFileReference - lastKnownFileType - text.script.sh - path - Pods-resources.sh - sourceTree - <group> - - A33177A3F1C140BB331FE267B0360B55 - - children - - 4CE51720A521314D5E46F1780D087B05 - - isa - PBXGroup - name - GoogleInterchangeUtilities - path - GoogleInterchangeUtilities - sourceTree - <group> - - A3F18049928ABBBC6BB92196EFADD047 - - children - - 9655B9A8A0F40AD128DF4CBCA02C90B1 - - isa - PBXGroup - name - Frameworks - sourceTree - <group> - - B3D1D13E0C6553800746CB8FD61CF946 - - children - - 37DB56D75062CC75FCB0966E1C6E8A8E - 10834806BD7B412BC24F347361FA2C8E - 272643F56613CA0D336AE3DBF19DC404 - 6911BECA35E7518D864239B7E898EEF3 - A1A36D34413696BE466E2CA0AFF194DA - 4E762F23EC34ED4A6FF3312D84E33A40 - 98C98CDFB3F20F2925F6CD1F141BB14F - - isa - PBXGroup - name - Pods - path - Target Support Files/Pods - sourceTree - <group> - - B991A49F4C12A4F8462C02B69D83DB11 - - fileRef - 272643F56613CA0D336AE3DBF19DC404 - isa - PBXBuildFile - - BA1562965E3B6B9CD7EB0EC76CC631BE - - baseConfigurationReference - 98C98CDFB3F20F2925F6CD1F141BB14F - buildSettings - - ENABLE_STRICT_OBJC_MSGSEND - YES - IPHONEOS_DEPLOYMENT_TARGET - 9.0 - MACH_O_TYPE - staticlib - MTL_ENABLE_DEBUG_INFO - NO - OTHER_LDFLAGS - - OTHER_LIBTOOLFLAGS - - PODS_ROOT - $(SRCROOT) - PRODUCT_NAME - $(TARGET_NAME) - SDKROOT - iphoneos - SKIP_INSTALL - YES - - isa - XCBuildConfiguration - name - Release - - BA6428E9F66FD5A23C0A2E06ED26CD2F - - includeInIndex - 1 - isa - PBXFileReference - lastKnownFileType - text - name - Podfile - path - ../Podfile - sourceTree - SOURCE_ROOT - xcLanguageSpecificationIdentifier - xcode.lang.ruby - - BBC6F2FB2556C157DF5EE716018726B6 - - isa - PBXFileReference - lastKnownFileType - wrapper.framework - name - FirebaseAnalytics.framework - path - Frameworks/frameworks/FirebaseAnalytics.framework - sourceTree - <group> - - BC3CA7F9E30CC8F7E2DD044DD34432FC - - children - - BF6342C8B29F4CEEA088EFF7AB4DE362 - - isa - PBXGroup - name - Frameworks - sourceTree - <group> - - BF6342C8B29F4CEEA088EFF7AB4DE362 - - children - - 3E4E89230EF59BC255123B67864ACF77 - - isa - PBXGroup - name - iOS - sourceTree - <group> - - BFDCEDF11CC5329E8A2F6885DA7FBE21 - - explicitFileType - archive.ar - includeInIndex - 0 - isa - PBXFileReference - name - libPods.a - path - libPods.a - sourceTree - BUILT_PRODUCTS_DIR - - C15F99FE1CD1C2F7CACD029F566331B5 - - isa - PBXFileReference - lastKnownFileType - wrapper.framework - name - GoogleUtilities.framework - path - Frameworks/GoogleUtilities.framework - sourceTree - <group> - - C5FD6B0D0FADFE345EE4C12522AEE235 - - isa - PBXFileReference - lastKnownFileType - wrapper.framework - name - GoogleInterchangeUtilities.framework - path - Frameworks/GoogleInterchangeUtilities.framework - sourceTree - <group> - - CB440934A214E7B1A28A640A5178B5CF - - children - - D49AD3BD1591E1FAC6A468B095EBFCA6 - - isa - PBXGroup - name - Frameworks - sourceTree - <group> - - D38544B74C25B9DD6F972E44B6D2B347 - - children - - 99809E3440D851732861B083AEE89981 - - isa - PBXGroup - name - GoogleSymbolUtilities - path - GoogleSymbolUtilities - sourceTree - <group> - - D41D8CD98F00B204E9800998ECF8427E - - attributes - - LastSwiftUpdateCheck - 0700 - LastUpgradeCheck - 0700 - - buildConfigurationList - 2D8E8EC45A3A1A1D94AE762CB5028504 - compatibilityVersion - Xcode 3.2 - developmentRegion - English - hasScannedForEncodings - 0 - isa - PBXProject - knownRegions - - en - - mainGroup - 7DB346D0F39D3F0E887471402A8071AB - productRefGroup - 1F0B9F713A13B4F29BE0C0E7483B187B - projectDirPath - - projectReferences - - projectRoot - - targets - - 1469924FC52F60B0068FA24EEFCB3EFC - - - D49AD3BD1591E1FAC6A468B095EBFCA6 - - isa - PBXFileReference - lastKnownFileType - wrapper.framework - name - FirebaseAuth.framework - path - Frameworks/frameworks/FirebaseAuth.framework - sourceTree - <group> - - DFAEE58E41FEB79E2A095B402D1F99FA - - children - - 5010F559BAF4B581A2D0BBAD609AC228 - 1546ED4A2B55C0A278488955D7688CDA - 7AFEFA9CAC2E0695A643A6FE109745CB - 732B7AC4B7BF5A35D30561E0DC7F356E - 0890A1688208A28DD9B7369FC1633AC1 - A33177A3F1C140BB331FE267B0360B55 - 254CC2549EC5EFDA48F0A788DA320609 - 8CE86DD4F8BA2FDE545816D21D94DC79 - D38544B74C25B9DD6F972E44B6D2B347 - 21A2C8BC661C678B137E3A3D2B8BD254 - - isa - PBXGroup - name - Pods - sourceTree - <group> - - E74246C4A74C8411630C6ECF322475BD - - children - - C15F99FE1CD1C2F7CACD029F566331B5 - - isa - PBXGroup - name - Frameworks - sourceTree - <group> - - F5D95B9F58DFC78F78E36B6302656AAF - - children - - BBC6F2FB2556C157DF5EE716018726B6 - - isa - PBXGroup - name - Frameworks - sourceTree - <group> - - F6DFF932C5710D959872647F8D2E7670 - - children - - 012C860C878E6DDA29E3E53FF2BB3B98 - - isa - PBXGroup - name - Frameworks - sourceTree - <group> - - - rootObject - D41D8CD98F00B204E9800998ECF8427E - - diff --git a/Project 29 - Grocr/Pods/Pods.xcodeproj/xcuserdata/Attila.xcuserdatad/xcschemes/Pods.xcscheme b/Project 29 - Grocr/Pods/Pods.xcodeproj/xcuserdata/Attila.xcuserdatad/xcschemes/Pods.xcscheme deleted file mode 100644 index 94e2d893..00000000 --- a/Project 29 - Grocr/Pods/Pods.xcodeproj/xcuserdata/Attila.xcuserdatad/xcschemes/Pods.xcscheme +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Project 29 - Grocr/Pods/Pods.xcodeproj/xcuserdata/Attila.xcuserdatad/xcschemes/xcschememanagement.plist b/Project 29 - Grocr/Pods/Pods.xcodeproj/xcuserdata/Attila.xcuserdatad/xcschemes/xcschememanagement.plist deleted file mode 100644 index a1f716ad..00000000 --- a/Project 29 - Grocr/Pods/Pods.xcodeproj/xcuserdata/Attila.xcuserdatad/xcschemes/xcschememanagement.plist +++ /dev/null @@ -1,22 +0,0 @@ - - - - - SchemeUserState - - Pods.xcscheme - - isShown - - - - SuppressBuildableAutocreation - - 1469924FC52F60B0068FA24EEFCB3EFC - - primary - - - - - diff --git a/Project 29 - Grocr/Pods/Pods.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/Pods.xcscheme b/Project 29 - Grocr/Pods/Pods.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/Pods.xcscheme deleted file mode 100644 index 77397998..00000000 --- a/Project 29 - Grocr/Pods/Pods.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/Pods.xcscheme +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Project 29 - Grocr/Pods/Pods.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/xcschememanagement.plist b/Project 29 - Grocr/Pods/Pods.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/xcschememanagement.plist deleted file mode 100644 index 65aa8143..00000000 --- a/Project 29 - Grocr/Pods/Pods.xcodeproj/xcuserdata/Yi.xcuserdatad/xcschemes/xcschememanagement.plist +++ /dev/null @@ -1,22 +0,0 @@ - - - - - SchemeUserState - - Pods.xcscheme - - orderHint - 1 - - - SuppressBuildableAutocreation - - 1469924FC52F60B0068FA24EEFCB3EFC - - primary - - - - - diff --git a/Project 29 - Grocr/Pods/Target Support Files/Pods/Pods-acknowledgements.markdown b/Project 29 - Grocr/Pods/Target Support Files/Pods/Pods-acknowledgements.markdown deleted file mode 100644 index 2c6202a9..00000000 --- a/Project 29 - Grocr/Pods/Target Support Files/Pods/Pods-acknowledgements.markdown +++ /dev/null @@ -1,43 +0,0 @@ -# Acknowledgements -This application makes use of the following third party libraries: - -## Firebase - -Copyright 2016 Google Inc. - -## FirebaseAnalytics - -Copyright 2016 Google - -## FirebaseAuth - -Copyright 2016 Google - -## FirebaseDatabase - -Copyright 2016 Google - -## FirebaseInstanceID - -Copyright 2016 Google Inc. - -## GoogleInterchangeUtilities - -Copyright 2015 Google Inc. - -## GoogleNetworkingUtilities - -Copyright 2015 Google Inc. - -## GoogleParsingUtilities - -Copyright 2015 Google Inc. - -## GoogleSymbolUtilities - -Copyright 2015 Google Inc. - -## GoogleUtilities - -Copyright 2015 Google Inc. -Generated by CocoaPods - http://cocoapods.org diff --git a/Project 29 - Grocr/Pods/Target Support Files/Pods/Pods-acknowledgements.plist b/Project 29 - Grocr/Pods/Target Support Files/Pods/Pods-acknowledgements.plist deleted file mode 100644 index da1219d1..00000000 --- a/Project 29 - Grocr/Pods/Target Support Files/Pods/Pods-acknowledgements.plist +++ /dev/null @@ -1,109 +0,0 @@ - - - - - PreferenceSpecifiers - - - FooterText - This application makes use of the following third party libraries: - Title - Acknowledgements - Type - PSGroupSpecifier - - - FooterText - Copyright 2016 Google Inc. - Title - Firebase - Type - PSGroupSpecifier - - - FooterText - Copyright 2016 Google - Title - FirebaseAnalytics - Type - PSGroupSpecifier - - - FooterText - Copyright 2016 Google - Title - FirebaseAuth - Type - PSGroupSpecifier - - - FooterText - Copyright 2016 Google - Title - FirebaseDatabase - Type - PSGroupSpecifier - - - FooterText - Copyright 2016 Google Inc. - Title - FirebaseInstanceID - Type - PSGroupSpecifier - - - FooterText - Copyright 2015 Google Inc. - Title - GoogleInterchangeUtilities - Type - PSGroupSpecifier - - - FooterText - Copyright 2015 Google Inc. - Title - GoogleNetworkingUtilities - Type - PSGroupSpecifier - - - FooterText - Copyright 2015 Google Inc. - Title - GoogleParsingUtilities - Type - PSGroupSpecifier - - - FooterText - Copyright 2015 Google Inc. - Title - GoogleSymbolUtilities - Type - PSGroupSpecifier - - - FooterText - Copyright 2015 Google Inc. - Title - GoogleUtilities - Type - PSGroupSpecifier - - - FooterText - Generated by CocoaPods - http://cocoapods.org - Title - - Type - PSGroupSpecifier - - - StringsTable - Acknowledgements - Title - Acknowledgements - - diff --git a/Project 29 - Grocr/Pods/Target Support Files/Pods/Pods-dummy.m b/Project 29 - Grocr/Pods/Target Support Files/Pods/Pods-dummy.m deleted file mode 100644 index ade64bd1..00000000 --- a/Project 29 - Grocr/Pods/Target Support Files/Pods/Pods-dummy.m +++ /dev/null @@ -1,5 +0,0 @@ -#import -@interface PodsDummy_Pods : NSObject -@end -@implementation PodsDummy_Pods -@end diff --git a/Project 29 - Grocr/Pods/Target Support Files/Pods/Pods-frameworks.sh b/Project 29 - Grocr/Pods/Target Support Files/Pods/Pods-frameworks.sh deleted file mode 100755 index 6f763443..00000000 --- a/Project 29 - Grocr/Pods/Target Support Files/Pods/Pods-frameworks.sh +++ /dev/null @@ -1,84 +0,0 @@ -#!/bin/sh -set -e - -echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" -mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" - -SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" - -install_framework() -{ - if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then - local source="${BUILT_PRODUCTS_DIR}/$1" - elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then - local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" - elif [ -r "$1" ]; then - local source="$1" - fi - - local destination="${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" - - if [ -L "${source}" ]; then - echo "Symlinked..." - source="$(readlink "${source}")" - fi - - # use filter instead of exclude so missing patterns dont' throw errors - echo "rsync -av --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" - rsync -av --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" - - local basename - basename="$(basename -s .framework "$1")" - binary="${destination}/${basename}.framework/${basename}" - if ! [ -r "$binary" ]; then - binary="${destination}/${basename}" - fi - - # Strip invalid architectures so "fat" simulator / device frameworks work on device - if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then - strip_invalid_archs "$binary" - fi - - # Resign the code if required by the build settings to avoid unstable apps - code_sign_if_enabled "${destination}/$(basename "$1")" - - # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7. - if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then - local swift_runtime_libs - swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u && exit ${PIPESTATUS[0]}) - for lib in $swift_runtime_libs; do - echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" - rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" - code_sign_if_enabled "${destination}/${lib}" - done - fi -} - -# Signs a framework with the provided identity -code_sign_if_enabled() { - if [ -n "${EXPANDED_CODE_SIGN_IDENTITY}" -a "${CODE_SIGNING_REQUIRED}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then - # Use the current code_sign_identitiy - echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" - echo "/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} --preserve-metadata=identifier,entitlements \"$1\"" - /usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} --preserve-metadata=identifier,entitlements "$1" - fi -} - -# Strip invalid architectures -strip_invalid_archs() { - binary="$1" - # Get architectures for current file - archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | rev)" - stripped="" - for arch in $archs; do - if ! [[ "${VALID_ARCHS}" == *"$arch"* ]]; then - # Strip non-valid architectures in-place - lipo -remove "$arch" -output "$binary" "$binary" || exit 1 - stripped="$stripped $arch" - fi - done - if [[ "$stripped" ]]; then - echo "Stripped $binary of architectures:$stripped" - fi -} - diff --git a/Project 29 - Grocr/Pods/Target Support Files/Pods/Pods-resources.sh b/Project 29 - Grocr/Pods/Target Support Files/Pods/Pods-resources.sh deleted file mode 100755 index 16774fb4..00000000 --- a/Project 29 - Grocr/Pods/Target Support Files/Pods/Pods-resources.sh +++ /dev/null @@ -1,95 +0,0 @@ -#!/bin/sh -set -e - -mkdir -p "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" - -RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt -> "$RESOURCES_TO_COPY" - -XCASSET_FILES=() - -realpath() { - DIRECTORY="$(cd "${1%/*}" && pwd)" - FILENAME="${1##*/}" - echo "$DIRECTORY/$FILENAME" -} - -install_resource() -{ - case $1 in - *.storyboard) - echo "ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .storyboard`.storyboardc ${PODS_ROOT}/$1 --sdk ${SDKROOT}" - ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .storyboard`.storyboardc" "${PODS_ROOT}/$1" --sdk "${SDKROOT}" - ;; - *.xib) - echo "ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .xib`.nib ${PODS_ROOT}/$1 --sdk ${SDKROOT}" - ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .xib`.nib" "${PODS_ROOT}/$1" --sdk "${SDKROOT}" - ;; - *.framework) - echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" - mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" - echo "rsync -av ${PODS_ROOT}/$1 ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" - rsync -av "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" - ;; - *.xcdatamodel) - echo "xcrun momc \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1"`.mom\"" - xcrun momc "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcdatamodel`.mom" - ;; - *.xcdatamodeld) - echo "xcrun momc \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcdatamodeld`.momd\"" - xcrun momc "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcdatamodeld`.momd" - ;; - *.xcmappingmodel) - echo "xcrun mapc \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcmappingmodel`.cdm\"" - xcrun mapc "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcmappingmodel`.cdm" - ;; - *.xcassets) - ABSOLUTE_XCASSET_FILE=$(realpath "${PODS_ROOT}/$1") - XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") - ;; - /*) - echo "$1" - echo "$1" >> "$RESOURCES_TO_COPY" - ;; - *) - echo "${PODS_ROOT}/$1" - echo "${PODS_ROOT}/$1" >> "$RESOURCES_TO_COPY" - ;; - esac -} - -mkdir -p "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" -rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" -if [[ "${ACTION}" == "install" ]] && [[ "${SKIP_INSTALL}" == "NO" ]]; then - mkdir -p "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" - rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" -fi -rm -f "$RESOURCES_TO_COPY" - -if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "$XCASSET_FILES" ] -then - case "${TARGETED_DEVICE_FAMILY}" in - 1,2) - TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone" - ;; - 1) - TARGET_DEVICE_ARGS="--target-device iphone" - ;; - 2) - TARGET_DEVICE_ARGS="--target-device ipad" - ;; - *) - TARGET_DEVICE_ARGS="--target-device mac" - ;; - esac - - # Find all other xcassets (this unfortunately includes those of path pods and other targets). - OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d) - while read line; do - if [[ $line != "`realpath $PODS_ROOT`*" ]]; then - XCASSET_FILES+=("$line") - fi - done <<<"$OTHER_XCASSETS" - - printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${IPHONEOS_DEPLOYMENT_TARGET}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" -fi diff --git a/Project 29 - Grocr/Pods/Target Support Files/Pods/Pods.debug.xcconfig b/Project 29 - Grocr/Pods/Target Support Files/Pods/Pods.debug.xcconfig deleted file mode 100644 index 85fad535..00000000 --- a/Project 29 - Grocr/Pods/Target Support Files/Pods/Pods.debug.xcconfig +++ /dev/null @@ -1,6 +0,0 @@ -FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/FirebaseAnalytics/Frameworks/frameworks" "${PODS_ROOT}/FirebaseAuth/Frameworks/frameworks" "${PODS_ROOT}/FirebaseDatabase/Frameworks" "${PODS_ROOT}/FirebaseInstanceID/Frameworks" "${PODS_ROOT}/GoogleInterchangeUtilities/Frameworks" "${PODS_ROOT}/GoogleNetworkingUtilities/Frameworks" "${PODS_ROOT}/GoogleParsingUtilities/Frameworks" "${PODS_ROOT}/GoogleSymbolUtilities/Frameworks" "${PODS_ROOT}/GoogleUtilities/Frameworks" -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = $(inherited) ${PODS_ROOT}/Firebase/Headers $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Firebase" "${PODS_ROOT}/Headers/Public/FirebaseAnalytics" "${PODS_ROOT}/Headers/Public/FirebaseAuth" "${PODS_ROOT}/Headers/Public/FirebaseDatabase" "${PODS_ROOT}/Headers/Public/FirebaseInstanceID" "${PODS_ROOT}/Headers/Public/GoogleInterchangeUtilities" "${PODS_ROOT}/Headers/Public/GoogleNetworkingUtilities" "${PODS_ROOT}/Headers/Public/GoogleParsingUtilities" "${PODS_ROOT}/Headers/Public/GoogleSymbolUtilities" "${PODS_ROOT}/Headers/Public/GoogleUtilities" -OTHER_CFLAGS = $(inherited) -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/Firebase" -isystem "${PODS_ROOT}/Headers/Public/FirebaseAnalytics" -isystem "${PODS_ROOT}/Headers/Public/FirebaseAuth" -isystem "${PODS_ROOT}/Headers/Public/FirebaseDatabase" -isystem "${PODS_ROOT}/Headers/Public/FirebaseInstanceID" -isystem "${PODS_ROOT}/Headers/Public/GoogleInterchangeUtilities" -isystem "${PODS_ROOT}/Headers/Public/GoogleNetworkingUtilities" -isystem "${PODS_ROOT}/Headers/Public/GoogleParsingUtilities" -isystem "${PODS_ROOT}/Headers/Public/GoogleSymbolUtilities" -isystem "${PODS_ROOT}/Headers/Public/GoogleUtilities" -OTHER_LDFLAGS = $(inherited) -ObjC -l"c++" -l"icucore" -l"sqlite3" -l"z" -framework "AdSupport" -framework "AddressBook" -framework "CFNetwork" -framework "CoreGraphics" -framework "FirebaseAnalytics" -framework "FirebaseAuth" -framework "FirebaseDatabase" -framework "FirebaseInstanceID" -framework "GoogleInterchangeUtilities" -framework "GoogleNetworkingUtilities" -framework "GoogleParsingUtilities" -framework "GoogleSymbolUtilities" -framework "GoogleUtilities" -framework "SafariServices" -framework "Security" -framework "StoreKit" -framework "SystemConfiguration" -PODS_ROOT = ${SRCROOT}/Pods \ No newline at end of file diff --git a/Project 29 - Grocr/Pods/Target Support Files/Pods/Pods.release.xcconfig b/Project 29 - Grocr/Pods/Target Support Files/Pods/Pods.release.xcconfig deleted file mode 100644 index 85fad535..00000000 --- a/Project 29 - Grocr/Pods/Target Support Files/Pods/Pods.release.xcconfig +++ /dev/null @@ -1,6 +0,0 @@ -FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/FirebaseAnalytics/Frameworks/frameworks" "${PODS_ROOT}/FirebaseAuth/Frameworks/frameworks" "${PODS_ROOT}/FirebaseDatabase/Frameworks" "${PODS_ROOT}/FirebaseInstanceID/Frameworks" "${PODS_ROOT}/GoogleInterchangeUtilities/Frameworks" "${PODS_ROOT}/GoogleNetworkingUtilities/Frameworks" "${PODS_ROOT}/GoogleParsingUtilities/Frameworks" "${PODS_ROOT}/GoogleSymbolUtilities/Frameworks" "${PODS_ROOT}/GoogleUtilities/Frameworks" -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = $(inherited) ${PODS_ROOT}/Firebase/Headers $(inherited) "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/Firebase" "${PODS_ROOT}/Headers/Public/FirebaseAnalytics" "${PODS_ROOT}/Headers/Public/FirebaseAuth" "${PODS_ROOT}/Headers/Public/FirebaseDatabase" "${PODS_ROOT}/Headers/Public/FirebaseInstanceID" "${PODS_ROOT}/Headers/Public/GoogleInterchangeUtilities" "${PODS_ROOT}/Headers/Public/GoogleNetworkingUtilities" "${PODS_ROOT}/Headers/Public/GoogleParsingUtilities" "${PODS_ROOT}/Headers/Public/GoogleSymbolUtilities" "${PODS_ROOT}/Headers/Public/GoogleUtilities" -OTHER_CFLAGS = $(inherited) -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/Firebase" -isystem "${PODS_ROOT}/Headers/Public/FirebaseAnalytics" -isystem "${PODS_ROOT}/Headers/Public/FirebaseAuth" -isystem "${PODS_ROOT}/Headers/Public/FirebaseDatabase" -isystem "${PODS_ROOT}/Headers/Public/FirebaseInstanceID" -isystem "${PODS_ROOT}/Headers/Public/GoogleInterchangeUtilities" -isystem "${PODS_ROOT}/Headers/Public/GoogleNetworkingUtilities" -isystem "${PODS_ROOT}/Headers/Public/GoogleParsingUtilities" -isystem "${PODS_ROOT}/Headers/Public/GoogleSymbolUtilities" -isystem "${PODS_ROOT}/Headers/Public/GoogleUtilities" -OTHER_LDFLAGS = $(inherited) -ObjC -l"c++" -l"icucore" -l"sqlite3" -l"z" -framework "AdSupport" -framework "AddressBook" -framework "CFNetwork" -framework "CoreGraphics" -framework "FirebaseAnalytics" -framework "FirebaseAuth" -framework "FirebaseDatabase" -framework "FirebaseInstanceID" -framework "GoogleInterchangeUtilities" -framework "GoogleNetworkingUtilities" -framework "GoogleParsingUtilities" -framework "GoogleSymbolUtilities" -framework "GoogleUtilities" -framework "SafariServices" -framework "Security" -framework "StoreKit" -framework "SystemConfiguration" -PODS_ROOT = ${SRCROOT}/Pods \ No newline at end of file diff --git a/Project 29 - Grocr/README.md b/Project 29 - Grocr/README.md deleted file mode 100644 index 276272cb..00000000 --- a/Project 29 - Grocr/README.md +++ /dev/null @@ -1,15 +0,0 @@ -Grocr -========== - -Grocr is a simple app demos the basic use of Google Firebase, they are: - -- How to use a save, fetch, remove and sync data from Firebase in realtime; -- How to authenticate user sign up and log in; -- How to monitor users' online/offline status; -- How to enable offline support. - -For details, please reference [Firebase Tutorial: Getting Started](https://www.raywenderlich.com/139322/firebase-tutorial-getting-started-2) - -## Screenshots -![Grocr](./Grocr.gif) - diff --git a/Project 27 - Marslink/Marslink.gif b/Project 29 - Marslink/Marslink.gif similarity index 100% rename from Project 27 - Marslink/Marslink.gif rename to Project 29 - Marslink/Marslink.gif diff --git a/Project 27 - Marslink/Marslink.xcodeproj/project.pbxproj b/Project 29 - Marslink/Marslink.xcodeproj/project.pbxproj similarity index 97% rename from Project 27 - Marslink/Marslink.xcodeproj/project.pbxproj rename to Project 29 - Marslink/Marslink.xcodeproj/project.pbxproj index dab4c309..f16d3424 100644 --- a/Project 27 - Marslink/Marslink.xcodeproj/project.pbxproj +++ b/Project 29 - Marslink/Marslink.xcodeproj/project.pbxproj @@ -239,12 +239,12 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0730; - LastUpgradeCheck = 0800; + LastUpgradeCheck = 0900; ORGANIZATIONNAME = "Ray Wenderlich"; TargetAttributes = { 2949EE871D8AB4F4005BC671 = { CreatedOnToolsVersion = 7.3.1; - LastSwiftMigration = 0810; + LastSwiftMigration = 0900; ProvisioningStyle = Automatic; }; }; @@ -383,14 +383,20 @@ CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -430,14 +436,20 @@ CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -478,7 +490,8 @@ PROVISIONING_PROFILE = ""; PROVISIONING_PROFILE_SPECIFIER = ""; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 3.0; + SWIFT_SWIFT3_OBJC_INFERENCE = On; + SWIFT_VERSION = 4.0; }; name = Debug; }; @@ -495,7 +508,8 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.raywenderlich.Marslink; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_SWIFT3_OBJC_INFERENCE = On; + SWIFT_VERSION = 4.0; }; name = Release; }; diff --git a/Project 27 - Marslink/Marslink.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Project 29 - Marslink/Marslink.xcodeproj/project.xcworkspace/contents.xcworkspacedata similarity index 100% rename from Project 27 - Marslink/Marslink.xcodeproj/project.xcworkspace/contents.xcworkspacedata rename to Project 29 - Marslink/Marslink.xcodeproj/project.xcworkspace/contents.xcworkspacedata diff --git a/Project 27 - Marslink/Marslink.xcworkspace/contents.xcworkspacedata b/Project 29 - Marslink/Marslink.xcworkspace/contents.xcworkspacedata similarity index 100% rename from Project 27 - Marslink/Marslink.xcworkspace/contents.xcworkspacedata rename to Project 29 - Marslink/Marslink.xcworkspace/contents.xcworkspacedata diff --git a/Project 27 - Marslink/Marslink/AppDelegate.swift b/Project 29 - Marslink/Marslink/AppDelegate.swift similarity index 100% rename from Project 27 - Marslink/Marslink/AppDelegate.swift rename to Project 29 - Marslink/Marslink/AppDelegate.swift diff --git a/Project 27 - Marslink/Marslink/Models/DateSortable.swift b/Project 29 - Marslink/Marslink/Models/DateSortable.swift similarity index 100% rename from Project 27 - Marslink/Marslink/Models/DateSortable.swift rename to Project 29 - Marslink/Marslink/Models/DateSortable.swift diff --git a/Project 27 - Marslink/Marslink/Models/JournalEntry.swift b/Project 29 - Marslink/Marslink/Models/JournalEntry.swift similarity index 100% rename from Project 27 - Marslink/Marslink/Models/JournalEntry.swift rename to Project 29 - Marslink/Marslink/Models/JournalEntry.swift diff --git a/Project 27 - Marslink/Marslink/Models/Message.swift b/Project 29 - Marslink/Marslink/Models/Message.swift similarity index 100% rename from Project 27 - Marslink/Marslink/Models/Message.swift rename to Project 29 - Marslink/Marslink/Models/Message.swift diff --git a/Project 27 - Marslink/Marslink/Models/NSObject+IGListDiffable.swift b/Project 29 - Marslink/Marslink/Models/NSObject+IGListDiffable.swift similarity index 100% rename from Project 27 - Marslink/Marslink/Models/NSObject+IGListDiffable.swift rename to Project 29 - Marslink/Marslink/Models/NSObject+IGListDiffable.swift diff --git a/Project 27 - Marslink/Marslink/Models/SolFormatter.swift b/Project 29 - Marslink/Marslink/Models/SolFormatter.swift similarity index 100% rename from Project 27 - Marslink/Marslink/Models/SolFormatter.swift rename to Project 29 - Marslink/Marslink/Models/SolFormatter.swift diff --git a/Project 27 - Marslink/Marslink/Models/User.swift b/Project 29 - Marslink/Marslink/Models/User.swift similarity index 100% rename from Project 27 - Marslink/Marslink/Models/User.swift rename to Project 29 - Marslink/Marslink/Models/User.swift diff --git a/Project 27 - Marslink/Marslink/Models/Weather.swift b/Project 29 - Marslink/Marslink/Models/Weather.swift similarity index 100% rename from Project 27 - Marslink/Marslink/Models/Weather.swift rename to Project 29 - Marslink/Marslink/Models/Weather.swift diff --git a/Project 27 - Marslink/Marslink/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json b/Project 29 - Marslink/Marslink/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from Project 27 - Marslink/Marslink/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json rename to Project 29 - Marslink/Marslink/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/Project 27 - Marslink/Marslink/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/Project 29 - Marslink/Marslink/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png similarity index 100% rename from Project 27 - Marslink/Marslink/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png rename to Project 29 - Marslink/Marslink/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png diff --git a/Project 27 - Marslink/Marslink/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/Project 29 - Marslink/Marslink/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png similarity index 100% rename from Project 27 - Marslink/Marslink/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png rename to Project 29 - Marslink/Marslink/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png diff --git a/Project 27 - Marslink/Marslink/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/Project 29 - Marslink/Marslink/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png similarity index 100% rename from Project 27 - Marslink/Marslink/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png rename to Project 29 - Marslink/Marslink/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png diff --git a/Project 27 - Marslink/Marslink/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x-1.png b/Project 29 - Marslink/Marslink/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x-1.png similarity index 100% rename from Project 27 - Marslink/Marslink/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x-1.png rename to Project 29 - Marslink/Marslink/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x-1.png diff --git a/Project 27 - Marslink/Marslink/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x-1.png b/Project 29 - Marslink/Marslink/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x-1.png similarity index 100% rename from Project 27 - Marslink/Marslink/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x-1.png rename to Project 29 - Marslink/Marslink/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x-1.png diff --git a/Project 27 - Marslink/Marslink/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@1x.png b/Project 29 - Marslink/Marslink/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@1x.png similarity index 100% rename from Project 27 - Marslink/Marslink/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@1x.png rename to Project 29 - Marslink/Marslink/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@1x.png diff --git a/Project 27 - Marslink/Marslink/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/Project 29 - Marslink/Marslink/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png similarity index 100% rename from Project 27 - Marslink/Marslink/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png rename to Project 29 - Marslink/Marslink/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png diff --git a/Project 27 - Marslink/Marslink/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/Project 29 - Marslink/Marslink/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png similarity index 100% rename from Project 27 - Marslink/Marslink/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png rename to Project 29 - Marslink/Marslink/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png diff --git a/Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/Contents.json b/Project 29 - Marslink/Marslink/Resources/Assets.xcassets/Contents.json similarity index 100% rename from Project 28 - SlidebarMenu/SlidebarMenu/Assets.xcassets/Contents.json rename to Project 29 - Marslink/Marslink/Resources/Assets.xcassets/Contents.json diff --git a/Project 27 - Marslink/Marslink/Resources/Base.lproj/LaunchScreen.storyboard b/Project 29 - Marslink/Marslink/Resources/Base.lproj/LaunchScreen.storyboard similarity index 100% rename from Project 27 - Marslink/Marslink/Resources/Base.lproj/LaunchScreen.storyboard rename to Project 29 - Marslink/Marslink/Resources/Base.lproj/LaunchScreen.storyboard diff --git a/Project 27 - Marslink/Marslink/Resources/Info.plist b/Project 29 - Marslink/Marslink/Resources/Info.plist similarity index 100% rename from Project 27 - Marslink/Marslink/Resources/Info.plist rename to Project 29 - Marslink/Marslink/Resources/Info.plist diff --git a/Project 27 - Marslink/Marslink/Resources/OCRAStd.otf b/Project 29 - Marslink/Marslink/Resources/OCRAStd.otf similarity index 100% rename from Project 27 - Marslink/Marslink/Resources/OCRAStd.otf rename to Project 29 - Marslink/Marslink/Resources/OCRAStd.otf diff --git a/Project 27 - Marslink/Marslink/SectionControllers/JournalSectionController.swift b/Project 29 - Marslink/Marslink/SectionControllers/JournalSectionController.swift similarity index 100% rename from Project 27 - Marslink/Marslink/SectionControllers/JournalSectionController.swift rename to Project 29 - Marslink/Marslink/SectionControllers/JournalSectionController.swift diff --git a/Project 27 - Marslink/Marslink/SectionControllers/MessageSectionController.swift b/Project 29 - Marslink/Marslink/SectionControllers/MessageSectionController.swift similarity index 100% rename from Project 27 - Marslink/Marslink/SectionControllers/MessageSectionController.swift rename to Project 29 - Marslink/Marslink/SectionControllers/MessageSectionController.swift diff --git a/Project 27 - Marslink/Marslink/SectionControllers/WeatherSectionController.swift b/Project 29 - Marslink/Marslink/SectionControllers/WeatherSectionController.swift similarity index 100% rename from Project 27 - Marslink/Marslink/SectionControllers/WeatherSectionController.swift rename to Project 29 - Marslink/Marslink/SectionControllers/WeatherSectionController.swift diff --git a/Project 27 - Marslink/Marslink/Systems/JournalLoader.swift b/Project 29 - Marslink/Marslink/Systems/JournalLoader.swift similarity index 100% rename from Project 27 - Marslink/Marslink/Systems/JournalLoader.swift rename to Project 29 - Marslink/Marslink/Systems/JournalLoader.swift diff --git a/Project 27 - Marslink/Marslink/Systems/Pathfinder.swift b/Project 29 - Marslink/Marslink/Systems/Pathfinder.swift similarity index 100% rename from Project 27 - Marslink/Marslink/Systems/Pathfinder.swift rename to Project 29 - Marslink/Marslink/Systems/Pathfinder.swift diff --git a/Project 27 - Marslink/Marslink/Systems/TextSize.swift b/Project 29 - Marslink/Marslink/Systems/TextSize.swift similarity index 97% rename from Project 27 - Marslink/Marslink/Systems/TextSize.swift rename to Project 29 - Marslink/Marslink/Systems/TextSize.swift index 1f26bf81..2d4d0a16 100644 --- a/Project 27 - Marslink/Marslink/Systems/TextSize.swift +++ b/Project 29 - Marslink/Marslink/Systems/TextSize.swift @@ -48,7 +48,7 @@ public struct TextSize { } let constrainedSize = CGSize(width: width - insets.left - insets.right, height: CGFloat.greatestFiniteMagnitude) - let attributes = [ NSFontAttributeName: font ] + let attributes = [ NSAttributedStringKey.font: font ] let options: NSStringDrawingOptions = [.usesFontLeading, .usesLineFragmentOrigin] var bounds = (text as NSString).boundingRect(with: constrainedSize, options: options, attributes: attributes, context: nil) bounds.size.width = width diff --git a/Project 27 - Marslink/Marslink/Systems/Theme.swift b/Project 29 - Marslink/Marslink/Systems/Theme.swift similarity index 100% rename from Project 27 - Marslink/Marslink/Systems/Theme.swift rename to Project 29 - Marslink/Marslink/Systems/Theme.swift diff --git a/Project 27 - Marslink/Marslink/Systems/WxScanner.swift b/Project 29 - Marslink/Marslink/Systems/WxScanner.swift similarity index 100% rename from Project 27 - Marslink/Marslink/Systems/WxScanner.swift rename to Project 29 - Marslink/Marslink/Systems/WxScanner.swift diff --git a/Project 27 - Marslink/Marslink/ViewControllers/ClassicFeedViewController.swift b/Project 29 - Marslink/Marslink/ViewControllers/ClassicFeedViewController.swift similarity index 100% rename from Project 27 - Marslink/Marslink/ViewControllers/ClassicFeedViewController.swift rename to Project 29 - Marslink/Marslink/ViewControllers/ClassicFeedViewController.swift diff --git a/Project 27 - Marslink/Marslink/ViewControllers/FeedViewController.swift b/Project 29 - Marslink/Marslink/ViewControllers/FeedViewController.swift similarity index 100% rename from Project 27 - Marslink/Marslink/ViewControllers/FeedViewController.swift rename to Project 29 - Marslink/Marslink/ViewControllers/FeedViewController.swift diff --git a/Project 27 - Marslink/Marslink/Views/CustomNavigationBar.swift b/Project 29 - Marslink/Marslink/Views/CustomNavigationBar.swift similarity index 100% rename from Project 27 - Marslink/Marslink/Views/CustomNavigationBar.swift rename to Project 29 - Marslink/Marslink/Views/CustomNavigationBar.swift diff --git a/Project 27 - Marslink/Marslink/Views/JournalEntryCell.swift b/Project 29 - Marslink/Marslink/Views/JournalEntryCell.swift similarity index 100% rename from Project 27 - Marslink/Marslink/Views/JournalEntryCell.swift rename to Project 29 - Marslink/Marslink/Views/JournalEntryCell.swift diff --git a/Project 27 - Marslink/Marslink/Views/JournalEntryDateCell.swift b/Project 29 - Marslink/Marslink/Views/JournalEntryDateCell.swift similarity index 100% rename from Project 27 - Marslink/Marslink/Views/JournalEntryDateCell.swift rename to Project 29 - Marslink/Marslink/Views/JournalEntryDateCell.swift diff --git a/Project 27 - Marslink/Marslink/Views/MessageCell.swift b/Project 29 - Marslink/Marslink/Views/MessageCell.swift similarity index 100% rename from Project 27 - Marslink/Marslink/Views/MessageCell.swift rename to Project 29 - Marslink/Marslink/Views/MessageCell.swift diff --git a/Project 27 - Marslink/Marslink/Views/WeatherDetailCell.swift b/Project 29 - Marslink/Marslink/Views/WeatherDetailCell.swift similarity index 100% rename from Project 27 - Marslink/Marslink/Views/WeatherDetailCell.swift rename to Project 29 - Marslink/Marslink/Views/WeatherDetailCell.swift diff --git a/Project 27 - Marslink/Marslink/Views/WeatherSummaryCell.swift b/Project 29 - Marslink/Marslink/Views/WeatherSummaryCell.swift similarity index 90% rename from Project 27 - Marslink/Marslink/Views/WeatherSummaryCell.swift rename to Project 29 - Marslink/Marslink/Views/WeatherSummaryCell.swift index cc0c36b1..dfcc237b 100644 --- a/Project 27 - Marslink/Marslink/Views/WeatherSummaryCell.swift +++ b/Project 29 - Marslink/Marslink/Views/WeatherSummaryCell.swift @@ -43,13 +43,13 @@ class WeatherSummaryCell: UICollectionViewCell { let paragraphStyle = NSMutableParagraphStyle() paragraphStyle.paragraphSpacing = 4 let subtitleAttributes = [ - NSFontAttributeName: AppFont(size: 14), - NSForegroundColorAttributeName: UIColor(hex6: 0x42c84b), - NSParagraphStyleAttributeName: paragraphStyle + NSAttributedStringKey.font: AppFont(size: 14), + NSAttributedStringKey.foregroundColor: UIColor(hex6: 0x42c84b), + NSAttributedStringKey.paragraphStyle: paragraphStyle ] let titleAttributes = [ - NSFontAttributeName: AppFont(size: 24), - NSForegroundColorAttributeName: UIColor.white + NSAttributedStringKey.font: AppFont(size: 24), + NSAttributedStringKey.foregroundColor: UIColor.white ] let attributedText = NSMutableAttributedString(string: "LATEST\n", attributes: subtitleAttributes) attributedText.append(NSAttributedString(string: "WEATHER", attributes: titleAttributes)) diff --git a/Project 27 - Marslink/Podfile b/Project 29 - Marslink/Podfile similarity index 100% rename from Project 27 - Marslink/Podfile rename to Project 29 - Marslink/Podfile diff --git a/Project 29 - Marslink/Podfile.lock b/Project 29 - Marslink/Podfile.lock new file mode 100644 index 00000000..01f3cf69 --- /dev/null +++ b/Project 29 - Marslink/Podfile.lock @@ -0,0 +1,26 @@ +PODS: + - IGListKit (3.1.1): + - IGListKit/Default (= 3.1.1) + - IGListKit/Default (3.1.1): + - IGListKit/Diffing + - IGListKit/Diffing (3.1.1) + +DEPENDENCIES: + - IGListKit (from `https://github.com/Instagram/IGListKit.git`, branch `master`) + +EXTERNAL SOURCES: + IGListKit: + :branch: master + :git: https://github.com/Instagram/IGListKit.git + +CHECKOUT OPTIONS: + IGListKit: + :commit: 0f04a073194033fbfc6f1d916fad83838042a7c0 + :git: https://github.com/Instagram/IGListKit.git + +SPEC CHECKSUMS: + IGListKit: cb97f405ae43e59fe1da74271e19427ec20d3c07 + +PODFILE CHECKSUM: c789b282c42fef7042ba9bbaed1c59874ce5025d + +COCOAPODS: 1.2.0.beta.1 diff --git a/Project 27 - Marslink/Pods/IGListKit/LICENSE.md b/Project 29 - Marslink/Pods/IGListKit/LICENSE.md similarity index 100% rename from Project 27 - Marslink/Pods/IGListKit/LICENSE.md rename to Project 29 - Marslink/Pods/IGListKit/LICENSE.md diff --git a/Project 29 - Marslink/Pods/IGListKit/README.md b/Project 29 - Marslink/Pods/IGListKit/README.md new file mode 100644 index 00000000..9e344eb1 --- /dev/null +++ b/Project 29 - Marslink/Pods/IGListKit/README.md @@ -0,0 +1,104 @@ +

+ +

+ +

+ + Build Status + + + Coverage Status + + + Pods Version + + + Platforms + + + Carthage Compatible + +

+ +---------------- + +A data-driven `UICollectionView` framework for building fast and flexible lists. + +| | Main Features | +----------|----------------- +🙅 | Never call `performBatchUpdates(_:, completion:)` or `reloadData()` again +🏠 | Better architecture with reusable cells and components +🔠 | Create collections with multiple data types +🔑 | Decoupled diffing algorithm +✅ | Fully unit tested +🔍 | Customize your diffing behavior for your models +📱 | Simply `UICollectionView` at its core +🚀 | Extendable API +🐦 | Written in Objective-C with full Swift interop support + +`IGListKit` is built and maintained with ❤️ by [Instagram engineering](https://engineering.instagram.com/). +We use the open source version `master` branch in the Instagram app. + +## Requirements + +- Xcode 8.0+ +- iOS 8.0+ +- tvOS 9.0+ +- macOS 10.10+ *(diffing algorithm components only)* +- Interoperability with Swift 3.0+ + +## Installation + +### CocoaPods + +The preferred installation method is with [CocoaPods](https://cocoapods.org). Add the following to your `Podfile`: + +```ruby +pod 'IGListKit', '~> 3.0' +``` + +### Carthage + +For [Carthage](https://github.com/Carthage/Carthage), add the following to your `Cartfile`: + +```ogdl +github "Instagram/IGListKit" ~> 3.0 +``` + +> For advanced usage, see our [Installation Guide](https://instagram.github.io/IGListKit/installation.html). + +## Getting Started + +- Our [Getting Started guide](https://instagram.github.io/IGListKit/getting-started.html) +- Ray Wenderlich's [IGListKit Tutorial: Better UICollectionViews](https://www.raywenderlich.com/147162/iglistkit-tutorial-better-uicollectionviews) +- Our [example projects](https://github.com/Instagram/IGListKit/tree/master/Examples) +- Ryan Nystrom's [talk at try! Swift NYC](https://realm.io/news/tryswift-ryan-nystrom-refactoring-at-scale-lessons-learned-rewriting-instagram-feed/) (Note: this talk was for an earlier version. Some APIs have changed.) +- [Migrating an UITableView to IGListCollectionView](https://medium.com/cocoaacademymag/iglistkit-migrating-an-uitableview-to-iglistkitcollectionview-65a30cf9bac9), by Rodrigo Cavalcante +- [Keeping data fresh in Buffer for iOS with AsyncDisplayKit, IGListKit & Pusher](https://overflow.buffer.com/2017/04/10/keeping-data-fresh-buffer-ios-asyncdisplaykit-iglistkit-pusher/), Andy Yates, Buffer + +## Documentation + +You can find [the docs here](https://instagram.github.io/IGListKit). Documentation is generated with [jazzy](https://github.com/realm/jazzy) and hosted on [GitHub-Pages](https://pages.github.com). + +To regenerate docs, run `./scripts/build_docs.sh` from the root directory in the repo. + +## Vision + +For the long-term goals and "vision" of `IGListKit`, please read our [Vision](https://github.com/Instagram/IGListKit/blob/master/Guides/VISION.md) doc. + +## Contributing + +Please see the [CONTRIBUTING](https://github.com/Instagram/IGListKit/blob/master/.github/CONTRIBUTING.md) file for how to help. At Instagram, we sync the open source version of `IGListKit` daily, so we're always testing the latest changes. But that requires all changes be thoroughly tested and follow our style guide. + +We have a set of [starter tasks](https://github.com/Instagram/IGListKit/issues?q=is%3Aissue+is%3Aopen+label%3Astarter-task) that are great for beginners to jump in on and start contributing. + +## License + +`IGListKit` is BSD-licensed. We also provide an additional patent grant. + +The files in the `/Examples/` directory are licensed under a separate license as specified in each file. Documentation is licensed [CC-BY-4.0](https://creativecommons.org/licenses/by/4.0/). diff --git a/Project 27 - Marslink/Pods/IGListKit/Source/IGListAssert.h b/Project 29 - Marslink/Pods/IGListKit/Source/Common/IGListAssert.h similarity index 87% rename from Project 27 - Marslink/Pods/IGListKit/Source/IGListAssert.h rename to Project 29 - Marslink/Pods/IGListKit/Source/Common/IGListAssert.h index 2781e0e9..328763c7 100644 --- a/Project 27 - Marslink/Pods/IGListKit/Source/IGListAssert.h +++ b/Project 29 - Marslink/Pods/IGListKit/Source/Common/IGListAssert.h @@ -11,6 +11,10 @@ #define IGAssert( condition, ... ) NSCAssert( (condition) , ##__VA_ARGS__) #endif // IGAssert +#ifndef IGFailAssert +#define IGFailAssert( ... ) IGAssert( (NO) , ##__VA_ARGS__) +#endif // IGFailAssert + #ifndef IGParameterAssert #define IGParameterAssert( condition ) IGAssert( (condition) , @"Invalid parameter not satisfying: %@", @#condition) #endif // IGParameterAssert diff --git a/Project 27 - Marslink/Pods/IGListKit/Source/IGListBatchUpdateData.h b/Project 29 - Marslink/Pods/IGListKit/Source/Common/IGListBatchUpdateData.h similarity index 65% rename from Project 27 - Marslink/Pods/IGListKit/Source/IGListBatchUpdateData.h rename to Project 29 - Marslink/Pods/IGListKit/Source/Common/IGListBatchUpdateData.h index 7b6675b8..b9ea800e 100644 --- a/Project 27 - Marslink/Pods/IGListKit/Source/IGListBatchUpdateData.h +++ b/Project 29 - Marslink/Pods/IGListKit/Source/Common/IGListBatchUpdateData.h @@ -7,10 +7,11 @@ * of patent rights can be found in the PATENTS file in the same directory. */ -#import +#import #import #import +#import NS_ASSUME_NONNULL_BEGIN @@ -20,6 +21,7 @@ NS_ASSUME_NONNULL_BEGIN update via `-[UICollectionView performBatchUpdates:completion:]`. */ IGLK_SUBCLASSING_RESTRICTED +NS_SWIFT_NAME(ListBatchUpdateData) @interface IGListBatchUpdateData : NSObject /** @@ -33,43 +35,43 @@ IGLK_SUBCLASSING_RESTRICTED @property (nonatomic, strong, readonly) NSIndexSet *deleteSections; /** - section moves. + Section moves. */ @property (nonatomic, strong, readonly) NSSet *moveSections; /** Item insert index paths. */ -@property (nonatomic, strong, readonly) NSSet *insertIndexPaths; +@property (nonatomic, strong, readonly) NSArray *insertIndexPaths; /** Item delete index paths. */ -@property (nonatomic, strong, readonly) NSSet *deleteIndexPaths; +@property (nonatomic, strong, readonly) NSArray *deleteIndexPaths; /** - Item reload index paths. + Item moves. */ -@property (nonatomic, strong, readonly) NSSet *reloadIndexPaths; +@property (nonatomic, strong, readonly) NSArray *moveIndexPaths; /** Creates a new batch update object with section and item operations. - @param insertSections Section indexes to insert. - @param deleteSections Section indexes to delete. - @param moveSections Section moves. + @param insertSections Section indexes to insert. + @param deleteSections Section indexes to delete. + @param moveSections Section moves. @param insertIndexPaths Item index paths to insert. @param deleteIndexPaths Item index paths to delete. - @param reloadIndexPaths Item index paths to reload. + @param moveIndexPaths Item index paths to move. @return A new batch update object. */ - (instancetype)initWithInsertSections:(NSIndexSet *)insertSections deleteSections:(NSIndexSet *)deleteSections moveSections:(NSSet *)moveSections - insertIndexPaths:(NSSet *)insertIndexPaths - deleteIndexPaths:(NSSet *)deleteIndexPaths - reloadIndexPaths:(NSSet *)reloadIndexPaths NS_DESIGNATED_INITIALIZER; + insertIndexPaths:(NSArray *)insertIndexPaths + deleteIndexPaths:(NSArray *)deleteIndexPaths + moveIndexPaths:(NSArray *)moveIndexPaths NS_DESIGNATED_INITIALIZER; /** :nodoc: diff --git a/Project 27 - Marslink/Pods/IGListKit/Source/IGListBatchUpdateData.mm b/Project 29 - Marslink/Pods/IGListKit/Source/Common/IGListBatchUpdateData.mm similarity index 64% rename from Project 27 - Marslink/Pods/IGListKit/Source/IGListBatchUpdateData.mm rename to Project 29 - Marslink/Pods/IGListKit/Source/Common/IGListBatchUpdateData.mm index bd402015..c33cb587 100644 --- a/Project 27 - Marslink/Pods/IGListKit/Source/IGListBatchUpdateData.mm +++ b/Project 29 - Marslink/Pods/IGListKit/Source/Common/IGListBatchUpdateData.mm @@ -8,23 +8,12 @@ */ #import "IGListBatchUpdateData.h" +#import #import #import -// Filters indexPaths removing all paths that have a section in sections. -static NSMutableSet *indexPathsMinusSections(NSSet *indexPaths, NSIndexSet *sections) { - NSMutableSet *filteredIndexPaths = [indexPaths mutableCopy]; - for (NSIndexPath *indexPath in indexPaths) { - const NSUInteger section = indexPath.section; - if ([sections containsIndex:section]) { - [filteredIndexPaths removeObject:indexPath]; - } - } - return filteredIndexPaths; -} - // Plucks the given move from available moves and turns it into a delete + insert static void convertMoveToDeleteAndInsert(NSMutableSet *moves, IGListMoveIndex *move, @@ -41,15 +30,16 @@ static void convertMoveToDeleteAndInsert(NSMutableSet *moves, @implementation IGListBatchUpdateData // Converts all section moves that have index path operations into a section delete + insert. -+ (void)cleanIndexPathsWithMap:(const std::unordered_map &)map ++ (void)cleanIndexPathsWithMap:(const std::unordered_map &)map moves:(NSMutableSet *)moves - indexPaths:(NSMutableSet *)indexPaths + indexPaths:(NSMutableArray *)indexPaths deletes:(NSMutableIndexSet *)deletes inserts:(NSMutableIndexSet *)inserts { - for (NSIndexPath *path in [indexPaths copy]) { + for (NSInteger i = indexPaths.count - 1; i >= 0; i--) { + NSIndexPath *path = indexPaths[i]; const auto it = map.find(path.section); if (it != map.end() && it->second != nil) { - [indexPaths removeObject:path]; + [indexPaths removeObjectAtIndex:i]; convertMoveToDeleteAndInsert(moves, it->second, deletes, inserts); } } @@ -62,48 +52,47 @@ + (void)cleanIndexPathsWithMap:(const std::unordered_map *)moveSections - insertIndexPaths:(NSSet *)insertIndexPaths - deleteIndexPaths:(NSSet *)deleteIndexPaths - reloadIndexPaths:(NSSet *)reloadIndexPaths { + insertIndexPaths:(NSArray *)insertIndexPaths + deleteIndexPaths:(NSArray *)deleteIndexPaths + moveIndexPaths:(NSArray *)moveIndexPaths { IGParameterAssert(insertSections != nil); IGParameterAssert(deleteSections != nil); IGParameterAssert(moveSections != nil); IGParameterAssert(insertIndexPaths != nil); IGParameterAssert(deleteIndexPaths != nil); - IGParameterAssert(reloadIndexPaths != nil); + IGParameterAssert(moveIndexPaths != nil); if (self = [super init]) { NSMutableSet *mMoveSections = [moveSections mutableCopy]; NSMutableIndexSet *mDeleteSections = [deleteSections mutableCopy]; NSMutableIndexSet *mInsertSections = [insertSections mutableCopy]; + NSMutableSet *mMoveIndexPaths = [moveIndexPaths mutableCopy]; // these collections should NEVER be mutated during cleanup passes, otherwise sections that have multiple item // changes (e.g. a moved section that has a delete + reload on different index paths w/in the section) will only // convert one of the item changes into a section delete+insert. this will fail hard and be VERY difficult to // debug - const NSUInteger moveCount = [moveSections count]; - std::unordered_map fromMap(moveCount); - std::unordered_map toMap(moveCount); + const NSInteger moveCount = [moveSections count]; + std::unordered_map fromMap(moveCount); + std::unordered_map toMap(moveCount); for (IGListMoveIndex *move in moveSections) { - const NSUInteger from = move.from; - const NSUInteger to = move.to; + const NSInteger from = move.from; + const NSInteger to = move.to; - // if the move is already deleted or inserted, discard it and use delete+insert instead + // if the move is already deleted or inserted, discard it because count-changing operations must match + // with data source changes if ([deleteSections containsIndex:from] || [insertSections containsIndex:to]) { - convertMoveToDeleteAndInsert(mMoveSections, move, mDeleteSections, mInsertSections); + [mMoveSections removeObject:move]; } else { fromMap[from] = move; toMap[to] = move; } } - NSMutableSet *mInsertIndexPaths = [insertIndexPaths mutableCopy]; - NSMutableSet *mDeleteIndexPaths = [deleteIndexPaths mutableCopy]; - - // UICollectionView will throw if reloading an index path in a section that is also deleted - NSMutableSet *mReloadIndexPaths = indexPathsMinusSections(reloadIndexPaths, deleteSections); + NSMutableArray *mInsertIndexPaths = [insertIndexPaths mutableCopy]; - // UICollectionView will throw about simultaneous animations when reloading and moving cells at the same time - [IGListBatchUpdateData cleanIndexPathsWithMap:fromMap moves:mMoveSections indexPaths:mReloadIndexPaths deletes:mDeleteSections inserts:mInsertSections]; + // avoid a flaky UICollectionView bug when deleting from the same index path twice + // exposes a possible data source inconsistency issue + NSMutableArray *mDeleteIndexPaths = [[[NSSet setWithArray:deleteIndexPaths] allObjects] mutableCopy]; // avoids a bug where a cell is animated twice and one of the snapshot cells is never removed from the hierarchy [IGListBatchUpdateData cleanIndexPathsWithMap:fromMap moves:mMoveSections indexPaths:mDeleteIndexPaths deletes:mDeleteSections inserts:mInsertSections]; @@ -111,20 +100,37 @@ - (instancetype)initWithInsertSections:(NSIndexSet *)insertSections // prevents a bug where UICollectionView corrupts the heap memory when inserting into a section that is moved [IGListBatchUpdateData cleanIndexPathsWithMap:toMap moves:mMoveSections indexPaths:mInsertIndexPaths deletes:mDeleteSections inserts:mInsertSections]; + for (IGListMoveIndexPath *move in moveIndexPaths) { + // if the section w/ an index path move is deleted, just drop the move + if ([deleteSections containsIndex:move.from.section]) { + [mMoveIndexPaths removeObject:move]; + } + + // if a move is inside a section that is moved, convert the section move to a delete+insert + const auto it = fromMap.find(move.from.section); + if (it != fromMap.end() && it->second != nil) { + IGListMoveIndex *sectionMove = it->second; + [mMoveIndexPaths removeObject:move]; + [mMoveSections removeObject:sectionMove]; + [mDeleteSections addIndex:sectionMove.from]; + [mInsertSections addIndex:sectionMove.to]; + } + } + _deleteSections = [mDeleteSections copy]; _insertSections = [mInsertSections copy]; _moveSections = [mMoveSections copy]; _deleteIndexPaths = [mDeleteIndexPaths copy]; _insertIndexPaths = [mInsertIndexPaths copy]; - _reloadIndexPaths = [mReloadIndexPaths copy]; + _moveIndexPaths = [mMoveIndexPaths copy]; } return self; } - (NSString *)description { - return [NSString stringWithFormat:@"<%@ %p; deleteSections: %zi; insertSections: %zi; moveSections: %zi; deleteIndexPaths: %zi; insertIndexPaths: %zi; reloadIndexPaths: %zi;>", + return [NSString stringWithFormat:@"<%@ %p; deleteSections: %zi; insertSections: %zi; moveSections: %zi; deleteIndexPaths: %zi; insertIndexPaths: %zi;>", NSStringFromClass(self.class), self, self.deleteSections.count, self.insertSections.count, self.moveSections.count, - self.deleteIndexPaths.count, self.insertIndexPaths.count, self.reloadIndexPaths.count]; + self.deleteIndexPaths.count, self.insertIndexPaths.count]; } @end diff --git a/Project 29 - Marslink/Pods/IGListKit/Source/Common/IGListCompatibility.h b/Project 29 - Marslink/Pods/IGListKit/Source/Common/IGListCompatibility.h new file mode 100644 index 00000000..2d59a928 --- /dev/null +++ b/Project 29 - Marslink/Pods/IGListKit/Source/Common/IGListCompatibility.h @@ -0,0 +1,16 @@ +/** + * Copyright (c) 2016-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import + +#if TARGET_OS_EMBEDDED || TARGET_OS_SIMULATOR +#import +#else +#import +#endif diff --git a/Project 27 - Marslink/Pods/IGListKit/Source/IGListDiff.h b/Project 29 - Marslink/Pods/IGListKit/Source/Common/IGListDiff.h similarity index 79% rename from Project 27 - Marslink/Pods/IGListKit/Source/IGListDiff.h rename to Project 29 - Marslink/Pods/IGListKit/Source/Common/IGListDiff.h index efa80887..2a531a0a 100644 --- a/Project 27 - Marslink/Pods/IGListKit/Source/IGListDiff.h +++ b/Project 29 - Marslink/Pods/IGListKit/Source/Common/IGListDiff.h @@ -18,6 +18,7 @@ NS_ASSUME_NONNULL_BEGIN /** An option for how to do comparisons between similar objects. */ +NS_SWIFT_NAME(ListDiffOption) typedef NS_ENUM(NSInteger, IGListDiffOption) { /** Compare objects using pointer personality. @@ -34,11 +35,12 @@ typedef NS_ENUM(NSInteger, IGListDiffOption) { @param oldArray The old objects to diff against. @param newArray The new objects. - @param option An option on how to compare objects. + @param option An option on how to compare objects. @return A result object containing affected indexes. */ -FOUNDATION_EXTERN IGListIndexSetResult *IGListDiff(NSArray> *_Nullable oldArray, +NS_SWIFT_NAME(ListDiff(oldArray:newArray:option:)) +FOUNDATION_EXTERN IGListIndexSetResult *IGListDiff(NSArray> *_Nullable oldArray, NSArray> *_Nullable newArray, IGListDiffOption option); @@ -46,13 +48,14 @@ FOUNDATION_EXTERN IGListIndexSetResult *IGListDiff(NSArray> * Creates a diff using index paths between two collections. @param fromSection The old section. - @param toSection The new section. - @param oldArray The old objects to diff against. - @param newArray The new objects. - @param option An option on how to compare objects. + @param toSection The new section. + @param oldArray The old objects to diff against. + @param newArray The new objects. + @param option An option on how to compare objects. @return A result object containing affected indexes. */ +NS_SWIFT_NAME(ListDiffPaths(fromSection:toSection:oldArray:newArray:option:)) FOUNDATION_EXTERN IGListIndexPathResult *IGListDiffPaths(NSInteger fromSection, NSInteger toSection, NSArray> *_Nullable oldArray, diff --git a/Project 27 - Marslink/Pods/IGListKit/Source/IGListDiff.mm b/Project 29 - Marslink/Pods/IGListKit/Source/Common/IGListDiff.mm similarity index 99% rename from Project 27 - Marslink/Pods/IGListKit/Source/IGListDiff.mm rename to Project 29 - Marslink/Pods/IGListKit/Source/Common/IGListDiff.mm index c1137b9a..8f87f81d 100644 --- a/Project 27 - Marslink/Pods/IGListKit/Source/IGListDiff.mm +++ b/Project 29 - Marslink/Pods/IGListKit/Source/Common/IGListDiff.mm @@ -13,8 +13,7 @@ #import #import -#import - +#import #import #import @@ -107,7 +106,7 @@ static id IGListDiffing(BOOL returnIndexPaths, IGListEntry &entry = table[key]; entry.oldCounter++; - // push the original indices where the item occured onto the index stack + // push the original indices where the item occurred onto the index stack entry.oldIndexes.push(i); // note: the entry is just a pointer to the entry which is stack-allocated in the table diff --git a/Project 29 - Marslink/Pods/IGListKit/Source/Common/IGListDiffKit.h b/Project 29 - Marslink/Pods/IGListKit/Source/Common/IGListDiffKit.h new file mode 100644 index 00000000..c40ddbe6 --- /dev/null +++ b/Project 29 - Marslink/Pods/IGListKit/Source/Common/IGListDiffKit.h @@ -0,0 +1,32 @@ +/** + * Copyright (c) 2016-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import + +/** + * Project version number for IGListKit. + */ +FOUNDATION_EXPORT double IGListKitVersionNumber; + +/** + * Project version string for IGListKit. + */ +FOUNDATION_EXPORT const unsigned char IGListKitVersionString[]; + +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import diff --git a/Project 27 - Marslink/Pods/IGListKit/Source/IGListDiffable.h b/Project 29 - Marslink/Pods/IGListKit/Source/Common/IGListDiffable.h similarity index 97% rename from Project 27 - Marslink/Pods/IGListKit/Source/IGListDiffable.h rename to Project 29 - Marslink/Pods/IGListKit/Source/Common/IGListDiffable.h index 937a1eb7..c46a91a1 100644 --- a/Project 27 - Marslink/Pods/IGListKit/Source/IGListDiffable.h +++ b/Project 29 - Marslink/Pods/IGListKit/Source/Common/IGListDiffable.h @@ -12,6 +12,7 @@ /** The `IGListDiffable` protocol provides methods needed to compare the identity and equality of two objects. */ +NS_SWIFT_NAME(ListDiffable) @protocol IGListDiffable /** diff --git a/Project 27 - Marslink/Pods/IGListKit/Source/IGListExperiments.h b/Project 29 - Marslink/Pods/IGListKit/Source/Common/IGListExperiments.h similarity index 72% rename from Project 27 - Marslink/Pods/IGListKit/Source/IGListExperiments.h rename to Project 29 - Marslink/Pods/IGListKit/Source/Common/IGListExperiments.h index 680aa6c0..d4893c50 100644 --- a/Project 27 - Marslink/Pods/IGListKit/Source/IGListExperiments.h +++ b/Project 29 - Marslink/Pods/IGListKit/Source/Common/IGListExperiments.h @@ -14,19 +14,25 @@ /** Bitmask-able options used for pre-release feature testing. */ +NS_SWIFT_NAME(ListExperiment) typedef NS_OPTIONS (NSInteger, IGListExperiment) { - /// Specifies no experiements. + /// Specifies no experiments. IGListExperimentNone = 1 << 1, + /// Test updater diffing performed on a background queue. + IGListExperimentBackgroundDiffing = 1 << 2, + /// Test fallback to reloadData when "too many" update operations. + IGListExperimentReloadDataFallback = 1 << 3, }; /** Check if an experiment is enabled in a bitmask. - @param mask The bitmask of experiments. + @param mask The bitmask of experiments. @param option The option to compare with. @return `YES` if the option is in the bitmask, otherwise `NO`. */ +NS_SWIFT_NAME(ListExperimentEnabled(mask:option:)) static inline BOOL IGListExperimentEnabled(IGListExperiment mask, IGListExperiment option) { return (mask & option) != 0; } @@ -36,15 +42,16 @@ NS_ASSUME_NONNULL_BEGIN /** Performs an index diff with an experiment bitmask. - @param oldArray The old array of objects. - @param newArray The new array of objects. - @param option Option to specify the type of diff. + @param oldArray The old array of objects. + @param newArray The new array of objects. + @param option Option to specify the type of diff. @param experiments Optional experiments. @return An index set result object contained the changed indexes. @see `IGListDiff()`. */ +NS_SWIFT_NAME(ListDiffExperiment(oldArray:newArray:option:experiments:)) FOUNDATION_EXTERN IGListIndexSetResult *IGListDiffExperiment(NSArray> *_Nullable oldArray, NSArray> *_Nullable newArray, IGListDiffOption option, @@ -54,16 +61,17 @@ FOUNDATION_EXTERN IGListIndexSetResult *IGListDiffExperiment(NSArray> *_Nullable oldArray, diff --git a/Project 27 - Marslink/Pods/IGListKit/Source/IGListIndexPathResult.h b/Project 29 - Marslink/Pods/IGListKit/Source/Common/IGListIndexPathResult.h similarity index 87% rename from Project 27 - Marslink/Pods/IGListKit/Source/IGListIndexPathResult.h rename to Project 29 - Marslink/Pods/IGListKit/Source/Common/IGListIndexPathResult.h index e6627d31..645dd397 100644 --- a/Project 27 - Marslink/Pods/IGListKit/Source/IGListIndexPathResult.h +++ b/Project 29 - Marslink/Pods/IGListKit/Source/Common/IGListIndexPathResult.h @@ -16,6 +16,7 @@ NS_ASSUME_NONNULL_BEGIN /** A result object returned when diffing with sections. */ +NS_SWIFT_NAME(ListIndexPathResult) @interface IGListIndexPathResult : NSObject /** @@ -29,7 +30,7 @@ NS_ASSUME_NONNULL_BEGIN @property (nonatomic, copy, readonly) NSArray *deletes; /** - The index paths in the new collection that need updated. + The index paths in the old collection that need updated. */ @property (nonatomic, copy, readonly) NSArray *updates; @@ -39,11 +40,10 @@ NS_ASSUME_NONNULL_BEGIN @property (nonatomic, copy, readonly) NSArray *moves; /** - Returns whether the result has any changes or not. - - @return `YES` if the result has changes, `NO` otherwise. + A Read-only boolean that indicates whether the result has any changes or not. + `YES` if the result has changes, `NO` otherwise. */ -- (BOOL)hasChanges; +@property (nonatomic, assign, readonly) BOOL hasChanges; /** Returns the index path of the object with the specified identifier *before* the diff. diff --git a/Project 27 - Marslink/Pods/IGListKit/Source/IGListIndexPathResult.m b/Project 29 - Marslink/Pods/IGListKit/Source/Common/IGListIndexPathResult.m similarity index 94% rename from Project 27 - Marslink/Pods/IGListKit/Source/IGListIndexPathResult.m rename to Project 29 - Marslink/Pods/IGListKit/Source/Common/IGListIndexPathResult.m index d8e9705a..ee635f02 100644 --- a/Project 27 - Marslink/Pods/IGListKit/Source/IGListIndexPathResult.m +++ b/Project 29 - Marslink/Pods/IGListKit/Source/Common/IGListIndexPathResult.m @@ -33,7 +33,11 @@ - (instancetype)initWithInserts:(NSArray *)inserts } - (BOOL)hasChanges { - return self.inserts.count || self.deletes.count || self.updates.count || self.moves.count; + return self.changeCount > 0; +} + +- (NSInteger)changeCount { + return self.inserts.count + self.deletes.count + self.updates.count + self.moves.count; } - (IGListIndexPathResult *)resultForBatchUpdates { @@ -45,7 +49,7 @@ - (IGListIndexPathResult *)resultForBatchUpdates { NSMutableArray *filteredMoves = [moves mutableCopy]; // convert move+update to delete+insert, respecting the from/to of the move - const NSUInteger moveCount = moves.count; + const NSInteger moveCount = moves.count; for (NSInteger i = moveCount - 1; i >= 0; i--) { IGListMoveIndexPath *move = moves[i]; if ([filteredUpdates containsObject:move.from]) { diff --git a/Project 27 - Marslink/Pods/IGListKit/Source/IGListIndexSetResult.h b/Project 29 - Marslink/Pods/IGListKit/Source/Common/IGListIndexSetResult.h similarity index 87% rename from Project 27 - Marslink/Pods/IGListKit/Source/IGListIndexSetResult.h rename to Project 29 - Marslink/Pods/IGListKit/Source/Common/IGListIndexSetResult.h index 4450c7bb..2eeccc0b 100644 --- a/Project 27 - Marslink/Pods/IGListKit/Source/IGListIndexSetResult.h +++ b/Project 29 - Marslink/Pods/IGListKit/Source/Common/IGListIndexSetResult.h @@ -16,6 +16,7 @@ NS_ASSUME_NONNULL_BEGIN /** A result object returned when diffing with indexes. */ +NS_SWIFT_NAME(ListIndexSetResult) @interface IGListIndexSetResult : NSObject /** @@ -29,7 +30,7 @@ NS_ASSUME_NONNULL_BEGIN @property (nonatomic, strong, readonly) NSIndexSet *deletes; /** - The indexes in the new collection that need updated. + The indexes in the old collection that need updated. */ @property (nonatomic, strong, readonly) NSIndexSet *updates; @@ -39,11 +40,10 @@ NS_ASSUME_NONNULL_BEGIN @property (nonatomic, copy, readonly) NSArray *moves; /** - Returns whether the result has any changes or not. - - @return `YES` if the result has changes, `NO` otherwise. + A Read-only boolean that indicates whether the result has any changes or not. + `YES` if the result has changes, `NO` otherwise. */ -- (BOOL)hasChanges; +@property (nonatomic, assign, readonly) BOOL hasChanges; /** Returns the index of the object with the specified identifier *before* the diff. diff --git a/Project 27 - Marslink/Pods/IGListKit/Source/IGListIndexSetResult.m b/Project 29 - Marslink/Pods/IGListKit/Source/Common/IGListIndexSetResult.m similarity index 94% rename from Project 27 - Marslink/Pods/IGListKit/Source/IGListIndexSetResult.m rename to Project 29 - Marslink/Pods/IGListKit/Source/Common/IGListIndexSetResult.m index 458a823d..f3c7a2f2 100644 --- a/Project 27 - Marslink/Pods/IGListKit/Source/IGListIndexSetResult.m +++ b/Project 29 - Marslink/Pods/IGListKit/Source/Common/IGListIndexSetResult.m @@ -35,7 +35,11 @@ - (instancetype)initWithInserts:(NSIndexSet *)inserts } - (BOOL)hasChanges { - return self.inserts.count || self.deletes.count || self.updates.count || self.moves.count; + return self.changeCount > 0; +} + +- (NSInteger)changeCount { + return self.inserts.count + self.deletes.count + self.updates.count + self.moves.count; } - (IGListIndexSetResult *)resultForBatchUpdates { @@ -47,7 +51,7 @@ - (IGListIndexSetResult *)resultForBatchUpdates { NSMutableArray *filteredMoves = [moves mutableCopy]; // convert all update+move to delete+insert - const NSUInteger moveCount = moves.count; + const NSInteger moveCount = moves.count; for (NSInteger i = moveCount - 1; i >= 0; i--) { IGListMoveIndex *move = moves[i]; if ([filteredUpdates containsIndex:move.from]) { diff --git a/Project 27 - Marslink/Pods/IGListKit/Source/IGListMacros.h b/Project 29 - Marslink/Pods/IGListKit/Source/Common/IGListMacros.h similarity index 88% rename from Project 27 - Marslink/Pods/IGListKit/Source/IGListMacros.h rename to Project 29 - Marslink/Pods/IGListKit/Source/Common/IGListMacros.h index 23c3b1ff..b464be3a 100644 --- a/Project 27 - Marslink/Pods/IGListKit/Source/IGListMacros.h +++ b/Project 29 - Marslink/Pods/IGListKit/Source/Common/IGListMacros.h @@ -24,3 +24,7 @@ #else #define IGLKLog( s, ... ) #endif + +#ifndef IGLK_DEBUG_DESCRIPTION_ENABLED +#define IGLK_DEBUG_DESCRIPTION_ENABLED DEBUG +#endif // #ifndef IGLK_DEBUG_DESCRIPTION_ENABLED diff --git a/Project 27 - Marslink/Pods/IGListKit/Source/IGListMoveIndex.h b/Project 29 - Marslink/Pods/IGListKit/Source/Common/IGListMoveIndex.h similarity index 96% rename from Project 27 - Marslink/Pods/IGListKit/Source/IGListMoveIndex.h rename to Project 29 - Marslink/Pods/IGListKit/Source/Common/IGListMoveIndex.h index 8745bb38..44c49618 100644 --- a/Project 27 - Marslink/Pods/IGListKit/Source/IGListMoveIndex.h +++ b/Project 29 - Marslink/Pods/IGListKit/Source/Common/IGListMoveIndex.h @@ -14,6 +14,7 @@ NS_ASSUME_NONNULL_BEGIN /** An object representing a move between indexes. */ +NS_SWIFT_NAME(ListMoveIndex) @interface IGListMoveIndex : NSObject /** diff --git a/Project 27 - Marslink/Pods/IGListKit/Source/IGListMoveIndex.m b/Project 29 - Marslink/Pods/IGListKit/Source/Common/IGListMoveIndex.m similarity index 100% rename from Project 27 - Marslink/Pods/IGListKit/Source/IGListMoveIndex.m rename to Project 29 - Marslink/Pods/IGListKit/Source/Common/IGListMoveIndex.m diff --git a/Project 27 - Marslink/Pods/IGListKit/Source/IGListMoveIndexPath.h b/Project 29 - Marslink/Pods/IGListKit/Source/Common/IGListMoveIndexPath.h similarity index 96% rename from Project 27 - Marslink/Pods/IGListKit/Source/IGListMoveIndexPath.h rename to Project 29 - Marslink/Pods/IGListKit/Source/Common/IGListMoveIndexPath.h index 9cb91f88..cbd9a274 100644 --- a/Project 27 - Marslink/Pods/IGListKit/Source/IGListMoveIndexPath.h +++ b/Project 29 - Marslink/Pods/IGListKit/Source/Common/IGListMoveIndexPath.h @@ -14,6 +14,7 @@ NS_ASSUME_NONNULL_BEGIN /** An object representing a move between indexes. */ +NS_SWIFT_NAME(ListMoveIndexPath) @interface IGListMoveIndexPath : NSObject /** diff --git a/Project 27 - Marslink/Pods/IGListKit/Source/IGListMoveIndexPath.m b/Project 29 - Marslink/Pods/IGListKit/Source/Common/IGListMoveIndexPath.m similarity index 100% rename from Project 27 - Marslink/Pods/IGListKit/Source/IGListMoveIndexPath.m rename to Project 29 - Marslink/Pods/IGListKit/Source/Common/IGListMoveIndexPath.m diff --git a/Project 29 - Marslink/Pods/IGListKit/Source/Common/Internal/IGListArrayUtilsInternal.h b/Project 29 - Marslink/Pods/IGListKit/Source/Common/Internal/IGListArrayUtilsInternal.h new file mode 100644 index 00000000..e3aed12a --- /dev/null +++ b/Project 29 - Marslink/Pods/IGListKit/Source/Common/Internal/IGListArrayUtilsInternal.h @@ -0,0 +1,33 @@ +/** + * Copyright (c) 2016-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#ifndef IGListArrayUtilsInternal_h +#define IGListArrayUtilsInternal_h + +static NSArray *objectsWithDuplicateIdentifiersRemoved(NSArray> *objects) { + if (objects == nil) { + return nil; + } + + NSMutableSet *identifiers = [NSMutableSet new]; + NSMutableArray *uniqueObjects = [NSMutableArray new]; + for (id object in objects) { + id diffIdentifier = [object diffIdentifier]; + if (diffIdentifier != nil + && ![identifiers containsObject:diffIdentifier]) { + [identifiers addObject:diffIdentifier]; + [uniqueObjects addObject:object]; + } else { + IGLKLog(@"WARNING: Object %@ already appeared in objects array", object); + } + } + return uniqueObjects; +} + +#endif /* IGListArrayUtilsInternal_h */ diff --git a/Project 27 - Marslink/Pods/IGListKit/Source/Internal/IGListIndexPathResultInternal.h b/Project 29 - Marslink/Pods/IGListKit/Source/Common/Internal/IGListIndexPathResultInternal.h similarity index 93% rename from Project 27 - Marslink/Pods/IGListKit/Source/Internal/IGListIndexPathResultInternal.h rename to Project 29 - Marslink/Pods/IGListKit/Source/Common/Internal/IGListIndexPathResultInternal.h index f60b5649..e8fdcc93 100644 --- a/Project 27 - Marslink/Pods/IGListKit/Source/Internal/IGListIndexPathResultInternal.h +++ b/Project 29 - Marslink/Pods/IGListKit/Source/Common/Internal/IGListIndexPathResultInternal.h @@ -22,6 +22,8 @@ NS_ASSUME_NONNULL_BEGIN oldIndexPathMap:(NSMapTable, NSIndexPath *> *)oldIndexPathMap newIndexPathMap:(NSMapTable, NSIndexPath *> *)newIndexPathMap; +@property (nonatomic, assign, readonly) NSInteger changeCount; + @end NS_ASSUME_NONNULL_END diff --git a/Project 27 - Marslink/Pods/IGListKit/Source/Internal/IGListIndexSetResultInternal.h b/Project 29 - Marslink/Pods/IGListKit/Source/Common/Internal/IGListIndexSetResultInternal.h similarity index 93% rename from Project 27 - Marslink/Pods/IGListKit/Source/Internal/IGListIndexSetResultInternal.h rename to Project 29 - Marslink/Pods/IGListKit/Source/Common/Internal/IGListIndexSetResultInternal.h index c66284e4..bbf5436e 100644 --- a/Project 27 - Marslink/Pods/IGListKit/Source/Internal/IGListIndexSetResultInternal.h +++ b/Project 29 - Marslink/Pods/IGListKit/Source/Common/Internal/IGListIndexSetResultInternal.h @@ -22,6 +22,8 @@ NS_ASSUME_NONNULL_BEGIN oldIndexMap:(NSMapTable, NSNumber *> *)oldIndexMap newIndexMap:(NSMapTable, NSNumber *> *)newIndexMap; +@property (nonatomic, assign, readonly) NSInteger changeCount; + @end NS_ASSUME_NONNULL_END diff --git a/Project 27 - Marslink/Pods/IGListKit/Source/Internal/IGListMoveIndexInternal.h b/Project 29 - Marslink/Pods/IGListKit/Source/Common/Internal/IGListMoveIndexInternal.h similarity index 100% rename from Project 27 - Marslink/Pods/IGListKit/Source/Internal/IGListMoveIndexInternal.h rename to Project 29 - Marslink/Pods/IGListKit/Source/Common/Internal/IGListMoveIndexInternal.h diff --git a/Project 27 - Marslink/Pods/IGListKit/Source/Internal/IGListMoveIndexPathInternal.h b/Project 29 - Marslink/Pods/IGListKit/Source/Common/Internal/IGListMoveIndexPathInternal.h similarity index 100% rename from Project 27 - Marslink/Pods/IGListKit/Source/Internal/IGListMoveIndexPathInternal.h rename to Project 29 - Marslink/Pods/IGListKit/Source/Common/Internal/IGListMoveIndexPathInternal.h diff --git a/Project 27 - Marslink/Pods/IGListKit/Source/NSNumber+IGListDiffable.h b/Project 29 - Marslink/Pods/IGListKit/Source/Common/NSNumber+IGListDiffable.h similarity index 100% rename from Project 27 - Marslink/Pods/IGListKit/Source/NSNumber+IGListDiffable.h rename to Project 29 - Marslink/Pods/IGListKit/Source/Common/NSNumber+IGListDiffable.h diff --git a/Project 27 - Marslink/Pods/IGListKit/Source/NSNumber+IGListDiffable.m b/Project 29 - Marslink/Pods/IGListKit/Source/Common/NSNumber+IGListDiffable.m similarity index 100% rename from Project 27 - Marslink/Pods/IGListKit/Source/NSNumber+IGListDiffable.m rename to Project 29 - Marslink/Pods/IGListKit/Source/Common/NSNumber+IGListDiffable.m diff --git a/Project 27 - Marslink/Pods/IGListKit/Source/NSString+IGListDiffable.h b/Project 29 - Marslink/Pods/IGListKit/Source/Common/NSString+IGListDiffable.h similarity index 100% rename from Project 27 - Marslink/Pods/IGListKit/Source/NSString+IGListDiffable.h rename to Project 29 - Marslink/Pods/IGListKit/Source/Common/NSString+IGListDiffable.h diff --git a/Project 27 - Marslink/Pods/IGListKit/Source/NSString+IGListDiffable.m b/Project 29 - Marslink/Pods/IGListKit/Source/Common/NSString+IGListDiffable.m similarity index 100% rename from Project 27 - Marslink/Pods/IGListKit/Source/NSString+IGListDiffable.m rename to Project 29 - Marslink/Pods/IGListKit/Source/Common/NSString+IGListDiffable.m diff --git a/Project 27 - Marslink/Pods/IGListKit/Source/IGListAdapter.h b/Project 29 - Marslink/Pods/IGListKit/Source/IGListAdapter.h similarity index 66% rename from Project 27 - Marslink/Pods/IGListKit/Source/IGListAdapter.h rename to Project 29 - Marslink/Pods/IGListKit/Source/IGListAdapter.h index cbbac766..17b5dd8b 100644 --- a/Project 27 - Marslink/Pods/IGListKit/Source/IGListAdapter.h +++ b/Project 29 - Marslink/Pods/IGListKit/Source/IGListAdapter.h @@ -12,9 +12,8 @@ #import #import #import -#import + #import -#import #import @protocol IGListUpdatingDelegate; @@ -24,21 +23,23 @@ NS_ASSUME_NONNULL_BEGIN /** - A block to execute when list updates completes. + A block to execute when the list updates are completed. - @param finished Specifies whether or not the updates finished. + @param finished Specifies whether or not the update animations completed successfully. */ +NS_SWIFT_NAME(ListUpdaterCompletion) typedef void (^IGListUpdaterCompletion)(BOOL finished); /** - `IGListAdapter` objects provide an abstraction for feeds of objects in a `UICollectionView` by breaking each object into - individual sections, called "section controllers". These controllers (objects conforming to `IGListSectionType`) act as a - data source and delegate for each section. + `IGListAdapter` objects provide an abstraction for feeds of objects in a `UICollectionView` by breaking each object + into individual sections, called "section controllers". These controllers (objects subclassing to + `IGListSectionController`) act as a data source and delegate for each section. Feed implementations must act as the data source for an `IGListAdapter` in order to drive the objects and section controllers in a collection view. */ IGLK_SUBCLASSING_RESTRICTED +NS_SWIFT_NAME(ListAdapter) @interface IGListAdapter : NSObject /** @@ -48,11 +49,13 @@ IGLK_SUBCLASSING_RESTRICTED /** The collection view used with the adapter. + + @note Setting this property will automatically set isPrefetchingEnabled to `NO` for performance reasons. */ -@property (nonatomic, nullable, weak) IGListCollectionView *collectionView; +@property (nonatomic, nullable, weak) UICollectionView *collectionView; /** - The object that acts as the data source for the list adapter. + The object that acts as the data source for the adapter. */ @property (nonatomic, nullable, weak) id dataSource; @@ -73,6 +76,11 @@ IGLK_SUBCLASSING_RESTRICTED */ @property (nonatomic, nullable, weak) id scrollViewDelegate; +/** + The updater for the adapter. + */ +@property (nonatomic, strong, readonly) id updater; + /** A bitmask of experiments to conduct on the adapter. */ @@ -81,8 +89,8 @@ IGLK_SUBCLASSING_RESTRICTED /** Initializes a new `IGListAdapter` object. - @param updatingDelegate An object that manages updates to the collection view. - @param viewController The view controller that will house the adapter. + @param updater An object that manages updates to the collection view. + @param viewController The view controller that will house the adapter. @param workingRangeSize The number of objects before and after the viewport to consider within the working range. @return A new list adapter object. @@ -92,18 +100,29 @@ IGLK_SUBCLASSING_RESTRICTED the previous and succeeding 2 objects will be notified that they are within the working range. As you scroll the list the range is updated as objects enter and exit the working range. - To opt out of using the working range, you can provide a value of `0`. + To opt out of using the working range, use `initWithUpdater:viewController:` or provide a working range of `0`. */ -- (instancetype)initWithUpdater:(id )updatingDelegate +- (instancetype)initWithUpdater:(id )updater viewController:(nullable UIViewController *)viewController workingRangeSize:(NSInteger)workingRangeSize NS_DESIGNATED_INITIALIZER; /** - Perform an update from the previous state of the data source. This is analagous to calling + Initializes a new `IGListAdapter` object with a working range of `0`. + + @param updater An object that manages updates to the collection view. + @param viewController The view controller that will house the adapter. + + @return A new list adapter object. + */ +- (instancetype)initWithUpdater:(id )updater + viewController:(nullable UIViewController *)viewController; + +/** + Perform an update from the previous state of the data source. This is analogous to calling `-[UICollectionView performBatchUpdates:completion:]`. - @param animated A flag indicating if the transition should be animated. - @param completion The block to execute when the update completes. + @param animated A flag indicating if the transition should be animated. + @param completion The block to execute when the updates complete. */ - (void)performUpdatesAnimated:(BOOL)animated completion:(nullable IGListUpdaterCompletion)completion; @@ -121,6 +140,15 @@ IGLK_SUBCLASSING_RESTRICTED */ - (void)reloadObjects:(NSArray *)objects; +/** + Query the section controller at a given section index. Constant time lookup. + + @param section A section in the list. + + @return A section controller or `nil` if the section does not exist. + */ +- (nullable IGListSectionController *)sectionControllerForSection:(NSInteger)section; + /** Query the section index of a list. Constant time lookup. @@ -128,27 +156,27 @@ IGLK_SUBCLASSING_RESTRICTED @return The section index of the list if it exists, otherwise `NSNotFound`. */ -- (NSInteger)sectionForSectionController:(IGListSectionController *)sectionController; +- (NSInteger)sectionForSectionController:(IGListSectionController *)sectionController; /** Returns the section controller for the specified object. Constant time lookup. @param object An object from the data source. - @return An section controller or `nil` if `object` is not in the list. + @return A section controller or `nil` if `object` is not in the list. @see `-[IGListAdapterDataSource listAdapter:sectionControllerForObject:]` */ -- (__kindof IGListSectionController * _Nullable)sectionControllerForObject:(id)object; +- (__kindof IGListSectionController * _Nullable)sectionControllerForObject:(id)object; /** Returns the object corresponding to the specified section controller in the list. Constant time lookup. @param sectionController A section controller in the list. - @return The object for the specified section controller, or nil if not found. + @return The object for the specified section controller, or `nil` if not found. */ -- (nullable id)objectForSectionController:(IGListSectionController *)sectionController; +- (nullable id)objectForSectionController:(IGListSectionController *)sectionController; /** Returns the object corresponding to a section in the list. Constant time lookup. @@ -169,7 +197,7 @@ IGLK_SUBCLASSING_RESTRICTED - (NSInteger)sectionForObject:(id)object; /** - Returns a copy of all the objects currently powering the adapter. + Returns a copy of all the objects currently driving the adapter. @return An array of objects. */ @@ -180,7 +208,7 @@ IGLK_SUBCLASSING_RESTRICTED @return An array of section controllers. */ -- (NSArray *> *)visibleSectionControllers; +- (NSArray *)visibleSectionControllers; /** An unordered array of the currently visible objects. @@ -190,13 +218,22 @@ IGLK_SUBCLASSING_RESTRICTED - (NSArray *)visibleObjects; /** - Scrolls to the sepcified object in the list adapter. + An unordered array of the currently visible cells for a given object. + + @param object An object in the list + + @return An array of collection view cells. + */ +- (NSArray *)visibleCellsForObject:(id)object; + +/** + Scrolls to the specified object in the list adapter. - @param object The object to which to scroll. + @param object The object to which to scroll. @param supplementaryKinds The types of supplementary views in the section. - @param scrollDirection An option indicating the direction to scroll. - @param scrollPosition An option that specifies where the item should be positioned when scrolling finishes. - @param animated A flag indicating if the scrolling should be animated. + @param scrollDirection An option indicating the direction to scroll. + @param scrollPosition An option that specifies where the item should be positioned when scrolling finishes. + @param animated A flag indicating if the scrolling should be animated. */ - (void)scrollToObject:(id)object supplementaryKinds:(nullable NSArray *)supplementaryKinds @@ -217,7 +254,7 @@ IGLK_SUBCLASSING_RESTRICTED Returns the size of a supplementary view in the list at the specified index path. @param elementKind The kind of supplementary view. - @param indexPath The index path of the supplementary view. + @param indexPath The index path of the supplementary view. @return The size of the supplementary view. */ diff --git a/Project 27 - Marslink/Pods/IGListKit/Source/IGListAdapter.m b/Project 29 - Marslink/Pods/IGListKit/Source/IGListAdapter.m similarity index 56% rename from Project 27 - Marslink/Pods/IGListKit/Source/IGListAdapter.m rename to Project 29 - Marslink/Pods/IGListKit/Source/IGListAdapter.m index 168284d4..85077f13 100644 --- a/Project 27 - Marslink/Pods/IGListKit/Source/IGListAdapter.m +++ b/Project 29 - Marslink/Pods/IGListKit/Source/IGListAdapter.m @@ -11,15 +11,15 @@ #import #import -#import #import #import "IGListSectionControllerInternal.h" +#import "IGListDebugger.h" @implementation IGListAdapter { - NSMapTable *> *_cellSectionControllerMap; - BOOL _isDequeuingCell; - BOOL _isSendingWorkingRangeDisplayUpdates; + NSMapTable *_viewSectionControllerMap; + // An array of blocks to execute once batch updates are finished + NSMutableArray *_queuedCompletionBlocks; } - (void)dealloc { @@ -29,46 +29,66 @@ - (void)dealloc { _collectionView.dataSource = nil; _collectionView.delegate = nil; } + + [self.sectionMap reset]; } #pragma mark - Init -- (instancetype)initWithUpdater:(id )updatingDelegate +- (instancetype)initWithUpdater:(id )updater viewController:(UIViewController *)viewController workingRangeSize:(NSInteger)workingRangeSize { IGAssertMainThread(); - IGParameterAssert(updatingDelegate); + IGParameterAssert(updater); if (self = [super init]) { - NSPointerFunctions *keyFunctions = [updatingDelegate objectLookupPointerFunctions]; + NSPointerFunctions *keyFunctions = [updater objectLookupPointerFunctions]; NSPointerFunctions *valueFunctions = [NSPointerFunctions pointerFunctionsWithOptions:NSPointerFunctionsStrongMemory]; NSMapTable *table = [[NSMapTable alloc] initWithKeyPointerFunctions:keyFunctions valuePointerFunctions:valueFunctions capacity:0]; _sectionMap = [[IGListSectionMap alloc] initWithMapTable:table]; - _displayHandler = [[IGListDisplayHandler alloc] init]; + _displayHandler = [IGListDisplayHandler new]; _workingRangeHandler = [[IGListWorkingRangeHandler alloc] initWithWorkingRangeSize:workingRangeSize]; - _cellSectionControllerMap = [NSMapTable mapTableWithKeyOptions:NSMapTableObjectPointerPersonality | NSMapTableStrongMemory + _viewSectionControllerMap = [NSMapTable mapTableWithKeyOptions:NSMapTableObjectPointerPersonality | NSMapTableStrongMemory valueOptions:NSMapTableStrongMemory]; - _updatingDelegate = updatingDelegate; + _updater = updater; _viewController = viewController; + + [IGListDebugger trackAdapter:self]; } return self; } -- (IGListCollectionView *)collectionView { - return (IGListCollectionView *)_collectionView; +- (instancetype)initWithUpdater:(id)updater + viewController:(UIViewController *)viewController { + return [self initWithUpdater:updater + viewController:viewController + workingRangeSize:0]; +} + +- (UICollectionView *)collectionView { + return _collectionView; } -- (void)setCollectionView:(IGListCollectionView *)collectionView { +- (void)setCollectionView:(UICollectionView *)collectionView { IGAssertMainThread(); - IGParameterAssert([collectionView isKindOfClass:[IGListCollectionView class]]); // if collection view has been used by a different list adapter, treat it as if we were using a new collection view - // this happens when embedding a IGListCollectionView inside a UICollectionViewCell that is reused + // this happens when embedding a UICollectionView inside a UICollectionViewCell that is reused if (_collectionView != collectionView || _collectionView.dataSource != self) { + // if the collection view was being used with another IGListAdapter (e.g. cell reuse) + // destroy the previous association so the old adapter doesn't update the wrong collection view + static NSMapTable *globalCollectionViewAdapterMap = nil; + if (globalCollectionViewAdapterMap == nil) { + globalCollectionViewAdapterMap = [NSMapTable weakToWeakObjectsMapTable]; + } + [globalCollectionViewAdapterMap removeObjectForKey:_collectionView]; + [[globalCollectionViewAdapterMap objectForKey:collectionView] setCollectionView:nil]; + [globalCollectionViewAdapterMap setObject:self forKey:collectionView]; + // dump old registered section controllers in the case that we are changing collection views or setting for // the first time _registeredCellClasses = [NSMutableSet new]; @@ -79,6 +99,12 @@ - (void)setCollectionView:(IGListCollectionView *)collectionView { _collectionView = collectionView; _collectionView.dataSource = self; + if ([_collectionView respondsToSelector:@selector(setPrefetchingEnabled:)]) { + _collectionView.prefetchingEnabled = NO; + } + + [_collectionView.collectionViewLayout invalidateLayout]; + [self updateCollectionViewDelegate]; [self updateAfterPublicSettingsChange]; } @@ -113,8 +139,9 @@ - (void)setScrollViewDelegate:(id)scrollViewDelegate { } - (void)updateAfterPublicSettingsChange { - if (_collectionView != nil && _dataSource != nil) { - [self updateObjects:[[_dataSource objectsForListAdapter:self] copy]]; + id dataSource = _dataSource; + if (_collectionView != nil && dataSource != nil) { + [self updateObjects:[[dataSource objectsForListAdapter:self] copy] dataSource:dataSource]; } } @@ -146,26 +173,47 @@ - (void)scrollToObject:(id)object IGAssertMainThread(); IGParameterAssert(object != nil); - const NSUInteger section = [self sectionForObject:object]; + const NSInteger section = [self sectionForObject:object]; if (section == NSNotFound) { return; } UICollectionView *collectionView = self.collectionView; - const NSUInteger numberOfItems = [collectionView numberOfItemsInSection:section]; - if (numberOfItems == 0) { - return; - } + UICollectionViewLayout *layout = self.collectionView.collectionViewLayout; // force layout before continuing // this method is typcially called before pushing a view controller // thus, before the layout process has actually happened + [collectionView setNeedsLayout]; [collectionView layoutIfNeeded]; + NSIndexPath *indexPathFirstElement = [NSIndexPath indexPathForItem:0 inSection:section]; + // collect the layout attributes for the cell and supplementary views for the first index // this will break if there are supplementary views beyond item 0 - NSIndexPath *indexPath = [NSIndexPath indexPathForItem:0 inSection:section]; - NSArray *attributes = [self layoutAttributesForIndexPath:indexPath supplementaryKinds:supplementaryKinds]; + NSMutableArray *attributes = nil; + + const NSInteger numberOfItems = [collectionView numberOfItemsInSection:section]; + if (numberOfItems > 0) { + attributes = [self layoutAttributesForIndexPath:indexPathFirstElement supplementaryKinds:supplementaryKinds].mutableCopy; + + if (numberOfItems > 1) { + NSIndexPath *indexPathLastElement = [NSIndexPath indexPathForItem:(numberOfItems - 1) inSection:section]; + UICollectionViewLayoutAttributes *lastElementattributes = [self layoutAttributesForIndexPath:indexPathLastElement supplementaryKinds:supplementaryKinds].firstObject; + if (lastElementattributes != nil) { + [attributes addObject:lastElementattributes]; + } + } + } else { + NSMutableArray *supplementaryAttributes = [NSMutableArray new]; + for (NSString* supplementaryKind in supplementaryKinds) { + UICollectionViewLayoutAttributes *supplementaryAttribute = [layout layoutAttributesForSupplementaryViewOfKind:supplementaryKind atIndexPath:indexPathFirstElement]; + if (supplementaryAttribute != nil) { + [supplementaryAttributes addObject: supplementaryAttribute]; + } + } + attributes = supplementaryAttributes; + } CGFloat offsetMin = 0.0; CGFloat offsetMax = 0.0; @@ -193,21 +241,23 @@ - (void)scrollToObject:(id)object offsetMax = endMax; } } - + const CGFloat offsetMid = (offsetMin + offsetMax) / 2.0; const CGFloat collectionViewWidth = collectionView.bounds.size.width; const CGFloat collectionViewHeight = collectionView.bounds.size.height; const UIEdgeInsets contentInset = collectionView.contentInset; CGPoint contentOffset = collectionView.contentOffset; switch (scrollDirection) { - case UICollectionViewScrollDirectionHorizontal: + case UICollectionViewScrollDirectionHorizontal: { switch (scrollPosition) { case UICollectionViewScrollPositionRight: contentOffset.x = offsetMax - collectionViewWidth - contentInset.left; break; - case UICollectionViewScrollPositionCenteredHorizontally: - contentOffset.x = offsetMid - collectionViewWidth / 2.0 - contentInset.left; + case UICollectionViewScrollPositionCenteredHorizontally: { + const CGFloat insets = (contentInset.left - contentInset.right) / 2.0; + contentOffset.x = offsetMid - collectionViewWidth / 2.0 - insets; break; + } case UICollectionViewScrollPositionLeft: case UICollectionViewScrollPositionNone: case UICollectionViewScrollPositionTop: @@ -216,15 +266,22 @@ - (void)scrollToObject:(id)object contentOffset.x = offsetMin - contentInset.left; break; } + const CGFloat maxOffsetX = collectionView.contentSize.width - collectionView.frame.size.width + collectionView.contentInset.right; + const CGFloat minOffsetX = -collectionView.contentInset.left; + contentOffset.x = MIN(contentOffset.x, maxOffsetX); + contentOffset.x = MAX(contentOffset.x, minOffsetX); break; - case UICollectionViewScrollDirectionVertical: + } + case UICollectionViewScrollDirectionVertical: { switch (scrollPosition) { case UICollectionViewScrollPositionBottom: - contentOffset.y = offsetMax - collectionViewHeight - contentInset.top; + contentOffset.y = offsetMax - collectionViewHeight; break; - case UICollectionViewScrollPositionCenteredVertically: - contentOffset.y = offsetMid - collectionViewHeight / 2.0 - contentInset.top; + case UICollectionViewScrollPositionCenteredVertically: { + const CGFloat insets = (contentInset.top - contentInset.bottom) / 2.0; + contentOffset.y = offsetMid - collectionViewHeight / 2.0 - insets; break; + } case UICollectionViewScrollPositionTop: case UICollectionViewScrollPositionNone: case UICollectionViewScrollPositionLeft: @@ -233,13 +290,17 @@ - (void)scrollToObject:(id)object contentOffset.y = offsetMin - contentInset.top; break; } + const CGFloat maxOffsetY = collectionView.contentSize.height - collectionView.frame.size.height + collectionView.contentInset.bottom; + const CGFloat minOffsetY = -collectionView.contentInset.top; + contentOffset.y = MIN(contentOffset.y, maxOffsetY); + contentOffset.y = MAX(contentOffset.y, minOffsetY); break; + } } [collectionView setContentOffset:contentOffset animated:animated]; } - #pragma mark - Editing - (void)performUpdatesAnimated:(BOOL)animated completion:(IGListUpdaterCompletion)completion { @@ -248,34 +309,39 @@ - (void)performUpdatesAnimated:(BOOL)animated completion:(IGListUpdaterCompletio id dataSource = self.dataSource; UICollectionView *collectionView = self.collectionView; if (dataSource == nil || collectionView == nil) { + IGLKLog(@"Warning: Your call to %s is ignored as dataSource or collectionView haven't been set.", __PRETTY_FUNCTION__); if (completion) { completion(NO); } return; } - NSArray *fromObjects = [self.sectionMap.objects copy]; - NSArray *newItems = [[dataSource objectsForListAdapter:self] copy]; + NSArray *fromObjects = self.sectionMap.objects; + NSArray *newObjects = [dataSource objectsForListAdapter:self]; + + [self enterBatchUpdates]; __weak __typeof__(self) weakSelf = self; - [self.updatingDelegate performUpdateWithCollectionView:collectionView - fromObjects:fromObjects - toObjects:newItems - animated:animated - objectTransitionBlock:^(NSArray *toObjects) { - // temporarily capture the item map that we are transitioning from in case - // there are any item deletes at the same - weakSelf.previoussectionMap = [weakSelf.sectionMap copy]; - - [weakSelf updateObjects:toObjects]; - } completion:^(BOOL finished) { - // release the previous items - weakSelf.previoussectionMap = nil; - - if (completion) { - completion(finished); - } - }]; + [self.updater performUpdateWithCollectionView:collectionView + fromObjects:fromObjects + toObjects:newObjects + animated:animated + objectTransitionBlock:^(NSArray *toObjects) { + // temporarily capture the item map that we are transitioning from in case + // there are any item deletes at the same + weakSelf.previousSectionMap = [weakSelf.sectionMap copy]; + + [weakSelf updateObjects:toObjects dataSource:dataSource]; + } completion:^(BOOL finished) { + // release the previous items + weakSelf.previousSectionMap = nil; + + if (completion) { + completion(finished); + } + + [weakSelf exitBatchUpdates]; + }]; } - (void)reloadDataWithCompletion:(nullable IGListUpdaterCompletion)completion { @@ -284,6 +350,7 @@ - (void)reloadDataWithCompletion:(nullable IGListUpdaterCompletion)completion { id dataSource = self.dataSource; UICollectionView *collectionView = self.collectionView; if (dataSource == nil || collectionView == nil) { + IGLKLog(@"Warning: Your call to %s is ignored as dataSource or collectionView haven't been set.", __PRETTY_FUNCTION__); if (completion) { completion(NO); } @@ -293,10 +360,10 @@ - (void)reloadDataWithCompletion:(nullable IGListUpdaterCompletion)completion { NSArray *newItems = [[dataSource objectsForListAdapter:self] copy]; __weak __typeof__(self) weakSelf = self; - [self.updatingDelegate reloadDataWithCollectionView:collectionView reloadUpdateBlock:^{ + [self.updater reloadDataWithCollectionView:collectionView reloadUpdateBlock:^{ // purge all section controllers from the item map so that they are regenerated [weakSelf.sectionMap reset]; - [weakSelf updateObjects:newItems]; + [weakSelf updateObjects:newItems dataSource:dataSource]; } completion:completion]; } @@ -304,10 +371,10 @@ - (void)reloadObjects:(NSArray *)objects { IGAssertMainThread(); IGParameterAssert(objects); - NSMutableIndexSet *sections = [[NSMutableIndexSet alloc] init]; + NSMutableIndexSet *sections = [NSMutableIndexSet new]; // use the item map based on whether or not we're in an update block - IGListSectionMap *map = [self sectionMapAdjustForUpdateBlock:YES]; + IGListSectionMap *map = [self sectionMapUsingPreviousIfInUpdateBlock:YES]; for (id object in objects) { // look up the item using the map's lookup function. might not be the same item @@ -328,31 +395,37 @@ - (void)reloadObjects:(NSArray *)objects { UICollectionView *collectionView = self.collectionView; IGAssert(collectionView != nil, @"Tried to reload the adapter without a collection view"); - [self.updatingDelegate reloadCollectionView:collectionView sections:sections]; + [self.updater reloadCollectionView:collectionView sections:sections]; } #pragma mark - List Items & Sections -- (NSInteger)sectionForSectionController:(IGListSectionController *)sectionController { +- (nullable IGListSectionController *)sectionControllerForSection:(NSInteger)section { + IGAssertMainThread(); + + return [self.sectionMap sectionControllerForSection:section]; +} + +- (NSInteger)sectionForSectionController:(IGListSectionController *)sectionController { IGAssertMainThread(); IGParameterAssert(sectionController != nil); return [self.sectionMap sectionForSectionController:sectionController]; } -- (id )sectionControllerForObject:(id)object { +- (IGListSectionController *)sectionControllerForObject:(id)object { IGAssertMainThread(); IGParameterAssert(object != nil); return [self.sectionMap sectionControllerForObject:object]; } -- (id)objectForSectionController:(IGListSectionController *)sectionController { +- (id)objectForSectionController:(IGListSectionController *)sectionController { IGAssertMainThread(); IGParameterAssert(sectionController != nil); - - const NSUInteger section = [self.sectionMap sectionForSectionController:sectionController]; + + const NSInteger section = [self.sectionMap sectionForSectionController:sectionController]; return [self.sectionMap objectForSection:section]; } @@ -372,21 +445,22 @@ - (NSInteger)sectionForObject:(id)item { - (NSArray *)objects { IGAssertMainThread(); - return [self.sectionMap.objects copy]; + return self.sectionMap.objects; } - (id)supplementaryViewSourceAtIndexPath:(NSIndexPath *)indexPath { - IGListSectionController *sectionController = [self.sectionMap sectionControllerForSection:indexPath.section]; + IGListSectionController *sectionController = [self sectionControllerForSection:indexPath.section]; return [sectionController supplementaryViewSource]; } -- (NSArray *> *)visibleSectionControllers { +- (NSArray *)visibleSectionControllers { IGAssertMainThread(); - NSArray *visibleCells = [self.collectionView visibleCells]; NSMutableSet *visibleSectionControllers = [NSMutableSet new]; - for (UICollectionViewCell *cell in visibleCells) { - IGListSectionController *sectionController = [self sectionControllerForCell:cell]; - IGAssert(sectionController != nil, @"Section controller nil for cell %@", cell); + NSArray *attributes = + [self.collectionView.collectionViewLayout layoutAttributesForElementsInRect:self.collectionView.bounds]; + for (UICollectionViewLayoutAttributes* attribute in attributes) { + IGListSectionController *sectionController = [self sectionControllerForSection:attribute.indexPath.section]; + IGAssert(sectionController != nil, @"Section controller nil for cell in section %zd", attribute.indexPath.section); if (sectionController) { [visibleSectionControllers addObject:sectionController]; } @@ -399,10 +473,10 @@ - (NSArray *)visibleObjects { NSArray *visibleCells = [self.collectionView visibleCells]; NSMutableSet *visibleObjects = [NSMutableSet new]; for (UICollectionViewCell *cell in visibleCells) { - IGListSectionController *sectionController = [self sectionControllerForCell:cell]; + IGListSectionController *sectionController = [self sectionControllerForView:cell]; IGAssert(sectionController != nil, @"Section controller nil for cell %@", cell); if (sectionController != nil) { - const NSUInteger section = [self sectionForSectionController:sectionController]; + const NSInteger section = [self sectionForSectionController:sectionController]; id object = [self objectAtSection:section]; IGAssert(object != nil, @"Object not found for section controller %@ at section %zi", sectionController, section); if (object != nil) { @@ -413,21 +487,42 @@ - (NSArray *)visibleObjects { return [visibleObjects allObjects]; } +- (NSArray *)visibleCellsForObject:(id)object { + IGAssertMainThread(); + IGParameterAssert(object != nil); + + const NSInteger section = [self.sectionMap sectionForObject:object]; + if (section == NSNotFound) { + return [NSArray new]; + } + + NSArray *visibleCells = [self.collectionView visibleCells]; + UICollectionView *collectionView = self.collectionView; + NSPredicate *controllerPredicate = [NSPredicate predicateWithBlock:^BOOL(UICollectionViewCell* cell, NSDictionary* bindings) { + NSIndexPath *indexPath = [collectionView indexPathForCell:cell]; + return indexPath.section == section; + }]; + + return [visibleCells filteredArrayUsingPredicate:controllerPredicate]; +} + #pragma mark - Layout - (CGSize)sizeForItemAtIndexPath:(NSIndexPath *)indexPath { IGAssertMainThread(); - IGListSectionController *sectionController = [self.sectionMap sectionControllerForSection:indexPath.section]; - return [sectionController sizeForItemAtIndex:indexPath.item]; + IGListSectionController *sectionController = [self sectionControllerForSection:indexPath.section]; + const CGSize size = [sectionController sizeForItemAtIndex:indexPath.item]; + return CGSizeMake(MAX(size.width, 0.0), MAX(size.height, 0.0)); } - (CGSize)sizeForSupplementaryViewOfKind:(NSString *)elementKind atIndexPath:(NSIndexPath *)indexPath { IGAssertMainThread(); id supplementaryViewSource = [self supplementaryViewSourceAtIndexPath:indexPath]; if ([[supplementaryViewSource supportedElementKinds] containsObject:elementKind]) { - return [supplementaryViewSource sizeForSupplementaryViewOfKind:elementKind atIndex:indexPath.item]; + const CGSize size = [supplementaryViewSource sizeForSupplementaryViewOfKind:elementKind atIndex:indexPath.item]; + return CGSizeMake(MAX(size.width, 0.0), MAX(size.height, 0.0)); } return CGSizeZero; } @@ -437,14 +532,21 @@ - (CGSize)sizeForSupplementaryViewOfKind:(NSString *)elementKind atIndexPath:(NS // this method is what updates the "source of truth" // this should only be called just before the collection view is updated -- (void)updateObjects:(NSArray *)objects { +- (void)updateObjects:(NSArray *)objects dataSource:(id)dataSource { + IGParameterAssert(dataSource != nil); + #if DEBUG + NSCountedSet *identifiersSet = [NSCountedSet new]; for (id object in objects) { - IGAssert([object isEqual:object], @"Object instance %@ not equal to itself. This will break infra map tables.", object); + [identifiersSet addObject:[object diffIdentifier]]; + IGAssert([object isEqualToDiffableObject:object], @"Object instance %@ not equal to itself. This will break infra map tables.", object); + IGAssert([identifiersSet countForObject:[object diffIdentifier]] <= 1, @"Diff identifier %@ for object %@ occurs more than once. Identifiers must be unique!", [object diffIdentifier], object); } #endif - NSMutableArray *> *sectionControllers = [[NSMutableArray alloc] init]; + NSMutableArray *sectionControllers = [NSMutableArray new]; + NSMutableArray *validObjects = [NSMutableArray new]; + IGListSectionMap *map = self.sectionMap; // collect items that have changed since the last update @@ -454,57 +556,62 @@ - (void)updateObjects:(NSArray *)objects { // for IGListSectionController subclasses after calling [super init] IGListSectionControllerPushThread(self.viewController, self); - id firstObject = objects.firstObject; - id lastObject = objects.lastObject; - for (id object in objects) { // infra checks to see if a controller exists - IGListSectionController *sectionController = [map sectionControllerForObject:object]; + IGListSectionController *sectionController = [map sectionControllerForObject:object]; // if not, query the data source for a new one if (sectionController == nil) { - sectionController = [self.dataSource listAdapter:self sectionControllerForObject:object]; + sectionController = [dataSource listAdapter:self sectionControllerForObject:object]; } - IGAssert(sectionController != nil, @"Data source <%@> cannot return a nil section controller.", self.dataSource); if (sectionController == nil) { + IGLKLog(@"WARNING: Ignoring nil section controller returned by data source %@ for object %@.", + dataSource, object); continue; } // in case the section controller was created outside of -listAdapter:sectionControllerForObject: sectionController.collectionContext = self; sectionController.viewController = self.viewController; - sectionController.isFirstSection = (object == firstObject); - sectionController.isLastSection = (object == lastObject); // check if the item has changed instances or is new - const NSUInteger oldSection = [map sectionForObject:object]; + const NSInteger oldSection = [map sectionForObject:object]; if (oldSection == NSNotFound || [map objectForSection:oldSection] != object) { [updatedObjects addObject:object]; } [sectionControllers addObject:sectionController]; + +#if DEBUG + IGAssert([NSSet setWithArray:sectionControllers].count == sectionControllers.count, + @"Section controllers array is not filled with unique objects; section controllers are being reused"); +#endif + [validObjects addObject:object]; } // clear the view controller and collection context IGListSectionControllerPopThread(); - [map updateWithObjects:objects sectionControllers:[sectionControllers copy]]; + [map updateWithObjects:validObjects sectionControllers:sectionControllers]; // now that the maps have been created and contexts are assigned, we consider the section controller "fully loaded" for (id object in updatedObjects) { [[map sectionControllerForObject:object] didUpdateToObject:object]; } - NSUInteger itemCount = 0; - for (IGListSectionController *sectionController in sectionControllers) { + NSInteger itemCount = 0; + for (IGListSectionController *sectionController in sectionControllers) { itemCount += [sectionController numberOfItems]; } - [self updateBackgroundViewWithItemCount:itemCount]; + [self updateBackgroundViewShouldHide:itemCount > 0]; } -- (void)updateBackgroundViewWithItemCount:(NSUInteger)itemCount { +- (void)updateBackgroundViewShouldHide:(BOOL)shouldHide { + if (self.isInUpdateBlock) { + return; // will be called again when update block completes + } UIView *backgroundView = [self.dataSource emptyViewForListAdapter:self]; // don't do anything if the client is using the same view if (backgroundView != _collectionView.backgroundView) { @@ -513,36 +620,50 @@ - (void)updateBackgroundViewWithItemCount:(NSUInteger)itemCount { [_collectionView.backgroundView removeFromSuperview]; _collectionView.backgroundView = backgroundView; } - _collectionView.backgroundView.hidden = itemCount > 0; + _collectionView.backgroundView.hidden = shouldHide; } -- (IGListSectionMap *)sectionMapAdjustForUpdateBlock:(BOOL)adjustForUpdateBlock { +- (BOOL)itemCountIsZero { + __block BOOL isZero = YES; + [self.sectionMap enumerateUsingBlock:^(id _Nonnull object, IGListSectionController * _Nonnull sectionController, NSInteger section, BOOL * _Nonnull stop) { + if (sectionController.numberOfItems > 0) { + isZero = NO; + *stop = YES; + } + }]; + return isZero; +} + +- (IGListSectionMap *)sectionMapUsingPreviousIfInUpdateBlock:(BOOL)usePreviousMapIfInUpdateBlock { // if we are inside an update block, we may have to use the /previous/ item map for some operations - if (adjustForUpdateBlock && self.isInUpdateBlock && self.previoussectionMap != nil) { - return self.previoussectionMap; + IGListSectionMap *previousSectionMap = self.previousSectionMap; + if (usePreviousMapIfInUpdateBlock && self.isInUpdateBlock && previousSectionMap != nil) { + return previousSectionMap; } else { return self.sectionMap; } } -- (NSArray *)indexPathsFromSectionController:(IGListSectionController *)sectionController +- (NSArray *)indexPathsFromSectionController:(IGListSectionController *)sectionController indexes:(NSIndexSet *)indexes - adjustForUpdateBlock:(BOOL)adjustForUpdateBlock { - NSMutableArray *indexPaths = [[NSMutableArray alloc] init]; + usePreviousIfInUpdateBlock:(BOOL)usePreviousIfInUpdateBlock { + NSMutableArray *indexPaths = [NSMutableArray new]; - IGListSectionMap *map = [self sectionMapAdjustForUpdateBlock:adjustForUpdateBlock]; - - const NSUInteger section = [map sectionForSectionController:sectionController]; + IGListSectionMap *map = [self sectionMapUsingPreviousIfInUpdateBlock:usePreviousIfInUpdateBlock]; + const NSInteger section = [map sectionForSectionController:sectionController]; if (section != NSNotFound) { [indexes enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL *stop) { [indexPaths addObject:[NSIndexPath indexPathForItem:idx inSection:section]]; }]; } - return [indexPaths copy]; + return indexPaths; } -- (NSIndexPath *)indexPathForSectionController:(IGListSectionController *)controller index:(NSInteger)index { - const NSUInteger section = [self.sectionMap sectionForSectionController:controller]; +- (NSIndexPath *)indexPathForSectionController:(IGListSectionController *)controller + index:(NSInteger)index + usePreviousIfInUpdateBlock:(BOOL)usePreviousIfInUpdateBlock { + IGListSectionMap *map = [self sectionMapUsingPreviousIfInUpdateBlock:usePreviousIfInUpdateBlock]; + const NSInteger section = [map sectionForSectionController:controller]; if (section == NSNotFound) { return nil; } else { @@ -553,7 +674,7 @@ - (NSIndexPath *)indexPathForSectionController:(IGListSectionController *)contro - (NSArray *)layoutAttributesForIndexPath:(NSIndexPath *)indexPath supplementaryKinds:(NSArray *)supplementaryKinds { UICollectionViewLayout *layout = self.collectionView.collectionViewLayout; - NSMutableArray *attributes = [[NSMutableArray alloc] init]; + NSMutableArray *attributes = [NSMutableArray new]; UICollectionViewLayoutAttributes *cellAttributes = [layout layoutAttributesForItemAtIndexPath:indexPath]; if (cellAttributes) { @@ -567,115 +688,44 @@ - (NSIndexPath *)indexPathForSectionController:(IGListSectionController *)contro } } - return [attributes copy]; + return attributes; } -- (void)mapCell:(UICollectionViewCell *)cell toSectionController:(IGListSectionController *)sectionController { +- (void)mapView:(UICollectionReusableView *)view toSectionController:(IGListSectionController *)sectionController { IGAssertMainThread(); - IGParameterAssert(cell != nil); + IGParameterAssert(view != nil); IGParameterAssert(sectionController != nil); - [_cellSectionControllerMap setObject:sectionController forKey:cell]; + [_viewSectionControllerMap setObject:sectionController forKey:view]; } -- (nullable IGListSectionController *)sectionControllerForCell:(UICollectionViewCell *)cell { +- (nullable IGListSectionController *)sectionControllerForView:(UICollectionReusableView *)view { IGAssertMainThread(); - return [_cellSectionControllerMap objectForKey:cell]; + return [_viewSectionControllerMap objectForKey:view]; } -- (void)removeMapForCell:(UICollectionViewCell *)cell { +- (void)removeMapForView:(UICollectionReusableView *)view { IGAssertMainThread(); - [_cellSectionControllerMap removeObjectForKey:cell]; -} - -#pragma mark - UICollectionViewDataSource - -- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView { - return self.sectionMap.objects.count; -} - -- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { - IGListSectionController * sectionController = [self.sectionMap sectionControllerForSection:section]; - IGAssert(sectionController != nil, @"Nil section controller for section %zi for item %@. Check your -diffIdentifier and -isEqual: implementations.", - section, [self.sectionMap objectForSection:section]); - const NSInteger numberOfItems = [sectionController numberOfItems]; - IGAssert(numberOfItems >= 0, @"Cannot return negative number of items %zi for section controller %@.", numberOfItems, sectionController); - return numberOfItems; + [_viewSectionControllerMap removeObjectForKey:view]; } -- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { - IGListSectionController *sectionController = [self.sectionMap sectionControllerForSection:indexPath.section]; - - // flag that a cell is being dequeued in case it tries to access a cell in the process - _isDequeuingCell = YES; - UICollectionViewCell *cell = [sectionController cellForItemAtIndex:indexPath.item]; - _isDequeuingCell = NO; - - IGAssert(cell != nil, @"Returned a nil cell at indexPath <%@> from section controller: <%@>", indexPath, sectionController); - - // associate the section controller with the cell so that we know which section controller is using it - [self mapCell:cell toSectionController:sectionController]; - - return cell; -} - -- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath { - IGListSectionController *sectionController = [self.sectionMap sectionControllerForSection:indexPath.section]; - id supplementarySource = [sectionController supplementaryViewSource]; - UICollectionReusableView *view = [supplementarySource viewForSupplementaryElementOfKind:kind atIndex:indexPath.item]; - IGAssert(view != nil, @"Returned a nil supplementary view at indexPath <%@> from section controller: <%@>, supplementary source: <%@>", indexPath, sectionController, supplementarySource); - return view; -} - - -#pragma mark - UICollectionViewDelegate - -- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath { - // forward this method to the delegate b/c this implementation will steal the message from the proxy - id collectionViewDelegate = self.collectionViewDelegate; - if ([collectionViewDelegate respondsToSelector:@selector(collectionView:didSelectItemAtIndexPath:)]) { - [collectionViewDelegate collectionView:collectionView didSelectItemAtIndexPath:indexPath]; +- (void)deferBlockBetweenBatchUpdates:(void (^)())block { + IGAssertMainThread(); + if (_queuedCompletionBlocks == nil) { + block(); + } else { + [_queuedCompletionBlocks addObject:block]; } - - IGListSectionController * sectionController = [self.sectionMap sectionControllerForSection:indexPath.section]; - [sectionController didSelectItemAtIndex:indexPath.item]; } -- (void)collectionView:(UICollectionView *)collectionView willDisplayCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath { - // forward this method to the delegate b/c this implementation will steal the message from the proxy - id collectionViewDelegate = self.collectionViewDelegate; - if ([collectionViewDelegate respondsToSelector:@selector(collectionView:willDisplayCell:forItemAtIndexPath:)]) { - [collectionViewDelegate collectionView:collectionView willDisplayCell:cell forItemAtIndexPath:indexPath]; - } - - IGListSectionController *sectionController = [self sectionControllerForCell:cell]; - // if the section controller relationship was destroyed, reconnect it - // this happens with iOS 10 UICollectionView display range changes - if (sectionController == nil) { - sectionController = [self.sectionMap sectionControllerForSection:indexPath.section]; - [self mapCell:cell toSectionController:sectionController]; - } - - id object = [self.sectionMap objectForSection:indexPath.section]; - [self.displayHandler willDisplayCell:cell forListAdapter:self sectionController:sectionController object:object indexPath:indexPath]; - - _isSendingWorkingRangeDisplayUpdates = YES; - [self.workingRangeHandler willDisplayItemAtIndexPath:indexPath forListAdapter:self]; - _isSendingWorkingRangeDisplayUpdates = NO; +- (void)enterBatchUpdates { + _queuedCompletionBlocks = [NSMutableArray new]; } -- (void)collectionView:(UICollectionView *)collectionView didEndDisplayingCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath { - // forward this method to the delegate b/c this implementation will steal the message from the proxy - id collectionViewDelegate = self.collectionViewDelegate; - if ([collectionViewDelegate respondsToSelector:@selector(collectionView:didEndDisplayingCell:forItemAtIndexPath:)]) { - [collectionViewDelegate collectionView:collectionView didEndDisplayingCell:cell forItemAtIndexPath:indexPath]; +- (void)exitBatchUpdates { + for (void (^block)() in _queuedCompletionBlocks) { + block(); } - - IGListSectionController *sectionController = [self sectionControllerForCell:cell]; - [self.displayHandler didEndDisplayingCell:cell forListAdapter:self sectionController:sectionController indexPath:indexPath]; - [self.workingRangeHandler didEndDisplayingItemAtIndexPath:indexPath forListAdapter:self]; - - // break the association between the cell and the section controller - [self removeMapForCell:cell]; + _queuedCompletionBlocks = nil; } #pragma mark - UIScrollViewDelegate @@ -686,8 +736,8 @@ - (void)scrollViewDidScroll:(UIScrollView *)scrollView { if ([scrollViewDelegate respondsToSelector:@selector(scrollViewDidScroll:)]) { [scrollViewDelegate scrollViewDidScroll:scrollView]; } - NSArray *> *visibleSectionControllers = [self visibleSectionControllers]; - for (IGListSectionController *sectionController in visibleSectionControllers) { + NSArray *visibleSectionControllers = [self visibleSectionControllers]; + for (IGListSectionController *sectionController in visibleSectionControllers) { [[sectionController scrollDelegate] listAdapter:self didScrollSectionController:sectionController]; } } @@ -698,8 +748,8 @@ - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView { if ([scrollViewDelegate respondsToSelector:@selector(scrollViewWillBeginDragging:)]) { [scrollViewDelegate scrollViewWillBeginDragging:scrollView]; } - NSArray *> *visibleSectionControllers = [self visibleSectionControllers]; - for (IGListSectionController *sectionController in visibleSectionControllers) { + NSArray *visibleSectionControllers = [self visibleSectionControllers]; + for (IGListSectionController *sectionController in visibleSectionControllers) { [[sectionController scrollDelegate] listAdapter:self willBeginDraggingSectionController:sectionController]; } } @@ -710,31 +760,61 @@ - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL if ([scrollViewDelegate respondsToSelector:@selector(scrollViewDidEndDragging:willDecelerate:)]) { [scrollViewDelegate scrollViewDidEndDragging:scrollView willDecelerate:decelerate]; } - NSArray *> *visibleSectionControllers = [self visibleSectionControllers]; - for (IGListSectionController *sectionController in visibleSectionControllers) { + NSArray *visibleSectionControllers = [self visibleSectionControllers]; + for (IGListSectionController *sectionController in visibleSectionControllers) { [[sectionController scrollDelegate] listAdapter:self didEndDraggingSectionController:sectionController willDecelerate:decelerate]; } } +- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView { + // forward this method to the delegate b/c this implementation will steal the message from the proxy + id scrollViewDelegate = self.scrollViewDelegate; + if ([scrollViewDelegate respondsToSelector:@selector(scrollViewDidEndDecelerating:)]) { + [scrollViewDelegate scrollViewDidEndDecelerating:scrollView]; + } + NSArray *visibleSectionControllers = [self visibleSectionControllers]; + for (IGListSectionController *sectionController in visibleSectionControllers) { + id scrollDelegate = [sectionController scrollDelegate]; + if ([scrollDelegate respondsToSelector:@selector(listAdapter:didEndDeceleratingSectionController:)]) { + [scrollDelegate listAdapter:self didEndDeceleratingSectionController:sectionController]; + } + } +} #pragma mark - IGListCollectionContext - (CGSize)containerSize { - return UIEdgeInsetsInsetRect(self.collectionView.bounds, self.collectionView.contentInset).size; + return self.collectionView.bounds.size; +} + +- (UIEdgeInsets)containerInset { + return self.collectionView.contentInset; +} + +- (CGSize)insetContainerSize { + UICollectionView *collectionView = self.collectionView; + return UIEdgeInsetsInsetRect(collectionView.bounds, collectionView.contentInset).size; +} + +- (CGSize)containerSizeForSectionController:(IGListSectionController *)sectionController { + const UIEdgeInsets inset = sectionController.inset; + return CGSizeMake(self.containerSize.width - inset.left - inset.right, + self.containerSize.height - inset.top - inset.bottom); } -- (NSInteger)indexForCell:(UICollectionViewCell *)cell sectionController:(nonnull IGListSectionController *)sectionController { +- (NSInteger)indexForCell:(UICollectionViewCell *)cell sectionController:(nonnull IGListSectionController *)sectionController { IGAssertMainThread(); IGParameterAssert(cell != nil); IGParameterAssert(sectionController != nil); NSIndexPath *indexPath = [self.collectionView indexPathForCell:cell]; - IGAssert(indexPath.section == [self sectionForSectionController:sectionController], + IGAssert(indexPath == nil + || indexPath.section == [self sectionForSectionController:sectionController], @"Requesting a cell from another section controller is not allowed."); return indexPath != nil ? indexPath.item : NSNotFound; } - (__kindof UICollectionViewCell *)cellForItemAtIndex:(NSInteger)index - sectionController:(IGListSectionController *)sectionController { + sectionController:(IGListSectionController *)sectionController { IGAssertMainThread(); IGParameterAssert(sectionController != nil); @@ -743,44 +823,67 @@ - (__kindof UICollectionViewCell *)cellForItemAtIndex:(NSInteger)index return nil; } - NSIndexPath *indexPath = [self indexPathForSectionController:sectionController index:index]; + NSIndexPath *indexPath = [self indexPathForSectionController:sectionController index:index usePreviousIfInUpdateBlock:NO]; // prevent querying the collection view if it isn't fully reloaded yet for the current data set if (indexPath != nil && indexPath.section < [self.collectionView numberOfSections]) { // only return a cell if it belongs to the section controller // this association is created in -collectionView:cellForItemAtIndexPath: UICollectionViewCell *cell = [self.collectionView cellForItemAtIndexPath:indexPath]; - if ([self sectionControllerForCell:cell] == sectionController) { + if ([self sectionControllerForView:cell] == sectionController) { return cell; } } return nil; } -- (NSArray *)visibleCellsForSectionController:(IGListSectionController *)sectionController { +- (NSArray *)visibleCellsForSectionController:(IGListSectionController *)sectionController { NSMutableArray *cells = [NSMutableArray new]; UICollectionView *collectionView = self.collectionView; NSArray *visibleCells = [collectionView visibleCells]; - const NSUInteger section = [self sectionForSectionController:sectionController]; + const NSInteger section = [self sectionForSectionController:sectionController]; for (UICollectionViewCell *cell in visibleCells) { if ([collectionView indexPathForCell:cell].section == section) { [cells addObject:cell]; } } - return [cells copy]; + return cells; +} + +- (NSArray *)visibleIndexPathsForSectionController:(IGListSectionController *) sectionController { + NSMutableArray *paths = [NSMutableArray new]; + UICollectionView *collectionView = self.collectionView; + NSArray *visiblePaths = [collectionView indexPathsForVisibleItems]; + const NSInteger section = [self sectionForSectionController:sectionController]; + for (NSIndexPath *path in visiblePaths) { + if (path.section == section) { + [paths addObject:path]; + } + } + return paths; } - (void)deselectItemAtIndex:(NSInteger)index - sectionController:(IGListSectionController *)sectionController + sectionController:(IGListSectionController *)sectionController animated:(BOOL)animated { IGAssertMainThread(); IGParameterAssert(sectionController != nil); - NSIndexPath *indexPath = [self indexPathForSectionController:sectionController index:index]; + NSIndexPath *indexPath = [self indexPathForSectionController:sectionController index:index usePreviousIfInUpdateBlock:NO]; [self.collectionView deselectItemAtIndexPath:indexPath animated:animated]; } +- (void)selectItemAtIndex:(NSInteger)index + sectionController:(IGListSectionController *)sectionController + animated:(BOOL)animated + scrollPosition:(UICollectionViewScrollPosition)scrollPosition { + IGAssertMainThread(); + IGParameterAssert(sectionController != nil); + NSIndexPath *indexPath = [self indexPathForSectionController:sectionController index:index usePreviousIfInUpdateBlock:NO]; + [self.collectionView selectItemAtIndexPath:indexPath animated:animated scrollPosition:scrollPosition]; +} + - (__kindof UICollectionViewCell *)dequeueReusableCellOfClass:(Class)cellClass - forSectionController:(IGListSectionController *)sectionController + forSectionController:(IGListSectionController *)sectionController atIndex:(NSInteger)index { IGAssertMainThread(); IGParameterAssert(sectionController != nil); @@ -789,7 +892,7 @@ - (__kindof UICollectionViewCell *)dequeueReusableCellOfClass:(Class)cellClass UICollectionView *collectionView = self.collectionView; IGAssert(collectionView != nil, @"Dequeueing cell of class %@ from section controller %@ without a collection view at index %zi", NSStringFromClass(cellClass), sectionController, index); NSString *identifier = IGListReusableViewIdentifier(cellClass, nil, nil); - NSIndexPath *indexPath = [self indexPathForSectionController:sectionController index:index]; + NSIndexPath *indexPath = [self indexPathForSectionController:sectionController index:index usePreviousIfInUpdateBlock:NO]; if (![self.registeredCellClasses containsObject:cellClass]) { [self.registeredCellClasses addObject:cellClass]; [collectionView registerClass:cellClass forCellWithReuseIdentifier:identifier]; @@ -798,20 +901,20 @@ - (__kindof UICollectionViewCell *)dequeueReusableCellOfClass:(Class)cellClass } - (__kindof UICollectionViewCell *)dequeueReusableCellFromStoryboardWithIdentifier:(NSString *)identifier - forSectionController:(IGListSectionController *)sectionController + forSectionController:(IGListSectionController *)sectionController atIndex:(NSInteger)index { IGAssertMainThread(); IGParameterAssert(sectionController != nil); IGParameterAssert(identifier.length > 0); UICollectionView *collectionView = self.collectionView; IGAssert(collectionView != nil, @"Reloading adapter without a collection view."); - NSIndexPath *indexPath = [self indexPathForSectionController:sectionController index:index]; + NSIndexPath *indexPath = [self indexPathForSectionController:sectionController index:index usePreviousIfInUpdateBlock:NO]; return [collectionView dequeueReusableCellWithReuseIdentifier:identifier forIndexPath:indexPath]; } - (UICollectionViewCell *)dequeueReusableCellWithNibName:(NSString *)nibName bundle:(NSBundle *)bundle - forSectionController:(IGListSectionController *)sectionController + forSectionController:(IGListSectionController *)sectionController atIndex:(NSInteger)index { IGAssertMainThread(); IGParameterAssert([nibName length] > 0); @@ -819,7 +922,7 @@ - (UICollectionViewCell *)dequeueReusableCellWithNibName:(NSString *)nibName IGParameterAssert(index >= 0); UICollectionView *collectionView = self.collectionView; IGAssert(collectionView != nil, @"Dequeueing cell with nib name %@ and bundle %@ from section controller %@ without a collection view at index %zi.", nibName, bundle, sectionController, index); - NSIndexPath *indexPath = [self indexPathForSectionController:sectionController index:index]; + NSIndexPath *indexPath = [self indexPathForSectionController:sectionController index:index usePreviousIfInUpdateBlock:NO]; if (![self.registeredNibNames containsObject:nibName]) { [self.registeredNibNames addObject:nibName]; UINib *nib = [UINib nibWithNibName:nibName bundle:bundle]; @@ -829,7 +932,7 @@ - (UICollectionViewCell *)dequeueReusableCellWithNibName:(NSString *)nibName } - (__kindof UICollectionReusableView *)dequeueReusableSupplementaryViewOfKind:(NSString *)elementKind - forSectionController:(IGListSectionController *)sectionController + forSectionController:(IGListSectionController *)sectionController class:(Class)viewClass atIndex:(NSInteger)index { IGAssertMainThread(); @@ -840,7 +943,7 @@ - (__kindof UICollectionReusableView *)dequeueReusableSupplementaryViewOfKind:(N UICollectionView *collectionView = self.collectionView; IGAssert(collectionView != nil, @"Dequeueing cell of class %@ from section controller %@ without a collection view at index %zi with supplementary view %@", NSStringFromClass(viewClass), sectionController, index, elementKind); NSString *identifier = IGListReusableViewIdentifier(viewClass, nil, elementKind); - NSIndexPath *indexPath = [self indexPathForSectionController:sectionController index:index]; + NSIndexPath *indexPath = [self indexPathForSectionController:sectionController index:index usePreviousIfInUpdateBlock:NO]; if (![self.registeredSupplementaryViewIdentifiers containsObject:identifier]) { [self.registeredSupplementaryViewIdentifiers addObject:identifier]; [collectionView registerClass:viewClass forSupplementaryViewOfKind:elementKind withReuseIdentifier:identifier]; @@ -850,7 +953,7 @@ - (__kindof UICollectionReusableView *)dequeueReusableSupplementaryViewOfKind:(N - (__kindof UICollectionReusableView *)dequeueReusableSupplementaryViewFromStoryboardOfKind:(NSString *)elementKind withIdentifier:(NSString *)identifier - forSectionController:(IGListSectionController *)sectionController + forSectionController:(IGListSectionController *)sectionController atIndex:(NSInteger)index { IGAssertMainThread(); IGParameterAssert(elementKind.length > 0); @@ -859,12 +962,12 @@ - (__kindof UICollectionReusableView *)dequeueReusableSupplementaryViewFromStory IGParameterAssert(index >= 0); UICollectionView *collectionView = self.collectionView; IGAssert(collectionView != nil, @"Dequeueing Supplementary View from storyboard of kind %@ with identifier %@ for section controller %@ without a collection view at index %zi", elementKind, identifier, sectionController, index); - NSIndexPath *indexPath = [self indexPathForSectionController:sectionController index:index]; + NSIndexPath *indexPath = [self indexPathForSectionController:sectionController index:index usePreviousIfInUpdateBlock:NO]; return [collectionView dequeueReusableSupplementaryViewOfKind:elementKind withReuseIdentifier:identifier forIndexPath:indexPath]; } - (__kindof UICollectionReusableView *)dequeueReusableSupplementaryViewOfKind:(NSString *)elementKind - forSectionController:(IGListSectionController *)sectionController + forSectionController:(IGListSectionController *)sectionController nibName:(NSString *)nibName bundle:(NSBundle *)bundle atIndex:(NSInteger)index { @@ -873,7 +976,7 @@ - (__kindof UICollectionReusableView *)dequeueReusableSupplementaryViewOfKind:(N IGParameterAssert([elementKind length] > 0); UICollectionView *collectionView = self.collectionView; IGAssert(collectionView != nil, @"Reloading adapter without a collection view."); - NSIndexPath *indexPath = [self indexPathForSectionController:sectionController index:index]; + NSIndexPath *indexPath = [self indexPathForSectionController:sectionController index:index usePreviousIfInUpdateBlock:NO]; if (![self.registeredSupplementaryViewNibNames containsObject:nibName]) { [self.registeredSupplementaryViewNibNames addObject:nibName]; UINib *nib = [UINib nibWithNibName:nibName bundle:bundle]; @@ -882,7 +985,68 @@ - (__kindof UICollectionReusableView *)dequeueReusableSupplementaryViewOfKind:(N return [collectionView dequeueReusableSupplementaryViewOfKind:elementKind withReuseIdentifier:nibName forIndexPath:indexPath]; } -- (void)reloadInSectionController:(IGListSectionController *)sectionController atIndexes:(NSIndexSet *)indexes { +- (void)performBatchAnimated:(BOOL)animated updates:(void (^)(id))updates completion:(void (^)(BOOL))completion { + IGAssertMainThread(); + IGParameterAssert(updates != nil); + UICollectionView *collectionView = self.collectionView; + IGAssert(collectionView != nil, @"Performing batch updates without a collection view."); + + [self enterBatchUpdates]; + + __weak __typeof__(self) weakSelf = self; + [self.updater performUpdateWithCollectionView:collectionView animated:animated itemUpdates:^{ + weakSelf.isInUpdateBlock = YES; + // the adapter acts as the batch context with its API stripped to just the IGListBatchContext protocol + updates(weakSelf); + weakSelf.isInUpdateBlock = NO; + } completion: ^(BOOL finished) { + [weakSelf updateBackgroundViewShouldHide:![weakSelf itemCountIsZero]]; + if (completion) { + completion(finished); + } + + [weakSelf exitBatchUpdates]; + }]; +} + +- (void)scrollToSectionController:(IGListSectionController *)sectionController + atIndex:(NSInteger)index + scrollPosition:(UICollectionViewScrollPosition)scrollPosition + animated:(BOOL)animated { + IGAssertMainThread(); + IGParameterAssert(sectionController != nil); + + NSIndexPath *indexPath = [self indexPathForSectionController:sectionController index:index usePreviousIfInUpdateBlock:NO]; + [self.collectionView scrollToItemAtIndexPath:indexPath atScrollPosition:scrollPosition animated:animated]; +} + +- (void)invalidateLayoutForSectionController:(IGListSectionController *)sectionController + completion:(void (^)(BOOL finished))completion{ + const NSInteger section = [self sectionForSectionController:sectionController]; + const NSInteger items = [_collectionView numberOfItemsInSection:section]; + + NSMutableArray *indexPaths = [NSMutableArray new]; + for (NSInteger item = 0; item < items; item++) { + [indexPaths addObject:[NSIndexPath indexPathForItem:item inSection:section]]; + } + + UICollectionViewLayout *layout = _collectionView.collectionViewLayout; + UICollectionViewLayoutInvalidationContext *context = [[[layout.class invalidationContextClass] alloc] init]; + [context invalidateItemsAtIndexPaths:indexPaths]; + + __weak __typeof__(_collectionView) weakCollectionView = _collectionView; + + // do not call -[UICollectionView performBatchUpdates:completion:] while already updating. defer it until completed. + [self deferBlockBetweenBatchUpdates:^{ + [weakCollectionView performBatchUpdates:^{ + [layout invalidateLayoutWithContext:context]; + } completion:completion]; + }]; +} + +#pragma mark - IGListBatchContext + +- (void)reloadInSectionController:(IGListSectionController *)sectionController atIndexes:(NSIndexSet *)indexes { IGAssertMainThread(); IGParameterAssert(indexes != nil); IGParameterAssert(sectionController != nil); @@ -893,11 +1057,34 @@ - (void)reloadInSectionController:(IGListSectionController *) return; } - NSArray *indexPaths = [self indexPathsFromSectionController:sectionController indexes:indexes adjustForUpdateBlock:YES]; - [self.updatingDelegate reloadItemsInCollectionView:collectionView indexPaths:indexPaths]; + /** + UICollectionView is not designed to support -reloadSections: or -reloadItemsAtIndexPaths: during batch updates. + Internally it appears to convert these operations to a delete+insert. However the transformation is too simple + in that it doesn't account for the item's section being moved (naturally or explicitly) and can queue animation + collisions. + + If you have an object at section 2 with 4 items and attempt to reload item at index 1, you would create an + NSIndexPath at section: 2, item: 1. Within -performBatchUpdates:, UICollectionView converts this to a delete + and insert at the same NSIndexPath. + + If a section were inserted at position 2, the original section 2 has naturally shifted to section 3. However, + the insert NSIndexPath is section: 2, item: 1. Now the UICollectionView has a section animation at section 2, + as well as an item insert animation at section: 2, item: 1, and it will throw an exception. + + IGListAdapter tracks the before/after mapping of section controllers to make precise NSIndexPath conversions. + */ + [indexes enumerateIndexesUsingBlock:^(NSUInteger index, BOOL *stop) { + NSIndexPath *fromIndexPath = [self indexPathForSectionController:sectionController index:index usePreviousIfInUpdateBlock:YES]; + NSIndexPath *toIndexPath = [self indexPathForSectionController:sectionController index:index usePreviousIfInUpdateBlock:NO]; + // index paths could be nil if a section controller is prematurely reloading or a reload was batched with + // the section controller being deleted + if (fromIndexPath != nil && toIndexPath != nil) { + [self.updater reloadItemInCollectionView:collectionView fromIndexPath:fromIndexPath toIndexPath:toIndexPath]; + } + }]; } -- (void)insertInSectionController:(IGListSectionController *)sectionController atIndexes:(NSIndexSet *)indexes { +- (void)insertInSectionController:(IGListSectionController *)sectionController atIndexes:(NSIndexSet *)indexes { IGAssertMainThread(); IGParameterAssert(indexes != nil); IGParameterAssert(sectionController != nil); @@ -908,11 +1095,12 @@ - (void)insertInSectionController:(IGListSectionController *) return; } - NSArray *indexPaths = [self indexPathsFromSectionController:sectionController indexes:indexes adjustForUpdateBlock:NO]; - [self.updatingDelegate insertItemsIntoCollectionView:collectionView indexPaths:indexPaths]; + NSArray *indexPaths = [self indexPathsFromSectionController:sectionController indexes:indexes usePreviousIfInUpdateBlock:NO]; + [self.updater insertItemsIntoCollectionView:collectionView indexPaths:indexPaths]; + [self updateBackgroundViewShouldHide:![self itemCountIsZero]]; } -- (void)deleteInSectionController:(IGListSectionController *)sectionController atIndexes:(NSIndexSet *)indexes { +- (void)deleteInSectionController:(IGListSectionController *)sectionController atIndexes:(NSIndexSet *)indexes { IGAssertMainThread(); IGParameterAssert(indexes != nil); IGParameterAssert(sectionController != nil); @@ -923,83 +1111,45 @@ - (void)deleteInSectionController:(IGListSectionController *) return; } - NSArray *indexPaths = [self indexPathsFromSectionController:sectionController indexes:indexes adjustForUpdateBlock:YES]; - [self.updatingDelegate deleteItemsFromCollectionView:collectionView indexPaths:indexPaths]; + NSArray *indexPaths = [self indexPathsFromSectionController:sectionController indexes:indexes usePreviousIfInUpdateBlock:YES]; + [self.updater deleteItemsFromCollectionView:collectionView indexPaths:indexPaths]; + [self updateBackgroundViewShouldHide:![self itemCountIsZero]]; } -- (void)reloadSectionController:(IGListSectionController *)sectionController { +- (void)moveInSectionController:(IGListSectionController *)sectionController fromIndex:(NSInteger)fromIndex toIndex:(NSInteger)toIndex { IGAssertMainThread(); IGParameterAssert(sectionController != nil); + IGParameterAssert(fromIndex >= 0); + IGParameterAssert(toIndex >= 0); UICollectionView *collectionView = self.collectionView; - IGAssert(collectionView != nil, @"Reloading items from %@ without a collection view.", sectionController); + IGAssert(collectionView != nil, @"Moving items from %@ without a collection view from index %zi to index %zi.", + sectionController, fromIndex, toIndex); - IGListSectionMap *map = [self sectionMapAdjustForUpdateBlock:YES]; - const NSInteger section = [map sectionForSectionController:sectionController]; - if (section == NSNotFound) { + NSIndexPath *fromIndexPath = [self indexPathForSectionController:sectionController index:fromIndex usePreviousIfInUpdateBlock:YES]; + NSIndexPath *toIndexPath = [self indexPathForSectionController:sectionController index:toIndex usePreviousIfInUpdateBlock:NO]; + + if (fromIndexPath == nil || toIndexPath == nil) { return; } - NSIndexSet *sections = [NSIndexSet indexSetWithIndex:section]; - [self.updatingDelegate reloadCollectionView:collectionView sections:sections]; -} - -- (void)performBatchAnimated:(BOOL)animated updates:(void (^)())updates completion:(void (^)(BOOL))completion { - IGAssertMainThread(); - IGParameterAssert(updates != nil); - UICollectionView *collectionView = self.collectionView; - IGAssert(collectionView != nil, @"Performing batch updates without a collection view."); - - __weak __typeof__(self) weakSelf = self; - [self.updatingDelegate performUpdateWithCollectionView:collectionView animated:animated itemUpdates:^{ - weakSelf.isInUpdateBlock = YES; - updates(); - weakSelf.isInUpdateBlock = NO; - } completion:completion]; + [self.updater moveItemInCollectionView:collectionView fromIndexPath:fromIndexPath toIndexPath:toIndexPath]; } -- (void)scrollToSectionController:(IGListSectionController *)sectionController - atIndex:(NSInteger)index - scrollPosition:(UICollectionViewScrollPosition)scrollPosition - animated:(BOOL)animated { +- (void)reloadSectionController:(IGListSectionController *)sectionController { IGAssertMainThread(); IGParameterAssert(sectionController != nil); + UICollectionView *collectionView = self.collectionView; + IGAssert(collectionView != nil, @"Reloading items from %@ without a collection view.", sectionController); - NSIndexPath *indexPath = [self indexPathForSectionController:sectionController index:index]; - [self.collectionView scrollToItemAtIndexPath:indexPath atScrollPosition:scrollPosition animated:animated]; -} - -#pragma mark - UICollectionViewDelegateFlowLayout - -- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath { - IGAssert(![self.collectionViewDelegate respondsToSelector:_cmd], @"IGListAdapter is consuming method also implemented by the collectionViewDelegate: %@", NSStringFromSelector(_cmd)); - return [self sizeForItemAtIndexPath:indexPath]; -} - -- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout insetForSectionAtIndex:(NSInteger)section { - IGAssert(![self.collectionViewDelegate respondsToSelector:_cmd], @"IGListAdapter is consuming method also implemented by the collectionViewDelegate: %@", NSStringFromSelector(_cmd)); - return [[self.sectionMap sectionControllerForSection:section] inset]; -} - -- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout minimumLineSpacingForSectionAtIndex:(NSInteger)section { - IGAssert(![self.collectionViewDelegate respondsToSelector:_cmd], @"IGListAdapter is consuming method also implemented by the collectionViewDelegate: %@", NSStringFromSelector(_cmd)); - return [[self.sectionMap sectionControllerForSection:section] minimumLineSpacing]; -} - -- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout minimumInteritemSpacingForSectionAtIndex:(NSInteger)section { - IGAssert(![self.collectionViewDelegate respondsToSelector:_cmd], @"IGListAdapter is consuming method also implemented by the collectionViewDelegate: %@", NSStringFromSelector(_cmd)); - return [[self.sectionMap sectionControllerForSection:section] minimumInteritemSpacing]; -} - -- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section { - IGAssert(![self.collectionViewDelegate respondsToSelector:_cmd], @"IGListAdapter is consuming method also implemented by the collectionViewDelegate: %@", NSStringFromSelector(_cmd)); - NSIndexPath *indexPath = [NSIndexPath indexPathForItem:0 inSection:section]; - return [self sizeForSupplementaryViewOfKind:UICollectionElementKindSectionHeader atIndexPath:indexPath]; -} + IGListSectionMap *map = [self sectionMapUsingPreviousIfInUpdateBlock:YES]; + const NSInteger section = [map sectionForSectionController:sectionController]; + if (section == NSNotFound) { + return; + } -- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout referenceSizeForFooterInSection:(NSInteger)section { - IGAssert(![self.collectionViewDelegate respondsToSelector:_cmd], @"IGListAdapter is consuming method also implemented by the collectionViewDelegate: %@", NSStringFromSelector(_cmd)); - NSIndexPath *indexPath = [NSIndexPath indexPathForItem:0 inSection:section]; - return [self sizeForSupplementaryViewOfKind:UICollectionElementKindSectionFooter atIndexPath:indexPath]; + NSIndexSet *sections = [NSIndexSet indexSetWithIndex:section]; + [self.updater reloadCollectionView:collectionView sections:sections]; + [self updateBackgroundViewShouldHide:![self itemCountIsZero]]; } @end diff --git a/Project 27 - Marslink/Pods/IGListKit/Source/IGListAdapterDataSource.h b/Project 29 - Marslink/Pods/IGListKit/Source/IGListAdapterDataSource.h similarity index 90% rename from Project 27 - Marslink/Pods/IGListKit/Source/IGListAdapterDataSource.h rename to Project 29 - Marslink/Pods/IGListKit/Source/IGListAdapterDataSource.h index f45ca43e..e0039a99 100644 --- a/Project 27 - Marslink/Pods/IGListKit/Source/IGListAdapterDataSource.h +++ b/Project 29 - Marslink/Pods/IGListKit/Source/IGListAdapterDataSource.h @@ -14,13 +14,12 @@ @class IGListAdapter; @class IGListSectionController; -@protocol IGListSectionType; - NS_ASSUME_NONNULL_BEGIN /** Implement this protocol to provide data to an `IGListAdapter`. */ +NS_SWIFT_NAME(ListAdapterDataSource) @protocol IGListAdapterDataSource /** @@ -36,7 +35,7 @@ NS_ASSUME_NONNULL_BEGIN Asks the data source for a section controller for the specified object in the list. @param listAdapter The list adapter requesting this information. - @param object An object in the list. + @param object An object in the list. @return A new section controller instance that can be displayed in the list. @@ -45,9 +44,9 @@ NS_ASSUME_NONNULL_BEGIN Section controllers are initialized for all objects whenever the `IGListAdapter` is created, updated, or reloaded. Section controllers are reused when objects are moved or updated. Maintaining the `-[IGListDiffable diffIdentifier]` - guarentees this. + guarantees this. */ -- (IGListSectionController *)listAdapter:(IGListAdapter *)listAdapter sectionControllerForObject:(id)object; +- (IGListSectionController *)listAdapter:(IGListAdapter *)listAdapter sectionControllerForObject:(id)object; /** Asks the data source for a view to use as the collection view background when the list is empty. diff --git a/Project 27 - Marslink/Pods/IGListKit/Source/IGListAdapterDelegate.h b/Project 29 - Marslink/Pods/IGListKit/Source/IGListAdapterDelegate.h similarity index 80% rename from Project 27 - Marslink/Pods/IGListKit/Source/IGListAdapterDelegate.h rename to Project 29 - Marslink/Pods/IGListKit/Source/IGListAdapterDelegate.h index b141c9f1..e59087b9 100644 --- a/Project 27 - Marslink/Pods/IGListKit/Source/IGListAdapterDelegate.h +++ b/Project 29 - Marslink/Pods/IGListKit/Source/IGListAdapterDelegate.h @@ -11,6 +11,8 @@ @class IGListAdapter; +NS_ASSUME_NONNULL_BEGIN + /** Conform to `IGListAdapterDelegate` to receive display events for objects in a list. */ @@ -20,8 +22,8 @@ Notifies the delegate that a list object is about to be displayed. @param listAdapter The list adapter sending this information. - @param object The object that will display. - @param index The index of the object in the list. + @param object The object that will display. + @param index The index of the object in the list. */ - (void)listAdapter:(IGListAdapter *)listAdapter willDisplayObject:(id)object atIndex:(NSInteger)index; @@ -29,9 +31,11 @@ Notifies the delegate that a list object is no longer being displayed. @param listAdapter The list adapter sending this information. - @param object The object that ended display. - @param index The index of the object in the list. + @param object The object that ended display. + @param index The index of the object in the list. */ - (void)listAdapter:(IGListAdapter *)listAdapter didEndDisplayingObject:(id)object atIndex:(NSInteger)index; @end + +NS_ASSUME_NONNULL_END diff --git a/Project 27 - Marslink/Pods/IGListKit/Source/IGListAdapterUpdater.h b/Project 29 - Marslink/Pods/IGListKit/Source/IGListAdapterUpdater.h similarity index 69% rename from Project 27 - Marslink/Pods/IGListKit/Source/IGListAdapterUpdater.h rename to Project 29 - Marslink/Pods/IGListKit/Source/IGListAdapterUpdater.h index 8ed2a7e6..b772a95f 100644 --- a/Project 27 - Marslink/Pods/IGListKit/Source/IGListAdapterUpdater.h +++ b/Project 29 - Marslink/Pods/IGListKit/Source/IGListAdapterUpdater.h @@ -18,13 +18,14 @@ NS_ASSUME_NONNULL_BEGIN /** An `IGListAdapterUpdater` is a concrete type that conforms to `IGListUpdatingDelegate`. - It is an out-of-box upater for `IGListAdapter` objects to use. + It is an out-of-box updater for `IGListAdapter` objects to use. @note This updater performs re-entrant, coalesced updating for a list. It also uses a least-minimal diff for calculating UI updates when `IGListAdapter` calls `-performUpdateWithCollectionView:fromObjects:toObjects:completion:`. */ IGLK_SUBCLASSING_RESTRICTED +NS_SWIFT_NAME(ListAdapterUpdater) @interface IGListAdapterUpdater : NSObject /** @@ -37,6 +38,17 @@ IGLK_SUBCLASSING_RESTRICTED */ @property (nonatomic, assign) BOOL movesAsDeletesInserts; +/** + A flag indicating whether this updater should skip diffing and simply call + `reloadData` for updates when the collection view is not in a window. The default value is `YES`. + + @note This will result in better performance, but will not generate the same delegate + callbacks. If using a custom layout, it will not receive `prepareForCollectionViewUpdates:`. + + @warning On iOS < 8.3, this behavior is unsupported and will always be treated as `NO`. + */ +@property (nonatomic, assign) BOOL allowsBackgroundReloading; + /** A bitmask of experiments to conduct on the updater. */ diff --git a/Project 27 - Marslink/Pods/IGListKit/Source/IGListAdapterUpdater.m b/Project 29 - Marslink/Pods/IGListKit/Source/IGListAdapterUpdater.m similarity index 55% rename from Project 27 - Marslink/Pods/IGListKit/Source/IGListAdapterUpdater.m rename to Project 29 - Marslink/Pods/IGListKit/Source/IGListAdapterUpdater.m index 06316d23..78f989b1 100644 --- a/Project 27 - Marslink/Pods/IGListKit/Source/IGListAdapterUpdater.m +++ b/Project 29 - Marslink/Pods/IGListKit/Source/IGListAdapterUpdater.m @@ -15,10 +15,12 @@ #import #import "UICollectionView+IGListBatchUpdateData.h" +#import "IGListIndexSetResultInternal.h" +#import "IGListMoveIndexPathInternal.h" +#import "IGListReloadIndexPath.h" +#import "IGListArrayUtilsInternal.h" -@implementation IGListAdapterUpdater { - BOOL _canBackgroundReload; -} +@implementation IGListAdapterUpdater - (instancetype)init { IGAssertMainThread(); @@ -26,27 +28,18 @@ - (instancetype)init { if (self = [super init]) { // the default is to use animations unless NO is passed _queuedUpdateIsAnimated = YES; - - _completionBlocks = [[NSMutableArray alloc] init]; - _itemUpdateBlocks = [[NSMutableArray alloc] init]; - - _reloadSections = [[NSMutableIndexSet alloc] init]; - - _deleteIndexPaths = [[NSMutableSet alloc] init]; - _insertIndexPaths = [[NSMutableSet alloc] init]; - _reloadIndexPaths = [[NSMutableSet alloc] init]; - - _canBackgroundReload = [[[UIDevice currentDevice] systemVersion] compare:@"8.3" options:NSNumericSearch] != NSOrderedAscending; + _completionBlocks = [NSMutableArray new]; + _batchUpdates = [IGListBatchUpdates new]; + _allowsBackgroundReloading = YES; } return self; } - #pragma mark - Private API - (BOOL)hasChanges { return self.hasQueuedReloadData - || self.itemUpdateBlocks.count > 0 + || [self.batchUpdates hasChanges] || self.fromObjects != nil || self.toObjects != nil; } @@ -61,57 +54,49 @@ - (void)performReloadDataWithCollectionView:(UICollectionView *)collectionView { id delegate = self.delegate; void (^reloadUpdates)() = self.reloadUpdates; - NSArray *completionBlocks = [self.completionBlocks copy]; - NSArray *itemUpdateBlocks = [self.itemUpdateBlocks copy]; + IGListBatchUpdates *batchUpdates = self.batchUpdates; + NSMutableArray *completionBlocks = [self.completionBlocks mutableCopy]; + + [self cleanStateBeforeUpdates]; // item updates must not send mutations to the collection view while we are reloading - self.batchUpdateOrReloadInProgress = YES; + self.state = IGListBatchUpdateStateExecutingBatchUpdateBlock; if (reloadUpdates) { reloadUpdates(); } // execute all stored item update blocks even if we are just calling reloadData. the actual collection view - // mutations will be discarded, but clients are encouraged to put their actually /data/ mutations inside the + // mutations will be discarded, but clients are encouraged to put their actual /data/ mutations inside the // update block as well, so if we don't execute the block the changes will never happen - for (IGListItemUpdateBlock itemUpdateBlock in itemUpdateBlocks) { + for (IGListItemUpdateBlock itemUpdateBlock in batchUpdates.itemUpdateBlocks) { itemUpdateBlock(); } - // cleanup state before reloading and calling completion blocks - [self cleanupState]; - [self cleanupUpdateBlockState]; + // add any completion blocks from item updates. added after item blocks are executed in order to capture any + // re-entrant updates + [completionBlocks addObjectsFromArray:batchUpdates.itemCompletionBlocks]; + + self.state = IGListBatchUpdateStateExecutedBatchUpdateBlock; + + [self cleanStateAfterUpdates]; [delegate listAdapterUpdater:self willReloadDataWithCollectionView:collectionView]; [collectionView reloadData]; + [collectionView.collectionViewLayout invalidateLayout]; [collectionView layoutIfNeeded]; [delegate listAdapterUpdater:self didReloadDataWithCollectionView:collectionView]; - self.batchUpdateOrReloadInProgress = NO; - for (IGListUpdatingCompletion block in completionBlocks) { block(YES); } -} -static NSArray *objectsWithDuplicateIdentifiersRemoved(NSArray> *objects) { - NSMutableSet *identifiers = [NSMutableSet new]; - NSMutableArray *uniqueObjects = [NSMutableArray new]; - for (id object in objects) { - id diffIdentifier = [object diffIdentifier]; - if (![identifiers containsObject:diffIdentifier]) { - [identifiers addObject:diffIdentifier]; - [uniqueObjects addObject:object]; - } else { - IGLKLog(@"WARNING: Object %@ already appeared in objects array", object); - } - } - return [uniqueObjects copy]; + self.state = IGListBatchUpdateStateIdle; } - (void)performBatchUpdatesWithCollectionView:(UICollectionView *)collectionView { IGAssertMainThread(); - IGAssert(!self.batchUpdateOrReloadInProgress, @"should not call this when updating"); + IGAssert(self.state == IGListBatchUpdateStateIdle, @"Should not call batch updates when state isn't idle"); // bail early if the collection view has been deallocated in the time since the update was queued if (collectionView == nil) { @@ -122,15 +107,17 @@ - (void)performBatchUpdatesWithCollectionView:(UICollectionView *)collectionView id delegate = self.delegate; NSArray *fromObjects = [self.fromObjects copy]; NSArray *toObjects = objectsWithDuplicateIdentifiersRemoved(self.toObjects); + NSMutableArray *completionBlocks = [self.completionBlocks mutableCopy]; void (^objectTransitionBlock)(NSArray *) = [self.objectTransitionBlock copy]; - NSArray *itemUpdateBlocks = [self.itemUpdateBlocks copy]; - NSArray *completionBlocks = [self.completionBlocks copy]; const BOOL animated = self.queuedUpdateIsAnimated; + IGListBatchUpdates *batchUpdates = self.batchUpdates; // clean up all state so that new updates can be coalesced while the current update is in flight - [self cleanupState]; + [self cleanStateBeforeUpdates]; void (^executeUpdateBlocks)() = ^{ + self.state = IGListBatchUpdateStateExecutingBatchUpdateBlock; + // run the update block so that the adapter can set its items. this makes sure that just before the update is // committed that the data source is updated to the /latest/ "toObjects". this makes the data source in sync // with the items that the updater is transitioning to @@ -141,83 +128,118 @@ - (void)performBatchUpdatesWithCollectionView:(UICollectionView *)collectionView // execute each item update block which should make calls like insert, delete, and reload for index paths // we collect all mutations in corresponding sets on self, then filter based on UICollectionView shortcomings // call after the objectTransitionBlock so section level mutations happen before any items - for (IGListItemUpdateBlock itemUpdateBlock in itemUpdateBlocks) { + for (IGListItemUpdateBlock itemUpdateBlock in batchUpdates.itemUpdateBlocks) { itemUpdateBlock(); } + + // add any completion blocks from item updates. added after item blocks are executed in order to capture any + // re-entrant updates + [completionBlocks addObjectsFromArray:batchUpdates.itemCompletionBlocks]; + + self.state = IGListBatchUpdateStateExecutedBatchUpdateBlock; }; void (^executeCompletionBlocks)(BOOL) = ^(BOOL finished) { + self.applyingUpdateData = nil; + self.state = IGListBatchUpdateStateIdle; + for (IGListUpdatingCompletion block in completionBlocks) { block(finished); } }; - // if the collection view isn't in a visible window, skip diffing and batch updating. execute all transition blocks, - // reload data, execute completion blocks, and get outta here - if (_canBackgroundReload && collectionView.window == nil) { - [self beginPerformBatchUpdatestoObjects:toObjects]; + void (^reloadDataFallback)() = ^{ executeUpdateBlocks(); - [self cleanupUpdateBlockState]; + [self cleanStateAfterUpdates]; [self performBatchUpdatesItemBlockApplied]; [collectionView reloadData]; - [self endPerformBatchUpdates]; + [collectionView layoutIfNeeded]; executeCompletionBlocks(YES); + }; + + // if the collection view isn't in a visible window, skip diffing and batch updating. execute all transition blocks, + // reload data, execute completion blocks, and get outta here + const BOOL iOS83OrLater = (NSFoundationVersionNumber >= NSFoundationVersionNumber_iOS_8_3); + if (iOS83OrLater && self.allowsBackgroundReloading && collectionView.window == nil) { + [self beginPerformBatchUpdatesToObjects:toObjects]; + reloadDataFallback(); return; } - IGListIndexSetResult *result = IGListDiffExperiment(fromObjects, toObjects, IGListDiffEquality, self.experiments); + // disables multiple performBatchUpdates: from happening at the same time + [self beginPerformBatchUpdatesToObjects:toObjects]; - // if the diff has no changes and there are no update blocks queued, dont batch update - if (!result.hasChanges && itemUpdateBlocks.count == 0) { - executeUpdateBlocks(); - executeCompletionBlocks(YES); - return; - } + const IGListExperiment experiments = self.experiments; - __block IGListBatchUpdateData *updateData = nil; + IGListIndexSetResult *(^performDiff)() = ^{ + return IGListDiffExperiment(fromObjects, toObjects, IGListDiffEquality, experiments); + }; - void (^updateBlock)() = ^{ + // block executed in the first param block of -[UICollectionView performBatchUpdates:completion:] + void (^batchUpdatesBlock)(IGListIndexSetResult *result) = ^(IGListIndexSetResult *result){ executeUpdateBlocks(); - updateData = [self flushCollectionView:collectionView - withDiffResult:result - reloadSections:[self.reloadSections copy] - deleteIndexPaths:[self.deleteIndexPaths copy] - insertIndexPaths:[self.insertIndexPaths copy] - reloadIndexPaths:[self.reloadIndexPaths copy] - fromObjects:fromObjects]; + self.applyingUpdateData = [self flushCollectionView:collectionView + withDiffResult:result + batchUpdates:self.batchUpdates + fromObjects:fromObjects]; - [self cleanupUpdateBlockState]; + [self cleanStateAfterUpdates]; [self performBatchUpdatesItemBlockApplied]; }; - void (^completionBlock)(BOOL) = ^(BOOL finished) { - [self endPerformBatchUpdates]; - + // block used as the second param of -[UICollectionView performBatchUpdates:completion:] + void (^batchUpdatesCompletionBlock)(BOOL) = ^(BOOL finished) { executeCompletionBlocks(finished); - [delegate listAdapterUpdater:self didPerformBatchUpdates:updateData withCollectionView:collectionView]; + [delegate listAdapterUpdater:self didPerformBatchUpdates:(id)self.applyingUpdateData collectionView:collectionView]; // queue another update in case something changed during batch updates. this method will bail next runloop if // there are no changes [self queueUpdateWithCollectionView:collectionView]; }; - // disables multiple performBatchUpdates: from happening at the same time - [self beginPerformBatchUpdatestoObjects:toObjects]; - - @try { - [delegate listAdapterUpdater:self willPerformBatchUpdatesWithCollectionView:collectionView]; - if (animated) { - [collectionView performBatchUpdates:updateBlock completion:completionBlock]; - } else { - [UIView performWithoutAnimation:^{ - [collectionView performBatchUpdates:updateBlock completion:completionBlock]; - }]; + // block that executes the batch update and exception handling + void (^performUpdate)(IGListIndexSetResult *) = ^(IGListIndexSetResult *result){ + @try { + [delegate listAdapterUpdater:self willPerformBatchUpdatesWithCollectionView:collectionView]; + if (result.changeCount > 100 && IGListExperimentEnabled(experiments, IGListExperimentReloadDataFallback)) { + reloadDataFallback(); + } else if (animated) { + [collectionView performBatchUpdates:^{ + batchUpdatesBlock(result); + } completion:batchUpdatesCompletionBlock]; + } else { + [CATransaction begin]; + [CATransaction setDisableActions:YES]; + [collectionView performBatchUpdates:^{ + batchUpdatesBlock(result); + } completion:^(BOOL finished) { + [CATransaction commit]; + batchUpdatesCompletionBlock(finished); + }]; + } + } @catch (NSException *exception) { + [delegate listAdapterUpdater:self + willCrashWithException:exception + fromObjects:fromObjects + toObjects:toObjects + updates:(id)self.applyingUpdateData]; + @throw exception; } - } @catch (NSException *exception) { - [delegate listAdapterUpdater:self willCrashWithException:exception fromObjects:fromObjects toObjects:toObjects updates:updateData]; - @throw exception; + }; + + // temporary test to try out background diffing + if (IGListExperimentEnabled(experiments, IGListExperimentBackgroundDiffing)) { + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ + IGListIndexSetResult *result = performDiff(); + dispatch_async(dispatch_get_main_queue(), ^{ + performUpdate(result); + }); + }); + } else { + IGListIndexSetResult *result = performDiff(); + performUpdate(result); } } @@ -231,26 +253,31 @@ void convertReloadToDeleteInsert(NSMutableIndexSet *reloads, [[reloads copy] enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL *stop) { // if a diff was not performed, there are no changes. instead use the same index that was originally queued id diffIdentifier = hasObjects ? [fromObjects[idx] diffIdentifier] : nil; - const NSUInteger from = hasObjects ? [result oldIndexForIdentifier:diffIdentifier] : idx; - const NSUInteger to = hasObjects ? [result newIndexForIdentifier:diffIdentifier] : idx; + const NSInteger from = hasObjects ? [result oldIndexForIdentifier:diffIdentifier] : idx; + const NSInteger to = hasObjects ? [result newIndexForIdentifier:diffIdentifier] : idx; [reloads removeIndex:from]; - [deletes addIndex:from]; - [inserts addIndex:to]; + + // if a reload is queued outside the diff and the object was inserted or deleted it cannot be + if (from != NSNotFound && to != NSNotFound) { + [deletes addIndex:from]; + [inserts addIndex:to]; + } else { + IGAssert([result.deletes containsIndex:idx], + @"Reloaded section %zi was not found in deletes with from: %zi, to: %zi, deletes: %@", + idx, from, to, deletes); + } }]; } - (IGListBatchUpdateData *)flushCollectionView:(UICollectionView *)collectionView withDiffResult:(IGListIndexSetResult *)diffResult - reloadSections:(NSIndexSet *)reloadSections - deleteIndexPaths:(NSSet *)deleteIndexPaths - insertIndexPaths:(NSSet *)insertIndexPaths - reloadIndexPaths:(NSSet *)reloadIndexPaths + batchUpdates:(IGListBatchUpdates *)batchUpdates fromObjects:(NSArray > *)fromObjects { NSSet *moves = [[NSSet alloc] initWithArray:diffResult.moves]; // combine section reloads from the diff and manual reloads via reloadItems: NSMutableIndexSet *reloads = [diffResult.updates mutableCopy]; - [reloads addIndexes:reloadSections]; + [reloads addIndexes:batchUpdates.sectionReloads]; NSMutableIndexSet *inserts = [diffResult.inserts mutableCopy]; NSMutableIndexSet *deletes = [diffResult.deletes mutableCopy]; @@ -266,30 +293,42 @@ - (IGListBatchUpdateData *)flushCollectionView:(UICollectionView *)collectionVie // reloadSections: is unsafe to use within performBatchUpdates:, so instead convert all reloads into deletes+inserts convertReloadToDeleteInsert(reloads, deletes, inserts, diffResult, fromObjects); - IGListBatchUpdateData *updateData = [[IGListBatchUpdateData alloc] initWithInsertSections:[inserts copy] - deleteSections:[deletes copy] + NSMutableArray *itemInserts = batchUpdates.itemInserts; + NSMutableArray *itemDeletes = batchUpdates.itemDeletes; + NSMutableArray *itemMoves = batchUpdates.itemMoves; + + NSSet *uniqueDeletes = [NSSet setWithArray:itemDeletes]; + NSMutableSet *reloadDeletePaths = [NSMutableSet new]; + NSMutableSet *reloadInsertPaths = [NSMutableSet new]; + for (IGListReloadIndexPath *reload in batchUpdates.itemReloads) { + if (![uniqueDeletes containsObject:reload.fromIndexPath]) { + [reloadDeletePaths addObject:reload.fromIndexPath]; + [reloadInsertPaths addObject:reload.toIndexPath]; + } + } + [itemDeletes addObjectsFromArray:[reloadDeletePaths allObjects]]; + [itemInserts addObjectsFromArray:[reloadInsertPaths allObjects]]; + + IGListBatchUpdateData *updateData = [[IGListBatchUpdateData alloc] initWithInsertSections:inserts + deleteSections:deletes moveSections:moves - insertIndexPaths:insertIndexPaths - deleteIndexPaths:deleteIndexPaths - reloadIndexPaths:reloadIndexPaths]; + insertIndexPaths:itemInserts + deleteIndexPaths:itemDeletes + moveIndexPaths:itemMoves]; [collectionView ig_applyBatchUpdateData:updateData]; return updateData; } -- (void)beginPerformBatchUpdatestoObjects:(NSArray *)toObjects { - self.batchUpdateOrReloadInProgress = YES; +- (void)beginPerformBatchUpdatesToObjects:(NSArray *)toObjects { self.pendingTransitionToObjects = toObjects; + self.state = IGListBatchUpdateStateQueuedBatchUpdate; } - (void)performBatchUpdatesItemBlockApplied { self.pendingTransitionToObjects = nil; } -- (void)endPerformBatchUpdates { - self.batchUpdateOrReloadInProgress = NO; -} - -- (void)cleanupState { +- (void)cleanStateBeforeUpdates { self.queuedUpdateIsAnimated = YES; // destroy to/from transition items @@ -302,17 +341,14 @@ - (void)cleanupState { // remove indexpath/item changes self.objectTransitionBlock = nil; - [self.itemUpdateBlocks removeAllObjects]; - // remove completion blocks from item transitions or index path updates + // removes all object completion blocks. done before updates to start collecting completion blocks for coalesced + // or re-entrant object updates [self.completionBlocks removeAllObjects]; } -- (void)cleanupUpdateBlockState { - [self.reloadSections removeAllIndexes]; - [self.deleteIndexPaths removeAllObjects]; - [self.insertIndexPaths removeAllObjects]; - [self.reloadIndexPaths removeAllObjects]; +- (void)cleanStateAfterUpdates { + self.batchUpdates = [IGListBatchUpdates new]; } - (void)queueUpdateWithCollectionView:(UICollectionView *)collectionView { @@ -324,15 +360,22 @@ - (void)queueUpdateWithCollectionView:(UICollectionView *)collectionView { } __weak __typeof__(self) weakSelf = self; + __weak __typeof__(collectionView) weakCollectionView = collectionView; + + // dispatch_async to give the main queue time to collect more batch updates so that a minimum amount of work + // (diffing, etc) is done on main. dispatch_async does not garauntee a full runloop turn will pass though. + // see -performUpdateWithCollectionView:fromObjects:toObjects:animated:]objectTransitionBlock:completion: for more + // details on how coalescence is done. dispatch_async(dispatch_get_main_queue(), ^{ - if (weakSelf.batchUpdateOrReloadInProgress || ![weakSelf hasChanges]) { + if (weakSelf.state != IGListBatchUpdateStateIdle + || ![weakSelf hasChanges]) { return; } if (weakSelf.hasQueuedReloadData) { - [weakSelf performReloadDataWithCollectionView:collectionView]; + [weakSelf performReloadDataWithCollectionView:weakCollectionView]; } else { - [weakSelf performBatchUpdatesWithCollectionView:collectionView]; + [weakSelf performBatchUpdatesWithCollectionView:weakCollectionView]; } }); } @@ -385,6 +428,8 @@ - (void)performUpdateWithCollectionView:(UICollectionView *)collectionView for (id obj in toObjects) { IGAssert([obj conformsToProtocol:@protocol(IGListDiffable)], @"In order to use IGListAdapterUpdater, object %@ must conform to IGListDiffable", obj); + IGAssert([obj diffIdentifier] != nil, + @"Cannot have a nil diffIdentifier for object %@", obj); } #endif @@ -407,25 +452,32 @@ - (void)performUpdateWithCollectionView:(UICollectionView *)collectionView IGParameterAssert(collectionView != nil); IGParameterAssert(itemUpdates != nil); - // disabled animations will always take priority - // reset to YES in -cleanupState - self.queuedUpdateIsAnimated = self.queuedUpdateIsAnimated && animated; - - [self.itemUpdateBlocks addObject:itemUpdates]; - + IGListBatchUpdates *batchUpdates = self.batchUpdates; if (completion != nil) { - [self.completionBlocks addObject:completion]; + [batchUpdates.itemCompletionBlocks addObject:completion]; } - [self queueUpdateWithCollectionView:collectionView]; + // if already inside the execution of the update block, immediately unload the itemUpdates block. + // the completion blocks are executed later in the lifecycle, so that still needs to be added to the batch + if (self.state == IGListBatchUpdateStateExecutingBatchUpdateBlock) { + itemUpdates(); + } else { + [batchUpdates.itemUpdateBlocks addObject:itemUpdates]; + + // disabled animations will always take priority + // reset to YES in -cleanupState + self.queuedUpdateIsAnimated = self.queuedUpdateIsAnimated && animated; + + [self queueUpdateWithCollectionView:collectionView]; + } } - (void)insertItemsIntoCollectionView:(UICollectionView *)collectionView indexPaths:(NSArray *)indexPaths { IGAssertMainThread(); IGParameterAssert(collectionView != nil); IGParameterAssert(indexPaths != nil); - if (self.batchUpdateOrReloadInProgress) { - [self.insertIndexPaths addObjectsFromArray:indexPaths]; + if (self.state == IGListBatchUpdateStateExecutingBatchUpdateBlock) { + [self.batchUpdates.itemInserts addObjectsFromArray:indexPaths]; } else { [self.delegate listAdapterUpdater:self willInsertIndexPaths:indexPaths collectionView:collectionView]; [collectionView insertItemsAtIndexPaths:indexPaths]; @@ -436,23 +488,34 @@ - (void)deleteItemsFromCollectionView:(UICollectionView *)collectionView indexPa IGAssertMainThread(); IGParameterAssert(collectionView != nil); IGParameterAssert(indexPaths != nil); - if (self.batchUpdateOrReloadInProgress) { - [self.deleteIndexPaths addObjectsFromArray:indexPaths]; + if (self.state == IGListBatchUpdateStateExecutingBatchUpdateBlock) { + [self.batchUpdates.itemDeletes addObjectsFromArray:indexPaths]; } else { [self.delegate listAdapterUpdater:self willDeleteIndexPaths:indexPaths collectionView:collectionView]; [collectionView deleteItemsAtIndexPaths:indexPaths]; } } -- (void)reloadItemsInCollectionView:(UICollectionView *)collectionView indexPaths:(NSArray *)indexPaths { - IGAssertMainThread(); - IGParameterAssert(collectionView != nil); - IGParameterAssert(indexPaths != nil); - if (self.batchUpdateOrReloadInProgress) { - [self.reloadIndexPaths addObjectsFromArray:indexPaths]; +- (void)moveItemInCollectionView:(UICollectionView *)collectionView + fromIndexPath:(NSIndexPath *)fromIndexPath + toIndexPath:(NSIndexPath *)toIndexPath { + if (self.state == IGListBatchUpdateStateExecutingBatchUpdateBlock) { + IGListMoveIndexPath *move = [[IGListMoveIndexPath alloc] initWithFrom:fromIndexPath to:toIndexPath]; + [self.batchUpdates.itemMoves addObject:move]; + } else { + [self.delegate listAdapterUpdater:self willMoveFromIndexPath:fromIndexPath toIndexPath:toIndexPath collectionView:collectionView]; + [collectionView moveItemAtIndexPath:fromIndexPath toIndexPath:toIndexPath]; + } +} + +- (void)reloadItemInCollectionView:(UICollectionView *)collectionView + fromIndexPath:(NSIndexPath *)fromIndexPath + toIndexPath:(NSIndexPath *)toIndexPath { + if (self.state == IGListBatchUpdateStateExecutingBatchUpdateBlock) { + IGListReloadIndexPath *reload = [[IGListReloadIndexPath alloc] initWithFromIndexPath:fromIndexPath toIndexPath:toIndexPath]; + [self.batchUpdates.itemReloads addObject:reload]; } else { - [self.delegate listAdapterUpdater:self willReloadIndexPaths:indexPaths collectionView:collectionView]; - [collectionView reloadItemsAtIndexPaths:indexPaths]; + [collectionView reloadItemsAtIndexPaths:@[fromIndexPath]]; } } @@ -477,8 +540,8 @@ - (void)reloadCollectionView:(UICollectionView *)collectionView sections:(NSInde IGAssertMainThread(); IGParameterAssert(collectionView != nil); IGParameterAssert(sections != nil); - if (self.batchUpdateOrReloadInProgress) { - [self.reloadSections addIndexes:sections]; + if (self.state == IGListBatchUpdateStateExecutingBatchUpdateBlock) { + [self.batchUpdates.sectionReloads addIndexes:sections]; } else { [self.delegate listAdapterUpdater:self willReloadSections:sections collectionView:collectionView]; [collectionView reloadSections:sections]; @@ -486,3 +549,4 @@ - (void)reloadCollectionView:(UICollectionView *)collectionView sections:(NSInde } @end + diff --git a/Project 27 - Marslink/Pods/IGListKit/Source/IGListAdapterUpdaterDelegate.h b/Project 29 - Marslink/Pods/IGListKit/Source/IGListAdapterUpdaterDelegate.h similarity index 57% rename from Project 27 - Marslink/Pods/IGListKit/Source/IGListAdapterUpdaterDelegate.h rename to Project 29 - Marslink/Pods/IGListKit/Source/IGListAdapterUpdaterDelegate.h index 04449327..9961fd58 100644 --- a/Project 27 - Marslink/Pods/IGListKit/Source/IGListAdapterUpdaterDelegate.h +++ b/Project 29 - Marslink/Pods/IGListKit/Source/IGListAdapterUpdaterDelegate.h @@ -18,76 +18,102 @@ NS_ASSUME_NONNULL_BEGIN /** A protocol that receives events about `IGListAdapterUpdater` operations. */ +NS_SWIFT_NAME(ListAdapterUpdaterDelegate) @protocol IGListAdapterUpdaterDelegate /** Notifies the delegate that the updater will call `-[UICollectionView performBatchUpdates:completion:]`. @param listAdapterUpdater The adapter updater owning the transition. - @param collectionView The collection view that will perform the batch updates. + @param collectionView The collection view that will perform the batch updates. */ - (void)listAdapterUpdater:(IGListAdapterUpdater *)listAdapterUpdater willPerformBatchUpdatesWithCollectionView:(UICollectionView *)collectionView; /** - Notifies the delegate that the updater succesfully finished `-[UICollectionView performBatchUpdates:completion:]`. + Notifies the delegate that the updater successfully finished `-[UICollectionView performBatchUpdates:completion:]`. @param listAdapterUpdater The adapter updater owning the transition. - @param updates The batch updates that were applied to the collection view. - @param collectionView The collection view that performed the batch updates. + @param updates The batch updates that were applied to the collection view. + @param collectionView The collection view that performed the batch updates. @note This event is called in the completion block of the batch update. */ -- (void)listAdapterUpdater:(IGListAdapterUpdater *)listAdapterUpdater didPerformBatchUpdates:(IGListBatchUpdateData *)updates withCollectionView:(UICollectionView *)collectionView; +- (void)listAdapterUpdater:(IGListAdapterUpdater *)listAdapterUpdater + didPerformBatchUpdates:(IGListBatchUpdateData *)updates + collectionView:(UICollectionView *)collectionView; /** Notifies the delegate that the updater will call `-[UICollectionView insertItemsAtIndexPaths:]`. @param listAdapterUpdater The adapter updater owning the transition. - @param indexPaths An array of index paths that will be inserted. - @param collectionView The collection view that will perform the insert. + @param indexPaths An array of index paths that will be inserted. + @param collectionView The collection view that will perform the insert. @note This event is only sent when outside of `-[UICollectionView performBatchUpdates:completion:]`. */ -- (void)listAdapterUpdater:(IGListAdapterUpdater *)listAdapterUpdater willInsertIndexPaths:(NSArray *)indexPaths collectionView:(UICollectionView *)collectionView; +- (void)listAdapterUpdater:(IGListAdapterUpdater *)listAdapterUpdater + willInsertIndexPaths:(NSArray *)indexPaths + collectionView:(UICollectionView *)collectionView; /** Notifies the delegate that the updater will call `-[UICollectionView deleteItemsAtIndexPaths:]`. @param listAdapterUpdater The adapter updater owning the transition. - @param indexPaths An array of index paths that will be deleted. - @param collectionView The collection view that will perform the delete. + @param indexPaths An array of index paths that will be deleted. + @param collectionView The collection view that will perform the delete. @note This event is only sent when outside of `-[UICollectionView performBatchUpdates:completion:]`. */ -- (void)listAdapterUpdater:(IGListAdapterUpdater *)listAdapterUpdater willDeleteIndexPaths:(NSArray *)indexPaths collectionView:(UICollectionView *)collectionView; +- (void)listAdapterUpdater:(IGListAdapterUpdater *)listAdapterUpdater + willDeleteIndexPaths:(NSArray *)indexPaths + collectionView:(UICollectionView *)collectionView; + +/** + Notifies the delegate that the updater will call `-[UICollectionView moveItemAtIndexPath:toIndexPath:]` + + @param listAdapterUpdater The adapter updater owning the transition. + @param fromIndexPath The index path of the item that will be moved. + @param toIndexPath The index path to move the item to. + @param collectionView The collection view that will perform the move. + + @note This event is only sent when outside of `-[UICollectionView performBatchUpdates:completion:]`. + */ +- (void)listAdapterUpdater:(IGListAdapterUpdater *)listAdapterUpdater + willMoveFromIndexPath:(NSIndexPath *)fromIndexPath + toIndexPath:(NSIndexPath *)toIndexPath + collectionView:(UICollectionView *)collectionView; /** Notifies the delegate that the updater will call `-[UICollectionView reloadItemsAtIndexPaths:]`. @param listAdapterUpdater The adapter updater owning the transition. - @param indexPaths An array of index paths that will be reloaded. - @param collectionView The collection view that will perform the reload. + @param indexPaths An array of index paths that will be reloaded. + @param collectionView The collection view that will perform the reload. @note This event is only sent when outside of `-[UICollectionView performBatchUpdates:completion:]`. */ -- (void)listAdapterUpdater:(IGListAdapterUpdater *)listAdapterUpdater willReloadIndexPaths:(NSArray *)indexPaths collectionView:(UICollectionView *)collectionView; +- (void)listAdapterUpdater:(IGListAdapterUpdater *)listAdapterUpdater + willReloadIndexPaths:(NSArray *)indexPaths + collectionView:(UICollectionView *)collectionView; /** Notifies the delegate that the updater will call `-[UICollectionView reloadSections:]`. @param listAdapterUpdater The adapter updater owning the transition. - @param sections The sections that will be reloaded - @param collectionView The collection view that will perform the reload. + @param sections The sections that will be reloaded + @param collectionView The collection view that will perform the reload. @note This event is only sent when outside of `-[UICollectionView performBatchUpdates:completion:]`. */ -- (void)listAdapterUpdater:(IGListAdapterUpdater *)listAdapterUpdater willReloadSections:(NSIndexSet *)sections collectionView:(UICollectionView *)collectionView; +- (void)listAdapterUpdater:(IGListAdapterUpdater *)listAdapterUpdater + willReloadSections:(NSIndexSet *)sections + collectionView:(UICollectionView *)collectionView; /** Notifies the delegate that the updater will call `-[UICollectionView reloadData]`. @param listAdapterUpdater The adapter updater owning the transition. - @param collectionView The collection view that will be reloaded. + @param collectionView The collection view that will be reloaded. */ - (void)listAdapterUpdater:(IGListAdapterUpdater *)listAdapterUpdater willReloadDataWithCollectionView:(UICollectionView *)collectionView; @@ -95,7 +121,7 @@ NS_ASSUME_NONNULL_BEGIN Notifies the delegate that the updater successfully called `-[UICollectionView reloadData]`. @param listAdapterUpdater The adapter updater owning the transition. - @param collectionView The collection view that reloaded. + @param collectionView The collection view that reloaded. */ - (void)listAdapterUpdater:(IGListAdapterUpdater *)listAdapterUpdater didReloadDataWithCollectionView:(UICollectionView *)collectionView; @@ -103,10 +129,10 @@ NS_ASSUME_NONNULL_BEGIN Notifies the delegate that the collection view threw an exception in `-[UICollectionView performBatchUpdates:completion:]`. @param listAdapterUpdater The adapter updater owning the transition. - @param exception The exception thrown by the collection view. - @param fromObjects The items transitioned from in the diff, if any. - @param toObjects The items transitioned to in the diff, if any. - @param updates The batch updates that were applied to the collection view. + @param exception The exception thrown by the collection view. + @param fromObjects The items transitioned from in the diff, if any. + @param toObjects The items transitioned to in the diff, if any. + @param updates The batch updates that were applied to the collection view. */ - (void)listAdapterUpdater:(IGListAdapterUpdater *)listAdapterUpdater willCrashWithException:(NSException *)exception diff --git a/Project 29 - Marslink/Pods/IGListKit/Source/IGListBatchContext.h b/Project 29 - Marslink/Pods/IGListKit/Source/IGListBatchContext.h new file mode 100644 index 00000000..561502c3 --- /dev/null +++ b/Project 29 - Marslink/Pods/IGListKit/Source/IGListBatchContext.h @@ -0,0 +1,72 @@ +/** + * Copyright (c) 2016-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import + +@class IGListSectionController; + + + +NS_ASSUME_NONNULL_BEGIN + +/** + Objects conforming to the IGListBatchContext protocol provide a way for section controllers to mutate their cells or + reload everything within the section. + */ +NS_SWIFT_NAME(ListBatchContext) +@protocol IGListBatchContext + +/** + Reloads cells in the section controller. + + @param sectionController The section controller who's cells need reloading. + @param indexes The indexes of items that need reloading. + */ +- (void)reloadInSectionController:(IGListSectionController *)sectionController + atIndexes:(NSIndexSet *)indexes; + +/** + Inserts cells in the list. + + @param sectionController The section controller who's cells need inserting. + @param indexes The indexes of items that need inserting. + */ +- (void)insertInSectionController:(IGListSectionController *)sectionController + atIndexes:(NSIndexSet *)indexes; + +/** + Deletes cells in the list. + + @param sectionController The section controller who's cells need deleted. + @param indexes The indexes of items that need deleting. + */ +- (void)deleteInSectionController:(IGListSectionController *)sectionController + atIndexes:(NSIndexSet *)indexes; + +/** + Moves a cell from one index to another within the section controller. + + @param sectionController The section controller who's cell needs moved. + @param fromIndex The index the cell is currently in. + @param toIndex The index the cell should move to. + */ +- (void)moveInSectionController:(IGListSectionController *)sectionController + fromIndex:(NSInteger)fromIndex + toIndex:(NSInteger)toIndex; + +/** + Reloads the entire section controller. + + @param sectionController The section controller who's cells need reloading. + */ +- (void)reloadSectionController:(IGListSectionController *)sectionController; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Project 29 - Marslink/Pods/IGListKit/Source/IGListBindable.h b/Project 29 - Marslink/Pods/IGListKit/Source/IGListBindable.h new file mode 100644 index 00000000..add078c9 --- /dev/null +++ b/Project 29 - Marslink/Pods/IGListKit/Source/IGListBindable.h @@ -0,0 +1,32 @@ +/** + * Copyright (c) 2016-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** + A protocol for cells that configure themselves given a view model. + */ +NS_SWIFT_NAME(ListBindable) +@protocol IGListBindable + +/** + Tells the cell to configure itself with the given view model. + + @param viewModel The view model for the cell. + + @note The view model can change many times throughout the lifetime of a cell as the model values change and the cell + is reused. Implementations should use only this method to do their configuration. + */ +- (void)bindViewModel:(id)viewModel; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Project 29 - Marslink/Pods/IGListKit/Source/IGListBindingSectionController.h b/Project 29 - Marslink/Pods/IGListKit/Source/IGListBindingSectionController.h new file mode 100644 index 00000000..04871621 --- /dev/null +++ b/Project 29 - Marslink/Pods/IGListKit/Source/IGListBindingSectionController.h @@ -0,0 +1,84 @@ +/** + * Copyright (c) 2016-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import + +#import + +#import +#import +#import + +@protocol IGListDiffable; +@protocol IGListBindable; + +@class IGListBindingSectionController; + +NS_ASSUME_NONNULL_BEGIN + +/** + This section controller uses a data source to transform its "top level" object into an array of diffable view models. + It then automatically binds each view model to cells via the `IGListBindable` protocol. + + Models used with `IGListBindingSectionController` should take special care to always return `YES` for identical + objects. That is, any objects with matching `-diffIdentifier`s should always be equal, that way the section controller + can create new view models via the data source, create a diff, and update the specific cells that have changed. + + In Objective-C, your `-isEqualToDiffableObject:` can simply be: + ``` + - (BOOL)isEqualToDiffableObject:(id)object { + return YES; + } + ``` + + In Swift: + ``` + func isEqual(toDiffableObject object: IGListDiffable?) -> Bool { + return true + } + ``` + + Only when `-diffIdentifier`s match is object equality compared, so you can assume the class is the same, and the + instance has already been checked. + */ +NS_SWIFT_NAME(ListBindingSectionController) +@interface IGListBindingSectionController<__covariant ObjectType : id> : IGListSectionController + +/** + A data source that transforms a top-level object into view models, and returns cells and sizes for given view models. + */ +@property (nonatomic, weak, nullable) id dataSource; + +/** + A delegate that receives selection events from cells in an `IGListBindingSectionController` instance. + */ +@property (nonatomic, weak, nullable) id selectionDelegate; + +/** + The object currently assigned to the section controller, if any. + */ +@property (nonatomic, strong, readonly, nullable) ObjectType object; + +/** + The array of view models created from the data source. Values are changed when the top-level object changes or by + calling `-updateAnimated:completion:` manually. + */ +@property (nonatomic, strong, readonly) NSArray> *viewModels; + +/** + Tells the section controller to query for new view models, diff the changes, and update its cells. + + @param animated A flag indicating if the transition should be animated or not. + @param completion An optional completion block executed after updates finish. Parameter is YES if updates were applied. + */ +- (void)updateAnimated:(BOOL)animated completion:(nullable void (^)(BOOL updated))completion; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Project 29 - Marslink/Pods/IGListKit/Source/IGListBindingSectionController.m b/Project 29 - Marslink/Pods/IGListKit/Source/IGListBindingSectionController.m new file mode 100644 index 00000000..b7e73296 --- /dev/null +++ b/Project 29 - Marslink/Pods/IGListKit/Source/IGListBindingSectionController.m @@ -0,0 +1,151 @@ +/** + * Copyright (c) 2016-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import "IGListBindingSectionController.h" + +#import +#import +#import +#import +#import + +#import "IGListArrayUtilsInternal.h" + +typedef NS_ENUM(NSInteger, IGListDiffingSectionState) { + IGListDiffingSectionStateIdle = 0, + IGListDiffingSectionStateUpdateQueued, + IGListDiffingSectionStateUpdateApplied +}; + +@interface IGListBindingSectionController() + +@property (nonatomic, strong, readwrite) NSArray> *viewModels; + +@property (nonatomic, strong) id object; +@property (nonatomic, assign) IGListDiffingSectionState state; + +@end + +@implementation IGListBindingSectionController + +#pragma mark - Public API + +- (void)updateAnimated:(BOOL)animated completion:(void (^)(BOOL))completion { + IGAssertMainThread(); + + if (self.state != IGListDiffingSectionStateIdle) { + if (completion != nil) { + completion(NO); + } + return; + } + self.state = IGListDiffingSectionStateUpdateQueued; + + __block IGListIndexSetResult *result = nil; + __block NSArray> *oldViewModels = nil; + + id collectionContext = self.collectionContext; + [self.collectionContext performBatchAnimated:animated updates:^(id batchContext) { + if (self.state != IGListDiffingSectionStateUpdateQueued) { + return; + } + + oldViewModels = self.viewModels; + + id object = self.object; + IGAssert(object != nil, @"Expected IGListBindingSectionController object to be non-nil before updating."); + + NSArray *newViewModels = [self.dataSource sectionController:self viewModelsForObject:object]; + self.viewModels = objectsWithDuplicateIdentifiersRemoved(newViewModels); + result = IGListDiff(oldViewModels, self.viewModels, IGListDiffEquality); + + [result.updates enumerateIndexesUsingBlock:^(NSUInteger oldUpdatedIndex, BOOL *stop) { + id identifier = [oldViewModels[oldUpdatedIndex] diffIdentifier]; + const NSInteger indexAfterUpdate = [result newIndexForIdentifier:identifier]; + if (indexAfterUpdate != NSNotFound) { + UICollectionViewCell *cell = [collectionContext cellForItemAtIndex:oldUpdatedIndex + sectionController:self]; + [cell bindViewModel:self.viewModels[indexAfterUpdate]]; + } + }]; + + + [batchContext deleteInSectionController:self atIndexes:result.deletes]; + [batchContext insertInSectionController:self atIndexes:result.inserts]; + + for (IGListMoveIndex *move in result.moves) { + [batchContext moveInSectionController:self fromIndex:move.from toIndex:move.to]; + } + + self.state = IGListDiffingSectionStateUpdateApplied; + } completion:^(BOOL finished) { + self.state = IGListDiffingSectionStateIdle; + if (completion != nil) { + completion(YES); + } + }]; +} + +#pragma mark - IGListSectionController Overrides + +- (NSInteger)numberOfItems { + return self.viewModels.count; +} + +- (CGSize)sizeForItemAtIndex:(NSInteger)index { + return [self.dataSource sectionController:self sizeForViewModel:self.viewModels[index] atIndex:index]; +} + +- (UICollectionViewCell *)cellForItemAtIndex:(NSInteger)index { + id viewModel = self.viewModels[index]; + UICollectionViewCell *cell = [self.dataSource sectionController:self cellForViewModel:viewModel atIndex:index]; + [cell bindViewModel:viewModel]; + return cell; +} + +- (void)didUpdateToObject:(id)object { + id oldObject = self.object; + self.object = object; + + if (oldObject == nil) { + self.viewModels = [self.dataSource sectionController:self viewModelsForObject:object]; + } else { + IGAssert([oldObject isEqualToDiffableObject:object], + @"Unequal objects %@ and %@ will cause IGListBindingSectionController to reload the entire section", + oldObject, object); + [self updateAnimated:YES completion:nil]; + } +} + +- (void)didSelectItemAtIndex:(NSInteger)index { + [self.selectionDelegate sectionController:self didSelectItemAtIndex:index viewModel:self.viewModels[index]]; +} + +- (void)didDeselectItemAtIndex:(NSInteger)index { + id selectionDelegate = self.selectionDelegate; + if ([selectionDelegate respondsToSelector:@selector(sectionController:didDeselectItemAtIndex:viewModel:)]) { + [selectionDelegate sectionController:self didDeselectItemAtIndex:index viewModel:self.viewModels[index]]; + } +} + +- (void)didHighlightItemAtIndex:(NSInteger)index { + id selectionDelegate = self.selectionDelegate; + if ([selectionDelegate respondsToSelector:@selector(sectionController:didHighlightItemAtIndex:viewModel:)]) { + [selectionDelegate sectionController:self didHighlightItemAtIndex:index viewModel:self.viewModels[index]]; + } +} + +- (void)didUnhighlightItemAtIndex:(NSInteger)index { + id selectionDelegate = self.selectionDelegate; + if ([selectionDelegate respondsToSelector:@selector(sectionController:didUnhighlightItemAtIndex:viewModel:)]) { + [selectionDelegate sectionController:self didUnhighlightItemAtIndex:index viewModel:self.viewModels[index]]; + } +} + +@end diff --git a/Project 29 - Marslink/Pods/IGListKit/Source/IGListBindingSectionControllerDataSource.h b/Project 29 - Marslink/Pods/IGListKit/Source/IGListBindingSectionControllerDataSource.h new file mode 100644 index 00000000..1886b7c8 --- /dev/null +++ b/Project 29 - Marslink/Pods/IGListKit/Source/IGListBindingSectionControllerDataSource.h @@ -0,0 +1,67 @@ +/** + * Copyright (c) 2016-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import + +@class IGListBindingSectionController; + +@protocol IGListBindable; +@protocol IGListDiffable; + +NS_ASSUME_NONNULL_BEGIN + +/** + A protocol that returns data to power cells in an `IGListBindingSectionController`. + */ +NS_SWIFT_NAME(ListBindingSectionControllerDataSource) +@protocol IGListBindingSectionControllerDataSource + +/** + Create an array of view models given a top-level object. + + @param sectionController The section controller requesting view models. + @param object The top-level object that powers the section controller. + + @return A new array of view models. + */ +- (NSArray> *)sectionController:(IGListBindingSectionController *)sectionController + viewModelsForObject:(id)object; + +/** + Return a dequeued cell for a given view model. + + @param sectionController The section controller requesting a cell. + @param viewModel The view model for the cell. + @param index The index of the view model. + + @return A dequeued cell. + + @note The section controller will call `-bindViewModel:` with the provided view model after the cell is dequeued. You + should handle cell configuration using this method. However, you can do additional configuration at this stage as well. + */ +- (UICollectionViewCell *)sectionController:(IGListBindingSectionController *)sectionController + cellForViewModel:(id)viewModel + atIndex:(NSInteger)index; + +/** + Return a cell size for a given view model. + + @param sectionController The section controller requesting a size. + @param viewModel The view model for the cell. + @param index The index of the view model. + + @return A size for the view model. + */ +- (CGSize)sectionController:(IGListBindingSectionController *)sectionController + sizeForViewModel:(id)viewModel + atIndex:(NSInteger)index; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Project 29 - Marslink/Pods/IGListKit/Source/IGListBindingSectionControllerSelectionDelegate.h b/Project 29 - Marslink/Pods/IGListKit/Source/IGListBindingSectionControllerSelectionDelegate.h new file mode 100644 index 00000000..ae5992e5 --- /dev/null +++ b/Project 29 - Marslink/Pods/IGListKit/Source/IGListBindingSectionControllerSelectionDelegate.h @@ -0,0 +1,73 @@ +/** + * Copyright (c) 2016-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import + +@class IGListBindingSectionController; + +NS_ASSUME_NONNULL_BEGIN + +/** + A protocol that handles cell selection events in an `IGListBindingSectionController`. + */ +NS_SWIFT_NAME(ListBindingSectionControllerSelectionDelegate) +@protocol IGListBindingSectionControllerSelectionDelegate + +/** + Tells the delegate that a cell at a given index was selected. + + @param sectionController The section controller the selection occurred in. + @param index The index of the selected cell. + @param viewModel The view model that was bound to the cell. + */ +- (void)sectionController:(IGListBindingSectionController *)sectionController + didSelectItemAtIndex:(NSInteger)index + viewModel:(id)viewModel; + +/** + Tells the delegate that a cell at a given index was deselected. + + @param sectionController The section controller the deselection occurred in. + @param index The index of the deselected cell. + @param viewModel The view model that was bound to the cell. + + @note Method is `@optional` until the 4.0.0 release where it will become required. + */ +@optional +- (void)sectionController:(IGListBindingSectionController *)sectionController + didDeselectItemAtIndex:(NSInteger)index + viewModel:(id)viewModel; + +/** + Tells the delegate that a cell at a given index was highlighted. + + @param sectionController The section controller the highlight occurred in. + @param index The index of the highlighted cell. + @param viewModel The view model that was bound to the cell. + */ +@optional +- (void)sectionController:(IGListBindingSectionController *)sectionController + didHighlightItemAtIndex:(NSInteger)index + viewModel:(id)viewModel; + +/** + Tells the delegate that a cell at a given index was unhighlighted. + + @param sectionController The section controller the unhighlight occurred in. + @param index The index of the unhighlighted cell. + @param viewModel The view model that was bound to the cell. + */ +@optional +- (void)sectionController:(IGListBindingSectionController *)sectionController +didUnhighlightItemAtIndex:(NSInteger)index + viewModel:(id)viewModel; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Project 27 - Marslink/Pods/IGListKit/Source/IGListCollectionContext.h b/Project 29 - Marslink/Pods/IGListKit/Source/IGListCollectionContext.h similarity index 54% rename from Project 27 - Marslink/Pods/IGListKit/Source/IGListCollectionContext.h rename to Project 29 - Marslink/Pods/IGListKit/Source/IGListCollectionContext.h index bebb501b..e137e81c 100644 --- a/Project 27 - Marslink/Pods/IGListKit/Source/IGListCollectionContext.h +++ b/Project 29 - Marslink/Pods/IGListKit/Source/IGListCollectionContext.h @@ -9,37 +9,58 @@ #import +#import + NS_ASSUME_NONNULL_BEGIN @class IGListSectionController; -@protocol IGListSectionType; /** The collection context provides limited access to the collection-related information that - section controllers need for operations like sizing, dequeing cells, insterting, deleting, reloading, etc. + section controllers need for operations like sizing, dequeuing cells, inserting, deleting, reloading, etc. */ +NS_SWIFT_NAME(ListCollectionContext) @protocol IGListCollectionContext /** - The size of the collection view. You may use this for sizing cells. + The size of the collection view. You can use this for sizing cells. */ @property (nonatomic, readonly) CGSize containerSize; +/** + The content insets of the collection view. You can use this for sizing cells. + */ +@property (nonatomic, readonly) UIEdgeInsets containerInset; + +/** + The size of the collection view with content insets applied. + */ +@property (nonatomic, readonly) CGSize insetContainerSize; + +/** + Returns size of the collection view relative to the section controller. + + @param sectionController The section controller requesting this information. + + @return The size of the collection view minus the given section controller's insets. + */ +- (CGSize)containerSizeForSectionController:(IGListSectionController *)sectionController; + /** Returns the index of the specified cell in the collection relative to the section controller. - @param cell An existing cell in the collection. + @param cell An existing cell in the collection. @param sectionController The section controller requesting this information. @return The index of the cell or `NSNotFound` if it does not exist in the collection. */ - (NSInteger)indexForCell:(UICollectionViewCell *)cell - sectionController:(IGListSectionController *)sectionController; + sectionController:(IGListSectionController *)sectionController; /** Returns the cell in the collection at the specified index for the section controller. - @param index The index of the desired cell. + @param index The index of the desired cell. @param sectionController The section controller requesting this information. @return The collection view cell, or `nil` if not found. @@ -47,7 +68,7 @@ NS_ASSUME_NONNULL_BEGIN @warning This method may return `nil` if the cell is offscreen. */ - (nullable __kindof UICollectionViewCell *)cellForItemAtIndex:(NSInteger)index - sectionController:(IGListSectionController *)sectionController; + sectionController:(IGListSectionController *)sectionController; /** Returns the visible cells for the given section controller. @@ -56,50 +77,63 @@ NS_ASSUME_NONNULL_BEGIN @return An array of visible cells, or an empty array if none are found. */ -- (NSArray *)visibleCellsForSectionController:(IGListSectionController *)sectionController; +- (NSArray *)visibleCellsForSectionController:(IGListSectionController *)sectionController; + +/** + Returns the visible paths for the given section controller. + + @param sectionController The section controller requesting this information. + + @return An array of visible index paths, or an empty array if none are found. + */ +- (NSArray *)visibleIndexPathsForSectionController:(IGListSectionController *) sectionController; /** Deselects a cell in the collection. - @param index The index of the item to deselect. + @param index The index of the item to deselect. @param sectionController The section controller requesting this information. - @param animated Pass `YES` to animate the change, `NO` otherwise. + @param animated Pass `YES` to animate the change, `NO` otherwise. */ - (void)deselectItemAtIndex:(NSInteger)index - sectionController:(IGListSectionController *)sectionController + sectionController:(IGListSectionController *)sectionController animated:(BOOL)animated; /** - Returns the section index of an section controller. - - @param sectionController An section controller object. - - @return The section index of the controller if found, otherwise `NSNotFound`. + Selects a cell in the collection. + + @param index The index of the item to select. + @param sectionController The section controller requesting this information. + @param animated Pass `YES` to animate the change, `NO` otherwise. + @param scrollPosition An option that specifies where the item should be positioned when scrolling finishes. */ -- (NSInteger)sectionForSectionController:(IGListSectionController *)sectionController; +- (void)selectItemAtIndex:(NSInteger)index + sectionController:(IGListSectionController *)sectionController + animated:(BOOL)animated + scrollPosition:(UICollectionViewScrollPosition)scrollPosition; /** Dequeues a cell from the collection view reuse pool. - @param cellClass The class of the cell you want to dequeue. + @param cellClass The class of the cell you want to dequeue. @param sectionController The section controller requesting this information. - @param index The index of the cell. + @param index The index of the cell. @return A cell dequeued from the reuse pool or a newly created one. @note This method uses a string representation of the cell class as the identifier. */ - (__kindof UICollectionViewCell *)dequeueReusableCellOfClass:(Class)cellClass - forSectionController:(IGListSectionController *)sectionController + forSectionController:(IGListSectionController *)sectionController atIndex:(NSInteger)index; /** Dequeues a cell from the collection view reuse pool. - @param nibName The name of the nib file. - @param bundle The bundle in which to search for the nib file. If `nil`, this method searches the main bundle. + @param nibName The name of the nib file. + @param bundle The bundle in which to search for the nib file. If `nil`, this method searches the main bundle. @param sectionController The section controller requesting this information. - @param index The index of the cell. + @param index The index of the cell. @return A cell dequeued from the reuse pool or a newly created one. @@ -107,148 +141,129 @@ NS_ASSUME_NONNULL_BEGIN */ - (__kindof UICollectionViewCell *)dequeueReusableCellWithNibName:(NSString *)nibName bundle:(nullable NSBundle *)bundle - forSectionController:(IGListSectionController *)sectionController + forSectionController:(IGListSectionController *)sectionController atIndex:(NSInteger)index; /** Dequeues a storyboard prototype cell from the collection view reuse pool. - @param identifier The identifier of the cell prototype in storyboard. + @param identifier The identifier of the cell prototype in storyboard. @param sectionController The section controller requesting this information. - @param index The index of the cell. + @param index The index of the cell. @return A cell dequeued from the reuse pool or a newly created one. */ - (__kindof UICollectionViewCell *)dequeueReusableCellFromStoryboardWithIdentifier:(NSString *)identifier - forSectionController:(IGListSectionController *)sectionController + forSectionController:(IGListSectionController *)sectionController atIndex:(NSInteger)index; /** Dequeues a supplementary view from the collection view reuse pool. - @param elementKind The kind of supplementary veiw. + @param elementKind The kind of supplementary view. @param sectionController The section controller requesting this information. - @param viewClass The class of the supplementary view. - @param index The index of the supplementary vew. + @param viewClass The class of the supplementary view. + @param index The index of the supplementary view. @return A supplementary view dequeued from the reuse pool or a newly created one. @note This method uses a string representation of the view class as the identifier. */ - (__kindof UICollectionReusableView *)dequeueReusableSupplementaryViewOfKind:(NSString *)elementKind - forSectionController:(IGListSectionController *)sectionController + forSectionController:(IGListSectionController *)sectionController class:(Class)viewClass atIndex:(NSInteger)index; /** Dequeues a supplementary view from the collection view reuse pool. - @param elementKind The kind of supplementary veiw. - @param identifier The identifier of the supplementary view in storyboard. + @param elementKind The kind of supplementary view. + @param identifier The identifier of the supplementary view in storyboard. @param sectionController The section controller requesting this information. - @param index The index of the supplementary vew. + @param index The index of the supplementary view. @return A supplementary view dequeued from the reuse pool or a newly created one. */ - (__kindof UICollectionReusableView *)dequeueReusableSupplementaryViewFromStoryboardOfKind:(NSString *)elementKind withIdentifier:(NSString *)identifier - forSectionController:(IGListSectionController *)sectionController + forSectionController:(IGListSectionController *)sectionController atIndex:(NSInteger)index; /** Dequeues a supplementary view from the collection view reuse pool. - @param elementKind The kind of supplementary veiw. + @param elementKind The kind of supplementary view. @param sectionController The section controller requesting this information. - @param nibName The name of the nib file. - @param bundle The bundle in which to search for the nib file. If `nil`, this method searches the main bundle. - @param index The index of the supplementary vew. + @param nibName The name of the nib file. + @param bundle The bundle in which to search for the nib file. If `nil`, this method searches the main bundle. + @param index The index of the supplementary view. @return A supplementary view dequeued from the reuse pool or a newly created one. @note This method uses a string representation of the view class as the identifier. */ - (__kindof UICollectionReusableView *)dequeueReusableSupplementaryViewOfKind:(NSString *)elementKind - forSectionController:(IGListSectionController *)sectionController + forSectionController:(IGListSectionController *)sectionController nibName:(NSString *)nibName bundle:(nullable NSBundle *)bundle atIndex:(NSInteger)index; /** - Reloads cells in the section controller. - - @param sectionController The section controller who's cells need reloading. - @param indexes The indexes of items that need reloading. - */ -- (void)reloadInSectionController:(IGListSectionController *)sectionController - atIndexes:(NSIndexSet *)indexes; - -/** - Inserts cells in the list. + Invalidate the backing `UICollectionViewLayout` for all items in the section controller. - @param sectionController The section controller who's cells need inserting. - @param indexes The indexes of items that need inserting. - */ -- (void)insertInSectionController:(IGListSectionController *)sectionController - atIndexes:(NSIndexSet *)indexes; - -/** - Deletes cells in the list. - - @param sectionController The section controller who's cells need deleted. - @param indexes The indexes of items that need deleting. - */ -- (void)deleteInSectionController:(IGListSectionController *)sectionController - atIndexes:(NSIndexSet *)indexes; - -/** - Reloads the entire section controller. + @param sectionController The section controller that needs invalidating. + @param completion An optional completion block to execute when the updates are finished. - @param sectionController The section controller who's cells need reloading. + @note This method can be wrapped in `UIView` animation APIs to control the duration or perform without animations. This + will end up calling `-[UICollectionView performBatchUpdates:completion:]` internally, so invalidated changes may not be + reflected in the cells immediately. */ -- (void)reloadSectionController:(IGListSectionController *)sectionController; +- (void)invalidateLayoutForSectionController:(IGListSectionController *)sectionController + completion:(nullable void (^)(BOOL finished))completion; /** Batches and performs many cell-level updates in a single transaction. - @param animated A flag indicating if the transition should be animated. - @param updates A block containing all of the cell updates. + @param animated A flag indicating if the transition should be animated. + @param updates A block with a context parameter to make mutations. @param completion An optional completion block to execute when the updates are finished. - @note Use this method to batch cell updates (inserts, deletes, reloads) into a single transaction. This lets you - make many changes to your data store and perform all the transitions at once. + @note You should make state changes that impact the number of items in your section controller within the updates + block alongside changes on the context object. For example, inside your section controllers, you may want to delete *and* insert into the data source that backs your section controller. For example: ``` - [self.collectionContext performBatchItemUpdates:^{ - // perform data source changes inside the update block - [self.items addObject:newItem]; - [self.items removeObjectAtIndex:0]; + [self.collectionContext performBatchItemUpdates:^ (id batchContext>){ + // perform data source changes inside the update block + [self.items addObject:newItem]; + [self.items removeObjectAtIndex:0]; - NSIndexSet *inserts = [NSIndexSet indexSetWithIndex:[self.items count] - 1]; - [self.collectionContext insertInSectionController:self atIndexes:inserts]; + NSIndexSet *inserts = [NSIndexSet indexSetWithIndex:[self.items count] - 1]; + [batchContext insertInSectionController:self atIndexes:inserts]; - NSIndexSet *deletes = [NSIndexSet indexSetWithIndex:0]; - [self.collectionContext deleteInSectionController:self deletes]; + NSIndexSet *deletes = [NSIndexSet indexSetWithIndex:0]; + [batchContext deleteInSectionController:self atIndexes:deletes]; } completion:nil]; ``` @warning You **must** perform data modifications **inside** the update block. Updates will not be performed synchronously, so you should make sure that your data source changes only when necessary. */ -- (void)performBatchAnimated:(BOOL)animated updates:(void (^)())updates completion:(nullable void (^)(BOOL finished))completion; +- (void)performBatchAnimated:(BOOL)animated + updates:(void (^)(id batchContext))updates + completion:(nullable void (^)(BOOL finished))completion; /** Scrolls to the specified section controller in the list. @param sectionController The section controller. - @param index The index of the item in the section controller to which to scroll. - @param scrollPosition An option that specifies where the item should be positioned when scrolling finishes. - @param animated A flag indicating if the scrolling should be animated. + @param index The index of the item in the section controller to which to scroll. + @param scrollPosition An option that specifies where the item should be positioned when scrolling finishes. + @param animated A flag indicating if the scrolling should be animated. */ -- (void)scrollToSectionController:(IGListSectionController *)sectionController +- (void)scrollToSectionController:(IGListSectionController *)sectionController atIndex:(NSInteger)index scrollPosition:(UICollectionViewScrollPosition)scrollPosition animated:(BOOL)animated; diff --git a/Project 29 - Marslink/Pods/IGListKit/Source/IGListCollectionViewLayout.h b/Project 29 - Marslink/Pods/IGListKit/Source/IGListCollectionViewLayout.h new file mode 100644 index 00000000..558003a8 --- /dev/null +++ b/Project 29 - Marslink/Pods/IGListKit/Source/IGListCollectionViewLayout.h @@ -0,0 +1,132 @@ +/** + * Copyright (c) 2016-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** + This UICollectionViewLayout subclass is for vertically or horizontally scrolling lists of data with variable widths and + heights. It supports an infinite number of sections and items. All work is done on the main thread, and while extremely efficient, + care must be taken not to stall the main thread in sizing delegate methods. + + This layout piggybacks on the mechanics of UICollectionViewFlowLayout in that: + + - Your UICollectionView data source must also conform to UICollectionViewDelegateFlowLayout + - Header support given via UICollectionElementKindSectionHeader + + All UICollectionViewDelegateFlowLayout methods are required and used by this layout: + + ``` + - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath; + - (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout insetForSectionAtIndex:(NSInteger)section; + - (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout minimumLineSpacingForSectionAtIndex:(NSInteger)section; + - (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout minimumInteritemSpacingForSectionAtIndex:(NSInteger)section; + - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section; + ``` + + In a vertically scrolling layout, sections and items are put into the same horizontal row until the max-x position + of an item extends beyond the width of the collection view. When that happens, the item is "newlined" to the next row. + The y position of that row is determined by the maximum height (including section insets) of the section/item of the previous row. + + Ex. of a section (2,0) with a large width causing a newline. + ``` + |[ 0,0 ][ 1,0 ] | + |[ 2,0 ]| + ``` + + A section with a non-zero height header will always cause that section to newline. Headers are always stretched to the + width of the collection view, pinched with the section insets. + + Ex. of a section (2,0) with a header inset on the left/right. + ``` + |[ 0,0 ][ 1,0 ] | + | >======header=======< | + | [ 2,0 ] | + ``` + + Section insets apply to items in the section no matter if they begin on a new row or are on the same row as a previous + section. + + Ex. of a section (2) with multiple items and a left inset. + ``` + |[ 0,0 ][ 1,0 ] >[ 2,0 ]| + | >[ 2,1 ][ 2,2 ][ 2,3 ]| + ``` + + Interitem spacing applies to items and sections within the same row. Line spacing only applies to items within the same + section. + + In a horizontally scrolling layout, sections and items are flowed vertically until they need to be "newlined" to the + next column. Headers, if used, are stretched to the height of the collection view, minus the section insets. + + Please see the unit tests for more configuration examples and expected output. + */ +NS_SWIFT_NAME(ListCollectionViewLayout) +@interface IGListCollectionViewLayout : UICollectionViewLayout + +/** + Direction in which layout will be scrollable; items will be flowed in the perpendicular direction, "newlining" when they + run out of space along that axis or when a non-zero header is found. + */ +@property (nonatomic, readonly) UICollectionViewScrollDirection scrollDirection; + +/** + Set this to adjust the offset of the sticky headers in the scrolling direction. Can be used to change the sticky + header position as UI like the navigation bar is scrolled offscreen. In a vertically scrolling layout, changing + this to the height of the navigation bar will give the effect of the headers sticking to the nav as it is collapsed. + + @note Changing the value on this method will invalidate the layout every time. + */ +@property (nonatomic, assign) CGFloat stickyHeaderYOffset; + + +/** + Create and return a new collection view layout. + + @param stickyHeaders Set to `YES` to stick section headers to the top of the bounds while scrolling. + @param scrollDirection Direction along which the collection view will be scrollable (if content size exceeds the frame size) + @param topContentInset The content inset (top or left, depending on scrolling direction) used to offset the sticky headers. Ignored if stickyHeaders is `NO`. + @param stretchToEdge Specifies whether to stretch width (in vertically scrolling layout) or height (horizontally scrolling) of last item to right/bottom edge when distance from last item to right/bottom edge < epsilon(1) + + @return A new collection view layout. + */ +- (instancetype)initWithStickyHeaders:(BOOL)stickyHeaders + scrollDirection:(UICollectionViewScrollDirection)scrollDirection + topContentInset:(CGFloat)topContentInset + stretchToEdge:(BOOL)stretchToEdge NS_DESIGNATED_INITIALIZER; + +/** + Create and return a new vertically scrolling collection view layout. + + @param stickyHeaders Set to `YES` to stick section headers to the top of the bounds while scrolling. + @param topContentInset The top content inset used to offset the sticky headers. Ignored if stickyHeaders is `NO`. + @param stretchToEdge Specifies whether to stretch width of last item to right edge when distance from last item to right edge < epsilon(1) + + @return A new collection view layout. + */ +- (instancetype)initWithStickyHeaders:(BOOL)stickyHeaders + topContentInset:(CGFloat)topContentInset + stretchToEdge:(BOOL)stretchToEdge; + +/** + :nodoc: + */ +- (instancetype)init NS_UNAVAILABLE; + +/** + :nodoc: + */ ++ (instancetype)new NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Project 29 - Marslink/Pods/IGListKit/Source/IGListCollectionViewLayout.mm b/Project 29 - Marslink/Pods/IGListKit/Source/IGListCollectionViewLayout.mm new file mode 100644 index 00000000..37df6e50 --- /dev/null +++ b/Project 29 - Marslink/Pods/IGListKit/Source/IGListCollectionViewLayout.mm @@ -0,0 +1,553 @@ +/** + * Copyright (c) 2016-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import "IGListCollectionViewLayout.h" +#import "IGListCollectionViewLayoutInternal.h" + +#import + +#import + +static CGFloat UIEdgeInsetsLeadingInsetInDirection(UIEdgeInsets insets, UICollectionViewScrollDirection direction) { + switch (direction) { + case UICollectionViewScrollDirectionVertical: return insets.top; + case UICollectionViewScrollDirectionHorizontal: return insets.left; + } +} + +static CGFloat UIEdgeInsetsTrailingInsetInDirection(UIEdgeInsets insets, UICollectionViewScrollDirection direction) { + switch (direction) { + case UICollectionViewScrollDirectionVertical: return insets.bottom; + case UICollectionViewScrollDirectionHorizontal: return insets.right; + } +} + +static CGFloat CGPointGetCoordinateInDirection(CGPoint point, UICollectionViewScrollDirection direction) { + switch (direction) { + case UICollectionViewScrollDirectionVertical: return point.y; + case UICollectionViewScrollDirectionHorizontal: return point.x; + } +} + +static CGFloat CGRectGetLengthInDirection(CGRect rect, UICollectionViewScrollDirection direction) { + switch (direction) { + case UICollectionViewScrollDirectionVertical: return rect.size.height; + case UICollectionViewScrollDirectionHorizontal: return rect.size.width; + } +} + +static CGFloat CGRectGetMaxInDirection(CGRect rect, UICollectionViewScrollDirection direction) { + switch (direction) { + case UICollectionViewScrollDirectionVertical: return CGRectGetMaxY(rect); + case UICollectionViewScrollDirectionHorizontal: return CGRectGetMaxX(rect); + } +} + +static CGFloat CGRectGetMinInDirection(CGRect rect, UICollectionViewScrollDirection direction) { + switch (direction) { + case UICollectionViewScrollDirectionVertical: return CGRectGetMinY(rect); + case UICollectionViewScrollDirectionHorizontal: return CGRectGetMinX(rect); + } +} + +static CGFloat CGSizeGetLengthInDirection(CGSize size, UICollectionViewScrollDirection direction) { + switch (direction) { + case UICollectionViewScrollDirectionVertical: return size.height; + case UICollectionViewScrollDirectionHorizontal: return size.width; + } +} + +static NSIndexPath *headerIndexPathForSection(NSInteger section) { + return [NSIndexPath indexPathForItem:0 inSection:section]; +} + +struct IGListSectionEntry { + /** + Represents the minimum-bounding box of every element in the section. This includes all item frames as well as the + header bounds. It is made simply by unioning all item and header frames. Use this to find section intersections + to build layout attributes given a rect. + */ + CGRect bounds; + + // The insets for the section. Used to find total content size of the section. + UIEdgeInsets insets; + + // The RESTING frame of the header view (e.g. when the header is not sticking to the top of the scroll view). + CGRect headerBounds; + + // An array of frames for each cell in the section. + std::vector itemBounds; + + // Returns YES when the section has visible content (header and/or items). + BOOL isValid() { + return !CGSizeEqualToSize(bounds.size, CGSizeZero); + } +}; + +// Each section has a base zIndex of section * maxZIndexPerSection; +// section header adds (maxZIndexPerSection - 1) to the base zIndex; +// other cells adds (item) to the base zIndex. +// This allows us to present tooltips that can grow from the cell to its top. +static void adjustZIndexForAttributes(UICollectionViewLayoutAttributes *attributes) { + const NSInteger maxZIndexPerSection = 1000; + const NSInteger baseZIndex = attributes.indexPath.section * maxZIndexPerSection; + + switch (attributes.representedElementCategory) { + case UICollectionElementCategoryCell: + attributes.zIndex = baseZIndex + attributes.indexPath.item; + break; + case UICollectionElementCategorySupplementaryView: + IGAssert([attributes.representedElementKind isEqualToString:UICollectionElementKindSectionHeader], + @"Only support for element kind header, not %@", attributes.representedElementKind); + attributes.zIndex = baseZIndex + maxZIndexPerSection - 1; + break; + case UICollectionElementCategoryDecorationView: + attributes.zIndex = baseZIndex - 1; + break; + } +} + +@interface IGListCollectionViewLayoutInvalidationContext : UICollectionViewLayoutInvalidationContext +@property (nonatomic, assign) BOOL ig_invalidateSupplementaryAttributes; +@property (nonatomic, assign) BOOL ig_invalidateAllAttributes; +@end + +@implementation IGListCollectionViewLayoutInvalidationContext +@end + +@interface IGListCollectionViewLayout () + +@property (nonatomic, assign, readonly) BOOL stickyHeaders; +@property (nonatomic, assign, readonly) CGFloat topContentInset; +@property (nonatomic, assign, readonly) BOOL stretchToEdge; + +@end + +@implementation IGListCollectionViewLayout { + std::vector _sectionData; + NSMutableDictionary *_attributesCache; + BOOL _cachedLayoutInvalid; + + /** + The workflow for getting sticky headers working: + 1. Use a custom invalidation context to mark supplementary attributes invalid. + 2. Return YES from -shouldInvalidateLayoutForBoundsChange: + 3. In -invalidationContextForBoundsChange: mark supplementary attributes invalid on the custom context. + 4. Purge supplementary caches in -invalidateLayoutWithContext: if context says they are invalid + 5. Use cached attributes in -layoutAttributesForSupplementaryViewOfKind:atIndexPath: if they exist, else rebuild + 6. Make sure -layoutAttributesForElementsInRect: always uses the attributes returned from + -layoutAttributesForSupplementaryViewOfKind:atIndexPath:. + */ + NSMutableDictionary *_headerAttributesCache; +} + +- (instancetype)initWithStickyHeaders:(BOOL)stickyHeaders + topContentInset:(CGFloat)topContentInset + stretchToEdge:(BOOL)stretchToEdge { + return [self initWithStickyHeaders:stickyHeaders + scrollDirection:UICollectionViewScrollDirectionVertical + topContentInset:topContentInset + stretchToEdge:stretchToEdge]; +} + +- (instancetype)initWithStickyHeaders:(BOOL)stickyHeaders + scrollDirection:(UICollectionViewScrollDirection)scrollDirection + topContentInset:(CGFloat)topContentInset + stretchToEdge:(BOOL)stretchToEdge { + if (self = [super init]) { + _scrollDirection = scrollDirection; + _stickyHeaders = stickyHeaders; + _topContentInset = topContentInset; + _stretchToEdge = stretchToEdge; + _attributesCache = [NSMutableDictionary new]; + _headerAttributesCache = [NSMutableDictionary new]; + _cachedLayoutInvalid = YES; + } + return self; +} + +- (instancetype)initWithCoder:(NSCoder *)aDecoder { + return [self initWithStickyHeaders:NO topContentInset:0 stretchToEdge:NO]; +} + +#pragma mark - UICollectionViewLayout + +- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect { + IGAssertMainThread(); + + NSMutableArray *result = [NSMutableArray new]; + + const NSRange range = [self rangeOfSectionsInRect:rect]; + if (range.location == NSNotFound) { + return nil; + } + + for (NSInteger section = range.location; section < NSMaxRange(range); section++) { + const NSInteger itemCount = _sectionData[section].itemBounds.size(); + + // do not add headers if there are no items + if (itemCount > 0) { + NSIndexPath *headerIndexPath = headerIndexPathForSection(section); + UICollectionViewLayoutAttributes *attributes = [self layoutAttributesForSupplementaryViewOfKind:UICollectionElementKindSectionHeader + atIndexPath:headerIndexPath]; + // do not add zero height headers or headers that are outside the rect + const CGRect frame = attributes.frame; + const CGRect intersection = CGRectIntersection(frame, rect); + if (!CGRectIsEmpty(intersection) + && CGRectGetLengthInDirection(frame, self.scrollDirection) > 0.0) { + [result addObject:attributes]; + } + } + + // add all cells within the rect, return early if it starts iterating outside + for (NSInteger item = 0; item < itemCount; item++) { + NSIndexPath *indexPath = [NSIndexPath indexPathForItem:item inSection:section]; + UICollectionViewLayoutAttributes *attributes = [self layoutAttributesForItemAtIndexPath:indexPath]; + if (CGRectIntersectsRect(attributes.frame, rect)) { + [result addObject:attributes]; + } + } + } + + return result; +} + +- (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath { + IGAssertMainThread(); + IGParameterAssert(indexPath != nil); + + UICollectionViewLayoutAttributes *attributes = _attributesCache[indexPath]; + if (attributes != nil) { + return attributes; + } + + // avoid OOB errors + const NSInteger section = indexPath.section; + const NSInteger item = indexPath.item; + if (section >= _sectionData.size() + || item >= _sectionData[section].itemBounds.size()) { + return nil; + } + + attributes = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath]; + attributes.frame = _sectionData[indexPath.section].itemBounds[indexPath.item]; + adjustZIndexForAttributes(attributes); + _attributesCache[indexPath] = attributes; + return attributes; +} + +- (UICollectionViewLayoutAttributes *)layoutAttributesForSupplementaryViewOfKind:(NSString *)elementKind atIndexPath:(NSIndexPath *)indexPath { + IGAssertMainThread(); + IGParameterAssert([elementKind isEqualToString:UICollectionElementKindSectionHeader]); + IGParameterAssert(indexPath != nil); + + UICollectionViewLayoutAttributes *attributes = _headerAttributesCache[indexPath]; + if (attributes != nil) { + return attributes; + } + + // avoid OOB errors + const NSInteger section = indexPath.section; + if (section >= _sectionData.size()) { + return nil; + } + + UICollectionView *collectionView = self.collectionView; + const IGListSectionEntry entry = _sectionData[section]; + const CGFloat minOffset = CGRectGetMinInDirection(entry.bounds, self.scrollDirection); + + CGRect frame = entry.headerBounds; + + if (self.stickyHeaders) { + CGFloat offset = CGPointGetCoordinateInDirection(collectionView.contentOffset, self.scrollDirection) + self.topContentInset + self.stickyHeaderYOffset; + + if (section + 1 == _sectionData.size()) { + offset = MAX(minOffset, offset); + } else { + const CGFloat maxOffset = CGRectGetMinInDirection(_sectionData[section + 1].bounds, self.scrollDirection) - CGRectGetLengthInDirection(frame, self.scrollDirection); + offset = MIN(MAX(minOffset, offset), maxOffset); + } + switch (self.scrollDirection) { + case UICollectionViewScrollDirectionVertical: + frame.origin.y = offset; + break; + case UICollectionViewScrollDirectionHorizontal: + frame.origin.x = offset; + break; + } + } + + attributes = [UICollectionViewLayoutAttributes layoutAttributesForSupplementaryViewOfKind:elementKind withIndexPath:indexPath]; + attributes.frame = frame; + adjustZIndexForAttributes(attributes); + _headerAttributesCache[indexPath] = attributes; + return attributes; +} + +- (CGSize)collectionViewContentSize { + IGAssertMainThread(); + + const NSInteger sectionCount = _sectionData.size(); + + if (sectionCount == 0) { + return CGSizeZero; + } + + const IGListSectionEntry section = _sectionData[sectionCount - 1]; + UICollectionView *collectionView = self.collectionView; + const UIEdgeInsets contentInset = collectionView.contentInset; + + switch (self.scrollDirection) { + case UICollectionViewScrollDirectionVertical: { + const CGFloat height = CGRectGetMaxY(section.bounds) + section.insets.bottom; + return CGSizeMake(CGRectGetWidth(collectionView.bounds) - contentInset.left - contentInset.right, height); + } + case UICollectionViewScrollDirectionHorizontal: { + const CGFloat width = CGRectGetMaxX(section.bounds) + section.insets.right; + return CGSizeMake(width, CGRectGetHeight(collectionView.bounds) - contentInset.top - contentInset.bottom); + } + } + +} + +- (void)invalidateLayoutWithContext:(IGListCollectionViewLayoutInvalidationContext *)context { + BOOL hasInvalidatedItemIndexPaths = NO; + if ([context respondsToSelector:@selector(invalidatedItemIndexPaths)]) { + hasInvalidatedItemIndexPaths = [context invalidatedItemIndexPaths].count > 0; + } + + if (hasInvalidatedItemIndexPaths + || [context invalidateEverything] + || [context invalidateDataSourceCounts] + || context.ig_invalidateAllAttributes) { + _cachedLayoutInvalid = YES; + } + + if (context.ig_invalidateSupplementaryAttributes) { + [_headerAttributesCache removeAllObjects]; + } + + [super invalidateLayoutWithContext:context]; +} + ++ (Class)invalidationContextClass { + return [IGListCollectionViewLayoutInvalidationContext class]; +} + +- (UICollectionViewLayoutInvalidationContext *)invalidationContextForBoundsChange:(CGRect)newBounds { + const CGRect oldBounds = self.collectionView.bounds; + + IGListCollectionViewLayoutInvalidationContext *context = + (IGListCollectionViewLayoutInvalidationContext *)[super invalidationContextForBoundsChange:newBounds]; + context.ig_invalidateSupplementaryAttributes = YES; + if (!CGSizeEqualToSize(oldBounds.size, newBounds.size)) { + context.ig_invalidateAllAttributes = YES; + } + return context; +} + +- (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds { + const CGRect oldBounds = self.collectionView.bounds; + + // if the y origin has changed, only invalidate when using sticky headers + if (CGRectGetMinInDirection(newBounds, self.scrollDirection) != CGRectGetMinInDirection(oldBounds, self.scrollDirection)) { + return self.stickyHeaders; + } + + // always invalidate for size changes + return !CGSizeEqualToSize(oldBounds.size, newBounds.size); +} + +- (void)prepareLayout { + if (_cachedLayoutInvalid) { + [self cacheLayout]; + } +} + +#pragma mark - Public API + +- (void)setStickyHeaderYOffset:(CGFloat)stickyHeaderYOffset { + IGAssertMainThread(); + + if (_stickyHeaderYOffset != stickyHeaderYOffset) { + _stickyHeaderYOffset = stickyHeaderYOffset; + + IGListCollectionViewLayoutInvalidationContext *invalidationContext = [IGListCollectionViewLayoutInvalidationContext new]; + invalidationContext.ig_invalidateSupplementaryAttributes = YES; + [self invalidateLayoutWithContext:invalidationContext]; + } +} + +#pragma mark - Private API + +- (void)cacheLayout { + _cachedLayoutInvalid = NO; + + // purge attribute caches so they are rebuilt + [_attributesCache removeAllObjects]; + [_headerAttributesCache removeAllObjects]; + + UICollectionView *collectionView = self.collectionView; + id dataSource = collectionView.dataSource; + id delegate = (id)collectionView.delegate; + + const NSInteger sectionCount = [dataSource numberOfSectionsInCollectionView:collectionView]; + const UIEdgeInsets contentInset = collectionView.contentInset; + const CGRect contentInsetAdjustedCollectionViewBounds = UIEdgeInsetsInsetRect(collectionView.bounds, contentInset); + + auto sectionData = std::vector(sectionCount); + + CGFloat itemCoordInScrollDirection = 0.0; + CGFloat itemCoordInFixedDirection = 0.0; + CGFloat nextRowCoordInScrollDirection = 0.0; + + // union item frames and optionally the header to find a bounding box of the entire section + CGRect rollingSectionBounds; + + for (NSInteger section = 0; section < sectionCount; section++) { + const NSInteger itemCount = [dataSource collectionView:collectionView numberOfItemsInSection:section]; + sectionData[section].itemBounds = std::vector(itemCount); + + const CGSize headerSize = [delegate collectionView:collectionView layout:self referenceSizeForHeaderInSection:section]; + const UIEdgeInsets insets = [delegate collectionView:collectionView layout:self insetForSectionAtIndex:section]; + const CGFloat lineSpacing = [delegate collectionView:collectionView layout:self minimumLineSpacingForSectionAtIndex:section]; + const CGFloat interitemSpacing = [delegate collectionView:collectionView layout:self minimumInteritemSpacingForSectionAtIndex:section]; + + const CGSize paddedCollectionViewSize = UIEdgeInsetsInsetRect(contentInsetAdjustedCollectionViewBounds, insets).size; + const UICollectionViewScrollDirection fixedDirection = self.scrollDirection == UICollectionViewScrollDirectionHorizontal ? UICollectionViewScrollDirectionVertical : UICollectionViewScrollDirectionHorizontal; + const CGFloat paddedLengthInFixedDirection = CGSizeGetLengthInDirection(paddedCollectionViewSize, fixedDirection); + const CGFloat headerLengthInScrollDirection = CGSizeGetLengthInDirection(headerSize, self.scrollDirection); + const BOOL headerExists = headerLengthInScrollDirection > 0; + + // start the section accounting for the header size + // header length in scroll direction is subtracted from the sectionBounds when calculating the header bounds after items are done + // this bumps the first row of items over enough to make room for the header + itemCoordInScrollDirection += headerLengthInScrollDirection; + nextRowCoordInScrollDirection += headerLengthInScrollDirection; + + // add the leading inset in fixed direction in case the section falls on the same row as the previous + // if the section is newlined then the coord in fixed direction is reset + itemCoordInFixedDirection += UIEdgeInsetsLeadingInsetInDirection(insets, fixedDirection); + + // the farthest in the fixed direction the frame of an item in this section can go + const CGFloat maxCoordinateInFixedDirection = CGRectGetLengthInDirection(contentInsetAdjustedCollectionViewBounds, fixedDirection) - UIEdgeInsetsTrailingInsetInDirection(insets, fixedDirection); + + for (NSInteger item = 0; item < itemCount; item++) { + NSIndexPath *indexPath = [NSIndexPath indexPathForItem:item inSection:section]; + const CGSize size = [delegate collectionView:collectionView layout:self sizeForItemAtIndexPath:indexPath]; + + IGAssert(CGSizeGetLengthInDirection(size, fixedDirection) <= paddedLengthInFixedDirection + || fabs(CGSizeGetLengthInDirection(size, fixedDirection) - paddedLengthInFixedDirection) < FLT_EPSILON, + @"%@ of item %zi in section %zi must be less than container %.0f accounting for section insets %@", + self.scrollDirection == UICollectionViewScrollDirectionVertical ? @"Width" : @"Height", + item, section, CGRectGetLengthInDirection(contentInsetAdjustedCollectionViewBounds, fixedDirection), + NSStringFromUIEdgeInsets(insets)); + + CGFloat itemLengthInFixedDirection = MIN(CGSizeGetLengthInDirection(size, fixedDirection), paddedLengthInFixedDirection); + + // if the origin and length in fixed direction of the item busts the size of the container + // or if this is the first item and the header has a non-zero size + // newline to the next row and reset + // define epsilon to avoid float overflow issue + const CGFloat epsilon = 1.0; + if (itemCoordInFixedDirection + itemLengthInFixedDirection > maxCoordinateInFixedDirection + epsilon + || (item == 0 && headerExists)) { + itemCoordInScrollDirection = nextRowCoordInScrollDirection; + itemCoordInFixedDirection = UIEdgeInsetsLeadingInsetInDirection(insets, fixedDirection); + + + // if newlining, always append line spacing unless its the very first item of the section + if (item > 0) { + itemCoordInScrollDirection += lineSpacing; + } + } + + const CGFloat distanceToEdge = paddedLengthInFixedDirection - (itemCoordInFixedDirection + itemLengthInFixedDirection); + if (self.stretchToEdge && distanceToEdge > 0 && distanceToEdge <= epsilon) { + itemLengthInFixedDirection = paddedLengthInFixedDirection - itemCoordInFixedDirection; + } + + const CGRect rawFrame = (self.scrollDirection == UICollectionViewScrollDirectionVertical) ? + CGRectMake(itemCoordInFixedDirection, + itemCoordInScrollDirection + insets.top, + itemLengthInFixedDirection, + size.height) : + CGRectMake(itemCoordInScrollDirection + insets.left, + itemCoordInFixedDirection, + size.width, + itemLengthInFixedDirection); + const CGRect frame = IGListRectIntegralScaled(rawFrame); + + sectionData[section].itemBounds[item] = frame; + + // track the max size of the row to find the coord of the next row, adjust for leading inset while iterating items + nextRowCoordInScrollDirection = MAX(CGRectGetMaxInDirection(frame, self.scrollDirection) - UIEdgeInsetsLeadingInsetInDirection(insets, self.scrollDirection), nextRowCoordInScrollDirection); + + // increase the rolling coord in fixed direction appropriately and add item spacing for all items on the same row + itemCoordInFixedDirection += itemLengthInFixedDirection + interitemSpacing; + + // union the rolling section bounds + if (item == 0) { + rollingSectionBounds = frame; + } else { + rollingSectionBounds = CGRectUnion(rollingSectionBounds, frame); + } + } + + const CGRect headerBounds = (self.scrollDirection == UICollectionViewScrollDirectionVertical) ? + CGRectMake(insets.left, + CGRectGetMinY(rollingSectionBounds) - headerSize.height, + paddedLengthInFixedDirection, + headerSize.height) : + CGRectMake(CGRectGetMinX(rollingSectionBounds) - headerSize.width, + insets.top, + headerSize.width, + paddedLengthInFixedDirection); + + sectionData[section].headerBounds = headerBounds; + + // union the header before setting the bounds of the section + // only do this when the header has a size, otherwise the union stretches to box empty space + if (headerExists) { + rollingSectionBounds = CGRectUnion(rollingSectionBounds, headerBounds); + } + + sectionData[section].bounds = rollingSectionBounds; + sectionData[section].insets = insets; + + // bump the coord for the next section with the right insets + itemCoordInFixedDirection += UIEdgeInsetsTrailingInsetInDirection(insets, fixedDirection); + + // find the farthest point in the section and add the trailing inset to find the next row's coord + nextRowCoordInScrollDirection = MAX(nextRowCoordInScrollDirection, CGRectGetMaxInDirection(rollingSectionBounds, self.scrollDirection) + UIEdgeInsetsTrailingInsetInDirection(insets, self.scrollDirection)); + } + + _sectionData = sectionData; +} + +- (NSRange)rangeOfSectionsInRect:(CGRect)rect { + NSRange result = NSMakeRange(NSNotFound, 0); + + const NSInteger sectionCount = _sectionData.size(); + for (NSInteger section = 0; section < sectionCount; section++) { + IGListSectionEntry entry = _sectionData[section]; + if (entry.isValid() && CGRectIntersectsRect(entry.bounds, rect)) { + const NSRange sectionRange = NSMakeRange(section, 1); + if (result.location == NSNotFound) { + result = sectionRange; + } else { + result = NSUnionRange(result, sectionRange); + } + } + } + + return result; +} + +@end diff --git a/Project 27 - Marslink/Pods/IGListKit/Source/IGListDisplayDelegate.h b/Project 29 - Marslink/Pods/IGListKit/Source/IGListDisplayDelegate.h similarity index 64% rename from Project 27 - Marslink/Pods/IGListKit/Source/IGListDisplayDelegate.h rename to Project 29 - Marslink/Pods/IGListKit/Source/IGListDisplayDelegate.h index 00321da2..b29bd5b7 100644 --- a/Project 27 - Marslink/Pods/IGListKit/Source/IGListDisplayDelegate.h +++ b/Project 29 - Marslink/Pods/IGListKit/Source/IGListDisplayDelegate.h @@ -12,22 +12,23 @@ @class IGListAdapter; @class IGListSectionController; -@protocol IGListSectionType; + NS_ASSUME_NONNULL_BEGIN /** - Implement this protocol to receive display events for an section controller when it is on screen. + Implement this protocol to receive display events for a section controller when it is on screen. */ +NS_SWIFT_NAME(ListDisplayDelegate) @protocol IGListDisplayDelegate /** Tells the delegate that the specified section controller is about to be displayed. - @param listAdapter The list adapter for the section controller. + @param listAdapter The list adapter for the section controller. @param sectionController The section controller about to be displayed. */ -- (void)listAdapter:(IGListAdapter *)listAdapter willDisplaySectionController:(IGListSectionController *)sectionController; +- (void)listAdapter:(IGListAdapter *)listAdapter willDisplaySectionController:(IGListSectionController *)sectionController; /** Tells the delegate that the specified section controller is no longer being displayed. @@ -35,29 +36,29 @@ NS_ASSUME_NONNULL_BEGIN @param listAdapter The list adapter for the section controller. @param sectionController The section controller that is no longer displayed. */ -- (void)listAdapter:(IGListAdapter *)listAdapter didEndDisplayingSectionController:(IGListSectionController *)sectionController; +- (void)listAdapter:(IGListAdapter *)listAdapter didEndDisplayingSectionController:(IGListSectionController *)sectionController; /** Tells the delegate that a cell in the specified list is about to be displayed. - @param listAdapter The list adapter in which the cell will display. + @param listAdapter The list adapter in which the cell will display. @param sectionController The section controller that is displaying the cell. - @param cell The cell about to be displayed. - @param index The index of the cell in the section. + @param cell The cell about to be displayed. + @param index The index of the cell in the section. */ -- (void)listAdapter:(IGListAdapter *)listAdapter willDisplaySectionController:(IGListSectionController *)sectionController +- (void)listAdapter:(IGListAdapter *)listAdapter willDisplaySectionController:(IGListSectionController *)sectionController cell:(UICollectionViewCell *)cell atIndex:(NSInteger)index; /** Tells the delegate that a cell in the specified list is no longer being displayed. - @param listAdapter The list adapter in which the cell was displayed. + @param listAdapter The list adapter in which the cell was displayed. @param sectionController The section controller that is no longer displaying the cell. - @param cell The cell that is no longer displayed. - @param index The index of the cell in the section. + @param cell The cell that is no longer displayed. + @param index The index of the cell in the section. */ -- (void)listAdapter:(IGListAdapter *)listAdapter didEndDisplayingSectionController:(IGListSectionController *)sectionController +- (void)listAdapter:(IGListAdapter *)listAdapter didEndDisplayingSectionController:(IGListSectionController *)sectionController cell:(UICollectionViewCell *)cell atIndex:(NSInteger)index; diff --git a/Project 29 - Marslink/Pods/IGListKit/Source/IGListGenericSectionController.h b/Project 29 - Marslink/Pods/IGListKit/Source/IGListGenericSectionController.h new file mode 100644 index 00000000..e71039a8 --- /dev/null +++ b/Project 29 - Marslink/Pods/IGListKit/Source/IGListGenericSectionController.h @@ -0,0 +1,42 @@ +/** + * Copyright (c) 2016-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** + This class adds a helper layer to `IGListSectionController` to automatically store a generic object in + `didUpdateToObject:`. + */ +NS_SWIFT_NAME(ListGenericSectionController) +@interface IGListGenericSectionController<__covariant ObjectType> : IGListSectionController + +/** + The object mapped to this section controller. Matches the object provided in + `[IGListAdapterDataSource listAdapter:sectionControllerForObject:]` when this section controller was created and + returned. + + @note This object is briefly `nil` between initialization and the first call to `didUpdateToObject:`. After that, it is + safe to assume that this is non-`nil`. + */ +@property (nonatomic, strong, nullable, readonly) ObjectType object; + +/** + Updates the section controller to a new object. + + @param object The object mapped to this section controller. + + @note This `IGListSectionController` subclass sets its object in this method, so any overrides **must call super**. + */ +- (void)didUpdateToObject:(id)object NS_REQUIRES_SUPER; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Project 29 - Marslink/Pods/IGListKit/Source/IGListGenericSectionController.m b/Project 29 - Marslink/Pods/IGListKit/Source/IGListGenericSectionController.m new file mode 100644 index 00000000..8022aa44 --- /dev/null +++ b/Project 29 - Marslink/Pods/IGListKit/Source/IGListGenericSectionController.m @@ -0,0 +1,18 @@ +/** + * Copyright (c) 2016-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import "IGListGenericSectionController.h" + +@implementation IGListGenericSectionController + +- (void)didUpdateToObject:(id)object { + _object = object; +} + +@end diff --git a/Project 27 - Marslink/Pods/IGListKit/Source/IGListKit.h b/Project 29 - Marslink/Pods/IGListKit/Source/IGListKit.h similarity index 73% rename from Project 27 - Marslink/Pods/IGListKit/Source/IGListKit.h rename to Project 29 - Marslink/Pods/IGListKit/Source/IGListKit.h index 62d07ea2..d8665b06 100644 --- a/Project 27 - Marslink/Pods/IGListKit/Source/IGListKit.h +++ b/Project 29 - Marslink/Pods/IGListKit/Source/IGListKit.h @@ -7,7 +7,7 @@ * of patent rights can be found in the PATENTS file in the same directory. */ -#import +#import /** * Project version number for IGListKit. @@ -19,33 +19,47 @@ FOUNDATION_EXPORT double IGListKitVersionNumber; */ FOUNDATION_EXPORT const unsigned char IGListKitVersionString[]; -#import +#if TARGET_OS_EMBEDDED || TARGET_OS_SIMULATOR + +// iOS and tvOS only: + #import #import #import #import #import -#import +#import +#import +#import +#import +#import +#import #import -#import -#import -#import #import #import -#import -#import -#import +#import #import -#import -#import -#import -#import #import #import #import #import #import #import +#import #import + +#endif + +// Shared (iOS, tvOS, macOS compatible): + +#import +#import +#import +#import +#import +#import +#import +#import +#import #import #import diff --git a/Project 27 - Marslink/Pods/IGListKit/Source/IGListReloadDataUpdater.h b/Project 29 - Marslink/Pods/IGListKit/Source/IGListReloadDataUpdater.h similarity index 82% rename from Project 27 - Marslink/Pods/IGListKit/Source/IGListReloadDataUpdater.h rename to Project 29 - Marslink/Pods/IGListKit/Source/IGListReloadDataUpdater.h index 342732a0..43f531f9 100644 --- a/Project 27 - Marslink/Pods/IGListKit/Source/IGListReloadDataUpdater.h +++ b/Project 29 - Marslink/Pods/IGListKit/Source/IGListReloadDataUpdater.h @@ -12,13 +12,18 @@ #import #import +NS_ASSUME_NONNULL_BEGIN + /** An `IGListReloadDataUpdater` is a concrete type that conforms to `IGListUpdatingDelegate`. - It is an out-of-box upater for `IGListAdapter` objects to use. + It is an out-of-box updater for `IGListAdapter` objects to use. @note This updater performs simple, synchronous updates using `-[UICollectionView reloadData]`. */ IGLK_SUBCLASSING_RESTRICTED +NS_SWIFT_NAME(ListReloadDataUpdater) @interface IGListReloadDataUpdater : NSObject @end + +NS_ASSUME_NONNULL_END diff --git a/Project 27 - Marslink/Pods/IGListKit/Source/IGListReloadDataUpdater.m b/Project 29 - Marslink/Pods/IGListKit/Source/IGListReloadDataUpdater.m similarity index 86% rename from Project 27 - Marslink/Pods/IGListKit/Source/IGListReloadDataUpdater.m rename to Project 29 - Marslink/Pods/IGListKit/Source/IGListReloadDataUpdater.m index 9dac153d..15d2d5ff 100644 --- a/Project 27 - Marslink/Pods/IGListKit/Source/IGListReloadDataUpdater.m +++ b/Project 29 - Marslink/Pods/IGListKit/Source/IGListReloadDataUpdater.m @@ -49,6 +49,14 @@ - (void)deleteItemsFromCollectionView:(UICollectionView *)collectionView indexPa [self synchronousReloadDataWithCollectionView:collectionView]; } +- (void)moveItemInCollectionView:(UICollectionView *)collectionView fromIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath { + [self synchronousReloadDataWithCollectionView:collectionView]; +} + +- (void)reloadItemInCollectionView:(UICollectionView *)collectionView fromIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath { + [self synchronousReloadDataWithCollectionView:collectionView]; +} + - (void)reloadItemsInCollectionView:(UICollectionView *)collectionView indexPaths:(NSArray *)indexPaths { [self synchronousReloadDataWithCollectionView:collectionView]; } diff --git a/Project 27 - Marslink/Pods/IGListKit/Source/IGListScrollDelegate.h b/Project 29 - Marslink/Pods/IGListKit/Source/IGListScrollDelegate.h similarity index 50% rename from Project 27 - Marslink/Pods/IGListKit/Source/IGListScrollDelegate.h rename to Project 29 - Marslink/Pods/IGListKit/Source/IGListScrollDelegate.h index d13576f1..6ce78366 100644 --- a/Project 27 - Marslink/Pods/IGListKit/Source/IGListScrollDelegate.h +++ b/Project 29 - Marslink/Pods/IGListKit/Source/IGListScrollDelegate.h @@ -12,35 +12,51 @@ @class IGListAdapter; @class IGListSectionController; -@protocol IGListSectionType; + + +NS_ASSUME_NONNULL_BEGIN /** - Implement this protocol to receive display events for an section controller when it is on screen. + Implement this protocol to receive display events for a section controller when it is on screen. */ +NS_SWIFT_NAME(ListScrollDelegate) @protocol IGListScrollDelegate /** Tells the delegate that the section controller was scrolled on screen. - @param listAdapter The list adapter whose collection view was scrolled. + @param listAdapter The list adapter whose collection view was scrolled. @param sectionController The visible section controller that was scrolled. */ -- (void)listAdapter:(IGListAdapter *)listAdapter didScrollSectionController:(IGListSectionController *)sectionController; +- (void)listAdapter:(IGListAdapter *)listAdapter didScrollSectionController:(IGListSectionController *)sectionController; /** Tells the delegate that the section controller will be dragged on screen. - @param listAdapter The list adapter whose collection view will drag. + @param listAdapter The list adapter whose collection view will drag. @param sectionController The visible section controller that will drag. */ -- (void)listAdapter:(IGListAdapter *)listAdapter willBeginDraggingSectionController:(IGListSectionController *)sectionController; +- (void)listAdapter:(IGListAdapter *)listAdapter willBeginDraggingSectionController:(IGListSectionController *)sectionController; /** Tells the delegate that the section controller did end dragging on screen. - @param listAdapter The list adapter whose collection view ended dragging. + @param listAdapter The list adapter whose collection view ended dragging. @param sectionController The visible section controller that ended dragging. */ -- (void)listAdapter:(IGListAdapter *)listAdapter didEndDraggingSectionController:(IGListSectionController *)sectionController willDecelerate:(BOOL)decelerate; +- (void)listAdapter:(IGListAdapter *)listAdapter didEndDraggingSectionController:(IGListSectionController *)sectionController willDecelerate:(BOOL)decelerate; + +/** + Tells the delegate that the section controller did end decelerating on screen. + + @param listAdapter The list adapter whose collection view ended decelerating. + @param sectionController The visible section controller that ended decelerating. + + @note This method is `@optional` until the next breaking-change release. + */ +@optional +- (void)listAdapter:(IGListAdapter *)listAdapter didEndDeceleratingSectionController:(IGListSectionController *)sectionController; @end + +NS_ASSUME_NONNULL_END diff --git a/Project 29 - Marslink/Pods/IGListKit/Source/IGListSectionController.h b/Project 29 - Marslink/Pods/IGListKit/Source/IGListSectionController.h new file mode 100644 index 00000000..1846a9b9 --- /dev/null +++ b/Project 29 - Marslink/Pods/IGListKit/Source/IGListSectionController.h @@ -0,0 +1,205 @@ +/** + * Copyright (c) 2016-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import + +#import +#import +#import +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +/** + The base class for section controllers used in a list. This class is intended to be subclassed. + */ +NS_SWIFT_NAME(ListSectionController) +@interface IGListSectionController : NSObject + +/** + Returns the number of items in the section. + + @return A count of items in the list. + + @note The count returned is used to drive the number of cells displayed for this section controller. The default + implementation returns 1. **Calling super is not required.** + */ +- (NSInteger)numberOfItems; + +/** + The specific size for the item at the specified index. + + @param index The row index of the item. + + @return The size for the item at index. + + @note The returned size is not guaranteed to be used. The implementation may query sections for their + layout information at will, or use its own layout metrics. For example, consider a dynamic-text sized list versus a + fixed height-and-width grid. The former will ask each section for a size, and the latter will likely not. The default + implementation returns size zero. **Calling super is not required.** + */ +- (CGSize)sizeForItemAtIndex:(NSInteger)index; + +/** + Return a dequeued cell for a given index. + + @param index The index of the requested row. + + @return A configured `UICollectionViewCell` subclass. + + @note This is your opportunity to do any cell setup and configuration. The infrastructure requests a cell when it + will be used on screen. You should never allocate new cells in this method, instead use the provided adapter to call + one of the dequeue methods on the IGListCollectionContext. The default implementation will assert. **You must override + this method without calling super.** + */ +- (__kindof UICollectionViewCell *)cellForItemAtIndex:(NSInteger)index; + +/** + Updates the section controller to a new object. + + @param object The object mapped to this section controller. + + @note When this method is called, all available contexts and configurations have been set for the section + controller. This method will only be called when the object instance has changed, including from `nil` or a previous + object. **Calling super is not required.** + */ +- (void)didUpdateToObject:(id)object; + +/** + Tells the section controller that the cell at the specified index path was selected. + + @param index The index of the selected cell. + + @note The default implementation does nothing. **Calling super is not required.** + */ +- (void)didSelectItemAtIndex:(NSInteger)index; + +/** + Tells the section controller that the cell at the specified index path was deselected. + + @param index The index of the deselected cell. + + @note The default implementation does nothing. **Calling super is not required.** + */ +- (void)didDeselectItemAtIndex:(NSInteger)index; + +/** + Tells the section controller that the cell at the specified index path was highlighted. + + @param index The index of the highlighted cell. + + @note The default implementation does nothing. **Calling super is not required.** + */ +- (void)didHighlightItemAtIndex:(NSInteger)index; + +/** + Tells the section controller that the cell at the specified index path was unhighlighted. + + @param index The index of the unhighlighted cell. + + @note The default implementation does nothing. **Calling super is not required.** + */ +- (void)didUnhighlightItemAtIndex:(NSInteger)index; + +/** + The view controller housing the adapter that created this section controller. + + @note Use this view controller to push, pop, present, or do other custom transitions. + + @warning It is considered very bad practice to cast this to a known view controller + and call methods on it other than for navigations and transitions. + */ +@property (nonatomic, weak, nullable, readonly) UIViewController *viewController; + +/** + A context object for interacting with the collection. + + Use this property for accessing the collection size, dequeuing cells, reloading, inserting, deleting, etc. + */ +@property (nonatomic, weak, nullable, readonly) id collectionContext; + +/** + Returns the section within the list for this section controller. + + @note This value also relates to the section within a `UICollectionView` that this section controller's cells belong. + It also relates to the `-[NSIndexPath section]` value for individual cells within the collection view. + */ +@property (nonatomic, assign, readonly) NSInteger section; + +/** + Returns `YES` if the section controller is the first section in the list, `NO` otherwise. + */ +@property (nonatomic, assign, readonly) BOOL isFirstSection; + +/** + Returns `YES` if the section controller is the last section in the list, `NO` otherwise. + */ +@property (nonatomic, assign, readonly) BOOL isLastSection; + +/** + The margins used to lay out content in the section controller. + + @see `-[UICollectionViewFlowLayout sectionInset]`. + */ +@property (nonatomic, assign) UIEdgeInsets inset; + +/** + The minimum spacing to use between rows of items. + + @see `-[UICollectionViewFlowLayout minimumLineSpacing]`. + */ +@property (nonatomic, assign) CGFloat minimumLineSpacing; + +/** + The minimum spacing to use between items in the same row. + + @see `-[UICollectionViewFlowLayout minimumInteritemSpacing]`. + */ +@property (nonatomic, assign) CGFloat minimumInteritemSpacing; + +/** + The supplementary view source for the section controller. Can be `nil`. + + @return An object that conforms to `IGListSupplementaryViewSource` or `nil`. + + @note You may wish to return `self` if your section controller implements this protocol. + */ +@property (nonatomic, weak, nullable) id supplementaryViewSource; + +/** + An object that handles display events for the section controller. Can be `nil`. + + @return An object that conforms to `IGListDisplayDelegate` or `nil`. + + @note You may wish to return `self` if your section controller implements this protocol. + */ +@property (nonatomic, weak, nullable) id displayDelegate; + +/** + An object that handles working range events for the section controller. Can be `nil`. + + @return An object that conforms to `IGListWorkingRangeDelegate` or `nil`. + + @note You may wish to return `self` if your section controller implements this protocol. + */ +@property (nonatomic, weak, nullable) id workingRangeDelegate; + +/** + An object that handles scroll events for the section controller. Can be `nil`. + + @return An object that conforms to `IGListScrollDelegate` or `nil`. + + @note You may wish to return `self` if your section controller implements this protocol. + */ +@property (nonatomic, weak, nullable) id scrollDelegate; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Project 27 - Marslink/Pods/IGListKit/Source/IGListSectionController.m b/Project 29 - Marslink/Pods/IGListKit/Source/IGListSectionController.m similarity index 81% rename from Project 27 - Marslink/Pods/IGListKit/Source/IGListSectionController.m rename to Project 29 - Marslink/Pods/IGListKit/Source/IGListSectionController.m index 5e36b689..242a73ae 100644 --- a/Project 27 - Marslink/Pods/IGListKit/Source/IGListSectionController.m +++ b/Project 29 - Marslink/Pods/IGListKit/Source/IGListSectionController.m @@ -62,8 +62,32 @@ - (instancetype)init { _minimumInteritemSpacing = 0.0; _minimumLineSpacing = 0.0; _inset = UIEdgeInsetsZero; + _section = NSNotFound; } return self; } +- (NSInteger)numberOfItems { + return 1; +} + +- (CGSize)sizeForItemAtIndex:(NSInteger)index { + return CGSizeZero; +} + +- (__kindof UICollectionViewCell *)cellForItemAtIndex:(NSInteger)index { + IGFailAssert(@"Section controller %@ must override %s:", self, __PRETTY_FUNCTION__); + return nil; +} + +- (void)didUpdateToObject:(id)object {} + +- (void)didSelectItemAtIndex:(NSInteger)index {} + +- (void)didDeselectItemAtIndex:(NSInteger)index {} + +- (void)didHighlightItemAtIndex:(NSInteger)index {} + +- (void)didUnhighlightItemAtIndex:(NSInteger)index {} + @end diff --git a/Project 27 - Marslink/Pods/IGListKit/Source/IGListSingleSectionController.h b/Project 29 - Marslink/Pods/IGListKit/Source/IGListSingleSectionController.h similarity index 78% rename from Project 27 - Marslink/Pods/IGListKit/Source/IGListSingleSectionController.h rename to Project 29 - Marslink/Pods/IGListKit/Source/IGListSingleSectionController.h index a0ae50d7..aecc28d6 100644 --- a/Project 27 - Marslink/Pods/IGListKit/Source/IGListSingleSectionController.h +++ b/Project 29 - Marslink/Pods/IGListKit/Source/IGListSingleSectionController.h @@ -10,7 +10,7 @@ #import #import -#import + #import NS_ASSUME_NONNULL_BEGIN @@ -22,16 +22,18 @@ NS_ASSUME_NONNULL_BEGIN @param item The model with which to configure the cell. @param cell The cell to configure. */ +NS_SWIFT_NAME(ListSingleSectionCellConfigureBlock) typedef void (^IGListSingleSectionCellConfigureBlock)(id item, __kindof UICollectionViewCell *cell); /** A block that returns the size for the cell given the collection context. - @param item The model for the section. + @param item The model for the section. @param collectionContext The collection context for the section. - @return The for the cell. + @return The size for the cell. */ +NS_SWIFT_NAME(ListSingleSectionCellSizeBlock) typedef CGSize (^IGListSingleSectionCellSizeBlock)(id item, id _Nullable collectionContext); @class IGListSingleSectionController; @@ -39,30 +41,35 @@ typedef CGSize (^IGListSingleSectionCellSizeBlock)(id item, id /** Tells the delegate that the section controller was selected. @param sectionController The section controller that was selected. + @param object The model for the given section. */ -- (void)didSelectSingleSectionController:(IGListSingleSectionController *)sectionController; +- (void)didSelectSectionController:(IGListSingleSectionController *)sectionController + withObject:(id)object; @end /** This section controller is meant to make building simple, single-cell lists easier. By providing the type of cell, a block - to configure the cell, and a block to return the size of a cell, you can use an IGListAdapter-powered list simpler architecture. + to configure the cell, and a block to return the size of a cell, you can use an `IGListAdapter`-powered list with a + simpler architecture. */ IGLK_SUBCLASSING_RESTRICTED -@interface IGListSingleSectionController : IGListSectionController +NS_SWIFT_NAME(ListSingleSectionController) +@interface IGListSingleSectionController : IGListSectionController /** Creates a new section controller for a given cell type that will always have only one cell when present in a list. - @param cellClass The `UICollectionViewCell` subclass for the single cell. + @param cellClass The `UICollectionViewCell` subclass for the single cell. @param configureBlock A block that configures the cell with the item given to the section controller. - @param sizeBlock A block that returns the size for the cell given the collection context. + @param sizeBlock A block that returns the size for the cell given the collection context. @return A new section controller. @@ -76,10 +83,10 @@ IGLK_SUBCLASSING_RESTRICTED /** Creates a new section controller for a given nib name and bundle that will always have only one cell when present in a list. - @param nibName The name of the nib file for the single cell. - @param bundle The bundle in which to search for the nib file. If nil, this method looks for the file in the main bundle. + @param nibName The name of the nib file for the single cell. + @param bundle The bundle in which to search for the nib file. If `nil`, this method looks for the file in the main bundle. @param configureBlock A block that configures the cell with the item given to the section controller. - @param sizeBlock A block that returns the size for the cell given the collection context. + @param sizeBlock A block that returns the size for the cell given the collection context. @return A new section controller. @@ -94,9 +101,9 @@ IGLK_SUBCLASSING_RESTRICTED /** Creates a new section controller for a given storyboard cell identifier that will always have only one cell when present in a list. - @param identifier The identifier of the cell prototype in storyboard. + @param identifier The identifier of the cell prototype in storyboard. @param configureBlock A block that configures the cell with the item given to the section controller. - @param sizeBlock A block that returns the size for the cell given the collection context. + @param sizeBlock A block that returns the size for the cell given the collection context. @return A new section controller. diff --git a/Project 27 - Marslink/Pods/IGListKit/Source/IGListSingleSectionController.m b/Project 29 - Marslink/Pods/IGListKit/Source/IGListSingleSectionController.m similarity index 96% rename from Project 27 - Marslink/Pods/IGListKit/Source/IGListSingleSectionController.m rename to Project 29 - Marslink/Pods/IGListKit/Source/IGListSingleSectionController.m index 6bb35b5f..311b20d8 100644 --- a/Project 27 - Marslink/Pods/IGListKit/Source/IGListSingleSectionController.m +++ b/Project 29 - Marslink/Pods/IGListKit/Source/IGListSingleSectionController.m @@ -71,7 +71,7 @@ - (instancetype)initWithStoryboardCellIdentifier:(NSString *)identifier } -#pragma mark - IGListSectionType +#pragma mark - IGListSectionController Overrides - (NSInteger)numberOfItems { return 1; @@ -106,7 +106,7 @@ - (void)didUpdateToObject:(id)object { } - (void)didSelectItemAtIndex:(NSInteger)index { - [self.selectionDelegate didSelectSingleSectionController:self]; + [self.selectionDelegate didSelectSectionController:self withObject:self.item]; } @end diff --git a/Project 27 - Marslink/Pods/IGListKit/Source/IGListStackedSectionController.h b/Project 29 - Marslink/Pods/IGListKit/Source/IGListStackedSectionController.h similarity index 70% rename from Project 27 - Marslink/Pods/IGListKit/Source/IGListStackedSectionController.h rename to Project 29 - Marslink/Pods/IGListKit/Source/IGListStackedSectionController.h index 07b21c26..1afc4bd0 100644 --- a/Project 27 - Marslink/Pods/IGListKit/Source/IGListStackedSectionController.h +++ b/Project 29 - Marslink/Pods/IGListKit/Source/IGListStackedSectionController.h @@ -8,21 +8,24 @@ */ #import -#import + #import +NS_ASSUME_NONNULL_BEGIN + /** - An instace of `IGListStackedSectionController` is a clustered section controller, - composed of many child section controllers. It constructs and routes item-level - indexes to the appropriate child section controller with a local index. This lets you build section controllers made up - of individual units that can be shared and reused with other section controllers. + An instance of `IGListStackedSectionController` is a clustered section controller, composed of many child section + controllers. It constructs and routes item-level indexes to the appropriate child section controller with a local + index. This lets you build section controllers made up of individual units that can be shared and reused with other + section controllers. For example, you can create a "Comments" section controller that displays lists of text that is used alongside photo, video, or slideshow section controllers. You then have four small and manageable section controllers instead of one huge class. */ IGLK_SUBCLASSING_RESTRICTED -@interface IGListStackedSectionController : IGListSectionController +NS_SWIFT_NAME(ListStackedSectionController) +@interface IGListStackedSectionController : IGListSectionController /** Creates a new stacked section controller. @@ -33,7 +36,7 @@ IGLK_SUBCLASSING_RESTRICTED @warning The first section controller that is the supplementary source decides which supplementary views get displayed. */ -- (instancetype)initWithSectionControllers:(NSArray *> *)sectionControllers NS_DESIGNATED_INITIALIZER; +- (instancetype)initWithSectionControllers:(NSArray *)sectionControllers NS_DESIGNATED_INITIALIZER; /** :nodoc: @@ -46,3 +49,5 @@ IGLK_SUBCLASSING_RESTRICTED + (instancetype)new NS_UNAVAILABLE; @end + +NS_ASSUME_NONNULL_END diff --git a/Project 27 - Marslink/Pods/IGListKit/Source/IGListStackedSectionController.m b/Project 29 - Marslink/Pods/IGListKit/Source/IGListStackedSectionController.m similarity index 55% rename from Project 27 - Marslink/Pods/IGListKit/Source/IGListStackedSectionController.m rename to Project 29 - Marslink/Pods/IGListKit/Source/IGListStackedSectionController.m index 93d39fdc..0ac91c4e 100644 --- a/Project 27 - Marslink/Pods/IGListKit/Source/IGListStackedSectionController.m +++ b/Project 29 - Marslink/Pods/IGListKit/Source/IGListStackedSectionController.m @@ -33,7 +33,7 @@ - (id)ig_stackedSectionController { static void * kStackedSectionControllerIndexKey = &kStackedSectionControllerIndexKey; - (void)ig_setStackedSectionControllerIndex:(NSInteger)stackedSectionControllerIndex { - objc_setAssociatedObject(self, kStackedSectionControllerIndexKey, @(stackedSectionControllerIndex), OBJC_ASSOCIATION_ASSIGN); + objc_setAssociatedObject(self, kStackedSectionControllerIndexKey, @(stackedSectionControllerIndex), OBJC_ASSOCIATION_COPY_NONATOMIC); } - (NSInteger)ig_stackedSectionControllerIndex { @@ -44,24 +44,19 @@ - (NSInteger)ig_stackedSectionControllerIndex { @implementation IGListStackedSectionController -- (instancetype)initWithSectionControllers:(NSArray *> *)sectionControllers { +- (instancetype)initWithSectionControllers:(NSArray *)sectionControllers { if (self = [super init]) { - for (IGListSectionController *sectionController in sectionControllers) { + for (IGListSectionController *sectionController in sectionControllers) { sectionController.collectionContext = self; sectionController.viewController = self.viewController; - - if (self.supplementaryViewSource == nil) { - self.supplementaryViewSource = sectionController.supplementaryViewSource; - } } - _visibleSectionControllers = [[NSCountedSet alloc] init]; + _visibleSectionControllers = [NSCountedSet new]; _sectionControllers = [NSOrderedSet orderedSetWithArray:sectionControllers]; self.displayDelegate = self; self.scrollDelegate = self; - - [self reloadData]; + self.workingRangeDelegate = self; } return self; } @@ -70,15 +65,15 @@ - (instancetype)initWithSectionControllers:(NSArray *sectionController in self.sectionControllers) { + NSInteger numberOfItems = 0; + for (IGListSectionController *sectionController in self.sectionControllers) { [offsets addObject:@(numberOfItems)]; - const NSUInteger items = [sectionController numberOfItems]; - for (NSUInteger i = 0; i < items; i++) { + const NSInteger items = [sectionController numberOfItems]; + for (NSInteger i = 0; i < items; i++) { [sectionControllers addObject:sectionController]; } @@ -93,106 +88,165 @@ - (void)reloadData { IGAssert(self.sectionControllersForItems.count == self.flattenedNumberOfItems, @"Controller map does not equal total number of items"); } -- (IGListSectionController *)sectionControllerForObjectIndex:(NSInteger)itemIndex { +- (IGListSectionController *)sectionControllerForObjectIndex:(NSInteger)itemIndex { return self.sectionControllersForItems[itemIndex]; } -- (NSInteger)offsetForSectionController:(IGListSectionController *)sectionController { - const NSUInteger index = [self.sectionControllers indexOfObject:sectionController]; +- (NSInteger)offsetForSectionController:(IGListSectionController *)sectionController { + const NSInteger index = [self.sectionControllers indexOfObject:sectionController]; IGAssert(index != NSNotFound, @"Querying offset for an undocumented section controller"); return [self.sectionControllerOffsets[index] integerValue]; } -- (NSInteger)localIndexForSectionController:(IGListSectionController *)sectionController index:(NSInteger)index { - const NSUInteger offset = [self offsetForSectionController:sectionController]; +- (NSInteger)localIndexForSectionController:(IGListSectionController *)sectionController index:(NSInteger)index { + const NSInteger offset = [self offsetForSectionController:sectionController]; IGAssert(offset <= index, @"Section controller offset must be less than or equal to the item index"); return index - offset; } -- (NSInteger)relativeIndexForSectionController:(IGListSectionController *)sectionController fromLocalIndex:(NSInteger)index { - const NSUInteger offset = [self offsetForSectionController:sectionController]; +- (NSInteger)relativeIndexForSectionController:(IGListSectionController *)sectionController fromLocalIndex:(NSInteger)index { + const NSInteger offset = [self offsetForSectionController:sectionController]; return index + offset; } -- (NSIndexSet *)itemIndexesForSectionController:(IGListSectionController *)sectionController indexes:(NSIndexSet *)indexes { - const NSUInteger offset = [self offsetForSectionController:sectionController]; - NSMutableIndexSet *itemIndexes = [[NSMutableIndexSet alloc] init]; +- (NSIndexSet *)itemIndexesForSectionController:(IGListSectionController *)sectionController indexes:(NSIndexSet *)indexes { + const NSInteger offset = [self offsetForSectionController:sectionController]; + NSMutableIndexSet *itemIndexes = [NSMutableIndexSet new]; [indexes enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL *stop) { [itemIndexes addIndex:(idx + offset)]; }]; return itemIndexes; } +- (id)supplementaryViewSource { + for (IGListSectionController *sectionController in self.sectionControllers) { + id supplementaryViewSource = sectionController.supplementaryViewSource; + if (supplementaryViewSource != nil) { + return supplementaryViewSource; + } + } + return nil; +} -#pragma mark - IGListSectionType +#pragma mark - IGListSectionController Overrides - (NSInteger)numberOfItems { return self.flattenedNumberOfItems; } - (CGSize)sizeForItemAtIndex:(NSInteger)index { - IGListSectionController *sectionController = [self sectionControllerForObjectIndex:index]; - const NSUInteger localIndex = [self localIndexForSectionController:sectionController index:index]; + IGListSectionController *sectionController = [self sectionControllerForObjectIndex:index]; + const NSInteger localIndex = [self localIndexForSectionController:sectionController index:index]; return [sectionController sizeForItemAtIndex:localIndex]; } - (UICollectionViewCell *)cellForItemAtIndex:(NSInteger)index { - IGListSectionController *sectionController = [self sectionControllerForObjectIndex:index]; - const NSUInteger localIndex = [self localIndexForSectionController:sectionController index:index]; + IGListSectionController *sectionController = [self sectionControllerForObjectIndex:index]; + const NSInteger localIndex = [self localIndexForSectionController:sectionController index:index]; return [sectionController cellForItemAtIndex:localIndex]; } - (void)didUpdateToObject:(id)object { - for (IGListSectionController *sectionController in self.sectionControllers) { + for (IGListSectionController *sectionController in self.sectionControllers) { + sectionController.section = self.section; [sectionController didUpdateToObject:object]; } + [self reloadData]; } - (void)didSelectItemAtIndex:(NSInteger)index { - IGListSectionController *sectionController = [self sectionControllerForObjectIndex:index]; - const NSUInteger localIndex = [self localIndexForSectionController:sectionController index:index]; + IGListSectionController *sectionController = [self sectionControllerForObjectIndex:index]; + const NSInteger localIndex = [self localIndexForSectionController:sectionController index:index]; [sectionController didSelectItemAtIndex:localIndex]; } +- (void)didDeselectItemAtIndex:(NSInteger)index { + IGListSectionController *sectionController = [self sectionControllerForObjectIndex:index]; + const NSInteger localIndex = [self localIndexForSectionController:sectionController index:index]; + [sectionController didDeselectItemAtIndex:localIndex]; +} + +- (void)didHighlightItemAtIndex:(NSInteger)index { + IGListSectionController *sectionController = [self sectionControllerForObjectIndex:index]; + const NSInteger localIndex = [self localIndexForSectionController:sectionController index:index]; + [sectionController didHighlightItemAtIndex:localIndex]; +} + +- (void)didUnhighlightItemAtIndex:(NSInteger)index { + IGListSectionController *sectionController = [self sectionControllerForObjectIndex:index]; + const NSInteger localIndex = [self localIndexForSectionController:sectionController index:index]; + [sectionController didUnhighlightItemAtIndex:localIndex]; +} + #pragma mark - IGListCollectionContext - (CGSize)containerSize { return [self.collectionContext containerSize]; } -- (NSInteger)indexForCell:(UICollectionViewCell *)cell sectionController:(IGListSectionController *)sectionController { - const NSUInteger index = [self.collectionContext indexForCell:cell sectionController:self]; +- (UIEdgeInsets)containerInset { + return [self.collectionContext containerInset]; +} + +- (CGSize)insetContainerSize { + return [self.collectionContext insetContainerSize]; +} + +- (CGSize)containerSizeForSectionController:(IGListSectionController *)sectionController { + const UIEdgeInsets inset = sectionController.inset; + return CGSizeMake(self.containerSize.width - inset.left - inset.right, + self.containerSize.height - inset.top - inset.bottom); +} + +- (NSInteger)indexForCell:(UICollectionViewCell *)cell sectionController:(IGListSectionController *)sectionController { + const NSInteger index = [self.collectionContext indexForCell:cell sectionController:self]; return [self localIndexForSectionController:sectionController index:index]; } -- (UICollectionViewCell *)cellForItemAtIndex:(NSInteger)index sectionController:(IGListSectionController *)sectionController { +- (UICollectionViewCell *)cellForItemAtIndex:(NSInteger)index sectionController:(IGListSectionController *)sectionController { return [self.collectionContext cellForItemAtIndex: [self relativeIndexForSectionController:sectionController fromLocalIndex:index] sectionController:self]; } -- (NSArray *)visibleCellsForSectionController:(IGListSectionController *)sectionController { +- (NSArray *)visibleCellsForSectionController:(IGListSectionController *)sectionController { NSMutableArray *cells = [NSMutableArray new]; id collectionContext = self.collectionContext; NSArray *visibleCells = [collectionContext visibleCellsForSectionController:self]; for (UICollectionViewCell *cell in visibleCells) { - const NSUInteger index = [collectionContext indexForCell:cell sectionController:self]; + const NSInteger index = [collectionContext indexForCell:cell sectionController:self]; if (self.sectionControllersForItems[index] == sectionController) { [cells addObject:cell]; } } - return [cells copy]; + return cells; } -- (void)deselectItemAtIndex:(NSInteger)index sectionController:(IGListSectionController *)sectionController animated:(BOOL)animated { - const NSUInteger localIndex = [self localIndexForSectionController:sectionController index:index]; - [self.collectionContext deselectItemAtIndex:localIndex sectionController:self animated:animated]; +- (NSArray *)visibleIndexPathsForSectionController:(IGListSectionController *)sectionController { + NSMutableArray *paths = [NSMutableArray new]; + id collectionContext = self.collectionContext; + NSArray *visiblePaths = [collectionContext visibleIndexPathsForSectionController:self]; + for (NSIndexPath *path in visiblePaths) { + if (self.sectionControllersForItems[path.item] == sectionController) { + [paths addObject:path]; + } + } + return paths; } -- (NSInteger)sectionForSectionController:(IGListSectionController *)sectionController { - return [self.collectionContext sectionForSectionController:self]; +- (void)deselectItemAtIndex:(NSInteger)index sectionController:(IGListSectionController *)sectionController animated:(BOOL)animated { + const NSInteger offsetIndex = [self relativeIndexForSectionController:sectionController fromLocalIndex:index]; + [self.collectionContext deselectItemAtIndex:offsetIndex sectionController:self animated:animated]; +} + +- (void)selectItemAtIndex:(NSInteger)index + sectionController:(IGListSectionController *)sectionController + animated:(BOOL)animated + scrollPosition:(UICollectionViewScrollPosition)scrollPosition { + const NSInteger offsetIndex = [self relativeIndexForSectionController:sectionController fromLocalIndex:index]; + [self.collectionContext selectItemAtIndex:offsetIndex sectionController:self animated:animated scrollPosition:scrollPosition]; } - (UICollectionViewCell *)dequeueReusableCellOfClass:(Class)cellClass - forSectionController:(IGListSectionController *)sectionController + forSectionController:(IGListSectionController *)sectionController atIndex:(NSInteger)index { const NSInteger offsetIndex = [self relativeIndexForSectionController:sectionController fromLocalIndex:index]; return (UICollectionViewCell *_Nonnull)[self.collectionContext dequeueReusableCellOfClass:cellClass @@ -202,7 +256,7 @@ - (UICollectionViewCell *)dequeueReusableCellOfClass:(Class)cellClass - (UICollectionViewCell *)dequeueReusableCellWithNibName:(NSString *)nibName bundle:(NSBundle *)bundle - forSectionController:(IGListSectionController *)sectionController + forSectionController:(IGListSectionController *)sectionController atIndex:(NSInteger)index { const NSInteger offsetIndex = [self relativeIndexForSectionController:sectionController fromLocalIndex:index]; return (UICollectionViewCell *_Nonnull)[self.collectionContext dequeueReusableCellWithNibName:nibName @@ -212,7 +266,7 @@ - (UICollectionViewCell *)dequeueReusableCellWithNibName:(NSString *)nibName } - (UICollectionViewCell *)dequeueReusableCellFromStoryboardWithIdentifier:(NSString *)identifier - forSectionController:(IGListSectionController *)sectionController + forSectionController:(IGListSectionController *)sectionController atIndex:(NSInteger)index { const NSInteger offsetIndex = [self relativeIndexForSectionController:sectionController fromLocalIndex:index]; return (UICollectionViewCell *_Nonnull)[self.collectionContext dequeueReusableCellFromStoryboardWithIdentifier:identifier @@ -221,7 +275,7 @@ - (UICollectionViewCell *)dequeueReusableCellFromStoryboardWithIdentifier:(NSStr } - (UICollectionReusableView *)dequeueReusableSupplementaryViewOfKind:(NSString *)elementKind - forSectionController:(IGListSectionController *)sectionController + forSectionController:(IGListSectionController *)sectionController class:(Class)viewClass atIndex:(NSInteger)index { const NSInteger offsetIndex = [self relativeIndexForSectionController:sectionController fromLocalIndex:index]; @@ -233,7 +287,7 @@ - (UICollectionReusableView *)dequeueReusableSupplementaryViewOfKind:(NSString * - (UICollectionReusableView *)dequeueReusableSupplementaryViewFromStoryboardOfKind:(NSString *)elementKind withIdentifier:(NSString *)identifier - forSectionController:(IGListSectionController *)sectionController + forSectionController:(IGListSectionController *)sectionController atIndex:(NSInteger)index { const NSInteger offsetIndex = [self relativeIndexForSectionController:sectionController fromLocalIndex:index]; return (UICollectionViewCell *_Nonnull)[self.collectionContext dequeueReusableSupplementaryViewFromStoryboardOfKind:elementKind @@ -243,7 +297,7 @@ - (UICollectionReusableView *)dequeueReusableSupplementaryViewFromStoryboardOfKi } - (UICollectionReusableView *)dequeueReusableSupplementaryViewOfKind:(NSString *)elementKind - forSectionController:(IGListSectionController *)sectionController + forSectionController:(IGListSectionController *)sectionController nibName:(NSString *)nibName bundle:(NSBundle *)bundle atIndex:(NSInteger)index { @@ -255,56 +309,73 @@ - (UICollectionReusableView *)dequeueReusableSupplementaryViewOfKind:(NSString * atIndex:offsetIndex]; } -- (void)reloadInSectionController:(IGListSectionController *)sectionController atIndexes:(NSIndexSet *)indexes { - NSIndexSet *itemIndexes = [self itemIndexesForSectionController:sectionController indexes:indexes]; - [self.collectionContext reloadInSectionController:self atIndexes:itemIndexes]; -} - -- (void)insertInSectionController:(IGListSectionController *)sectionController atIndexes:(NSIndexSet *)indexes { - [self reloadData]; - NSIndexSet *itemIndexes = [self itemIndexesForSectionController:sectionController indexes:indexes]; - [self.collectionContext insertInSectionController:self atIndexes:itemIndexes]; -} - -- (void)deleteInSectionController:(IGListSectionController *)sectionController atIndexes:(NSIndexSet *)indexes { - [self reloadData]; - NSIndexSet *itemIndexes = [self itemIndexesForSectionController:sectionController indexes:indexes]; - [self.collectionContext deleteInSectionController:self atIndexes:itemIndexes]; -} - -- (void)reloadSectionController:(IGListSectionController *)sectionController { - [self reloadData]; - [self.collectionContext reloadSectionController:self]; -} - -- (void)performBatchAnimated:(BOOL)animated updates:(void (^)())updates completion:(void (^)(BOOL))completion { - [self.collectionContext performBatchAnimated:animated updates:^{ - updates(); +- (void)performBatchAnimated:(BOOL)animated updates:(void (^)(id))updates completion:(void (^)(BOOL))completion { + __weak __typeof__(self) weakSelf = self; + [self.collectionContext performBatchAnimated:animated updates:^ (id batchContext) { + weakSelf.forwardingBatchContext = batchContext; + updates(weakSelf); + weakSelf.forwardingBatchContext = nil; } completion:^(BOOL finished) { - [self reloadData]; + [weakSelf reloadData]; if (completion) { completion(finished); } }]; } -- (void)scrollToSectionController:(IGListSectionController *)sectionController +- (void)scrollToSectionController:(IGListSectionController *)sectionController atIndex:(NSInteger)index scrollPosition:(UICollectionViewScrollPosition)scrollPosition animated:(BOOL)animated { - const NSUInteger offsetIndex = [self relativeIndexForSectionController:sectionController fromLocalIndex:index]; + const NSInteger offsetIndex = [self relativeIndexForSectionController:sectionController fromLocalIndex:index]; [self.collectionContext scrollToSectionController:self atIndex:offsetIndex scrollPosition:scrollPosition animated:animated]; } +- (void)invalidateLayoutForSectionController:(IGListSectionController *)sectionController completion:(void (^)(BOOL))completion { + [self.collectionContext invalidateLayoutForSectionController:self completion:completion]; +} + +#pragma mark - IGListBatchContext + +- (void)reloadInSectionController:(IGListSectionController *)sectionController atIndexes:(NSIndexSet *)indexes { + NSIndexSet *itemIndexes = [self itemIndexesForSectionController:sectionController indexes:indexes]; + [self.forwardingBatchContext reloadInSectionController:self atIndexes:itemIndexes]; +} + +- (void)insertInSectionController:(IGListSectionController *)sectionController atIndexes:(NSIndexSet *)indexes { + [self reloadData]; + NSIndexSet *itemIndexes = [self itemIndexesForSectionController:sectionController indexes:indexes]; + [self.forwardingBatchContext insertInSectionController:self atIndexes:itemIndexes]; +} + +- (void)deleteInSectionController:(IGListSectionController *)sectionController atIndexes:(NSIndexSet *)indexes { + [self reloadData]; + NSIndexSet *itemIndexes = [self itemIndexesForSectionController:sectionController indexes:indexes]; + [self.forwardingBatchContext deleteInSectionController:self atIndexes:itemIndexes]; +} + +- (void)moveInSectionController:(IGListSectionController *)sectionController fromIndex:(NSInteger)fromIndex toIndex:(NSInteger)toIndex { + [self reloadData]; + const NSInteger fromRelativeIndex = [self relativeIndexForSectionController:sectionController fromLocalIndex:fromIndex]; + const NSInteger toRelativeIndex = [self relativeIndexForSectionController:sectionController fromLocalIndex:toIndex]; + [self.forwardingBatchContext moveInSectionController:self fromIndex:fromRelativeIndex toIndex:toRelativeIndex]; +} + +- (void)reloadSectionController:(IGListSectionController *)sectionController { + [self reloadData]; + [self.forwardingBatchContext reloadSectionController:self]; +} + #pragma mark - IGListDisplayDelegate -- (void)listAdapter:(IGListAdapter *)listAdapter willDisplaySectionController:(IGListSectionController *)sectionController cell:(UICollectionViewCell *)cell atIndex:(NSInteger)index { - IGListSectionController *childSectionController = [self sectionControllerForObjectIndex:index]; - const NSUInteger localIndex = [self localIndexForSectionController:childSectionController index:index]; +- (void)listAdapter:(IGListAdapter *)listAdapter willDisplaySectionController:(IGListSectionController *)sectionController cell:(UICollectionViewCell *)cell atIndex:(NSInteger)index { + IGListSectionController *childSectionController = [self sectionControllerForObjectIndex:index]; + const NSInteger localIndex = [self localIndexForSectionController:childSectionController index:index]; + // update the assoc objects for use in didEndDisplay [cell ig_setStackedSectionController:childSectionController]; [cell ig_setStackedSectionControllerIndex:localIndex]; @@ -319,9 +390,10 @@ - (void)listAdapter:(IGListAdapter *)listAdapter willDisplaySectionController:(I [visibleSectionControllers addObject:childSectionController]; } -- (void)listAdapter:(IGListAdapter *)listAdapter didEndDisplayingSectionController:(IGListSectionController *)sectionController cell:(UICollectionViewCell *)cell atIndex:(NSInteger)index { - IGListSectionController *childSectionController = [self sectionControllerForObjectIndex:index]; - const NSUInteger localIndex = [self localIndexForSectionController:childSectionController index:index]; +- (void)listAdapter:(IGListAdapter *)listAdapter didEndDisplayingSectionController:(IGListSectionController *)sectionController cell:(UICollectionViewCell *)cell atIndex:(NSInteger)index { + const NSInteger localIndex = [cell ig_stackedSectionControllerIndex]; + IGListSectionController *childSectionController = [cell ig_stackedSectionController]; + NSCountedSet *visibleSectionControllers = self.visibleSectionControllers; id displayDelegate = [childSectionController displayDelegate]; @@ -333,27 +405,50 @@ - (void)listAdapter:(IGListAdapter *)listAdapter didEndDisplayingSectionControll } } -- (void)listAdapter:(IGListAdapter *)listAdapter willDisplaySectionController:(IGListSectionController *)sectionController {} -- (void)listAdapter:(IGListAdapter *)listAdapter didEndDisplayingSectionController:(IGListSectionController *)sectionController {} +- (void)listAdapter:(IGListAdapter *)listAdapter willDisplaySectionController:(IGListSectionController *)sectionController {} +- (void)listAdapter:(IGListAdapter *)listAdapter didEndDisplayingSectionController:(IGListSectionController *)sectionController {} #pragma mark - IGListScrollDelegate -- (void)listAdapter:(IGListAdapter *)listAdapter didScrollSectionController:(IGListSectionController *)sectionController { - for (IGListSectionController *childSectionController in self.sectionControllers) { +- (void)listAdapter:(IGListAdapter *)listAdapter didScrollSectionController:(IGListSectionController *)sectionController { + for (IGListSectionController *childSectionController in self.sectionControllers) { [[childSectionController scrollDelegate] listAdapter:listAdapter didScrollSectionController:childSectionController]; } } -- (void)listAdapter:(IGListAdapter *)listAdapter willBeginDraggingSectionController:(IGListSectionController *)sectionController { - for (IGListSectionController *childSectionController in self.sectionControllers) { - [[childSectionController scrollDelegate] listAdapter:listAdapter willBeginDraggingSectionController:sectionController]; +- (void)listAdapter:(IGListAdapter *)listAdapter willBeginDraggingSectionController:(IGListSectionController *)sectionController { + for (IGListSectionController *childSectionController in self.sectionControllers) { + [[childSectionController scrollDelegate] listAdapter:listAdapter willBeginDraggingSectionController:childSectionController]; } } -- (void)listAdapter:(IGListAdapter *)listAdapter didEndDraggingSectionController:(IGListSectionController *)sectionController willDecelerate:(BOOL)decelerate { - for (IGListSectionController *childSectionController in self.sectionControllers) { +- (void)listAdapter:(IGListAdapter *)listAdapter didEndDraggingSectionController:(IGListSectionController *)sectionController willDecelerate:(BOOL)decelerate { + for (IGListSectionController *childSectionController in self.sectionControllers) { [[childSectionController scrollDelegate] listAdapter:listAdapter didEndDraggingSectionController:childSectionController willDecelerate:decelerate]; } } +- (void)listAdapter:(IGListAdapter *)listAdapter didEndDeceleratingSectionController:(IGListSectionController *)sectionController { + for (IGListSectionController *childSectionController in self.sectionControllers) { + id scrollDelegate = [childSectionController scrollDelegate]; + if ([scrollDelegate respondsToSelector:@selector(listAdapter:didEndDeceleratingSectionController:)]) { + [scrollDelegate listAdapter:listAdapter didEndDeceleratingSectionController:childSectionController]; + } + } +} + +#pragma mark - IGListWorkingRangeDelegate + +- (void)listAdapter:(IGListAdapter *)listAdapter sectionControllerWillEnterWorkingRange:(IGListSectionController *)sectionController { + for (IGListSectionController *childSectionController in self.sectionControllers) { + [[childSectionController workingRangeDelegate] listAdapter:listAdapter sectionControllerWillEnterWorkingRange:childSectionController]; + } +} + +- (void)listAdapter:(IGListAdapter *)listAdapter sectionControllerDidExitWorkingRange:(IGListSectionController *)sectionController { + for (IGListSectionController *childSectionController in self.sectionControllers) { + [[childSectionController workingRangeDelegate] listAdapter:listAdapter sectionControllerDidExitWorkingRange:childSectionController]; + } +} + @end diff --git a/Project 27 - Marslink/Pods/IGListKit/Source/IGListSupplementaryViewSource.h b/Project 29 - Marslink/Pods/IGListKit/Source/IGListSupplementaryViewSource.h similarity index 92% rename from Project 27 - Marslink/Pods/IGListKit/Source/IGListSupplementaryViewSource.h rename to Project 29 - Marslink/Pods/IGListKit/Source/IGListSupplementaryViewSource.h index c79718bb..f7bd464a 100644 --- a/Project 27 - Marslink/Pods/IGListKit/Source/IGListSupplementaryViewSource.h +++ b/Project 29 - Marslink/Pods/IGListKit/Source/IGListSupplementaryViewSource.h @@ -16,6 +16,7 @@ NS_ASSUME_NONNULL_BEGIN `IGListAdapter` which then configures and maintains a `UICollectionView`. The supplementary API reflects that in `UICollectionView`, `UICollectionViewLayout`, and `UICollectionViewDataSource`. */ +NS_SWIFT_NAME(ListSupplementaryViewSource) @protocol IGListSupplementaryViewSource /** @@ -29,7 +30,7 @@ NS_ASSUME_NONNULL_BEGIN Asks the SupplementaryViewSource for a configured supplementary view for the specified kind and index. @param elementKind The kind of supplementary view being requested - @param index The index for the supplementary veiw being requested. + @param index The index for the supplementary veiw being requested. @note This is your opportunity to do any supplementary view setup and configuration. @@ -42,7 +43,7 @@ NS_ASSUME_NONNULL_BEGIN Asks the SupplementaryViewSource for the size of a supplementary view for the given kind and index path. @param elementKind The kind of supplementary view. - @param index The index of the requested view. + @param index The index of the requested view. @return The size for the supplementary view. */ diff --git a/Project 27 - Marslink/Pods/IGListKit/Source/IGListUpdatingDelegate.h b/Project 29 - Marslink/Pods/IGListKit/Source/IGListUpdatingDelegate.h similarity index 66% rename from Project 27 - Marslink/Pods/IGListKit/Source/IGListUpdatingDelegate.h rename to Project 29 - Marslink/Pods/IGListKit/Source/IGListUpdatingDelegate.h index cfb78511..143553fb 100644 --- a/Project 27 - Marslink/Pods/IGListKit/Source/IGListUpdatingDelegate.h +++ b/Project 29 - Marslink/Pods/IGListKit/Source/IGListUpdatingDelegate.h @@ -18,6 +18,7 @@ NS_ASSUME_NONNULL_BEGIN @param finished Specifies whether or not the update finished. */ +NS_SWIFT_NAME(ListUpdatingCompletion) typedef void (^IGListUpdatingCompletion)(BOOL finished); /** @@ -25,19 +26,23 @@ typedef void (^IGListUpdatingCompletion)(BOOL finished); @param toObjects The new objects in the collection. */ +NS_SWIFT_NAME(ListObjectTransitionBlock) typedef void (^IGListObjectTransitionBlock)(NSArray *toObjects); /// A block that contains all of the updates. +NS_SWIFT_NAME(ListItemUpdateBlock) typedef void (^IGListItemUpdateBlock)(); /// A block to be called when an adapter reloads the collection view. +NS_SWIFT_NAME(ListReloadUpdateBlock) typedef void (^IGListReloadUpdateBlock)(); /** Implement this protocol in order to handle both section and row based update events. Implementation should forward or coalesce these events to a backing store or collection. */ -@protocol IGListUpdatingDelegate +NS_SWIFT_NAME(ListUpdatingDelegate) +@protocol IGListUpdatingDelegate /** Asks the delegate for the pointer functions for looking up an object in a collection. @@ -56,12 +61,12 @@ typedef void (^IGListReloadUpdateBlock)(); /** Tells the delegate to perform a section transition from an old array of objects to a new one. - @param collectionView The collection view to perform the transition on. - @param fromObjects The previous objects in the collection view. Objects must conform to `IGListDiffable`. - @param toObjects The new objects in collection view. Objects must conform to `IGListDiffable`. - @param animated A flag indicating if the transition should be animated. + @param collectionView The collection view to perform the transition on. + @param fromObjects The previous objects in the collection view. Objects must conform to `IGListDiffable`. + @param toObjects The new objects in collection view. Objects must conform to `IGListDiffable`. + @param animated A flag indicating if the transition should be animated. @param objectTransitionBlock A block that must be called when the adapter applies changes to the collection view. - @param completion A completion block to execute when the update is finished. + @param completion A completion block to execute when the update is finished. @note Implementations determine how to transition between objects. You can perform a diff on the objects, reload each section, or simply call `-reloadData` on the collection view. In the end, the collection view must be setup with a @@ -81,7 +86,7 @@ typedef void (^IGListReloadUpdateBlock)(); Tells the delegate to perform item inserts at the given index paths. @param collectionView The collection view on which to perform the transition. - @param indexPaths The index paths to insert items into. + @param indexPaths The index paths to insert items into. */ - (void)insertItemsIntoCollectionView:(UICollectionView *)collectionView indexPaths:(NSArray *)indexPaths; @@ -89,24 +94,42 @@ typedef void (^IGListReloadUpdateBlock)(); Tells the delegate to perform item deletes at the given index paths. @param collectionView The collection view on which to perform the transition. - @param indexPaths The index paths to delete items from. + @param indexPaths The index paths to delete items from. */ - (void)deleteItemsFromCollectionView:(UICollectionView *)collectionView indexPaths:(NSArray *)indexPaths; /** - Tells the delegate to perform item reloads at the given index paths. + Tells the delegate to move an item from and to given index paths. @param collectionView The collection view on which to perform the transition. - @param indexPaths The index paths of items to reload. + @param fromIndexPath The source index path of the item to move. + @param toIndexPath The destination index path of the item to move. */ -- (void)reloadItemsInCollectionView:(UICollectionView *)collectionView indexPaths:(NSArray *)indexPaths; +- (void)moveItemInCollectionView:(UICollectionView *)collectionView + fromIndexPath:(NSIndexPath *)fromIndexPath + toIndexPath:(NSIndexPath *)toIndexPath; + +/** + Tells the delegate to reload an item from and to given index paths. + + @param collectionView The collection view on which to perform the transition. + @param fromIndexPath The source index path of the item to reload. + @param toIndexPath The destination index path of the item to reload. + + @note Since UICollectionView is unable to handle calling -[UICollectionView reloadItemsAtIndexPaths:] safely while also + executing insert and delete operations in the same batch updates, the updater must know about the origin and + destination of the reload to perform a safe transition. + */ +- (void)reloadItemInCollectionView:(UICollectionView *)collectionView + fromIndexPath:(NSIndexPath *)fromIndexPath + toIndexPath:(NSIndexPath *)toIndexPath; /** Completely reload data in the collection. - @param collectionView The collection view to reload. + @param collectionView The collection view to reload. @param reloadUpdateBlock A block that must be called when the adapter reloads the collection view. - @param completion A completion block to execute when the reload is finished. + @param completion A completion block to execute when the reload is finished. */ - (void)reloadDataWithCollectionView:(UICollectionView *)collectionView reloadUpdateBlock:(IGListReloadUpdateBlock)reloadUpdateBlock @@ -116,7 +139,7 @@ typedef void (^IGListReloadUpdateBlock)(); Completely reload each section in the collection view. @param collectionView The collection view to reload. - @param sections The sections to reload. + @param sections The sections to reload. */ - (void)reloadCollectionView:(UICollectionView *)collectionView sections:(NSIndexSet *)sections; @@ -124,9 +147,9 @@ typedef void (^IGListReloadUpdateBlock)(); Perform an item update block in the collection view. @param collectionView The collection view to update. - @param animated A flag indicating if the transition should be animated. - @param itemUpdates A block containing all of the updates. - @param completion A completion block to execute when the update is finished. + @param animated A flag indicating if the transition should be animated. + @param itemUpdates A block containing all of the updates. + @param completion A completion block to execute when the update is finished. */ - (void)performUpdateWithCollectionView:(UICollectionView *)collectionView animated:(BOOL)animated diff --git a/Project 27 - Marslink/Pods/IGListKit/Source/IGListWorkingRangeDelegate.h b/Project 29 - Marslink/Pods/IGListKit/Source/IGListWorkingRangeDelegate.h similarity index 78% rename from Project 27 - Marslink/Pods/IGListKit/Source/IGListWorkingRangeDelegate.h rename to Project 29 - Marslink/Pods/IGListKit/Source/IGListWorkingRangeDelegate.h index df050bb6..04fddc8e 100644 --- a/Project 27 - Marslink/Pods/IGListKit/Source/IGListWorkingRangeDelegate.h +++ b/Project 29 - Marslink/Pods/IGListKit/Source/IGListWorkingRangeDelegate.h @@ -12,7 +12,7 @@ @class IGListAdapter; @class IGListSectionController; -@protocol IGListSectionType; + NS_ASSUME_NONNULL_BEGIN @@ -22,23 +22,24 @@ NS_ASSUME_NONNULL_BEGIN The working range is a range *near* the viewport in which you can begin preparing content for display. For example, you could begin decoding images, or warming text caches. */ +NS_SWIFT_NAME(ListWorkingRangeDelegate) @protocol IGListWorkingRangeDelegate /** Notifies the delegate that an section controller will enter the working range. - @param listAdapter The adapter controlling the list. + @param listAdapter The adapter controlling the list. @param sectionController The section controller entering the range. */ -- (void)listAdapter:(IGListAdapter *)listAdapter sectionControllerWillEnterWorkingRange:(IGListSectionController *)sectionController; +- (void)listAdapter:(IGListAdapter *)listAdapter sectionControllerWillEnterWorkingRange:(IGListSectionController *)sectionController; /** Notifies the delegate that an section controller exited the working range. - @param listAdapter The adapter controlling the list. + @param listAdapter The adapter controlling the list. @param sectionController The section controller that exited the range. */ -- (void)listAdapter:(IGListAdapter *)listAdapter sectionControllerDidExitWorkingRange:(IGListSectionController *)sectionController; +- (void)listAdapter:(IGListAdapter *)listAdapter sectionControllerDidExitWorkingRange:(IGListSectionController *)sectionController; @end diff --git a/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListAdapter+DebugDescription.h b/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListAdapter+DebugDescription.h new file mode 100644 index 00000000..ab095bdb --- /dev/null +++ b/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListAdapter+DebugDescription.h @@ -0,0 +1,16 @@ +/** + * Copyright (c) 2016-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import + +@interface IGListAdapter (DebugDescription) + +- (NSArray *)debugDescriptionLines; + +@end diff --git a/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListAdapter+DebugDescription.m b/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListAdapter+DebugDescription.m new file mode 100644 index 00000000..6f31d09d --- /dev/null +++ b/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListAdapter+DebugDescription.m @@ -0,0 +1,76 @@ +/** + * Copyright (c) 2016-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import "IGListAdapter+DebugDescription.h" + +#import "IGListAdapterInternal.h" +#import "IGListSectionMap+DebugDescription.h" +#import "IGListAdapterUpdater+DebugDescription.h" +#import "UICollectionView+DebugDescription.h" +#import "IGListDebuggingUtilities.h" + +@implementation IGListAdapter (DebugDescription) + +- (NSString *)debugDescription { + NSMutableArray *lines = [NSMutableArray arrayWithObject:[NSString stringWithFormat:@"IGListAdapter %p:", self]]; + [lines addObjectsFromArray:IGListDebugIndentedLines([self debugDescriptionLines])]; + return [lines componentsJoinedByString:@"\n"]; +} + +- (NSArray *)debugDescriptionLines { + NSMutableArray *debug = [NSMutableArray new]; +#if IGLK_DEBUG_DESCRIPTION_ENABLED + [debug addObject:[NSString stringWithFormat:@"Updater type: %@", NSStringFromClass(self.updater.class)]]; + [debug addObject:[NSString stringWithFormat:@"Data source: %@", self.dataSource]]; + [debug addObject:[NSString stringWithFormat:@"Collection view delegate: %@", self.collectionViewDelegate]]; + [debug addObject:[NSString stringWithFormat:@"Scroll view delegate: %@", self.scrollViewDelegate]]; + [debug addObject:[NSString stringWithFormat:@"Is in update block: %@", IGListDebugBOOL(self.isInUpdateBlock)]]; + [debug addObject:[NSString stringWithFormat:@"View controller: %@", self.viewController]]; + [debug addObject:[NSString stringWithFormat:@"Is prefetching enabled: %@", IGListDebugBOOL(self.collectionView.isPrefetchingEnabled)]]; + + if (self.registeredCellClasses.count > 0) { + [debug addObject:@"Registered cell classes:"]; + [debug addObject:[self.registeredCellClasses description]]; + } + + if (self.registeredNibNames.count > 0) { + [debug addObject:@"Registered nib names:"]; + [debug addObject:[self.registeredNibNames description]]; + } + + if (self.registeredSupplementaryViewIdentifiers.count > 0) { + [debug addObject:@"Registered supplementary view identifiers:"]; + [debug addObject:[self.registeredSupplementaryViewIdentifiers description]]; + } + + if (self.registeredSupplementaryViewNibNames.count > 0) { + [debug addObject:@"Registered supplementary view nib names:"]; + [debug addObject:self.registeredSupplementaryViewNibNames]; + } + + if ([self.updater isKindOfClass:[IGListAdapterUpdater class]]) { + [debug addObject:[NSString stringWithFormat:@"IGListAdapterUpdater instance %p:", self.updater]]; + [debug addObjectsFromArray:IGListDebugIndentedLines([(IGListAdapterUpdater *)self.updater debugDescriptionLines])]; + } + + [debug addObject:[NSString stringWithFormat:@"Section map details:"]]; + [debug addObjectsFromArray:IGListDebugIndentedLines([self.sectionMap debugDescriptionLines])]; + + if (self.previousSectionMap != nil) { + [debug addObject:[NSString stringWithFormat:@"Previous section map details:"]]; + [debug addObjectsFromArray:IGListDebugIndentedLines([self.previousSectionMap debugDescriptionLines])]; + } + + [debug addObject:[NSString stringWithFormat:@"Collection view details:"]]; + [debug addObjectsFromArray:IGListDebugIndentedLines([self.collectionView debugDescriptionLines])]; +#endif // #if IGLK_DEBUG_DESCRIPTION_ENABLED + return debug; +} + +@end diff --git a/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListAdapter+UICollectionView.h b/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListAdapter+UICollectionView.h new file mode 100644 index 00000000..db2e4d0d --- /dev/null +++ b/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListAdapter+UICollectionView.h @@ -0,0 +1,19 @@ +/** + * Copyright (c) 2016-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import + +#import + +@interface IGListAdapter (UICollectionView) +< +UICollectionViewDataSource, +UICollectionViewDelegateFlowLayout +> +@end diff --git a/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListAdapter+UICollectionView.m b/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListAdapter+UICollectionView.m new file mode 100644 index 00000000..84d0973f --- /dev/null +++ b/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListAdapter+UICollectionView.m @@ -0,0 +1,209 @@ +/** + * Copyright (c) 2016-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import "IGListAdapter+UICollectionView.h" + +#import +#import +#import + +@implementation IGListAdapter (UICollectionView) + +#pragma mark - UICollectionViewDataSource + +- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView { + return self.sectionMap.objects.count; +} + +- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { + IGListSectionController * sectionController = [self sectionControllerForSection:section]; + IGAssert(sectionController != nil, @"Nil section controller for section %zi for item %@. Check your -diffIdentifier and -isEqual: implementations.", + section, [self.sectionMap objectForSection:section]); + const NSInteger numberOfItems = [sectionController numberOfItems]; + IGAssert(numberOfItems >= 0, @"Cannot return negative number of items %zi for section controller %@.", numberOfItems, sectionController); + return numberOfItems; +} + +- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { + IGListSectionController *sectionController = [self sectionControllerForSection:indexPath.section]; + + // flag that a cell is being dequeued in case it tries to access a cell in the process + _isDequeuingCell = YES; + UICollectionViewCell *cell = [sectionController cellForItemAtIndex:indexPath.item]; + _isDequeuingCell = NO; + + IGAssert(cell != nil, @"Returned a nil cell at indexPath <%@> from section controller: <%@>", indexPath, sectionController); + + // associate the section controller with the cell so that we know which section controller is using it + [self mapView:cell toSectionController:sectionController]; + + return cell; +} + +- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath { + IGListSectionController *sectionController = [self sectionControllerForSection:indexPath.section]; + id supplementarySource = [sectionController supplementaryViewSource]; + UICollectionReusableView *view = [supplementarySource viewForSupplementaryElementOfKind:kind atIndex:indexPath.item]; + IGAssert(view != nil, @"Returned a nil supplementary view at indexPath <%@> from section controller: <%@>, supplementary source: <%@>", indexPath, sectionController, supplementarySource); + + // associate the section controller with the cell so that we know which section controller is using it + [self mapView:view toSectionController:sectionController]; + + return view; +} + +#pragma mark - UICollectionViewDelegate + +- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath { + // forward this method to the delegate b/c this implementation will steal the message from the proxy + id collectionViewDelegate = self.collectionViewDelegate; + if ([collectionViewDelegate respondsToSelector:@selector(collectionView:didSelectItemAtIndexPath:)]) { + [collectionViewDelegate collectionView:collectionView didSelectItemAtIndexPath:indexPath]; + } + + IGListSectionController * sectionController = [self sectionControllerForSection:indexPath.section]; + [sectionController didSelectItemAtIndex:indexPath.item]; +} + +- (void)collectionView:(UICollectionView *)collectionView didDeselectItemAtIndexPath:(NSIndexPath *)indexPath { + // forward this method to the delegate b/c this implementation will steal the message from the proxy + id collectionViewDelegate = self.collectionViewDelegate; + if ([collectionViewDelegate respondsToSelector:@selector(collectionView:didDeselectItemAtIndexPath:)]) { + [collectionViewDelegate collectionView:collectionView didDeselectItemAtIndexPath:indexPath]; + } + + IGListSectionController * sectionController = [self sectionControllerForSection:indexPath.section]; + [sectionController didDeselectItemAtIndex:indexPath.item]; +} + +- (void)collectionView:(UICollectionView *)collectionView willDisplayCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath { + // forward this method to the delegate b/c this implementation will steal the message from the proxy + id collectionViewDelegate = self.collectionViewDelegate; + if ([collectionViewDelegate respondsToSelector:@selector(collectionView:willDisplayCell:forItemAtIndexPath:)]) { + [collectionViewDelegate collectionView:collectionView willDisplayCell:cell forItemAtIndexPath:indexPath]; + } + + IGListSectionController *sectionController = [self sectionControllerForView:cell]; + // if the section controller relationship was destroyed, reconnect it + // this happens with iOS 10 UICollectionView display range changes + if (sectionController == nil) { + sectionController = [self sectionControllerForSection:indexPath.section]; + [self mapView:cell toSectionController:sectionController]; + } + + id object = [self.sectionMap objectForSection:indexPath.section]; + [self.displayHandler willDisplayCell:cell forListAdapter:self sectionController:sectionController object:object indexPath:indexPath]; + + _isSendingWorkingRangeDisplayUpdates = YES; + [self.workingRangeHandler willDisplayItemAtIndexPath:indexPath forListAdapter:self]; + _isSendingWorkingRangeDisplayUpdates = NO; +} + +- (void)collectionView:(UICollectionView *)collectionView didEndDisplayingCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath { + // forward this method to the delegate b/c this implementation will steal the message from the proxy + id collectionViewDelegate = self.collectionViewDelegate; + if ([collectionViewDelegate respondsToSelector:@selector(collectionView:didEndDisplayingCell:forItemAtIndexPath:)]) { + [collectionViewDelegate collectionView:collectionView didEndDisplayingCell:cell forItemAtIndexPath:indexPath]; + } + + IGListSectionController *sectionController = [self sectionControllerForView:cell]; + [self.displayHandler didEndDisplayingCell:cell forListAdapter:self sectionController:sectionController indexPath:indexPath]; + [self.workingRangeHandler didEndDisplayingItemAtIndexPath:indexPath forListAdapter:self]; + + // break the association between the cell and the section controller + [self removeMapForView:cell]; +} + +- (void)collectionView:(UICollectionView *)collectionView willDisplaySupplementaryView:(UICollectionReusableView *)view forElementKind:(NSString *)elementKind atIndexPath:(NSIndexPath *)indexPath { + id collectionViewDelegate = self.collectionViewDelegate; + if ([collectionViewDelegate respondsToSelector:@selector(collectionView:willDisplaySupplementaryView:forElementKind:atIndexPath:)]) { + [collectionViewDelegate collectionView:collectionView willDisplaySupplementaryView:view forElementKind:elementKind atIndexPath:indexPath]; + } + + IGListSectionController *sectionController = [self sectionControllerForView:view]; + // if the section controller relationship was destroyed, reconnect it + // this happens with iOS 10 UICollectionView display range changes + if (sectionController == nil) { + sectionController = [self.sectionMap sectionControllerForSection:indexPath.section]; + [self mapView:view toSectionController:sectionController]; + } + + id object = [self.sectionMap objectForSection:indexPath.section]; + [self.displayHandler willDisplaySupplementaryView:view forListAdapter:self sectionController:sectionController object:object indexPath:indexPath]; +} + +- (void)collectionView:(UICollectionView *)collectionView didEndDisplayingSupplementaryView:(UICollectionReusableView *)view forElementOfKind:(NSString *)elementKind atIndexPath:(NSIndexPath *)indexPath { + id collectionViewDelegate = self.collectionViewDelegate; + if ([collectionViewDelegate respondsToSelector:@selector(collectionView:didEndDisplayingSupplementaryView:forElementOfKind:atIndexPath:)]) { + [collectionViewDelegate collectionView:collectionView didEndDisplayingSupplementaryView:view forElementOfKind:elementKind atIndexPath:indexPath]; + } + + IGListSectionController *sectionController = [self sectionControllerForView:view]; + [self.displayHandler didEndDisplayingSupplementaryView:view forListAdapter:self sectionController:sectionController indexPath:indexPath]; + + [self removeMapForView:view]; +} + +- (void)collectionView:(UICollectionView *)collectionView didHighlightItemAtIndexPath:(NSIndexPath *)indexPath { + // forward this method to the delegate b/c this implementation will steal the message from the proxy + id collectionViewDelegate = self.collectionViewDelegate; + if ([collectionViewDelegate respondsToSelector:@selector(collectionView:didHighlightItemAtIndexPath:)]) { + [collectionViewDelegate collectionView:collectionView didHighlightItemAtIndexPath:indexPath]; + } + + IGListSectionController * sectionController = [self sectionControllerForSection:indexPath.section]; + [sectionController didHighlightItemAtIndex:indexPath.item]; +} + +- (void)collectionView:(UICollectionView *)collectionView didUnhighlightItemAtIndexPath:(NSIndexPath *)indexPath { + // forward this method to the delegate b/c this implementation will steal the message from the proxy + id collectionViewDelegate = self.collectionViewDelegate; + if ([collectionViewDelegate respondsToSelector:@selector(collectionView:didUnhighlightItemAtIndexPath:)]) { + [collectionViewDelegate collectionView:collectionView didUnhighlightItemAtIndexPath:indexPath]; + } + + IGListSectionController * sectionController = [self sectionControllerForSection:indexPath.section]; + [sectionController didUnhighlightItemAtIndex:indexPath.item]; +} + +#pragma mark - UICollectionViewDelegateFlowLayout + +- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath { + IGAssert(![self.collectionViewDelegate respondsToSelector:_cmd], @"IGListAdapter is consuming method also implemented by the collectionViewDelegate: %@", NSStringFromSelector(_cmd)); + return [self sizeForItemAtIndexPath:indexPath]; +} + +- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout insetForSectionAtIndex:(NSInteger)section { + IGAssert(![self.collectionViewDelegate respondsToSelector:_cmd], @"IGListAdapter is consuming method also implemented by the collectionViewDelegate: %@", NSStringFromSelector(_cmd)); + return [[self sectionControllerForSection:section] inset]; +} + +- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout minimumLineSpacingForSectionAtIndex:(NSInteger)section { + IGAssert(![self.collectionViewDelegate respondsToSelector:_cmd], @"IGListAdapter is consuming method also implemented by the collectionViewDelegate: %@", NSStringFromSelector(_cmd)); + return [[self sectionControllerForSection:section] minimumLineSpacing]; +} + +- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout minimumInteritemSpacingForSectionAtIndex:(NSInteger)section { + IGAssert(![self.collectionViewDelegate respondsToSelector:_cmd], @"IGListAdapter is consuming method also implemented by the collectionViewDelegate: %@", NSStringFromSelector(_cmd)); + return [[self sectionControllerForSection:section] minimumInteritemSpacing]; +} + +- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section { + IGAssert(![self.collectionViewDelegate respondsToSelector:_cmd], @"IGListAdapter is consuming method also implemented by the collectionViewDelegate: %@", NSStringFromSelector(_cmd)); + NSIndexPath *indexPath = [NSIndexPath indexPathForItem:0 inSection:section]; + return [self sizeForSupplementaryViewOfKind:UICollectionElementKindSectionHeader atIndexPath:indexPath]; +} + +- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout referenceSizeForFooterInSection:(NSInteger)section { + IGAssert(![self.collectionViewDelegate respondsToSelector:_cmd], @"IGListAdapter is consuming method also implemented by the collectionViewDelegate: %@", NSStringFromSelector(_cmd)); + NSIndexPath *indexPath = [NSIndexPath indexPathForItem:0 inSection:section]; + return [self sizeForSupplementaryViewOfKind:UICollectionElementKindSectionFooter atIndexPath:indexPath]; +} + +@end diff --git a/Project 27 - Marslink/Pods/IGListKit/Source/Internal/IGListAdapterInternal.h b/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListAdapterInternal.h similarity index 75% rename from Project 27 - Marslink/Pods/IGListKit/Source/Internal/IGListAdapterInternal.h rename to Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListAdapterInternal.h index 35c0eb28..b5dd843a 100644 --- a/Project 27 - Marslink/Pods/IGListKit/Source/Internal/IGListAdapterInternal.h +++ b/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListAdapterInternal.h @@ -9,11 +9,13 @@ #import #import +#import #import "IGListAdapterProxy.h" #import "IGListDisplayHandler.h" #import "IGListSectionMap.h" #import "IGListWorkingRangeHandler.h" +#import "IGListAdapter+UICollectionView.h" NS_ASSUME_NONNULL_BEGIN @@ -24,15 +26,16 @@ NS_INLINE NSString *IGListReusableViewIdentifier(Class viewClass, NSString * _Nu @interface IGListAdapter () < -UICollectionViewDataSource, -UICollectionViewDelegateFlowLayout, -IGListCollectionContext +IGListCollectionContext, +IGListBatchContext > { __weak UICollectionView *_collectionView; + BOOL _isDequeuingCell; + BOOL _isSendingWorkingRangeDisplayUpdates; } -@property (nonatomic, strong) id updatingDelegate; +@property (nonatomic, strong) id updater; @property (nonatomic, strong, readonly) IGListSectionMap *sectionMap; @property (nonatomic, strong, readonly) IGListDisplayHandler *displayHandler; @@ -52,17 +55,25 @@ IGListCollectionContext objects or section controllers. */ @property (nonatomic, assign) BOOL isInUpdateBlock; -@property (nonatomic, strong, nullable) IGListSectionMap *previoussectionMap; +@property (nonatomic, strong, nullable) IGListSectionMap *previousSectionMap; @property (nonatomic, strong) NSMutableSet *registeredCellClasses; @property (nonatomic, strong) NSMutableSet *registeredNibNames; @property (nonatomic, strong) NSMutableSet *registeredSupplementaryViewIdentifiers; @property (nonatomic, strong) NSMutableSet *registeredSupplementaryViewNibNames; -- (NSArray *)indexPathsFromSectionController:(IGListSectionController *)sectionController + +- (void)mapView:(__kindof UIView *)view toSectionController:(IGListSectionController *)sectionController; +- (nullable IGListSectionController *)sectionControllerForView:(__kindof UIView *)view; +- (void)removeMapForView:(__kindof UIView *)view; + +- (NSArray *)indexPathsFromSectionController:(IGListSectionController *)sectionController indexes:(NSIndexSet *)indexes - adjustForUpdateBlock:(BOOL)adjustForUpdateBlock; -- (nullable NSIndexPath *)indexPathForSectionController:(IGListSectionController *)controller index:(NSInteger)index; + usePreviousIfInUpdateBlock:(BOOL)usePreviousIfInUpdateBlock; + +- (nullable NSIndexPath *)indexPathForSectionController:(IGListSectionController *)controller + index:(NSInteger)index + usePreviousIfInUpdateBlock:(BOOL)usePreviousIfInUpdateBlock; @end diff --git a/Project 27 - Marslink/Pods/IGListKit/Source/Internal/IGListAdapterProxy.h b/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListAdapterProxy.h similarity index 76% rename from Project 27 - Marslink/Pods/IGListKit/Source/Internal/IGListAdapterProxy.h rename to Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListAdapterProxy.h index b1af43be..e8f2e012 100644 --- a/Project 27 - Marslink/Pods/IGListKit/Source/Internal/IGListAdapterProxy.h +++ b/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListAdapterProxy.h @@ -25,9 +25,9 @@ IGLK_SUBCLASSING_RESTRICTED /** Create a new proxy object with targets and interceptor. - @param collectionViewTarget A UICollectionViewDelegate conforming object that receives unintercepted messages. - @param scrollViewTarget A UIScrollViewDelegate conforming object that receives unintercepted messages. - @param interceptor An IGListAdapter object that intercepts a set of messages. + @param collectionViewTarget A UICollectionViewDelegate conforming object that receives non-intercepted messages. + @param scrollViewTarget A UIScrollViewDelegate conforming object that receives non-intercepted messages. + @param interceptor An IGListAdapter object that intercepts a set of messages. @return A new IGListAdapterProxy object. */ @@ -35,6 +35,16 @@ IGLK_SUBCLASSING_RESTRICTED scrollViewTarget:(nullable id)scrollViewTarget interceptor:(IGListAdapter *)interceptor; +/** + :nodoc: + */ +- (instancetype)init NS_UNAVAILABLE; + +/** + :nodoc: + */ ++ (instancetype)new NS_UNAVAILABLE; + @end NS_ASSUME_NONNULL_END diff --git a/Project 27 - Marslink/Pods/IGListKit/Source/Internal/IGListAdapterProxy.m b/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListAdapterProxy.m similarity index 94% rename from Project 27 - Marslink/Pods/IGListKit/Source/Internal/IGListAdapterProxy.m rename to Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListAdapterProxy.m index 6d7297e3..af3b2686 100644 --- a/Project 27 - Marslink/Pods/IGListKit/Source/Internal/IGListAdapterProxy.m +++ b/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListAdapterProxy.m @@ -21,6 +21,8 @@ static BOOL isInterceptedSelector(SEL sel) { sel == @selector(collectionView:didSelectItemAtIndexPath:) || sel == @selector(collectionView:willDisplayCell:forItemAtIndexPath:) || sel == @selector(collectionView:didEndDisplayingCell:forItemAtIndexPath:) || + sel == @selector(collectionView:didHighlightItemAtIndexPath:) || + sel == @selector(collectionView:didUnhighlightItemAtIndexPath:) || // UICollectionViewDelegateFlowLayout sel == @selector(collectionView:layout:sizeForItemAtIndexPath:) || sel == @selector(collectionView:layout:insetForSectionAtIndex:) || @@ -31,7 +33,8 @@ static BOOL isInterceptedSelector(SEL sel) { // UIScrollViewDelegate sel == @selector(scrollViewDidScroll:) || sel == @selector(scrollViewWillBeginDragging:) || - sel == @selector(scrollViewDidEndDragging:willDecelerate:) + sel == @selector(scrollViewDidEndDragging:willDecelerate:) || + sel == @selector(scrollViewDidEndDecelerating:) ); } diff --git a/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListAdapterUpdater+DebugDescription.h b/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListAdapterUpdater+DebugDescription.h new file mode 100644 index 00000000..07d0fcf6 --- /dev/null +++ b/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListAdapterUpdater+DebugDescription.h @@ -0,0 +1,16 @@ +/** + * Copyright (c) 2016-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import + +@interface IGListAdapterUpdater (DebugDescription) + +- (NSArray *)debugDescriptionLines; + +@end diff --git a/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListAdapterUpdater+DebugDescription.m b/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListAdapterUpdater+DebugDescription.m new file mode 100644 index 00000000..22553d40 --- /dev/null +++ b/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListAdapterUpdater+DebugDescription.m @@ -0,0 +1,77 @@ +/** + * Copyright (c) 2016-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import "IGListAdapterUpdater+DebugDescription.h" + +#import "IGListAdapterUpdaterInternal.h" +#import "IGListBatchUpdateData+DebugDescription.h" +#import "IGListDebuggingUtilities.h" + +#if IGLK_DEBUG_DESCRIPTION_ENABLED +static NSMutableArray *linesFromObjects(NSArray *objects) { + NSMutableArray *lines = [NSMutableArray new]; + for (id object in objects) { + [lines addObject:[NSString stringWithFormat:@"Object %p of type %@ with identifier %@", + object, NSStringFromClass([object class]), [object diffIdentifier]]]; + } + return lines; +} +#endif // #if IGLK_DEBUG_DESCRIPTION_ENABLED + +@implementation IGListAdapterUpdater (DebugDescription) + +- (NSArray *)debugDescriptionLines { + NSMutableArray *debug = [NSMutableArray new]; +#if IGLK_DEBUG_DESCRIPTION_ENABLED + [debug addObject:[NSString stringWithFormat:@"Moves as deletes+inserts: %@", IGListDebugBOOL(self.movesAsDeletesInserts)]]; + [debug addObject:[NSString stringWithFormat:@"Allows background reloading: %@", IGListDebugBOOL(self.allowsBackgroundReloading)]]; + [debug addObject:[NSString stringWithFormat:@"Has queued reload data: %@", IGListDebugBOOL(self.hasQueuedReloadData)]]; + [debug addObject:[NSString stringWithFormat:@"Queued update is animated: %@", IGListDebugBOOL(self.queuedUpdateIsAnimated)]]; + + NSString *stateString; + switch (self.state) { + case IGListBatchUpdateStateIdle: + stateString = @"Idle"; + break; + case IGListBatchUpdateStateQueuedBatchUpdate: + stateString = @"Queued batch update"; + break; + case IGListBatchUpdateStateExecutedBatchUpdateBlock: + stateString = @"Executed batch update block"; + break; + case IGListBatchUpdateStateExecutingBatchUpdateBlock: + stateString = @"Executing batch update block"; + break; + } + [debug addObject:[NSString stringWithFormat:@"State: %@", stateString]]; + + if (self.applyingUpdateData != nil) { + [debug addObject:@"Batch update data:"]; + [debug addObjectsFromArray:IGListDebugIndentedLines([self.applyingUpdateData debugDescriptionLines])]; + } + + if (self.fromObjects != nil) { + [debug addObject:@"From objects:"]; + [debug addObjectsFromArray:IGListDebugIndentedLines(linesFromObjects(self.fromObjects))]; + } + + if (self.toObjects != nil) { + [debug addObject:@"To objects:"]; + [debug addObjectsFromArray:IGListDebugIndentedLines(linesFromObjects(self.toObjects))]; + } + + if (self.pendingTransitionToObjects != nil) { + [debug addObject:@"Pending objects:"]; + [debug addObjectsFromArray:IGListDebugIndentedLines(linesFromObjects(self.pendingTransitionToObjects))]; + } +#endif // #if IGLK_DEBUG_DESCRIPTION_ENABLED + return debug; +} + +@end diff --git a/Project 27 - Marslink/Pods/IGListKit/Source/Internal/IGListAdapterUpdaterInternal.h b/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListAdapterUpdaterInternal.h similarity index 72% rename from Project 27 - Marslink/Pods/IGListKit/Source/Internal/IGListAdapterUpdaterInternal.h rename to Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListAdapterUpdaterInternal.h index 3ce7ddf2..6295c1f0 100644 --- a/Project 27 - Marslink/Pods/IGListKit/Source/Internal/IGListAdapterUpdaterInternal.h +++ b/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListAdapterUpdaterInternal.h @@ -10,7 +10,11 @@ #import #import +#import + #import "IGListAdapterUpdater.h" +#import "IGListBatchUpdateState.h" +#import "IGListBatchUpdates.h" NS_ASSUME_NONNULL_BEGIN @@ -22,30 +26,26 @@ FOUNDATION_EXTERN void convertReloadToDeleteInsert(NSMutableIndexSet *reloads, @interface IGListAdapterUpdater () -@property (nonatomic, strong, readonly) NSMutableArray *completionBlocks; - @property (nonatomic, copy, nullable) NSArray *fromObjects; @property (nonatomic, copy, nullable) NSArray *toObjects; @property (nonatomic, copy, nullable) NSArray *pendingTransitionToObjects; +@property (nonatomic, strong) NSMutableArray *completionBlocks; @property (nonatomic, assign) BOOL queuedUpdateIsAnimated; -@property (nonatomic, strong, readonly) NSMutableSet *deleteIndexPaths; -@property (nonatomic, strong, readonly) NSMutableSet *insertIndexPaths; -@property (nonatomic, strong, readonly) NSMutableSet *reloadIndexPaths; -@property (nonatomic, strong, readonly) NSMutableIndexSet *reloadSections; +@property (nonatomic, strong) IGListBatchUpdates *batchUpdates; @property (nonatomic, copy, nullable) IGListObjectTransitionBlock objectTransitionBlock; -@property (nonatomic, copy, nullable) NSMutableArray *itemUpdateBlocks; @property (nonatomic, copy, nullable) IGListReloadUpdateBlock reloadUpdates; @property (nonatomic, assign, getter=hasQueuedReloadData) BOOL queuedReloadData; -@property (nonatomic, assign) BOOL batchUpdateOrReloadInProgress; +@property (nonatomic, assign) IGListBatchUpdateState state; +@property (nonatomic, strong, nullable) IGListBatchUpdateData *applyingUpdateData; - (void)performReloadDataWithCollectionView:(UICollectionView *)collectionView; - (void)performBatchUpdatesWithCollectionView:(UICollectionView *)collectionView; -- (void)cleanupState; +- (void)cleanStateBeforeUpdates; - (BOOL)hasChanges; @end diff --git a/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListBatchUpdateData+DebugDescription.h b/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListBatchUpdateData+DebugDescription.h new file mode 100644 index 00000000..a77072a9 --- /dev/null +++ b/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListBatchUpdateData+DebugDescription.h @@ -0,0 +1,16 @@ +/** + * Copyright (c) 2016-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import + +@interface IGListBatchUpdateData (DebugDescription) + +- (NSArray *)debugDescriptionLines; + +@end diff --git a/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListBatchUpdateData+DebugDescription.m b/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListBatchUpdateData+DebugDescription.m new file mode 100644 index 00000000..bdf703cd --- /dev/null +++ b/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListBatchUpdateData+DebugDescription.m @@ -0,0 +1,40 @@ +/** + * Copyright (c) 2016-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import "IGListBatchUpdateData+DebugDescription.h" + +@implementation IGListBatchUpdateData (DebugDescription) + +- (NSArray *)debugDescriptionLines { + NSMutableArray *debug = [NSMutableArray new]; +#if IGLK_DEBUG_DESCRIPTION_ENABLED + [debug addObject:[NSString stringWithFormat:@"Insert sections: %@", self.insertSections]]; + [debug addObject:[NSString stringWithFormat:@"Delete sections: %@", self.deleteSections]]; + + for (IGListMoveIndex *move in self.moveSections) { + [debug addObject:[NSString stringWithFormat:@"Move from section %zi to %zi", move.from, move.to]]; + } + + for (NSIndexPath *path in self.deleteIndexPaths) { + [debug addObject:[NSString stringWithFormat:@"Delete section %zi item %zi", path.section, path.item]]; + } + + for (NSIndexPath *path in self.insertIndexPaths) { + [debug addObject:[NSString stringWithFormat:@"Insert section %zi item %zi", path.section, path.item]]; + } + + for (IGListMoveIndexPath *move in self.moveIndexPaths) { + [debug addObject:[NSString stringWithFormat:@"Move from section %zi item %zi to section %zi item %zi", + move.from.section, move.from.item, move.to.section, move.to.item]]; + } +#endif // #if IGLK_DEBUG_DESCRIPTION_ENABLED + return debug; +} + +@end diff --git a/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListBatchUpdateState.h b/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListBatchUpdateState.h new file mode 100644 index 00000000..5b00ed26 --- /dev/null +++ b/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListBatchUpdateState.h @@ -0,0 +1,17 @@ +/** + * Copyright (c) 2016-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import + +typedef NS_ENUM (NSInteger, IGListBatchUpdateState) { + IGListBatchUpdateStateIdle, + IGListBatchUpdateStateQueuedBatchUpdate, + IGListBatchUpdateStateExecutingBatchUpdateBlock, + IGListBatchUpdateStateExecutedBatchUpdateBlock, +}; diff --git a/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListBatchUpdates.h b/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListBatchUpdates.h new file mode 100644 index 00000000..0014c821 --- /dev/null +++ b/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListBatchUpdates.h @@ -0,0 +1,31 @@ +/** + * Copyright (c) 2016-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import + +#import + +@class IGListMoveIndexPath; +@class IGListReloadIndexPath; + +IGLK_SUBCLASSING_RESTRICTED +@interface IGListBatchUpdates : NSObject + +@property (nonatomic, strong, readonly) NSMutableIndexSet *sectionReloads; +@property (nonatomic, strong, readonly) NSMutableArray *itemInserts; +@property (nonatomic, strong, readonly) NSMutableArray *itemDeletes; +@property (nonatomic, strong, readonly) NSMutableArray *itemReloads; +@property (nonatomic, strong, readonly) NSMutableArray *itemMoves; + +@property (nonatomic, strong, readonly) NSMutableArray *itemUpdateBlocks; +@property (nonatomic, strong, readonly) NSMutableArray *itemCompletionBlocks; + +- (BOOL)hasChanges; + +@end diff --git a/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListBatchUpdates.m b/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListBatchUpdates.m new file mode 100644 index 00000000..2e009f32 --- /dev/null +++ b/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListBatchUpdates.m @@ -0,0 +1,36 @@ +/** + * Copyright (c) 2016-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import "IGListBatchUpdates.h" + +@implementation IGListBatchUpdates + +- (instancetype)init { + if (self = [super init]) { + _sectionReloads = [NSMutableIndexSet new]; + _itemInserts = [NSMutableArray new]; + _itemMoves = [NSMutableArray new]; + _itemDeletes = [NSMutableArray new]; + _itemReloads = [NSMutableArray new]; + _itemUpdateBlocks = [NSMutableArray new]; + _itemCompletionBlocks = [NSMutableArray new]; + } + return self; +} + +- (BOOL)hasChanges { + return [self.itemUpdateBlocks count] > 0 + || [self.sectionReloads count] > 0 + || [self.itemInserts count] > 0 + || [self.itemMoves count] > 0 + || [self.itemReloads count] > 0 + || [self.itemDeletes count] > 0; +} + +@end diff --git a/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListBindingSectionController+DebugDescription.h b/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListBindingSectionController+DebugDescription.h new file mode 100644 index 00000000..e595e41c --- /dev/null +++ b/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListBindingSectionController+DebugDescription.h @@ -0,0 +1,16 @@ +/** + * Copyright (c) 2016-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import + +@interface IGListBindingSectionController (DebugDescription) + +- (NSArray *)debugDescriptionLines; + +@end diff --git a/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListBindingSectionController+DebugDescription.m b/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListBindingSectionController+DebugDescription.m new file mode 100644 index 00000000..2a0f41e2 --- /dev/null +++ b/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListBindingSectionController+DebugDescription.m @@ -0,0 +1,48 @@ +/** + * Copyright (c) 2016-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import "IGListBindingSectionController+DebugDescription.h" + +#import "IGListDebuggingUtilities.h" + +@implementation IGListBindingSectionController (DebugDescription) + +- (NSString *)debugDescription { + NSMutableArray *lines = [NSMutableArray arrayWithObject:[NSString stringWithFormat:@"IGListBindingSectionController %p:", self]]; + [lines addObjectsFromArray:IGListDebugIndentedLines([self debugDescriptionLines])]; + return [lines componentsJoinedByString:@"\n"]; +} + +- (NSArray *)debugDescriptionLines { + NSMutableArray *debug = [NSMutableArray new]; +#if IGLK_DEBUG_DESCRIPTION_ENABLED + [debug addObject:[NSString stringWithFormat:@"Data source: %@", self.dataSource]]; + [debug addObject:[NSString stringWithFormat:@"Selection delegate: %@", self.selectionDelegate]]; + [debug addObject:[NSString stringWithFormat:@"Object: %@", self.object]]; + [debug addObject:@"View models:"]; + for (id viewModel in self.viewModels) { + [debug addObject:[NSString stringWithFormat:@"%@: %@", viewModel, viewModel.diffIdentifier]]; + } + [debug addObject:[NSString stringWithFormat:@"Number of items: %ld", (long)self.numberOfItems]]; + [debug addObject:[NSString stringWithFormat:@"View controller: %@", self.viewController]]; + [debug addObject:[NSString stringWithFormat:@"Collection context: %@", self.collectionContext]]; + [debug addObject:[NSString stringWithFormat:@"Section: %ld", (long)self.section]]; + [debug addObject:[NSString stringWithFormat:@"Is first section: %@", IGListDebugBOOL(self.isFirstSection)]]; + [debug addObject:[NSString stringWithFormat:@"Is last section: %@", IGListDebugBOOL(self.isLastSection)]]; + [debug addObject:[NSString stringWithFormat:@"Supplementary view source: %@", self.supplementaryViewSource]]; + [debug addObject:[NSString stringWithFormat:@"Display delegate: %@", self.displayDelegate]]; + [debug addObject:[NSString stringWithFormat:@"Working range delegate: %@", self.workingRangeDelegate]]; + [debug addObject:[NSString stringWithFormat:@"Scroll delegate: %@", self.scrollDelegate]]; + +#endif // #if IGLK_DEBUG_DESCRIPTION_ENABLED + return debug; +} + +@end + diff --git a/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListCollectionViewLayoutInternal.h b/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListCollectionViewLayoutInternal.h new file mode 100644 index 00000000..99372a70 --- /dev/null +++ b/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListCollectionViewLayoutInternal.h @@ -0,0 +1,16 @@ +/** + * Copyright (c) 2016-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +static CGRect IGListRectIntegralScaled(CGRect rect) { + CGFloat scale = [[UIScreen mainScreen] scale]; + return CGRectMake(floorf(rect.origin.x * scale) / scale, + floorf(rect.origin.y * scale) / scale, + ceilf(rect.size.width * scale) / scale, + ceilf(rect.size.height * scale) / scale); +} diff --git a/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListDebugger.h b/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListDebugger.h new file mode 100644 index 00000000..dcd2086e --- /dev/null +++ b/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListDebugger.h @@ -0,0 +1,28 @@ +/** + * Copyright (c) 2016-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import + +#import + +@class IGListAdapter; + +IGLK_SUBCLASSING_RESTRICTED +@interface IGListDebugger : NSObject + ++ (void)trackAdapter:(IGListAdapter *)adapter; + ++ (NSArray *)adapterDescriptions; + ++ (NSString *)dump; + +- (instancetype)init NS_UNAVAILABLE; ++ (instancetype)new NS_UNAVAILABLE; + +@end diff --git a/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListDebugger.m b/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListDebugger.m new file mode 100644 index 00000000..4368aff5 --- /dev/null +++ b/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListDebugger.m @@ -0,0 +1,40 @@ +/** + * Copyright (c) 2016-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import "IGListDebugger.h" + +#import "IGListDebuggingUtilities.h" +#import "IGListAdapter+DebugDescription.h" + +@implementation IGListDebugger + +static NSHashTable *livingAdaptersTable = nil; + ++ (void)trackAdapter:(IGListAdapter *)adapter { +#if IGLK_DEBUG_DESCRIPTION_ENABLED + if (livingAdaptersTable == nil) { + livingAdaptersTable = [NSHashTable weakObjectsHashTable]; + } + [livingAdaptersTable addObject:adapter]; +#endif // #if IGLK_DEBUG_DESCRIPTION_ENABLED +} + ++ (NSArray *)adapterDescriptions { + NSMutableArray *descriptions = [NSMutableArray new]; + for (IGListAdapter *adapter in livingAdaptersTable) { + [descriptions addObject:[adapter debugDescription]]; + } + return descriptions; +} + ++ (NSString *)dump { + return [[self adapterDescriptions] componentsJoinedByString:@"\n"]; +} + +@end diff --git a/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListDebuggingUtilities.h b/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListDebuggingUtilities.h new file mode 100644 index 00000000..96fce2ec --- /dev/null +++ b/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListDebuggingUtilities.h @@ -0,0 +1,16 @@ +/** + * Copyright (c) 2016-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import + +@class IGListAdapter; + +extern NSString *IGListDebugBOOL(BOOL b); + +extern NSArray *IGListDebugIndentedLines(NSArray *lines); diff --git a/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListDebuggingUtilities.m b/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListDebuggingUtilities.m new file mode 100644 index 00000000..764430c4 --- /dev/null +++ b/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListDebuggingUtilities.m @@ -0,0 +1,22 @@ +/** + * Copyright (c) 2016-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import "IGListDebuggingUtilities.h" + +NSString *IGListDebugBOOL(BOOL b) { + return b ? @"Yes" : @"No"; +} + +NSArray *IGListDebugIndentedLines(NSArray *lines) { + NSMutableArray *newLines = [NSMutableArray new]; + for (NSString *line in lines) { + [newLines addObject:[NSString stringWithFormat:@" %@", line]]; + } + return newLines; +} diff --git a/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListDisplayHandler.h b/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListDisplayHandler.h new file mode 100644 index 00000000..650a7ca3 --- /dev/null +++ b/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListDisplayHandler.h @@ -0,0 +1,84 @@ +/** + * Copyright (c) 2016-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import + +#import + +@class IGListAdapter; +@class IGListSectionController; + + + +NS_ASSUME_NONNULL_BEGIN + +IGLK_SUBCLASSING_RESTRICTED +@interface IGListDisplayHandler : NSObject + +/** + Tells the handler that a cell will be displayed in the IGListAdapter. + + @param cell A cell that will be displayed. + @param listAdapter The adapter the cell will display in. + @param sectionController The section controller that manages the cell. + @param object The object that powers the section controller. + @param indexPath The index path of the cell in the UICollectionView. + */ +- (void)willDisplayCell:(UICollectionViewCell *)cell + forListAdapter:(IGListAdapter *)listAdapter + sectionController:(IGListSectionController *)sectionController + object:(id)object + indexPath:(NSIndexPath *)indexPath; + +/** + Tells the handler that a cell did end display in the IGListAdapter. + + @param cell A cell that will be displayed. + @param listAdapter The adapter the cell will display in. + @param sectionController The section controller that manages the cell. + @param indexPath The index path of the cell in the UICollectionView. + */ +- (void)didEndDisplayingCell:(UICollectionViewCell *)cell + forListAdapter:(IGListAdapter *)listAdapter + sectionController:(IGListSectionController *)sectionController + indexPath:(NSIndexPath *)indexPath; + + +/** + Tells the handler that a supplementary view will be displayed in the IGListAdapter. + + @param view A supplementary view that will be displayed. + @param listAdapter The adapter the supplementary view will display in. + @param sectionController The section controller that manages the supplementary view. + @param object The object that powers the section controller. + @param indexPath The index path of the supplementary view in the UICollectionView. + */ +- (void)willDisplaySupplementaryView:(UICollectionReusableView *)view + forListAdapter:(IGListAdapter *)listAdapter + sectionController:(IGListSectionController *)sectionController + object:(id)object + indexPath:(NSIndexPath *)indexPath; + + +/** + Tells the handler that a supplementary view did end display in the IGListAdapter. + + @param view A supplementary view that will be displayed. + @param listAdapter The adapter the supplementary view will display in. + @param sectionController The section controller that manages the supplementary view. + @param indexPath The index path of the supplementary view in the UICollectionView. + */ +- (void)didEndDisplayingSupplementaryView:(UICollectionReusableView *)view + forListAdapter:(IGListAdapter *)listAdapter + sectionController:(IGListSectionController *)sectionController + indexPath:(NSIndexPath *)indexPath; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListDisplayHandler.m b/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListDisplayHandler.m new file mode 100644 index 00000000..5e73e7de --- /dev/null +++ b/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListDisplayHandler.m @@ -0,0 +1,125 @@ +/** + * Copyright (c) 2016-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import "IGListDisplayHandler.h" + +#import +#import +#import +#import + +@interface IGListDisplayHandler () + +@property (nonatomic, strong) NSCountedSet *visibleListSections; +@property (nonatomic, strong) NSMapTable *visibleViewObjectMap; + +@end + +@implementation IGListDisplayHandler + +- (instancetype)init { + if (self = [super init]) { + _visibleListSections = [NSCountedSet new]; + _visibleViewObjectMap = [[NSMapTable alloc] initWithKeyOptions:NSMapTableStrongMemory valueOptions:NSMapTableStrongMemory capacity:0]; + } + return self; +} + +- (id)pluckObjectForView:(UICollectionReusableView *)view { + NSMapTable *viewObjectMap = self.visibleViewObjectMap; + id object = [viewObjectMap objectForKey:view]; + [viewObjectMap removeObjectForKey:view]; + return object; +} + +- (void)willDisplayReusableView:(UICollectionReusableView *)view + forListAdapter:(IGListAdapter *)listAdapter + sectionController:(IGListSectionController *)sectionController + object:(id)object + indexPath:(NSIndexPath *)indexPath { + IGParameterAssert(view != nil); + IGParameterAssert(listAdapter != nil); + IGParameterAssert(object != nil); + IGParameterAssert(indexPath != nil); + + [self.visibleViewObjectMap setObject:object forKey:view]; + NSCountedSet *visibleListSections = self.visibleListSections; + if ([visibleListSections countForObject:sectionController] == 0) { + [sectionController.displayDelegate listAdapter:listAdapter willDisplaySectionController:sectionController]; + [listAdapter.delegate listAdapter:listAdapter willDisplayObject:object atIndex:indexPath.section]; + } + [visibleListSections addObject:sectionController]; +} + +- (void)didEndDisplayingReusableView:(UICollectionReusableView *)view + forListAdapter:(IGListAdapter *)listAdapter + sectionController:(IGListSectionController *)sectionController + object:(id)object + indexPath:(NSIndexPath *)indexPath { + IGParameterAssert(view != nil); + IGParameterAssert(listAdapter != nil); + IGParameterAssert(indexPath != nil); + + if (object == nil || sectionController == nil) { + return; + } + + const NSInteger section = indexPath.section; + + NSCountedSet *visibleSections = self.visibleListSections; + [visibleSections removeObject:sectionController]; + + if ([visibleSections countForObject:sectionController] == 0) { + [sectionController.displayDelegate listAdapter:listAdapter didEndDisplayingSectionController:sectionController]; + [listAdapter.delegate listAdapter:listAdapter didEndDisplayingObject:object atIndex:section]; + } +} + +- (void)willDisplaySupplementaryView:(UICollectionReusableView *)view + forListAdapter:(IGListAdapter *)listAdapter + sectionController:(IGListSectionController *)sectionController + object:(id)object + indexPath:(NSIndexPath *)indexPath { + [self willDisplayReusableView:view forListAdapter:listAdapter sectionController:sectionController object:object indexPath:indexPath]; +} + +- (void)didEndDisplayingSupplementaryView:(UICollectionReusableView *)view + forListAdapter:(IGListAdapter *)listAdapter + sectionController:(IGListSectionController *)sectionController + indexPath:(NSIndexPath *)indexPath { + // if cell display events break, don't send display events when the object has disappeared + id object = [self pluckObjectForView:view]; + [self didEndDisplayingReusableView:view forListAdapter:listAdapter sectionController:sectionController object:object indexPath:indexPath]; +} + +- (void)willDisplayCell:(UICollectionViewCell *)cell + forListAdapter:(IGListAdapter *)listAdapter + sectionController:(IGListSectionController *)sectionController + object:(id)object + indexPath:(NSIndexPath *)indexPath { + id displayDelegate = [sectionController displayDelegate]; + [displayDelegate listAdapter:listAdapter willDisplaySectionController:sectionController cell:cell atIndex:indexPath.item]; + [self willDisplayReusableView:cell forListAdapter:listAdapter sectionController:sectionController object:object indexPath:indexPath]; +} + +- (void)didEndDisplayingCell:(UICollectionViewCell *)cell + forListAdapter:(IGListAdapter *)listAdapter + sectionController:(IGListSectionController *)sectionController + indexPath:(NSIndexPath *)indexPath { + // if cell display events break, don't send cell events to the displayDelegate when the object has disappeared + id object = [self pluckObjectForView:cell]; + if (object == nil) { + return; + } + + [sectionController.displayDelegate listAdapter:listAdapter didEndDisplayingSectionController:sectionController cell:cell atIndex:indexPath.item]; + [self didEndDisplayingReusableView:cell forListAdapter:listAdapter sectionController:sectionController object:object indexPath:indexPath]; +} + +@end diff --git a/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListReloadIndexPath.h b/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListReloadIndexPath.h new file mode 100644 index 00000000..f92ca7dc --- /dev/null +++ b/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListReloadIndexPath.h @@ -0,0 +1,54 @@ +/** + * Copyright (c) 2016-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** + An object with index path information for reloading an item during a batch update. + */ +IGLK_SUBCLASSING_RESTRICTED +@interface IGListReloadIndexPath : NSObject + +/** + The index path of the item before batch updates are applied. + */ +@property (nonatomic, strong, readonly) NSIndexPath *fromIndexPath; + +/** + The index path of the item after batch updates are applied. + */ +@property (nonatomic, strong, readonly) NSIndexPath *toIndexPath; + +/** + Creates a new reload object. + + @param fromIndexPath The index path of the item before batch updates. + @param toIndexPath The index path of the item after batch updates. + @return A new reload object. + */ +- (instancetype)initWithFromIndexPath:(NSIndexPath *)fromIndexPath + toIndexPath:(NSIndexPath *)toIndexPath NS_DESIGNATED_INITIALIZER; + +/** + :nodoc: + */ +- (instancetype)init NS_UNAVAILABLE; + +/** + :nodoc: + */ ++ (instancetype)new NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListReloadIndexPath.m b/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListReloadIndexPath.m new file mode 100644 index 00000000..a1ea5969 --- /dev/null +++ b/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListReloadIndexPath.m @@ -0,0 +1,23 @@ +/** + * Copyright (c) 2016-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import "IGListReloadIndexPath.h" + +@implementation IGListReloadIndexPath + +- (instancetype)initWithFromIndexPath:(NSIndexPath *)fromIndexPath + toIndexPath:(NSIndexPath *)toIndexPath { + if (self = [super init]) { + _fromIndexPath = fromIndexPath; + _toIndexPath = toIndexPath; + } + return self; +} + +@end diff --git a/Project 27 - Marslink/Pods/IGListKit/Source/Internal/IGListSectionControllerInternal.h b/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListSectionControllerInternal 2.h similarity index 100% rename from Project 27 - Marslink/Pods/IGListKit/Source/Internal/IGListSectionControllerInternal.h rename to Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListSectionControllerInternal 2.h diff --git a/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListSectionControllerInternal.h b/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListSectionControllerInternal.h new file mode 100644 index 00000000..e450039c --- /dev/null +++ b/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListSectionControllerInternal.h @@ -0,0 +1,28 @@ +/** + * Copyright (c) 2016-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import "IGListSectionController.h" + +FOUNDATION_EXTERN void IGListSectionControllerPushThread(UIViewController *viewController, id collectionContext); + +FOUNDATION_EXTERN void IGListSectionControllerPopThread(void); + +@interface IGListSectionController() + +@property (nonatomic, weak, readwrite) id collectionContext; + +@property (nonatomic, weak, readwrite) UIViewController *viewController; + +@property (nonatomic, assign, readwrite) NSInteger section; + +@property (nonatomic, assign, readwrite) BOOL isFirstSection; + +@property (nonatomic, assign, readwrite) BOOL isLastSection; + +@end diff --git a/Project 27 - Marslink/Pods/IGListKit/Source/Internal/IGListSectionMap.h b/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListSectionMap 2.h similarity index 100% rename from Project 27 - Marslink/Pods/IGListKit/Source/Internal/IGListSectionMap.h rename to Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListSectionMap 2.h diff --git a/Project 27 - Marslink/Pods/IGListKit/Source/Internal/IGListSectionMap.m b/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListSectionMap 2.m similarity index 100% rename from Project 27 - Marslink/Pods/IGListKit/Source/Internal/IGListSectionMap.m rename to Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListSectionMap 2.m diff --git a/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListSectionMap+DebugDescription.h b/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListSectionMap+DebugDescription.h new file mode 100644 index 00000000..299b8fdc --- /dev/null +++ b/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListSectionMap+DebugDescription.h @@ -0,0 +1,18 @@ +/** + * Copyright (c) 2016-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import + +#import "IGListSectionMap.h" + +@interface IGListSectionMap (DebugDescription) + +- (NSArray *)debugDescriptionLines; + +@end diff --git a/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListSectionMap+DebugDescription.m b/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListSectionMap+DebugDescription.m new file mode 100644 index 00000000..279dfeba --- /dev/null +++ b/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListSectionMap+DebugDescription.m @@ -0,0 +1,31 @@ +/** + * Copyright (c) 2016-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import "IGListSectionMap+DebugDescription.h" +#import "IGListBindingSectionController.h" + +@implementation IGListSectionMap (DebugDescription) + +- (NSArray *)debugDescriptionLines { + NSMutableArray *debug = [NSMutableArray new]; +#if IGLK_DEBUG_DESCRIPTION_ENABLED + [self enumerateUsingBlock:^(id object, IGListSectionController *sectionController, NSInteger section, BOOL *stop) { + if ([sectionController isKindOfClass:[IGListBindingSectionController class]]) { + [debug addObject:[sectionController debugDescription]]; + } else { + [debug addObject:[NSString stringWithFormat:@"Object and section controller at section: %zi:", section]]; + [debug addObject:[NSString stringWithFormat:@" %@", object]]; + [debug addObject:[NSString stringWithFormat:@" %@", sectionController]]; + } + }]; +#endif // #if IGLK_DEBUG_DESCRIPTION_ENABLED + return debug; +} + +@end diff --git a/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListSectionMap.h b/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListSectionMap.h new file mode 100644 index 00000000..54ecba53 --- /dev/null +++ b/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListSectionMap.h @@ -0,0 +1,117 @@ +/** + * Copyright (c) 2016-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import + +#import + +@class IGListSectionController; + + +NS_ASSUME_NONNULL_BEGIN + +/** + The IGListSectionMap provides a way to map a collection of objects to a collection of section controllers and achieve + constant-time lookups O(1). + + IGListSectionMap is a mutable object and does not guarantee thread safety. + */ +IGLK_SUBCLASSING_RESTRICTED +@interface IGListSectionMap : NSObject + +- (instancetype)initWithMapTable:(NSMapTable *)mapTable NS_DESIGNATED_INITIALIZER; + +/** + The objects stored in the map. + */ +@property (nonatomic, strong, readonly) NSArray *objects; + +/** + Update the map with objects and the section controller counterparts. + + @param objects The objects in the collection. + @param sectionControllers The section controllers that map to each object. + */ +- (void)updateWithObjects:(NSArray > *)objects sectionControllers:(NSArray *)sectionControllers; + +/** + Fetch a section controller given a section. + + @param section The section index of the section controller. + + @return A section controller. + */ +- (nullable IGListSectionController *)sectionControllerForSection:(NSInteger)section; + +/** + Fetch the object for a section + + @param section The section index of the object. + + @return The object corresponding to the section. + */ +- (nullable id)objectForSection:(NSInteger)section; + +/** + Fetch a section controller given an object. Can return nil. + + @param object The object that maps to a section controller. + + @return A section controller. + */ +- (nullable id)sectionControllerForObject:(id)object; + +/** + Look up the section index for a section controller. + + @param sectionController The list to look up. + + @return The section index of the given section controller if it exists, NSNotFound otherwise. + */ +- (NSInteger)sectionForSectionController:(id)sectionController; + +/** + Look up the section index for an object. + + @param object The object to look up. + + @return The section index of the given object if it exists, NSNotFound otherwise. + */ +- (NSInteger)sectionForObject:(id)object; + +/** + Remove all saved objects and section controllers. + */ +- (void)reset; + +/** + Update an object with a new instance. + */ +- (void)updateObject:(id)object; + +/** + Applies a given block object to the entries of the section controller map. + + @param block A block object to operate on entries in the section controller map. + */ +- (void)enumerateUsingBlock:(void (^)(id object, IGListSectionController *sectionController, NSInteger section, BOOL *stop))block; + +/** + :nodoc: + */ +- (instancetype)init NS_UNAVAILABLE; + +/** + :nodoc: + */ ++ (instancetype)new NS_UNAVAILABLE; + +@end + +NS_ASSUME_NONNULL_END diff --git a/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListSectionMap.m b/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListSectionMap.m new file mode 100644 index 00000000..7f6f1aca --- /dev/null +++ b/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListSectionMap.m @@ -0,0 +1,157 @@ +/** + * Copyright (c) 2016-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import "IGListSectionMap.h" + +#import + +#import "IGListSectionControllerInternal.h" + +@interface IGListSectionMap () + +// both of these maps allow fast lookups of objects, list objects, and indexes +@property (nonatomic, strong, readonly, nonnull) NSMapTable *objectToSectionControllerMap; +@property (nonatomic, strong, readonly, nonnull) NSMapTable *sectionControllerToSectionMap; + +@property (nonatomic, strong, nonnull) NSMutableArray *mObjects; + +@end + +@implementation IGListSectionMap + +- (instancetype)initWithMapTable:(NSMapTable *)mapTable { + IGParameterAssert(mapTable != nil); + + if (self = [super init]) { + _objectToSectionControllerMap = [mapTable copy]; + + // lookup list objects by pointer equality + _sectionControllerToSectionMap = [[NSMapTable alloc] initWithKeyOptions:NSMapTableStrongMemory | NSMapTableObjectPointerPersonality + valueOptions:NSMapTableStrongMemory + capacity:0]; + _mObjects = [NSMutableArray new]; + } + return self; +} + + +#pragma mark - Public API + +- (NSArray *)objects { + return [self.mObjects copy]; +} + +- (NSInteger)sectionForSectionController:(IGListSectionController *)sectionController { + IGParameterAssert(sectionController != nil); + + NSNumber *index = [self.sectionControllerToSectionMap objectForKey:sectionController]; + return index != nil ? [index integerValue] : NSNotFound; +} + +- (IGListSectionController *)sectionControllerForSection:(NSInteger)section { + return [self.objectToSectionControllerMap objectForKey:[self objectForSection:section]]; +} + +- (void)updateWithObjects:(NSArray *)objects sectionControllers:(NSArray *)sectionControllers { + IGParameterAssert(objects.count == sectionControllers.count); + + [self reset]; + + self.mObjects = [objects mutableCopy]; + + id firstObject = objects.firstObject; + id lastObject = objects.lastObject; + + [objects enumerateObjectsUsingBlock:^(id object, NSUInteger idx, BOOL *stop) { + IGListSectionController *sectionController = sectionControllers[idx]; + + // set the index of the list for easy reverse lookup + [self.sectionControllerToSectionMap setObject:@(idx) forKey:sectionController]; + [self.objectToSectionControllerMap setObject:sectionController forKey:object]; + + sectionController.isFirstSection = (object == firstObject); + sectionController.isLastSection = (object == lastObject); + sectionController.section = (NSInteger)idx; + }]; +} + +- (nullable IGListSectionController *)sectionControllerForObject:(id)object { + IGParameterAssert(object != nil); + + return [self.objectToSectionControllerMap objectForKey:object]; +} + +- (nullable id)objectForSection:(NSInteger)section { + NSArray *objects = self.mObjects; + if (section < objects.count) { + return objects[section]; + } else { + return nil; + } +} + +- (NSInteger)sectionForObject:(id)object { + IGParameterAssert(object != nil); + + id sectionController = [self sectionControllerForObject:object]; + if (sectionController == nil) { + return NSNotFound; + } else { + return [self sectionForSectionController:sectionController]; + } +} + +- (void)reset { + [self enumerateUsingBlock:^(id _Nonnull object, IGListSectionController * _Nonnull sectionController, NSInteger section, BOOL * _Nonnull stop) { + sectionController.section = NSNotFound; + sectionController.isFirstSection = NO; + sectionController.isLastSection = NO; + }]; + + [self.sectionControllerToSectionMap removeAllObjects]; + [self.objectToSectionControllerMap removeAllObjects]; +} + +- (void)updateObject:(id)object { + IGParameterAssert(object != nil); + const NSInteger section = [self sectionForObject:object]; + id sectionController = [self sectionControllerForObject:object]; + [self.sectionControllerToSectionMap setObject:@(section) forKey:sectionController]; + [self.objectToSectionControllerMap setObject:sectionController forKey:object]; + self.mObjects[section] = object; +} + +- (void)enumerateUsingBlock:(void (^)(id object, IGListSectionController *sectionController, NSInteger section, BOOL *stop))block { + IGParameterAssert(block != nil); + + BOOL stop = NO; + NSArray *objects = self.objects; + for (NSInteger section = 0; section < objects.count; section++) { + id object = objects[section]; + IGListSectionController *sectionController = [self sectionControllerForObject:object]; + block(object, sectionController, section, &stop); + if (stop) { + break; + } + } +} + + +#pragma mark - NSCopying + +- (id)copyWithZone:(NSZone *)zone { + IGListSectionMap *copy = [[IGListSectionMap allocWithZone:zone] initWithMapTable:self.objectToSectionControllerMap]; + if (copy != nil) { + copy->_sectionControllerToSectionMap = [self.sectionControllerToSectionMap copy]; + copy->_mObjects = [self.mObjects mutableCopy]; + } + return copy; +} + +@end diff --git a/Project 27 - Marslink/Pods/IGListKit/Source/Internal/IGListStackedSectionControllerInternal.h b/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListStackedSectionControllerInternal 2.h similarity index 100% rename from Project 27 - Marslink/Pods/IGListKit/Source/Internal/IGListStackedSectionControllerInternal.h rename to Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListStackedSectionControllerInternal 2.h diff --git a/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListStackedSectionControllerInternal.h b/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListStackedSectionControllerInternal.h new file mode 100644 index 00000000..252af5a7 --- /dev/null +++ b/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListStackedSectionControllerInternal.h @@ -0,0 +1,44 @@ +/** + * Copyright (c) 2016-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import + +#import "IGListStackedSectionController.h" + +@interface IGListStackedSectionController () +< +IGListBatchContext, +IGListCollectionContext, +IGListDisplayDelegate, +IGListScrollDelegate, +IGListWorkingRangeDelegate +> + +@property (nonatomic, strong, readonly) NSOrderedSet<__kindof IGListSectionController *> *sectionControllers; + +/// An array the length of the total number of items in the stack, pointing to a section controller for the item index. +@property (nonatomic, copy) NSArray *sectionControllersForItems; + +/// An array of index offsets for each item in the flattened stack. +@property (nonatomic, copy) NSArray *sectionControllerOffsets; + +/// A cached collection of the number of items summed from each section controller in the stack. +@property (nonatomic, assign) NSInteger flattenedNumberOfItems; + +/// A counted set of the visible section controllers, used to forward granular display events to child section controllers +@property (nonatomic, strong, readonly) NSCountedSet *visibleSectionControllers; + +/// Temporary batch context so the stack controller can transform child indices within the stack before updating. +@property (nonatomic, strong) id forwardingBatchContext; + +- (IGListSectionController *)sectionControllerForObjectIndex:(NSInteger)itemIndex; +- (NSInteger)offsetForSectionController:(IGListSectionController *)sectionController; +- (void)reloadData; + +@end diff --git a/Project 27 - Marslink/Pods/IGListKit/Source/Internal/IGListWorkingRangeHandler.h b/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListWorkingRangeHandler 2.h similarity index 100% rename from Project 27 - Marslink/Pods/IGListKit/Source/Internal/IGListWorkingRangeHandler.h rename to Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListWorkingRangeHandler 2.h diff --git a/Project 27 - Marslink/Pods/IGListKit/Source/Internal/IGListWorkingRangeHandler.mm b/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListWorkingRangeHandler 2.mm similarity index 100% rename from Project 27 - Marslink/Pods/IGListKit/Source/Internal/IGListWorkingRangeHandler.mm rename to Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListWorkingRangeHandler 2.mm diff --git a/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListWorkingRangeHandler.h b/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListWorkingRangeHandler.h new file mode 100644 index 00000000..acf7058c --- /dev/null +++ b/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListWorkingRangeHandler.h @@ -0,0 +1,44 @@ +/** + * Copyright (c) 2016-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import + +@class IGListAdapter; + + + +@interface IGListWorkingRangeHandler : NSObject + +/** + Initializes the working range handler. + + @param workingRangeSize the number of sections beyond the visible viewport that should be considered within the working + range. Applies equally in both directions above and below the viewport. + */ +- (instancetype)initWithWorkingRangeSize:(NSInteger)workingRangeSize; + +/** + Tells the handler that a cell will be displayed in the IGListKit infra. + + @param indexPath The index path of the cell in the UICollectionView. + @param listAdapter The adapter managing the infra. + */ +- (void)willDisplayItemAtIndexPath:(NSIndexPath *)indexPath + forListAdapter:(IGListAdapter *)listAdapter; + +/** + Tells the handler that a cell did end display in the IGListKit infra. + + @param indexPath The index path of the cell in the UICollectionView. + @param listAdapter The adapter managing the infra. + */ +- (void)didEndDisplayingItemAtIndexPath:(NSIndexPath *)indexPath + forListAdapter:(IGListAdapter *)listAdapter; + +@end diff --git a/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListWorkingRangeHandler.mm b/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListWorkingRangeHandler.mm new file mode 100644 index 00000000..f247d389 --- /dev/null +++ b/Project 29 - Marslink/Pods/IGListKit/Source/Internal/IGListWorkingRangeHandler.mm @@ -0,0 +1,160 @@ +/** + * Copyright (c) 2016-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import "IGListWorkingRangeHandler.h" + +#import +#import +#import + +#import +#import +#import +#import + +#import "IGListWorkingRangeDelegate.h" + +struct _IGListWorkingRangeHandlerIndexPath { + NSInteger section; + NSInteger row; + size_t hash; + + bool operator==(const _IGListWorkingRangeHandlerIndexPath &other) const { + return (section == other.section && row == other.row); + } +}; + +struct _IGListWorkingRangeHandlerSectionControllerWrapper { + IGListSectionController *sectionController; + + bool operator==(const _IGListWorkingRangeHandlerSectionControllerWrapper &other) const { + return (sectionController == other.sectionController); + } +}; + +struct _IGListWorkingRangeHandlerIndexPathHash { + size_t operator()(const _IGListWorkingRangeHandlerIndexPath& o) const { + return (size_t)o.hash; + } +}; + +struct _IGListWorkingRangeHashID { + size_t operator()(const _IGListWorkingRangeHandlerSectionControllerWrapper &o) const { + return (size_t)[o.sectionController hash]; + } +}; + +typedef std::unordered_set<_IGListWorkingRangeHandlerSectionControllerWrapper, _IGListWorkingRangeHashID> _IGListWorkingRangeSectionControllerSet; +typedef std::unordered_set<_IGListWorkingRangeHandlerIndexPath, _IGListWorkingRangeHandlerIndexPathHash> _IGListWorkingRangeIndexPathSet; + +@interface IGListWorkingRangeHandler () + +@property (nonatomic, assign, readonly) NSInteger workingRangeSize; + +@end + +@implementation IGListWorkingRangeHandler { + _IGListWorkingRangeIndexPathSet _visibleSectionIndices; + _IGListWorkingRangeSectionControllerSet _workingRangeSectionControllers; +} + +- (instancetype)initWithWorkingRangeSize:(NSInteger)workingRangeSize { + if (self = [super init]) { + _workingRangeSize = workingRangeSize; + } + return self; +} + +- (void)willDisplayItemAtIndexPath:(NSIndexPath *)indexPath + forListAdapter:(IGListAdapter *)listAdapter { + IGParameterAssert(indexPath != nil); + IGParameterAssert(listAdapter != nil); + + _visibleSectionIndices.insert({ + .section = indexPath.section, + .row = indexPath.row, + .hash = indexPath.hash + }); + + [self updateWorkingRangesWithListAdapter:listAdapter]; +} + +- (void)didEndDisplayingItemAtIndexPath:(NSIndexPath *)indexPath + forListAdapter:(IGListAdapter *)listAdapter { + IGParameterAssert(indexPath != nil); + IGParameterAssert(listAdapter != nil); + + _visibleSectionIndices.erase({ + .section = indexPath.section, + .row = indexPath.row, + .hash = indexPath.hash + }); + + [self updateWorkingRangesWithListAdapter:listAdapter]; +} + +#pragma mark - Working Ranges + +- (void)updateWorkingRangesWithListAdapter:(IGListAdapter *)listAdapter { + IGAssertMainThread(); + // This method is optimized C++ to improve straight-line speed of these operations. Change at your peril. + + // We use a std::set because it is ordered. + std::set visibleSectionSet = std::set(); + for (const _IGListWorkingRangeHandlerIndexPath &indexPath : _visibleSectionIndices) { + visibleSectionSet.insert(indexPath.section); + } + + NSInteger start; + NSInteger end; + if (visibleSectionSet.size() == 0) { + // We're now devoid of any visible sections. Bail + start = 0; + end = 0; + } else { + start = MAX(*visibleSectionSet.begin() - _workingRangeSize, 0); + end = MIN(*visibleSectionSet.rbegin() + 1 + _workingRangeSize, (NSInteger)listAdapter.objects.count); + } + + // Build the current set of working range section controllers + _IGListWorkingRangeSectionControllerSet workingRangeSectionControllers (visibleSectionSet.size()); + for (NSInteger idx = start; idx < end; idx++) { + id item = [listAdapter objectAtSection:idx]; + IGListSectionController *sectionController = [listAdapter sectionControllerForObject:item]; + workingRangeSectionControllers.insert({sectionController}); + } + + IGAssert(workingRangeSectionControllers.size() < 1000, @"This algorithm is way too slow with so many objects:%lu", workingRangeSectionControllers.size()); + + // Tell any new section controllers that they have entered the working range + for (const _IGListWorkingRangeHandlerSectionControllerWrapper &wrapper : workingRangeSectionControllers) { + // Check if the item exists in the old working range item array. + auto it = _workingRangeSectionControllers.find(wrapper); + if (it == _workingRangeSectionControllers.end()) { + // The section controller isn't in the existing list, so it's new. + id workingRangeDelegate = wrapper.sectionController.workingRangeDelegate; + [workingRangeDelegate listAdapter:listAdapter sectionControllerWillEnterWorkingRange:wrapper.sectionController]; + } + } + + // Tell any removed section controllers that they have exited the working range + for (const _IGListWorkingRangeHandlerSectionControllerWrapper &wrapper : _workingRangeSectionControllers) { + // Check if the item exists in the new list of section controllers + auto it = workingRangeSectionControllers.find(wrapper); + if (it == workingRangeSectionControllers.end()) { + // If the item does not exist in the new list, then it's been removed. + id workingRangeDelegate = wrapper.sectionController.workingRangeDelegate; + [workingRangeDelegate listAdapter:listAdapter sectionControllerDidExitWorkingRange:wrapper.sectionController]; + } + } + + _workingRangeSectionControllers = workingRangeSectionControllers; +} + +@end diff --git a/Project 29 - Marslink/Pods/IGListKit/Source/Internal/UICollectionView+DebugDescription.h b/Project 29 - Marslink/Pods/IGListKit/Source/Internal/UICollectionView+DebugDescription.h new file mode 100644 index 00000000..d9b016de --- /dev/null +++ b/Project 29 - Marslink/Pods/IGListKit/Source/Internal/UICollectionView+DebugDescription.h @@ -0,0 +1,16 @@ +/** + * Copyright (c) 2016-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import + +@interface UICollectionView (DebugDescription) + +- (NSArray *)debugDescriptionLines; + +@end diff --git a/Project 29 - Marslink/Pods/IGListKit/Source/Internal/UICollectionView+DebugDescription.m b/Project 29 - Marslink/Pods/IGListKit/Source/Internal/UICollectionView+DebugDescription.m new file mode 100644 index 00000000..f1aa4c74 --- /dev/null +++ b/Project 29 - Marslink/Pods/IGListKit/Source/Internal/UICollectionView+DebugDescription.m @@ -0,0 +1,45 @@ +/** + * Copyright (c) 2016-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import "UICollectionView+DebugDescription.h" + +#import + +@implementation UICollectionView (DebugDescription) + +- (NSArray *)debugDescriptionLines { + NSMutableArray *debug = [NSMutableArray new]; +#if IGLK_DEBUG_DESCRIPTION_ENABLED + [debug addObject:[NSString stringWithFormat:@"Class: %@, instance: %p", NSStringFromClass(self.class), self]]; + [debug addObject:[NSString stringWithFormat:@"Data source: %@", self.dataSource]]; + [debug addObject:[NSString stringWithFormat:@"Delegate: %@", self.delegate]]; + [debug addObject:[NSString stringWithFormat:@"Layout: %@", self.collectionViewLayout]]; + [debug addObject:[NSString stringWithFormat:@"Frame: %@, bounds: %@", + NSStringFromCGRect(self.frame), NSStringFromCGRect(self.bounds)]]; + + const NSInteger sections = [self numberOfSections]; + [debug addObject:[NSString stringWithFormat:@"Number of sections: %lld", (long long)sections]]; + + for (NSInteger section = 0; section < sections; section++) { + [debug addObject:[NSString stringWithFormat:@" %lld items in section %lld", + (long long)[self numberOfItemsInSection:section], (long long)section]]; + } + + [debug addObject:@"Visible cell details:"]; + NSArray *visibleIndexPaths = [[self indexPathsForVisibleItems] sortedArrayUsingSelector:@selector(compare:)]; + for (NSIndexPath *path in visibleIndexPaths) { + [debug addObject:[NSString stringWithFormat:@" Visible cell at section %lld, item %lld:", + (long long)path.section, (long long)path.item]]; + [debug addObject:[NSString stringWithFormat:@" %@", [[self cellForItemAtIndexPath:path] description] ?: @""]]; + } +#endif // #if IGLK_DEBUG_DESCRIPTION_ENABLED + return debug; +} + +@end diff --git a/Project 27 - Marslink/Pods/IGListKit/Source/Internal/UICollectionView+IGListBatchUpdateData.h b/Project 29 - Marslink/Pods/IGListKit/Source/Internal/UICollectionView+IGListBatchUpdateData 2.h similarity index 100% rename from Project 27 - Marslink/Pods/IGListKit/Source/Internal/UICollectionView+IGListBatchUpdateData.h rename to Project 29 - Marslink/Pods/IGListKit/Source/Internal/UICollectionView+IGListBatchUpdateData 2.h diff --git a/Project 27 - Marslink/Pods/IGListKit/Source/Internal/UICollectionView+IGListBatchUpdateData.m b/Project 29 - Marslink/Pods/IGListKit/Source/Internal/UICollectionView+IGListBatchUpdateData 2.m similarity index 100% rename from Project 27 - Marslink/Pods/IGListKit/Source/Internal/UICollectionView+IGListBatchUpdateData.m rename to Project 29 - Marslink/Pods/IGListKit/Source/Internal/UICollectionView+IGListBatchUpdateData 2.m diff --git a/Project 29 - Marslink/Pods/IGListKit/Source/Internal/UICollectionView+IGListBatchUpdateData.h b/Project 29 - Marslink/Pods/IGListKit/Source/Internal/UICollectionView+IGListBatchUpdateData.h new file mode 100644 index 00000000..36af9bfc --- /dev/null +++ b/Project 29 - Marslink/Pods/IGListKit/Source/Internal/UICollectionView+IGListBatchUpdateData.h @@ -0,0 +1,18 @@ +/** + * Copyright (c) 2016-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import + +@class IGListBatchUpdateData; + +@interface UICollectionView (IGListBatchUpdateData) + +- (void)ig_applyBatchUpdateData:(IGListBatchUpdateData *)updateData; + +@end diff --git a/Project 29 - Marslink/Pods/IGListKit/Source/Internal/UICollectionView+IGListBatchUpdateData.m b/Project 29 - Marslink/Pods/IGListKit/Source/Internal/UICollectionView+IGListBatchUpdateData.m new file mode 100644 index 00000000..0dffcb41 --- /dev/null +++ b/Project 29 - Marslink/Pods/IGListKit/Source/Internal/UICollectionView+IGListBatchUpdateData.m @@ -0,0 +1,32 @@ +/** + * Copyright (c) 2016-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import "UICollectionView+IGListBatchUpdateData.h" + +#import "IGListBatchUpdateData.h" + +@implementation UICollectionView (IGListBatchUpdateData) + +- (void)ig_applyBatchUpdateData:(IGListBatchUpdateData *)updateData { + [self deleteItemsAtIndexPaths:updateData.deleteIndexPaths]; + [self insertItemsAtIndexPaths:updateData.insertIndexPaths]; + + for (IGListMoveIndexPath *move in updateData.moveIndexPaths) { + [self moveItemAtIndexPath:move.from toIndexPath:move.to]; + } + + for (IGListMoveIndex *move in updateData.moveSections) { + [self moveSection:move.from toSection:move.to]; + } + + [self deleteSections:updateData.deleteSections]; + [self insertSections:updateData.insertSections]; +} + +@end diff --git a/Project 29 - Marslink/Pods/Local Podspecs/IGListKit.podspec.json b/Project 29 - Marslink/Pods/Local Podspecs/IGListKit.podspec.json new file mode 100644 index 00000000..3525ee59 --- /dev/null +++ b/Project 29 - Marslink/Pods/Local Podspecs/IGListKit.podspec.json @@ -0,0 +1,68 @@ +{ + "name": "IGListKit", + "version": "3.1.1", + "summary": "A data-driven UICollectionView framework.", + "homepage": "https://github.com/Instagram/IGListKit", + "documentation_url": "https://instagram.github.io/IGListKit", + "description": "A data-driven UICollectionView framework for building fast and flexible lists.", + "license": { + "type": "BSD" + }, + "authors": "Instagram", + "social_media_url": "https://twitter.com/fbOpenSource", + "source": { + "git": "https://github.com/Instagram/IGListKit.git", + "tag": "3.1.1", + "branch": "stable" + }, + "default_subspecs": "Default", + "requires_arc": true, + "platforms": { + "ios": "8.0", + "tvos": "9.0", + "osx": "10.10" + }, + "ios": { + "frameworks": "UIKit" + }, + "tvos": { + "frameworks": "UIKit" + }, + "osx": { + "frameworks": "Cocoa" + }, + "libraries": "c++", + "pod_target_xcconfig": { + "CLANG_CXX_LANGUAGE_STANDARD": "c++11", + "CLANG_CXX_LIBRARY": "libc++" + }, + "subspecs": [ + { + "name": "Diffing", + "source_files": "Source/Common/**/*.{h,m,mm}", + "private_header_files": "Source/Common/Internal/*.h" + }, + { + "name": "Default", + "dependencies": { + "IGListKit/Diffing": [ + + ] + }, + "ios": { + "source_files": "Source/**/*.{h,m,mm}", + "private_header_files": [ + "Source/Internal/*.h", + "Source/Common/Internal/*.h" + ] + }, + "tvos": { + "source_files": "Source/**/*.{h,m,mm}", + "private_header_files": [ + "Source/Internal/*.h", + "Source/Common/Internal/*.h" + ] + } + } + ] +} diff --git a/Project 29 - Marslink/Pods/Manifest.lock b/Project 29 - Marslink/Pods/Manifest.lock new file mode 100644 index 00000000..01f3cf69 --- /dev/null +++ b/Project 29 - Marslink/Pods/Manifest.lock @@ -0,0 +1,26 @@ +PODS: + - IGListKit (3.1.1): + - IGListKit/Default (= 3.1.1) + - IGListKit/Default (3.1.1): + - IGListKit/Diffing + - IGListKit/Diffing (3.1.1) + +DEPENDENCIES: + - IGListKit (from `https://github.com/Instagram/IGListKit.git`, branch `master`) + +EXTERNAL SOURCES: + IGListKit: + :branch: master + :git: https://github.com/Instagram/IGListKit.git + +CHECKOUT OPTIONS: + IGListKit: + :commit: 0f04a073194033fbfc6f1d916fad83838042a7c0 + :git: https://github.com/Instagram/IGListKit.git + +SPEC CHECKSUMS: + IGListKit: cb97f405ae43e59fe1da74271e19427ec20d3c07 + +PODFILE CHECKSUM: c789b282c42fef7042ba9bbaed1c59874ce5025d + +COCOAPODS: 1.2.0.beta.1 diff --git a/Project 29 - Marslink/Pods/Pods.xcodeproj/project.pbxproj b/Project 29 - Marslink/Pods/Pods.xcodeproj/project.pbxproj new file mode 100644 index 00000000..b9d08c1d --- /dev/null +++ b/Project 29 - Marslink/Pods/Pods.xcodeproj/project.pbxproj @@ -0,0 +1,948 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 000E239471A0EBAD60CB6195B5F79828 /* IGListAdapterProxy.h in Headers */ = {isa = PBXBuildFile; fileRef = 240B76B48241A59A6E709EE612825321 /* IGListAdapterProxy.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 0432166B2C8644CF44E7850511639C86 /* IGListReloadDataUpdater.h in Headers */ = {isa = PBXBuildFile; fileRef = 482E0C7673619FC7C95573093872DFFA /* IGListReloadDataUpdater.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 06943A7770B67047E43476F9A2D75DDA /* IGListMoveIndex.m in Sources */ = {isa = PBXBuildFile; fileRef = E89E2E65872110A42CFBE269D930CEF9 /* IGListMoveIndex.m */; }; + 069B74B76CEA27EE4BF57B2680438C5B /* IGListAdapterUpdater.h in Headers */ = {isa = PBXBuildFile; fileRef = DD593B0EEA8A99AD3C0483011596B467 /* IGListAdapterUpdater.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 09CEC673F58295DC0AC67C20BBF34BB1 /* IGListBindingSectionController.m in Sources */ = {isa = PBXBuildFile; fileRef = FD9E4EE16963E3F362FBA42923738E0F /* IGListBindingSectionController.m */; }; + 0A481DCFB6EBC9BEF7B5DB3A464AEF04 /* IGListWorkingRangeHandler.mm in Sources */ = {isa = PBXBuildFile; fileRef = 40B25C1D691536925F06B183FD43E6EC /* IGListWorkingRangeHandler.mm */; }; + 0EB88E66FFE4CECE12625B6F9619C3D9 /* IGListAdapterUpdaterInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 9C6F5ACA7035A54D4C503BA10C29B46C /* IGListAdapterUpdaterInternal.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 11D215B1EBE305CD58949CC136D0966B /* IGListIndexPathResultInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 91A581F909855E363C929073574C5761 /* IGListIndexPathResultInternal.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 126ADE896FACE07BEB0C55B0FBD2984B /* IGListMacros.h in Headers */ = {isa = PBXBuildFile; fileRef = 7F67F9FE07AB351D467CDFCB787985B1 /* IGListMacros.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 133960EE50FD9C80826B48383BC89277 /* IGListReloadIndexPath.m in Sources */ = {isa = PBXBuildFile; fileRef = 91187C3F582F75282D8E6EBBEF089EDF /* IGListReloadIndexPath.m */; }; + 137C45ECC2360170D79FEC8627F2AD6F /* IGListCollectionContext.h in Headers */ = {isa = PBXBuildFile; fileRef = 5D6FC1BF374F1B67AA37483A2F9107F2 /* IGListCollectionContext.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 13C4C4D9D2E78C99D801E1C44AAE6714 /* IGListDebugger.m in Sources */ = {isa = PBXBuildFile; fileRef = CF5FB2D4E0155741E41D1989D40072DD /* IGListDebugger.m */; }; + 154D881DB9AB9A1C7D7691D43A7FF2DE /* IGListAdapterProxy.m in Sources */ = {isa = PBXBuildFile; fileRef = 403CAF9FF70EE1DCB0DBFE3D4F117BB2 /* IGListAdapterProxy.m */; }; + 168016B44DD4CB68A2E02D5127E21024 /* IGListBatchUpdateData+DebugDescription.h in Headers */ = {isa = PBXBuildFile; fileRef = 850FD3FC368DB2F151167967BDD41EE1 /* IGListBatchUpdateData+DebugDescription.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 18FD56431CF1C10CB674A67D0DFB51BD /* IGListBatchUpdateData.mm in Sources */ = {isa = PBXBuildFile; fileRef = 555054F4DC377290E4B9AE0129749D13 /* IGListBatchUpdateData.mm */; }; + 19D468FAC7F26841628DA94C698C92DD /* IGListMoveIndexPath.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C7070EFF9A10C05B6659303F7C126AC /* IGListMoveIndexPath.m */; }; + 276AC4F82ACF09C032687CF1A5FA692A /* NSString+IGListDiffable.h in Headers */ = {isa = PBXBuildFile; fileRef = 1141964E047B4E43CF42F5F87D8E1C4F /* NSString+IGListDiffable.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 280BD09F8403F7419DE5B2077BDB7661 /* IGListDebugger.h in Headers */ = {isa = PBXBuildFile; fileRef = E12996472F339D3B7280E64A38DA3AF2 /* IGListDebugger.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 280F74839065CF25EAB795A27C49A43E /* IGListDiffKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 3C28188356EC05CD8AE704DE99D52B36 /* IGListDiffKit.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 29CA1AFB3A198F8BD823DC0F005EE0B2 /* IGListBatchContext.h in Headers */ = {isa = PBXBuildFile; fileRef = E8CE4754FDAE8C5D8A07E47FDE4BC7F1 /* IGListBatchContext.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 2AFF76F61A56D45B8245FDC53DDC134A /* IGListDiff.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5DCF00E444A0256B890DE0146DDC035C /* IGListDiff.mm */; }; + 2D8959D7283A997592266F855C2AEFC7 /* IGListAssert.h in Headers */ = {isa = PBXBuildFile; fileRef = BBC40E8CAC326FFADC13BA9EC59384D2 /* IGListAssert.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 2E1A9095D891D1B7A2152ADF6D773401 /* Pods-Marslink-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B4AC447EBDD0F94086F6DA64FDEBFA9 /* Pods-Marslink-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3029DB1A27C55F84F1AC2C46DE87D925 /* IGListStackedSectionController.m in Sources */ = {isa = PBXBuildFile; fileRef = 44BD96B1FAEA851CD241B95CCE8CDE79 /* IGListStackedSectionController.m */; }; + 32B83F6D28B85D7F9A4E21C0B584F8DE /* IGListDebuggingUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = 2F314E1A2573881CD3A9753B9510AEA1 /* IGListDebuggingUtilities.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 32E7E8C6A02B4FE9AA6B432EA4C00E55 /* IGListIndexSetResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 8FCF4D5ECB8D97EF0725C9CAF13C4937 /* IGListIndexSetResult.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 3B916A544B6BFB6242F4FB1146E110E3 /* IGListAdapter+UICollectionView.h in Headers */ = {isa = PBXBuildFile; fileRef = 43870C56350DDB385A793FE5CDCBDA05 /* IGListAdapter+UICollectionView.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 3F570E94828C4AF46CFEC6A5D61865A2 /* IGListIndexSetResultInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 2C5E0EE708ED520E1238832E21B5FF34 /* IGListIndexSetResultInternal.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 44EEEDE8BDFB206FB6B6231BA87159F9 /* IGListArrayUtilsInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = C480192F9BF7084801615F25FE67424F /* IGListArrayUtilsInternal.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 46D0BB242A93AB47B581E989553809AF /* IGListBindingSectionController+DebugDescription.m in Sources */ = {isa = PBXBuildFile; fileRef = 8DC6B2EC65882D3CD2B448FE32C9A601 /* IGListBindingSectionController+DebugDescription.m */; }; + 4829E32D52A26520273AAA0C53A595FB /* IGListCompatibility.h in Headers */ = {isa = PBXBuildFile; fileRef = 455AB974EE8CB73C6DEAE8F89B107216 /* IGListCompatibility.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4AFBDAE2746C7873D842CE3FB3FD7E09 /* IGListScrollDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 4FB208ADF2CF0D9D60C3C6040976BD77 /* IGListScrollDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 50FBE55D74C60243F5A6E882A229D67A /* IGListReloadIndexPath.h in Headers */ = {isa = PBXBuildFile; fileRef = 9B7B74C155EB68B386139D7C0F8F6772 /* IGListReloadIndexPath.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 50FC67816EB0ABB18D2BDB997EDD818B /* Pods-Marslink-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = E599AAEA69FEBFA25C5FEF9AD99A7605 /* Pods-Marslink-dummy.m */; }; + 51DB3F68106110BD5BDEC17211554BBE /* IGListAdapter+UICollectionView.m in Sources */ = {isa = PBXBuildFile; fileRef = 167C665C98A5E7805925E1C4CFDB4093 /* IGListAdapter+UICollectionView.m */; }; + 530F77AE094B5E9F80A91B923BBFEDEE /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B63C6A64CF66340668996F78DA6BB482 /* UIKit.framework */; }; + 5664756155B5E7CFA0F7CD1688C8AC2E /* IGListAdapterUpdater.m in Sources */ = {isa = PBXBuildFile; fileRef = B73CFBD3CF77BCCDCE1E987C5837BE47 /* IGListAdapterUpdater.m */; }; + 587D1FDFD48FA88E590DD810E9AD2BF8 /* NSNumber+IGListDiffable.h in Headers */ = {isa = PBXBuildFile; fileRef = 47621FD36E5D9205FB472691A874BB1C /* NSNumber+IGListDiffable.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 5D30CB2AFEC59D5C46CC5C527A46A103 /* IGListAdapterUpdater+DebugDescription.h in Headers */ = {isa = PBXBuildFile; fileRef = 5C55268FDCBAC2770431EC54D3B29EDA /* IGListAdapterUpdater+DebugDescription.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 5DE04335D0649195A0AD286FBC921892 /* IGListUpdatingDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 418836C9119FE735FE5A0F68E052E67D /* IGListUpdatingDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 61A983931A22AC5F95E7566D025BAE5D /* IGListWorkingRangeHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = A490C6FFA2A8A01C745508D1B80CCFF6 /* IGListWorkingRangeHandler.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 61EBA021C373E2AE422A0847BD601A11 /* IGListKit-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = B9439EE2CDEB2C31A714A02E3E77B7B1 /* IGListKit-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6359D5205DFDAC51DCC62954FE3DC12B /* IGListIndexPathResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BB4B87DE38AAB60A3580D26D1B32CB8 /* IGListIndexPathResult.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 647FC679CAA6DFB909E271861D5F9B93 /* IGListMoveIndexPathInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 110575E1B1403936D5B17E4888FBAF3E /* IGListMoveIndexPathInternal.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 657F82F4C682B2AAEF6D21F677CDCC28 /* IGListWorkingRangeDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E63335DD5B23F0D3D76CF1DCA949EA /* IGListWorkingRangeDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6AD915B811C4B346A95CD250EA01A62A /* IGListDiff.h in Headers */ = {isa = PBXBuildFile; fileRef = D3A88CE54E83D830DCF82AB376649277 /* IGListDiff.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6C3D79027A49AFD0D0DB72725DD380E6 /* IGListSectionController.h in Headers */ = {isa = PBXBuildFile; fileRef = 77E9C8BF2D8C1A235E43D77067B932FF /* IGListSectionController.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6EE34EFCD3C89B96AD2D32428B423428 /* IGListDisplayDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 8CE6AE0ADD0CFA907E59EFA780890BB5 /* IGListDisplayDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6F572A6B1B345E65EF44940850801510 /* IGListSectionMap.h in Headers */ = {isa = PBXBuildFile; fileRef = DB2FDBBA9C9053E6E26155F88BA04B50 /* IGListSectionMap.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 7025962A677A8638828C799A07B89BE1 /* NSString+IGListDiffable.m in Sources */ = {isa = PBXBuildFile; fileRef = F73A57963286D0CDD2E36AAAD1F68A44 /* NSString+IGListDiffable.m */; }; + 7187432EF79CBC59C99B1D36E7E718A5 /* IGListBindingSectionController.h in Headers */ = {isa = PBXBuildFile; fileRef = 903D57740BF5A5EB592465BC98075D03 /* IGListBindingSectionController.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 737984BECA9B20462A6E03E69CB6E364 /* IGListSingleSectionController.h in Headers */ = {isa = PBXBuildFile; fileRef = 67ABCD0269CF7A07C500E76CFC877E80 /* IGListSingleSectionController.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 78216CC6766D7E5F260F547A05538A8C /* IGListKit-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = B6D32B5668DEF27E640C8862AB5F5B36 /* IGListKit-dummy.m */; }; + 806233700333585C9A750F06571E2055 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D88AAE1F92055A60CC2FC970D7D34634 /* Foundation.framework */; }; + 81A52E626426C5A36E9D9A27C73710F5 /* IGListMoveIndexInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = F98127C06C4B8F785032902B0B32E2B1 /* IGListMoveIndexInternal.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 82E07BFE8E6324957014513165605108 /* IGListMoveIndex.h in Headers */ = {isa = PBXBuildFile; fileRef = 944501BC6F17635C566054C85D20AC1F /* IGListMoveIndex.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8300B8B48AD2393611604E9B9F5CC16B /* IGListBindingSectionController+DebugDescription.h in Headers */ = {isa = PBXBuildFile; fileRef = F67EA9AC8643AEB3DC299A18C1BB5E84 /* IGListBindingSectionController+DebugDescription.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 84970C905010294D056208920DD5C5E8 /* IGListGenericSectionController.h in Headers */ = {isa = PBXBuildFile; fileRef = 53D0B74E1981062B70D52DEBEB4A2CF2 /* IGListGenericSectionController.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 851ACD9A85D8A99A7F7B3FDA355A6027 /* IGListAdapterUpdaterDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = C8FA765D5A61F6B3BE97B78F80F89F1D /* IGListAdapterUpdaterDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 85B64AB512663D1E67036D671C171496 /* IGListSectionMap+DebugDescription.h in Headers */ = {isa = PBXBuildFile; fileRef = 6AB7E3DBF6A485CB3D875E86EB476E3F /* IGListSectionMap+DebugDescription.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 87B22BEF0817F79927BF7402F6B5C576 /* UICollectionView+IGListBatchUpdateData.h in Headers */ = {isa = PBXBuildFile; fileRef = 8F1F710CC8D27FC65B3D92B4D8CCB8C9 /* UICollectionView+IGListBatchUpdateData.h */; settings = {ATTRIBUTES = (Private, ); }; }; + 882C8F475A46B6925AE849A8089C5348 /* IGListAdapter.m in Sources */ = {isa = PBXBuildFile; fileRef = 2BD7A63FD139AC7F548301104B94FE06 /* IGListAdapter.m */; }; + 8C1884BB60A7B93A9D41C92FD45B5D92 /* IGListAdapterDataSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 840C9C5AC6B7FF1376E372A9BA7081F9 /* IGListAdapterDataSource.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 8F8DCC7B9492623DEF7E2C5403C5689A /* IGListReloadDataUpdater.m in Sources */ = {isa = PBXBuildFile; fileRef = CFEBE02201FB31F18A5AD51A8BA8F0A8 /* IGListReloadDataUpdater.m */; }; + 93E3219DC58D95B51097E4F3D86208F8 /* IGListBindable.h in Headers */ = {isa = PBXBuildFile; fileRef = AC61AF02FB6C0BF9BF672CFF27FB4632 /* IGListBindable.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 98FD1CAE76E708D5DA6AA437485946A2 /* UICollectionView+DebugDescription.m in Sources */ = {isa = PBXBuildFile; fileRef = B4CDB7BF181F4B9CA5BC358CAC4920D6 /* UICollectionView+DebugDescription.m */; }; + 9DCF7539E860292864CDDF251F2CC1D1 /* IGListDiffable.h in Headers */ = {isa = PBXBuildFile; fileRef = 87675DFD13CFE7F6DB83AD542486BA63 /* IGListDiffable.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9E99A948D2F03F5A72206E6F4EFE6B08 /* IGListStackedSectionController.h in Headers */ = {isa = PBXBuildFile; fileRef = 72E4E5B01F94BF36223CCC71552B6E4D /* IGListStackedSectionController.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 9FEFED5412E9448C8D45800C1187EFB1 /* IGListBindingSectionControllerSelectionDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = BDE6694C763213E21EBF16B250CDA15A /* IGListBindingSectionControllerSelectionDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; }; + A0BE967609CDC3056208EB8C0D958EA1 /* IGListAdapterUpdater+DebugDescription.m in Sources */ = {isa = PBXBuildFile; fileRef = 9CF054AE45BFA0535DB7465406CA1888 /* IGListAdapterUpdater+DebugDescription.m */; }; + A1896D6422D52BA625E262F8066CD169 /* IGListDisplayHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = F9C2AB06BF6A72AD309AB336E34BF8D0 /* IGListDisplayHandler.h */; settings = {ATTRIBUTES = (Private, ); }; }; + A59306B9C2AE4410B5F6FEA1C98DBE22 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D88AAE1F92055A60CC2FC970D7D34634 /* Foundation.framework */; }; + A6777CCED9102400181E4AC99724AB02 /* NSNumber+IGListDiffable.m in Sources */ = {isa = PBXBuildFile; fileRef = 8C7D703D17B53704068B69805FA77EE2 /* NSNumber+IGListDiffable.m */; }; + A6B66E7AB07A9D7F56BF95B98FB9A491 /* IGListSectionMap.m in Sources */ = {isa = PBXBuildFile; fileRef = 49619B43A35B753C7AFD642143AF87F1 /* IGListSectionMap.m */; }; + ABA81B3789F5120C503B466A50BD1E59 /* IGListDebuggingUtilities.m in Sources */ = {isa = PBXBuildFile; fileRef = DF61CCDBFA73753F41C18AC8C6FC5140 /* IGListDebuggingUtilities.m */; }; + B476FF8B58CE82B9ED1B43E504136EBC /* IGListKit.h in Headers */ = {isa = PBXBuildFile; fileRef = DC9E88F39D6D27C34CE21849CBFF7080 /* IGListKit.h */; settings = {ATTRIBUTES = (Public, ); }; }; + B691CE90CB3748A5D57ABBBE0EBFB46F /* IGListBatchUpdates.h in Headers */ = {isa = PBXBuildFile; fileRef = A58B8F05AEA9E9B6FA94CB04DCFF8F28 /* IGListBatchUpdates.h */; settings = {ATTRIBUTES = (Private, ); }; }; + B6D61808E8EB84F7FEA6BD88A20CAC9E /* UICollectionView+DebugDescription.h in Headers */ = {isa = PBXBuildFile; fileRef = 95F731882AC150FEB7DF8320DE9E4C2C /* UICollectionView+DebugDescription.h */; settings = {ATTRIBUTES = (Private, ); }; }; + B8411692B7B14917DD3000D5A7379C2A /* IGListDisplayHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = B9D05E6DCB5250D9C8E669A76A785268 /* IGListDisplayHandler.m */; }; + B8AA6344B70B9E66F99E21D0486E8DC8 /* UICollectionView+IGListBatchUpdateData.m in Sources */ = {isa = PBXBuildFile; fileRef = 670D2A5ED205A6314E043EB2ADE7FF36 /* UICollectionView+IGListBatchUpdateData.m */; }; + BAD4759C9719CA37B3623937FB6D5138 /* IGListAdapter.h in Headers */ = {isa = PBXBuildFile; fileRef = 3E9E36677B484170D3EC03D8881776A9 /* IGListAdapter.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BD5D859239156DB76BDB4EC2AD7648B6 /* IGListAdapter+DebugDescription.m in Sources */ = {isa = PBXBuildFile; fileRef = FF06424744D4CDB48962C3ACF67CE8C5 /* IGListAdapter+DebugDescription.m */; }; + BDD8393EA90B0C5F01019843C5C38B3E /* IGListIndexPathResult.m in Sources */ = {isa = PBXBuildFile; fileRef = 11AE97AF687657AF8B92D87BF3DF78DE /* IGListIndexPathResult.m */; }; + CAC2632786934E9160BEE01A6DC231E8 /* IGListBatchUpdateData+DebugDescription.m in Sources */ = {isa = PBXBuildFile; fileRef = B2276B38D7C34A1280B7CDB3DBC1038E /* IGListBatchUpdateData+DebugDescription.m */; }; + CAD491D31B12BC8F39D366AB4578AA8F /* IGListBatchUpdates.m in Sources */ = {isa = PBXBuildFile; fileRef = 056BAF6128054FE078658A1A0713B298 /* IGListBatchUpdates.m */; }; + CB7CDB6EABADF6EB1EB4D15C93687A2F /* IGListCollectionViewLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = 2618C09215004C65B7519E29DC3E834E /* IGListCollectionViewLayout.h */; settings = {ATTRIBUTES = (Public, ); }; }; + CB9B81FB97DC00169A4905F0D959B6C9 /* IGListCollectionViewLayoutInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 1D2F8E211B8A95246934C89308AB7043 /* IGListCollectionViewLayoutInternal.h */; settings = {ATTRIBUTES = (Private, ); }; }; + D01050FFC39EE3B828195AE08EA6C9E9 /* IGListBatchUpdateData.h in Headers */ = {isa = PBXBuildFile; fileRef = 02712C63FEB0EB8B0BF8967F77BDE7F7 /* IGListBatchUpdateData.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D0F432A2B4EC6C995AA0B58FD542B41B /* IGListBatchUpdateState.h in Headers */ = {isa = PBXBuildFile; fileRef = ED2DA31D371F9B7B16745F0BEC6522AC /* IGListBatchUpdateState.h */; settings = {ATTRIBUTES = (Private, ); }; }; + D52F42EDC1840303C5ACB12289313B86 /* IGListAdapterDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = 13D2E84B488F516B1F345BCBF053ECC5 /* IGListAdapterDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D57F9091BD401E3A504E075088D2778E /* IGListExperiments.h in Headers */ = {isa = PBXBuildFile; fileRef = 3A0B0B61082C7A3E789B9F7BA733620E /* IGListExperiments.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D63C6B7AD525B350DA9A719820DCD07A /* IGListSectionMap+DebugDescription.m in Sources */ = {isa = PBXBuildFile; fileRef = E68167E467E637E70C1273A2575B5C36 /* IGListSectionMap+DebugDescription.m */; }; + D8CC196E6F1E7AB313AE16128BF3729C /* IGListSupplementaryViewSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 6F28200AE4D9A6C8A7D6483F8120B78E /* IGListSupplementaryViewSource.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D91B00BCFE6AF9500E22D1186CE7EDB0 /* IGListCollectionViewLayout.mm in Sources */ = {isa = PBXBuildFile; fileRef = 2EE8149796C37DECFF23FD1D353865EB /* IGListCollectionViewLayout.mm */; }; + DD763352112719D4008CB0615F85155F /* IGListAdapterInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 92E731EA8F57F665FD37EC6CC9C1D04A /* IGListAdapterInternal.h */; settings = {ATTRIBUTES = (Private, ); }; }; + DF7905003A718FFBF42A6657D2DF3376 /* IGListIndexSetResult.m in Sources */ = {isa = PBXBuildFile; fileRef = F8605378F046D96FFD10C4599EA00635 /* IGListIndexSetResult.m */; }; + E16577EF22DEAB416DD10448F2DE8BBC /* IGListBindingSectionControllerDataSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 88EA0BEA85F3A3853375EF906BFD0639 /* IGListBindingSectionControllerDataSource.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E4469761843EA6C395BE69142AEC7DCC /* IGListSectionControllerInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 9E6B369178CF3434BA49091C93B71271 /* IGListSectionControllerInternal.h */; settings = {ATTRIBUTES = (Private, ); }; }; + E7190F4A240EDC86041CA9D8B45619D8 /* IGListSingleSectionController.m in Sources */ = {isa = PBXBuildFile; fileRef = F9F0769B72BFC96EDB61CCEB7B8D195A /* IGListSingleSectionController.m */; }; + F10F3FF78068903596F380CFE8E5C744 /* IGListGenericSectionController.m in Sources */ = {isa = PBXBuildFile; fileRef = 92A74896D4CE1C20F6EED82BE15D139F /* IGListGenericSectionController.m */; }; + F10F7A63136854578F8162CA912358B6 /* IGListAdapter+DebugDescription.h in Headers */ = {isa = PBXBuildFile; fileRef = 3610CD642FF3D5079141B5D28CD4051E /* IGListAdapter+DebugDescription.h */; settings = {ATTRIBUTES = (Private, ); }; }; + F3CF07C10C85826BC955BAB4D164189B /* IGListStackedSectionControllerInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 168BCD8CA2B3E8569951802E71D1DF03 /* IGListStackedSectionControllerInternal.h */; settings = {ATTRIBUTES = (Private, ); }; }; + F58EB40716DEAA45A35F44D7CF8AAA42 /* IGListMoveIndexPath.h in Headers */ = {isa = PBXBuildFile; fileRef = E681A030B6FFE9D241DF36BF13AD35AC /* IGListMoveIndexPath.h */; settings = {ATTRIBUTES = (Public, ); }; }; + F9AD64692A0278B25BD940988ACB377F /* IGListSectionController.m in Sources */ = {isa = PBXBuildFile; fileRef = 999576F2582953B0EDA743E641F84B11 /* IGListSectionController.m */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 59532D90F56EEAE0E93CFCD365BB2E24 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = 29E719DA9F63BD3532B4DCE63D74E737; + remoteInfo = IGListKit; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 02712C63FEB0EB8B0BF8967F77BDE7F7 /* IGListBatchUpdateData.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListBatchUpdateData.h; path = Source/Common/IGListBatchUpdateData.h; sourceTree = ""; }; + 056BAF6128054FE078658A1A0713B298 /* IGListBatchUpdates.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IGListBatchUpdates.m; path = Source/Internal/IGListBatchUpdates.m; sourceTree = ""; }; + 110575E1B1403936D5B17E4888FBAF3E /* IGListMoveIndexPathInternal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListMoveIndexPathInternal.h; path = Source/Common/Internal/IGListMoveIndexPathInternal.h; sourceTree = ""; }; + 1141964E047B4E43CF42F5F87D8E1C4F /* NSString+IGListDiffable.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSString+IGListDiffable.h"; path = "Source/Common/NSString+IGListDiffable.h"; sourceTree = ""; }; + 11AE97AF687657AF8B92D87BF3DF78DE /* IGListIndexPathResult.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IGListIndexPathResult.m; path = Source/Common/IGListIndexPathResult.m; sourceTree = ""; }; + 13D2E84B488F516B1F345BCBF053ECC5 /* IGListAdapterDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListAdapterDelegate.h; path = Source/IGListAdapterDelegate.h; sourceTree = ""; }; + 167C665C98A5E7805925E1C4CFDB4093 /* IGListAdapter+UICollectionView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "IGListAdapter+UICollectionView.m"; path = "Source/Internal/IGListAdapter+UICollectionView.m"; sourceTree = ""; }; + 168BCD8CA2B3E8569951802E71D1DF03 /* IGListStackedSectionControllerInternal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListStackedSectionControllerInternal.h; path = Source/Internal/IGListStackedSectionControllerInternal.h; sourceTree = ""; }; + 1D2F8E211B8A95246934C89308AB7043 /* IGListCollectionViewLayoutInternal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListCollectionViewLayoutInternal.h; path = Source/Internal/IGListCollectionViewLayoutInternal.h; sourceTree = ""; }; + 1EDA8350F812A94F669D9978C44326D3 /* Pods-Marslink-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-Marslink-resources.sh"; sourceTree = ""; }; + 240B76B48241A59A6E709EE612825321 /* IGListAdapterProxy.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListAdapterProxy.h; path = Source/Internal/IGListAdapterProxy.h; sourceTree = ""; }; + 2618C09215004C65B7519E29DC3E834E /* IGListCollectionViewLayout.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListCollectionViewLayout.h; path = Source/IGListCollectionViewLayout.h; sourceTree = ""; }; + 27FD2BC30D3F440534414FAACE9C2FDB /* Pods-Marslink.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-Marslink.release.xcconfig"; sourceTree = ""; }; + 28F33D3838585CAFDDE96D89CA7CE2F7 /* Pods-Marslink.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = "Pods-Marslink.modulemap"; sourceTree = ""; }; + 2BD7A63FD139AC7F548301104B94FE06 /* IGListAdapter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IGListAdapter.m; path = Source/IGListAdapter.m; sourceTree = ""; }; + 2C5E0EE708ED520E1238832E21B5FF34 /* IGListIndexSetResultInternal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListIndexSetResultInternal.h; path = Source/Common/Internal/IGListIndexSetResultInternal.h; sourceTree = ""; }; + 2EE8149796C37DECFF23FD1D353865EB /* IGListCollectionViewLayout.mm */ = {isa = PBXFileReference; includeInIndex = 1; name = IGListCollectionViewLayout.mm; path = Source/IGListCollectionViewLayout.mm; sourceTree = ""; }; + 2F314E1A2573881CD3A9753B9510AEA1 /* IGListDebuggingUtilities.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListDebuggingUtilities.h; path = Source/Internal/IGListDebuggingUtilities.h; sourceTree = ""; }; + 32320C9EBC24A2C6FD71B501B4D9993C /* Pods_Marslink.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_Marslink.framework; path = "Pods-Marslink.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; + 3610CD642FF3D5079141B5D28CD4051E /* IGListAdapter+DebugDescription.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "IGListAdapter+DebugDescription.h"; path = "Source/Internal/IGListAdapter+DebugDescription.h"; sourceTree = ""; }; + 3A0B0B61082C7A3E789B9F7BA733620E /* IGListExperiments.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListExperiments.h; path = Source/Common/IGListExperiments.h; sourceTree = ""; }; + 3C28188356EC05CD8AE704DE99D52B36 /* IGListDiffKit.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListDiffKit.h; path = Source/Common/IGListDiffKit.h; sourceTree = ""; }; + 3E9E36677B484170D3EC03D8881776A9 /* IGListAdapter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListAdapter.h; path = Source/IGListAdapter.h; sourceTree = ""; }; + 403CAF9FF70EE1DCB0DBFE3D4F117BB2 /* IGListAdapterProxy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IGListAdapterProxy.m; path = Source/Internal/IGListAdapterProxy.m; sourceTree = ""; }; + 40B25C1D691536925F06B183FD43E6EC /* IGListWorkingRangeHandler.mm */ = {isa = PBXFileReference; includeInIndex = 1; name = IGListWorkingRangeHandler.mm; path = Source/Internal/IGListWorkingRangeHandler.mm; sourceTree = ""; }; + 418836C9119FE735FE5A0F68E052E67D /* IGListUpdatingDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListUpdatingDelegate.h; path = Source/IGListUpdatingDelegate.h; sourceTree = ""; }; + 43870C56350DDB385A793FE5CDCBDA05 /* IGListAdapter+UICollectionView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "IGListAdapter+UICollectionView.h"; path = "Source/Internal/IGListAdapter+UICollectionView.h"; sourceTree = ""; }; + 44BD96B1FAEA851CD241B95CCE8CDE79 /* IGListStackedSectionController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IGListStackedSectionController.m; path = Source/IGListStackedSectionController.m; sourceTree = ""; }; + 455AB974EE8CB73C6DEAE8F89B107216 /* IGListCompatibility.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListCompatibility.h; path = Source/Common/IGListCompatibility.h; sourceTree = ""; }; + 47621FD36E5D9205FB472691A874BB1C /* NSNumber+IGListDiffable.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSNumber+IGListDiffable.h"; path = "Source/Common/NSNumber+IGListDiffable.h"; sourceTree = ""; }; + 482E0C7673619FC7C95573093872DFFA /* IGListReloadDataUpdater.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListReloadDataUpdater.h; path = Source/IGListReloadDataUpdater.h; sourceTree = ""; }; + 49619B43A35B753C7AFD642143AF87F1 /* IGListSectionMap.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IGListSectionMap.m; path = Source/Internal/IGListSectionMap.m; sourceTree = ""; }; + 4B4AC447EBDD0F94086F6DA64FDEBFA9 /* Pods-Marslink-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-Marslink-umbrella.h"; sourceTree = ""; }; + 4BB4B87DE38AAB60A3580D26D1B32CB8 /* IGListIndexPathResult.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListIndexPathResult.h; path = Source/Common/IGListIndexPathResult.h; sourceTree = ""; }; + 4C7070EFF9A10C05B6659303F7C126AC /* IGListMoveIndexPath.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IGListMoveIndexPath.m; path = Source/Common/IGListMoveIndexPath.m; sourceTree = ""; }; + 4FB208ADF2CF0D9D60C3C6040976BD77 /* IGListScrollDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListScrollDelegate.h; path = Source/IGListScrollDelegate.h; sourceTree = ""; }; + 53B18A22D4D1B00B5075DE18C94F8CE9 /* Pods-Marslink-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-Marslink-acknowledgements.plist"; sourceTree = ""; }; + 53D0B74E1981062B70D52DEBEB4A2CF2 /* IGListGenericSectionController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListGenericSectionController.h; path = Source/IGListGenericSectionController.h; sourceTree = ""; }; + 555054F4DC377290E4B9AE0129749D13 /* IGListBatchUpdateData.mm */ = {isa = PBXFileReference; includeInIndex = 1; name = IGListBatchUpdateData.mm; path = Source/Common/IGListBatchUpdateData.mm; sourceTree = ""; }; + 5C55268FDCBAC2770431EC54D3B29EDA /* IGListAdapterUpdater+DebugDescription.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "IGListAdapterUpdater+DebugDescription.h"; path = "Source/Internal/IGListAdapterUpdater+DebugDescription.h"; sourceTree = ""; }; + 5D6FC1BF374F1B67AA37483A2F9107F2 /* IGListCollectionContext.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListCollectionContext.h; path = Source/IGListCollectionContext.h; sourceTree = ""; }; + 5DCF00E444A0256B890DE0146DDC035C /* IGListDiff.mm */ = {isa = PBXFileReference; includeInIndex = 1; name = IGListDiff.mm; path = Source/Common/IGListDiff.mm; sourceTree = ""; }; + 5DD5F3689A7D443AE52C61D2321391E7 /* IGListKit-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "IGListKit-prefix.pch"; sourceTree = ""; }; + 66E63335DD5B23F0D3D76CF1DCA949EA /* IGListWorkingRangeDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListWorkingRangeDelegate.h; path = Source/IGListWorkingRangeDelegate.h; sourceTree = ""; }; + 670D2A5ED205A6314E043EB2ADE7FF36 /* UICollectionView+IGListBatchUpdateData.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UICollectionView+IGListBatchUpdateData.m"; path = "Source/Internal/UICollectionView+IGListBatchUpdateData.m"; sourceTree = ""; }; + 67ABCD0269CF7A07C500E76CFC877E80 /* IGListSingleSectionController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListSingleSectionController.h; path = Source/IGListSingleSectionController.h; sourceTree = ""; }; + 6AB7E3DBF6A485CB3D875E86EB476E3F /* IGListSectionMap+DebugDescription.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "IGListSectionMap+DebugDescription.h"; path = "Source/Internal/IGListSectionMap+DebugDescription.h"; sourceTree = ""; }; + 6F28200AE4D9A6C8A7D6483F8120B78E /* IGListSupplementaryViewSource.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListSupplementaryViewSource.h; path = Source/IGListSupplementaryViewSource.h; sourceTree = ""; }; + 72E4E5B01F94BF36223CCC71552B6E4D /* IGListStackedSectionController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListStackedSectionController.h; path = Source/IGListStackedSectionController.h; sourceTree = ""; }; + 731FD910BEC9C7181D10D58DC525A5CF /* IGListKit.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = IGListKit.xcconfig; sourceTree = ""; }; + 77E9C8BF2D8C1A235E43D77067B932FF /* IGListSectionController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListSectionController.h; path = Source/IGListSectionController.h; sourceTree = ""; }; + 7F67F9FE07AB351D467CDFCB787985B1 /* IGListMacros.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListMacros.h; path = Source/Common/IGListMacros.h; sourceTree = ""; }; + 8133290164FF9CB219BB1C948CAF6C82 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 840C9C5AC6B7FF1376E372A9BA7081F9 /* IGListAdapterDataSource.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListAdapterDataSource.h; path = Source/IGListAdapterDataSource.h; sourceTree = ""; }; + 850FD3FC368DB2F151167967BDD41EE1 /* IGListBatchUpdateData+DebugDescription.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "IGListBatchUpdateData+DebugDescription.h"; path = "Source/Internal/IGListBatchUpdateData+DebugDescription.h"; sourceTree = ""; }; + 87675DFD13CFE7F6DB83AD542486BA63 /* IGListDiffable.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListDiffable.h; path = Source/Common/IGListDiffable.h; sourceTree = ""; }; + 88EA0BEA85F3A3853375EF906BFD0639 /* IGListBindingSectionControllerDataSource.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListBindingSectionControllerDataSource.h; path = Source/IGListBindingSectionControllerDataSource.h; sourceTree = ""; }; + 8C7D703D17B53704068B69805FA77EE2 /* NSNumber+IGListDiffable.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSNumber+IGListDiffable.m"; path = "Source/Common/NSNumber+IGListDiffable.m"; sourceTree = ""; }; + 8CE6AE0ADD0CFA907E59EFA780890BB5 /* IGListDisplayDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListDisplayDelegate.h; path = Source/IGListDisplayDelegate.h; sourceTree = ""; }; + 8DC6B2EC65882D3CD2B448FE32C9A601 /* IGListBindingSectionController+DebugDescription.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "IGListBindingSectionController+DebugDescription.m"; path = "Source/Internal/IGListBindingSectionController+DebugDescription.m"; sourceTree = ""; }; + 8F1F710CC8D27FC65B3D92B4D8CCB8C9 /* UICollectionView+IGListBatchUpdateData.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UICollectionView+IGListBatchUpdateData.h"; path = "Source/Internal/UICollectionView+IGListBatchUpdateData.h"; sourceTree = ""; }; + 8FCF4D5ECB8D97EF0725C9CAF13C4937 /* IGListIndexSetResult.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListIndexSetResult.h; path = Source/Common/IGListIndexSetResult.h; sourceTree = ""; }; + 903D57740BF5A5EB592465BC98075D03 /* IGListBindingSectionController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListBindingSectionController.h; path = Source/IGListBindingSectionController.h; sourceTree = ""; }; + 91187C3F582F75282D8E6EBBEF089EDF /* IGListReloadIndexPath.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IGListReloadIndexPath.m; path = Source/Internal/IGListReloadIndexPath.m; sourceTree = ""; }; + 91A581F909855E363C929073574C5761 /* IGListIndexPathResultInternal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListIndexPathResultInternal.h; path = Source/Common/Internal/IGListIndexPathResultInternal.h; sourceTree = ""; }; + 92A74896D4CE1C20F6EED82BE15D139F /* IGListGenericSectionController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IGListGenericSectionController.m; path = Source/IGListGenericSectionController.m; sourceTree = ""; }; + 92E731EA8F57F665FD37EC6CC9C1D04A /* IGListAdapterInternal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListAdapterInternal.h; path = Source/Internal/IGListAdapterInternal.h; sourceTree = ""; }; + 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; + 944501BC6F17635C566054C85D20AC1F /* IGListMoveIndex.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListMoveIndex.h; path = Source/Common/IGListMoveIndex.h; sourceTree = ""; }; + 95F731882AC150FEB7DF8320DE9E4C2C /* UICollectionView+DebugDescription.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UICollectionView+DebugDescription.h"; path = "Source/Internal/UICollectionView+DebugDescription.h"; sourceTree = ""; }; + 98418E39B77A14D7AA027C0F514B3543 /* Pods-Marslink.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-Marslink.debug.xcconfig"; sourceTree = ""; }; + 999576F2582953B0EDA743E641F84B11 /* IGListSectionController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IGListSectionController.m; path = Source/IGListSectionController.m; sourceTree = ""; }; + 9B7B74C155EB68B386139D7C0F8F6772 /* IGListReloadIndexPath.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListReloadIndexPath.h; path = Source/Internal/IGListReloadIndexPath.h; sourceTree = ""; }; + 9C6F5ACA7035A54D4C503BA10C29B46C /* IGListAdapterUpdaterInternal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListAdapterUpdaterInternal.h; path = Source/Internal/IGListAdapterUpdaterInternal.h; sourceTree = ""; }; + 9CF054AE45BFA0535DB7465406CA1888 /* IGListAdapterUpdater+DebugDescription.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "IGListAdapterUpdater+DebugDescription.m"; path = "Source/Internal/IGListAdapterUpdater+DebugDescription.m"; sourceTree = ""; }; + 9E6B369178CF3434BA49091C93B71271 /* IGListSectionControllerInternal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListSectionControllerInternal.h; path = Source/Internal/IGListSectionControllerInternal.h; sourceTree = ""; }; + A490C6FFA2A8A01C745508D1B80CCFF6 /* IGListWorkingRangeHandler.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListWorkingRangeHandler.h; path = Source/Internal/IGListWorkingRangeHandler.h; sourceTree = ""; }; + A58B8F05AEA9E9B6FA94CB04DCFF8F28 /* IGListBatchUpdates.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListBatchUpdates.h; path = Source/Internal/IGListBatchUpdates.h; sourceTree = ""; }; + AADC4F74E1D7D043D491EAF42ABDAC9F /* IGListKit.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = IGListKit.modulemap; sourceTree = ""; }; + AC61AF02FB6C0BF9BF672CFF27FB4632 /* IGListBindable.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListBindable.h; path = Source/IGListBindable.h; sourceTree = ""; }; + B2276B38D7C34A1280B7CDB3DBC1038E /* IGListBatchUpdateData+DebugDescription.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "IGListBatchUpdateData+DebugDescription.m"; path = "Source/Internal/IGListBatchUpdateData+DebugDescription.m"; sourceTree = ""; }; + B4CDB7BF181F4B9CA5BC358CAC4920D6 /* UICollectionView+DebugDescription.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UICollectionView+DebugDescription.m"; path = "Source/Internal/UICollectionView+DebugDescription.m"; sourceTree = ""; }; + B63C6A64CF66340668996F78DA6BB482 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; }; + B6D32B5668DEF27E640C8862AB5F5B36 /* IGListKit-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "IGListKit-dummy.m"; sourceTree = ""; }; + B73CFBD3CF77BCCDCE1E987C5837BE47 /* IGListAdapterUpdater.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IGListAdapterUpdater.m; path = Source/IGListAdapterUpdater.m; sourceTree = ""; }; + B9439EE2CDEB2C31A714A02E3E77B7B1 /* IGListKit-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "IGListKit-umbrella.h"; sourceTree = ""; }; + B9D05E6DCB5250D9C8E669A76A785268 /* IGListDisplayHandler.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IGListDisplayHandler.m; path = Source/Internal/IGListDisplayHandler.m; sourceTree = ""; }; + BBC40E8CAC326FFADC13BA9EC59384D2 /* IGListAssert.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListAssert.h; path = Source/Common/IGListAssert.h; sourceTree = ""; }; + BDE6694C763213E21EBF16B250CDA15A /* IGListBindingSectionControllerSelectionDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListBindingSectionControllerSelectionDelegate.h; path = Source/IGListBindingSectionControllerSelectionDelegate.h; sourceTree = ""; }; + C06B0AE941A11A3ECE36C27A3009FCC6 /* IGListKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = IGListKit.framework; path = IGListKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + C480192F9BF7084801615F25FE67424F /* IGListArrayUtilsInternal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListArrayUtilsInternal.h; path = Source/Common/Internal/IGListArrayUtilsInternal.h; sourceTree = ""; }; + C572296ED32AD6D1F0EE7C2F77F78E55 /* Pods-Marslink-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-Marslink-acknowledgements.markdown"; sourceTree = ""; }; + C8FA765D5A61F6B3BE97B78F80F89F1D /* IGListAdapterUpdaterDelegate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListAdapterUpdaterDelegate.h; path = Source/IGListAdapterUpdaterDelegate.h; sourceTree = ""; }; + CF5FB2D4E0155741E41D1989D40072DD /* IGListDebugger.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IGListDebugger.m; path = Source/Internal/IGListDebugger.m; sourceTree = ""; }; + CFEBE02201FB31F18A5AD51A8BA8F0A8 /* IGListReloadDataUpdater.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IGListReloadDataUpdater.m; path = Source/IGListReloadDataUpdater.m; sourceTree = ""; }; + D3A88CE54E83D830DCF82AB376649277 /* IGListDiff.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListDiff.h; path = Source/Common/IGListDiff.h; sourceTree = ""; }; + D88AAE1F92055A60CC2FC970D7D34634 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; + DB2FDBBA9C9053E6E26155F88BA04B50 /* IGListSectionMap.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListSectionMap.h; path = Source/Internal/IGListSectionMap.h; sourceTree = ""; }; + DC9E88F39D6D27C34CE21849CBFF7080 /* IGListKit.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListKit.h; path = Source/IGListKit.h; sourceTree = ""; }; + DD593B0EEA8A99AD3C0483011596B467 /* IGListAdapterUpdater.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListAdapterUpdater.h; path = Source/IGListAdapterUpdater.h; sourceTree = ""; }; + DF61CCDBFA73753F41C18AC8C6FC5140 /* IGListDebuggingUtilities.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IGListDebuggingUtilities.m; path = Source/Internal/IGListDebuggingUtilities.m; sourceTree = ""; }; + E12996472F339D3B7280E64A38DA3AF2 /* IGListDebugger.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListDebugger.h; path = Source/Internal/IGListDebugger.h; sourceTree = ""; }; + E599AAEA69FEBFA25C5FEF9AD99A7605 /* Pods-Marslink-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-Marslink-dummy.m"; sourceTree = ""; }; + E68167E467E637E70C1273A2575B5C36 /* IGListSectionMap+DebugDescription.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "IGListSectionMap+DebugDescription.m"; path = "Source/Internal/IGListSectionMap+DebugDescription.m"; sourceTree = ""; }; + E681A030B6FFE9D241DF36BF13AD35AC /* IGListMoveIndexPath.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListMoveIndexPath.h; path = Source/Common/IGListMoveIndexPath.h; sourceTree = ""; }; + E89E2E65872110A42CFBE269D930CEF9 /* IGListMoveIndex.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IGListMoveIndex.m; path = Source/Common/IGListMoveIndex.m; sourceTree = ""; }; + E8CE4754FDAE8C5D8A07E47FDE4BC7F1 /* IGListBatchContext.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListBatchContext.h; path = Source/IGListBatchContext.h; sourceTree = ""; }; + ED2DA31D371F9B7B16745F0BEC6522AC /* IGListBatchUpdateState.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListBatchUpdateState.h; path = Source/Internal/IGListBatchUpdateState.h; sourceTree = ""; }; + F67EA9AC8643AEB3DC299A18C1BB5E84 /* IGListBindingSectionController+DebugDescription.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "IGListBindingSectionController+DebugDescription.h"; path = "Source/Internal/IGListBindingSectionController+DebugDescription.h"; sourceTree = ""; }; + F73A57963286D0CDD2E36AAAD1F68A44 /* NSString+IGListDiffable.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSString+IGListDiffable.m"; path = "Source/Common/NSString+IGListDiffable.m"; sourceTree = ""; }; + F80775F063B7393917604814738DE407 /* Pods-Marslink-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-Marslink-frameworks.sh"; sourceTree = ""; }; + F8605378F046D96FFD10C4599EA00635 /* IGListIndexSetResult.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IGListIndexSetResult.m; path = Source/Common/IGListIndexSetResult.m; sourceTree = ""; }; + F98127C06C4B8F785032902B0B32E2B1 /* IGListMoveIndexInternal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListMoveIndexInternal.h; path = Source/Common/Internal/IGListMoveIndexInternal.h; sourceTree = ""; }; + F9C2AB06BF6A72AD309AB336E34BF8D0 /* IGListDisplayHandler.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IGListDisplayHandler.h; path = Source/Internal/IGListDisplayHandler.h; sourceTree = ""; }; + F9F0769B72BFC96EDB61CCEB7B8D195A /* IGListSingleSectionController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IGListSingleSectionController.m; path = Source/IGListSingleSectionController.m; sourceTree = ""; }; + FD9E4EE16963E3F362FBA42923738E0F /* IGListBindingSectionController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IGListBindingSectionController.m; path = Source/IGListBindingSectionController.m; sourceTree = ""; }; + FDEF1620A79B599F0641410B72EC516A /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + FF06424744D4CDB48962C3ACF67CE8C5 /* IGListAdapter+DebugDescription.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "IGListAdapter+DebugDescription.m"; path = "Source/Internal/IGListAdapter+DebugDescription.m"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 3C773AAED7EB3164BFC415DA0C5F7976 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 806233700333585C9A750F06571E2055 /* Foundation.framework in Frameworks */, + 530F77AE094B5E9F80A91B923BBFEDEE /* UIKit.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 9338C194129560BC7B655B7D5DC4AC48 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + A59306B9C2AE4410B5F6FEA1C98DBE22 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 170C8C1CF37769CDE3478A366A3844E6 /* Default */ = { + isa = PBXGroup; + children = ( + 3E9E36677B484170D3EC03D8881776A9 /* IGListAdapter.h */, + 2BD7A63FD139AC7F548301104B94FE06 /* IGListAdapter.m */, + 3610CD642FF3D5079141B5D28CD4051E /* IGListAdapter+DebugDescription.h */, + FF06424744D4CDB48962C3ACF67CE8C5 /* IGListAdapter+DebugDescription.m */, + 43870C56350DDB385A793FE5CDCBDA05 /* IGListAdapter+UICollectionView.h */, + 167C665C98A5E7805925E1C4CFDB4093 /* IGListAdapter+UICollectionView.m */, + 840C9C5AC6B7FF1376E372A9BA7081F9 /* IGListAdapterDataSource.h */, + 13D2E84B488F516B1F345BCBF053ECC5 /* IGListAdapterDelegate.h */, + 92E731EA8F57F665FD37EC6CC9C1D04A /* IGListAdapterInternal.h */, + 240B76B48241A59A6E709EE612825321 /* IGListAdapterProxy.h */, + 403CAF9FF70EE1DCB0DBFE3D4F117BB2 /* IGListAdapterProxy.m */, + DD593B0EEA8A99AD3C0483011596B467 /* IGListAdapterUpdater.h */, + B73CFBD3CF77BCCDCE1E987C5837BE47 /* IGListAdapterUpdater.m */, + 5C55268FDCBAC2770431EC54D3B29EDA /* IGListAdapterUpdater+DebugDescription.h */, + 9CF054AE45BFA0535DB7465406CA1888 /* IGListAdapterUpdater+DebugDescription.m */, + C8FA765D5A61F6B3BE97B78F80F89F1D /* IGListAdapterUpdaterDelegate.h */, + 9C6F5ACA7035A54D4C503BA10C29B46C /* IGListAdapterUpdaterInternal.h */, + C480192F9BF7084801615F25FE67424F /* IGListArrayUtilsInternal.h */, + BBC40E8CAC326FFADC13BA9EC59384D2 /* IGListAssert.h */, + E8CE4754FDAE8C5D8A07E47FDE4BC7F1 /* IGListBatchContext.h */, + 02712C63FEB0EB8B0BF8967F77BDE7F7 /* IGListBatchUpdateData.h */, + 555054F4DC377290E4B9AE0129749D13 /* IGListBatchUpdateData.mm */, + 850FD3FC368DB2F151167967BDD41EE1 /* IGListBatchUpdateData+DebugDescription.h */, + B2276B38D7C34A1280B7CDB3DBC1038E /* IGListBatchUpdateData+DebugDescription.m */, + A58B8F05AEA9E9B6FA94CB04DCFF8F28 /* IGListBatchUpdates.h */, + 056BAF6128054FE078658A1A0713B298 /* IGListBatchUpdates.m */, + ED2DA31D371F9B7B16745F0BEC6522AC /* IGListBatchUpdateState.h */, + AC61AF02FB6C0BF9BF672CFF27FB4632 /* IGListBindable.h */, + 903D57740BF5A5EB592465BC98075D03 /* IGListBindingSectionController.h */, + FD9E4EE16963E3F362FBA42923738E0F /* IGListBindingSectionController.m */, + F67EA9AC8643AEB3DC299A18C1BB5E84 /* IGListBindingSectionController+DebugDescription.h */, + 8DC6B2EC65882D3CD2B448FE32C9A601 /* IGListBindingSectionController+DebugDescription.m */, + 88EA0BEA85F3A3853375EF906BFD0639 /* IGListBindingSectionControllerDataSource.h */, + BDE6694C763213E21EBF16B250CDA15A /* IGListBindingSectionControllerSelectionDelegate.h */, + 5D6FC1BF374F1B67AA37483A2F9107F2 /* IGListCollectionContext.h */, + 2618C09215004C65B7519E29DC3E834E /* IGListCollectionViewLayout.h */, + 2EE8149796C37DECFF23FD1D353865EB /* IGListCollectionViewLayout.mm */, + 1D2F8E211B8A95246934C89308AB7043 /* IGListCollectionViewLayoutInternal.h */, + 455AB974EE8CB73C6DEAE8F89B107216 /* IGListCompatibility.h */, + E12996472F339D3B7280E64A38DA3AF2 /* IGListDebugger.h */, + CF5FB2D4E0155741E41D1989D40072DD /* IGListDebugger.m */, + 2F314E1A2573881CD3A9753B9510AEA1 /* IGListDebuggingUtilities.h */, + DF61CCDBFA73753F41C18AC8C6FC5140 /* IGListDebuggingUtilities.m */, + D3A88CE54E83D830DCF82AB376649277 /* IGListDiff.h */, + 5DCF00E444A0256B890DE0146DDC035C /* IGListDiff.mm */, + 87675DFD13CFE7F6DB83AD542486BA63 /* IGListDiffable.h */, + 3C28188356EC05CD8AE704DE99D52B36 /* IGListDiffKit.h */, + 8CE6AE0ADD0CFA907E59EFA780890BB5 /* IGListDisplayDelegate.h */, + F9C2AB06BF6A72AD309AB336E34BF8D0 /* IGListDisplayHandler.h */, + B9D05E6DCB5250D9C8E669A76A785268 /* IGListDisplayHandler.m */, + 3A0B0B61082C7A3E789B9F7BA733620E /* IGListExperiments.h */, + 53D0B74E1981062B70D52DEBEB4A2CF2 /* IGListGenericSectionController.h */, + 92A74896D4CE1C20F6EED82BE15D139F /* IGListGenericSectionController.m */, + 4BB4B87DE38AAB60A3580D26D1B32CB8 /* IGListIndexPathResult.h */, + 11AE97AF687657AF8B92D87BF3DF78DE /* IGListIndexPathResult.m */, + 91A581F909855E363C929073574C5761 /* IGListIndexPathResultInternal.h */, + 8FCF4D5ECB8D97EF0725C9CAF13C4937 /* IGListIndexSetResult.h */, + F8605378F046D96FFD10C4599EA00635 /* IGListIndexSetResult.m */, + 2C5E0EE708ED520E1238832E21B5FF34 /* IGListIndexSetResultInternal.h */, + DC9E88F39D6D27C34CE21849CBFF7080 /* IGListKit.h */, + 7F67F9FE07AB351D467CDFCB787985B1 /* IGListMacros.h */, + 944501BC6F17635C566054C85D20AC1F /* IGListMoveIndex.h */, + E89E2E65872110A42CFBE269D930CEF9 /* IGListMoveIndex.m */, + F98127C06C4B8F785032902B0B32E2B1 /* IGListMoveIndexInternal.h */, + E681A030B6FFE9D241DF36BF13AD35AC /* IGListMoveIndexPath.h */, + 4C7070EFF9A10C05B6659303F7C126AC /* IGListMoveIndexPath.m */, + 110575E1B1403936D5B17E4888FBAF3E /* IGListMoveIndexPathInternal.h */, + 482E0C7673619FC7C95573093872DFFA /* IGListReloadDataUpdater.h */, + CFEBE02201FB31F18A5AD51A8BA8F0A8 /* IGListReloadDataUpdater.m */, + 9B7B74C155EB68B386139D7C0F8F6772 /* IGListReloadIndexPath.h */, + 91187C3F582F75282D8E6EBBEF089EDF /* IGListReloadIndexPath.m */, + 4FB208ADF2CF0D9D60C3C6040976BD77 /* IGListScrollDelegate.h */, + 77E9C8BF2D8C1A235E43D77067B932FF /* IGListSectionController.h */, + 999576F2582953B0EDA743E641F84B11 /* IGListSectionController.m */, + 9E6B369178CF3434BA49091C93B71271 /* IGListSectionControllerInternal.h */, + DB2FDBBA9C9053E6E26155F88BA04B50 /* IGListSectionMap.h */, + 49619B43A35B753C7AFD642143AF87F1 /* IGListSectionMap.m */, + 6AB7E3DBF6A485CB3D875E86EB476E3F /* IGListSectionMap+DebugDescription.h */, + E68167E467E637E70C1273A2575B5C36 /* IGListSectionMap+DebugDescription.m */, + 67ABCD0269CF7A07C500E76CFC877E80 /* IGListSingleSectionController.h */, + F9F0769B72BFC96EDB61CCEB7B8D195A /* IGListSingleSectionController.m */, + 72E4E5B01F94BF36223CCC71552B6E4D /* IGListStackedSectionController.h */, + 44BD96B1FAEA851CD241B95CCE8CDE79 /* IGListStackedSectionController.m */, + 168BCD8CA2B3E8569951802E71D1DF03 /* IGListStackedSectionControllerInternal.h */, + 6F28200AE4D9A6C8A7D6483F8120B78E /* IGListSupplementaryViewSource.h */, + 418836C9119FE735FE5A0F68E052E67D /* IGListUpdatingDelegate.h */, + 66E63335DD5B23F0D3D76CF1DCA949EA /* IGListWorkingRangeDelegate.h */, + A490C6FFA2A8A01C745508D1B80CCFF6 /* IGListWorkingRangeHandler.h */, + 40B25C1D691536925F06B183FD43E6EC /* IGListWorkingRangeHandler.mm */, + 47621FD36E5D9205FB472691A874BB1C /* NSNumber+IGListDiffable.h */, + 8C7D703D17B53704068B69805FA77EE2 /* NSNumber+IGListDiffable.m */, + 1141964E047B4E43CF42F5F87D8E1C4F /* NSString+IGListDiffable.h */, + F73A57963286D0CDD2E36AAAD1F68A44 /* NSString+IGListDiffable.m */, + 95F731882AC150FEB7DF8320DE9E4C2C /* UICollectionView+DebugDescription.h */, + B4CDB7BF181F4B9CA5BC358CAC4920D6 /* UICollectionView+DebugDescription.m */, + 8F1F710CC8D27FC65B3D92B4D8CCB8C9 /* UICollectionView+IGListBatchUpdateData.h */, + 670D2A5ED205A6314E043EB2ADE7FF36 /* UICollectionView+IGListBatchUpdateData.m */, + ); + name = Default; + sourceTree = ""; + }; + 39A05FBDB2F66DAE11DB574A98B82861 /* Support Files */ = { + isa = PBXGroup; + children = ( + AADC4F74E1D7D043D491EAF42ABDAC9F /* IGListKit.modulemap */, + 731FD910BEC9C7181D10D58DC525A5CF /* IGListKit.xcconfig */, + B6D32B5668DEF27E640C8862AB5F5B36 /* IGListKit-dummy.m */, + 5DD5F3689A7D443AE52C61D2321391E7 /* IGListKit-prefix.pch */, + B9439EE2CDEB2C31A714A02E3E77B7B1 /* IGListKit-umbrella.h */, + 8133290164FF9CB219BB1C948CAF6C82 /* Info.plist */, + ); + name = "Support Files"; + path = "../Target Support Files/IGListKit"; + sourceTree = ""; + }; + 3D8944B1E721B6810E915ADA3FCB120A /* Targets Support Files */ = { + isa = PBXGroup; + children = ( + D53C972E79F3791525BB4F3CFD7C802A /* Pods-Marslink */, + ); + name = "Targets Support Files"; + sourceTree = ""; + }; + 433CD3331B6C3787F473C941B61FC68F /* Frameworks */ = { + isa = PBXGroup; + children = ( + 438B396F6B4147076630CAEFE34282C1 /* iOS */, + ); + name = Frameworks; + sourceTree = ""; + }; + 438B396F6B4147076630CAEFE34282C1 /* iOS */ = { + isa = PBXGroup; + children = ( + D88AAE1F92055A60CC2FC970D7D34634 /* Foundation.framework */, + B63C6A64CF66340668996F78DA6BB482 /* UIKit.framework */, + ); + name = iOS; + sourceTree = ""; + }; + 58FD427A6D512B5333FDA9D524DE6747 /* IGListKit */ = { + isa = PBXGroup; + children = ( + 170C8C1CF37769CDE3478A366A3844E6 /* Default */, + 7E49ABCA87FFC2B7A53CFF8CD2A33590 /* Diffing */, + 39A05FBDB2F66DAE11DB574A98B82861 /* Support Files */, + ); + name = IGListKit; + path = IGListKit; + sourceTree = ""; + }; + 6C301443E286BB5F41C8A832C084AB3B /* Pods */ = { + isa = PBXGroup; + children = ( + 58FD427A6D512B5333FDA9D524DE6747 /* IGListKit */, + ); + name = Pods; + sourceTree = ""; + }; + 745608014D91D678A712F9BC8FF4C484 /* Products */ = { + isa = PBXGroup; + children = ( + C06B0AE941A11A3ECE36C27A3009FCC6 /* IGListKit.framework */, + 32320C9EBC24A2C6FD71B501B4D9993C /* Pods_Marslink.framework */, + ); + name = Products; + sourceTree = ""; + }; + 7DB346D0F39D3F0E887471402A8071AB = { + isa = PBXGroup; + children = ( + 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */, + 433CD3331B6C3787F473C941B61FC68F /* Frameworks */, + 6C301443E286BB5F41C8A832C084AB3B /* Pods */, + 745608014D91D678A712F9BC8FF4C484 /* Products */, + 3D8944B1E721B6810E915ADA3FCB120A /* Targets Support Files */, + ); + sourceTree = ""; + }; + 7E49ABCA87FFC2B7A53CFF8CD2A33590 /* Diffing */ = { + isa = PBXGroup; + children = ( + ); + name = Diffing; + sourceTree = ""; + }; + D53C972E79F3791525BB4F3CFD7C802A /* Pods-Marslink */ = { + isa = PBXGroup; + children = ( + FDEF1620A79B599F0641410B72EC516A /* Info.plist */, + 28F33D3838585CAFDDE96D89CA7CE2F7 /* Pods-Marslink.modulemap */, + C572296ED32AD6D1F0EE7C2F77F78E55 /* Pods-Marslink-acknowledgements.markdown */, + 53B18A22D4D1B00B5075DE18C94F8CE9 /* Pods-Marslink-acknowledgements.plist */, + E599AAEA69FEBFA25C5FEF9AD99A7605 /* Pods-Marslink-dummy.m */, + F80775F063B7393917604814738DE407 /* Pods-Marslink-frameworks.sh */, + 1EDA8350F812A94F669D9978C44326D3 /* Pods-Marslink-resources.sh */, + 4B4AC447EBDD0F94086F6DA64FDEBFA9 /* Pods-Marslink-umbrella.h */, + 98418E39B77A14D7AA027C0F514B3543 /* Pods-Marslink.debug.xcconfig */, + 27FD2BC30D3F440534414FAACE9C2FDB /* Pods-Marslink.release.xcconfig */, + ); + name = "Pods-Marslink"; + path = "Target Support Files/Pods-Marslink"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 16FAA228DE47900020B37AB606A11912 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 2E1A9095D891D1B7A2152ADF6D773401 /* Pods-Marslink-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 796CCD5569BBD0FDD010617B13C81D18 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + F10F7A63136854578F8162CA912358B6 /* IGListAdapter+DebugDescription.h in Headers */, + 3B916A544B6BFB6242F4FB1146E110E3 /* IGListAdapter+UICollectionView.h in Headers */, + BAD4759C9719CA37B3623937FB6D5138 /* IGListAdapter.h in Headers */, + 8C1884BB60A7B93A9D41C92FD45B5D92 /* IGListAdapterDataSource.h in Headers */, + D52F42EDC1840303C5ACB12289313B86 /* IGListAdapterDelegate.h in Headers */, + DD763352112719D4008CB0615F85155F /* IGListAdapterInternal.h in Headers */, + 000E239471A0EBAD60CB6195B5F79828 /* IGListAdapterProxy.h in Headers */, + 5D30CB2AFEC59D5C46CC5C527A46A103 /* IGListAdapterUpdater+DebugDescription.h in Headers */, + 069B74B76CEA27EE4BF57B2680438C5B /* IGListAdapterUpdater.h in Headers */, + 851ACD9A85D8A99A7F7B3FDA355A6027 /* IGListAdapterUpdaterDelegate.h in Headers */, + 0EB88E66FFE4CECE12625B6F9619C3D9 /* IGListAdapterUpdaterInternal.h in Headers */, + 44EEEDE8BDFB206FB6B6231BA87159F9 /* IGListArrayUtilsInternal.h in Headers */, + 2D8959D7283A997592266F855C2AEFC7 /* IGListAssert.h in Headers */, + 29CA1AFB3A198F8BD823DC0F005EE0B2 /* IGListBatchContext.h in Headers */, + 168016B44DD4CB68A2E02D5127E21024 /* IGListBatchUpdateData+DebugDescription.h in Headers */, + D01050FFC39EE3B828195AE08EA6C9E9 /* IGListBatchUpdateData.h in Headers */, + B691CE90CB3748A5D57ABBBE0EBFB46F /* IGListBatchUpdates.h in Headers */, + D0F432A2B4EC6C995AA0B58FD542B41B /* IGListBatchUpdateState.h in Headers */, + 93E3219DC58D95B51097E4F3D86208F8 /* IGListBindable.h in Headers */, + 8300B8B48AD2393611604E9B9F5CC16B /* IGListBindingSectionController+DebugDescription.h in Headers */, + 7187432EF79CBC59C99B1D36E7E718A5 /* IGListBindingSectionController.h in Headers */, + E16577EF22DEAB416DD10448F2DE8BBC /* IGListBindingSectionControllerDataSource.h in Headers */, + 9FEFED5412E9448C8D45800C1187EFB1 /* IGListBindingSectionControllerSelectionDelegate.h in Headers */, + 137C45ECC2360170D79FEC8627F2AD6F /* IGListCollectionContext.h in Headers */, + CB7CDB6EABADF6EB1EB4D15C93687A2F /* IGListCollectionViewLayout.h in Headers */, + CB9B81FB97DC00169A4905F0D959B6C9 /* IGListCollectionViewLayoutInternal.h in Headers */, + 4829E32D52A26520273AAA0C53A595FB /* IGListCompatibility.h in Headers */, + 280BD09F8403F7419DE5B2077BDB7661 /* IGListDebugger.h in Headers */, + 32B83F6D28B85D7F9A4E21C0B584F8DE /* IGListDebuggingUtilities.h in Headers */, + 6AD915B811C4B346A95CD250EA01A62A /* IGListDiff.h in Headers */, + 9DCF7539E860292864CDDF251F2CC1D1 /* IGListDiffable.h in Headers */, + 280F74839065CF25EAB795A27C49A43E /* IGListDiffKit.h in Headers */, + 6EE34EFCD3C89B96AD2D32428B423428 /* IGListDisplayDelegate.h in Headers */, + A1896D6422D52BA625E262F8066CD169 /* IGListDisplayHandler.h in Headers */, + D57F9091BD401E3A504E075088D2778E /* IGListExperiments.h in Headers */, + 84970C905010294D056208920DD5C5E8 /* IGListGenericSectionController.h in Headers */, + 6359D5205DFDAC51DCC62954FE3DC12B /* IGListIndexPathResult.h in Headers */, + 11D215B1EBE305CD58949CC136D0966B /* IGListIndexPathResultInternal.h in Headers */, + 32E7E8C6A02B4FE9AA6B432EA4C00E55 /* IGListIndexSetResult.h in Headers */, + 3F570E94828C4AF46CFEC6A5D61865A2 /* IGListIndexSetResultInternal.h in Headers */, + 61EBA021C373E2AE422A0847BD601A11 /* IGListKit-umbrella.h in Headers */, + B476FF8B58CE82B9ED1B43E504136EBC /* IGListKit.h in Headers */, + 126ADE896FACE07BEB0C55B0FBD2984B /* IGListMacros.h in Headers */, + 82E07BFE8E6324957014513165605108 /* IGListMoveIndex.h in Headers */, + 81A52E626426C5A36E9D9A27C73710F5 /* IGListMoveIndexInternal.h in Headers */, + F58EB40716DEAA45A35F44D7CF8AAA42 /* IGListMoveIndexPath.h in Headers */, + 647FC679CAA6DFB909E271861D5F9B93 /* IGListMoveIndexPathInternal.h in Headers */, + 0432166B2C8644CF44E7850511639C86 /* IGListReloadDataUpdater.h in Headers */, + 50FBE55D74C60243F5A6E882A229D67A /* IGListReloadIndexPath.h in Headers */, + 4AFBDAE2746C7873D842CE3FB3FD7E09 /* IGListScrollDelegate.h in Headers */, + 6C3D79027A49AFD0D0DB72725DD380E6 /* IGListSectionController.h in Headers */, + E4469761843EA6C395BE69142AEC7DCC /* IGListSectionControllerInternal.h in Headers */, + 85B64AB512663D1E67036D671C171496 /* IGListSectionMap+DebugDescription.h in Headers */, + 6F572A6B1B345E65EF44940850801510 /* IGListSectionMap.h in Headers */, + 737984BECA9B20462A6E03E69CB6E364 /* IGListSingleSectionController.h in Headers */, + 9E99A948D2F03F5A72206E6F4EFE6B08 /* IGListStackedSectionController.h in Headers */, + F3CF07C10C85826BC955BAB4D164189B /* IGListStackedSectionControllerInternal.h in Headers */, + D8CC196E6F1E7AB313AE16128BF3729C /* IGListSupplementaryViewSource.h in Headers */, + 5DE04335D0649195A0AD286FBC921892 /* IGListUpdatingDelegate.h in Headers */, + 657F82F4C682B2AAEF6D21F677CDCC28 /* IGListWorkingRangeDelegate.h in Headers */, + 61A983931A22AC5F95E7566D025BAE5D /* IGListWorkingRangeHandler.h in Headers */, + 587D1FDFD48FA88E590DD810E9AD2BF8 /* NSNumber+IGListDiffable.h in Headers */, + 276AC4F82ACF09C032687CF1A5FA692A /* NSString+IGListDiffable.h in Headers */, + B6D61808E8EB84F7FEA6BD88A20CAC9E /* UICollectionView+DebugDescription.h in Headers */, + 87B22BEF0817F79927BF7402F6B5C576 /* UICollectionView+IGListBatchUpdateData.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 29E719DA9F63BD3532B4DCE63D74E737 /* IGListKit */ = { + isa = PBXNativeTarget; + buildConfigurationList = D6F1EE63D3E7F86AA989C300523F32E5 /* Build configuration list for PBXNativeTarget "IGListKit" */; + buildPhases = ( + 6BE9CBB319C47E6A56FA4B03694EAF9B /* Sources */, + 3C773AAED7EB3164BFC415DA0C5F7976 /* Frameworks */, + 796CCD5569BBD0FDD010617B13C81D18 /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = IGListKit; + productName = IGListKit; + productReference = C06B0AE941A11A3ECE36C27A3009FCC6 /* IGListKit.framework */; + productType = "com.apple.product-type.framework"; + }; + 83717B0A04268D3257867FB3A9DF0873 /* Pods-Marslink */ = { + isa = PBXNativeTarget; + buildConfigurationList = 64A8E4AB0D7559C50F15F2EC0878740B /* Build configuration list for PBXNativeTarget "Pods-Marslink" */; + buildPhases = ( + E2D47BCD490B06CCED77C6FE228B9D35 /* Sources */, + 9338C194129560BC7B655B7D5DC4AC48 /* Frameworks */, + 16FAA228DE47900020B37AB606A11912 /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + D401FE3F025BB7458A4616A02AEB8CF1 /* PBXTargetDependency */, + ); + name = "Pods-Marslink"; + productName = "Pods-Marslink"; + productReference = 32320C9EBC24A2C6FD71B501B4D9993C /* Pods_Marslink.framework */; + productType = "com.apple.product-type.framework"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + D41D8CD98F00B204E9800998ECF8427E /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0830; + LastUpgradeCheck = 0700; + }; + buildConfigurationList = 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = 7DB346D0F39D3F0E887471402A8071AB; + productRefGroup = 745608014D91D678A712F9BC8FF4C484 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 29E719DA9F63BD3532B4DCE63D74E737 /* IGListKit */, + 83717B0A04268D3257867FB3A9DF0873 /* Pods-Marslink */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXSourcesBuildPhase section */ + 6BE9CBB319C47E6A56FA4B03694EAF9B /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + BD5D859239156DB76BDB4EC2AD7648B6 /* IGListAdapter+DebugDescription.m in Sources */, + 51DB3F68106110BD5BDEC17211554BBE /* IGListAdapter+UICollectionView.m in Sources */, + 882C8F475A46B6925AE849A8089C5348 /* IGListAdapter.m in Sources */, + 154D881DB9AB9A1C7D7691D43A7FF2DE /* IGListAdapterProxy.m in Sources */, + A0BE967609CDC3056208EB8C0D958EA1 /* IGListAdapterUpdater+DebugDescription.m in Sources */, + 5664756155B5E7CFA0F7CD1688C8AC2E /* IGListAdapterUpdater.m in Sources */, + CAC2632786934E9160BEE01A6DC231E8 /* IGListBatchUpdateData+DebugDescription.m in Sources */, + 18FD56431CF1C10CB674A67D0DFB51BD /* IGListBatchUpdateData.mm in Sources */, + CAD491D31B12BC8F39D366AB4578AA8F /* IGListBatchUpdates.m in Sources */, + 46D0BB242A93AB47B581E989553809AF /* IGListBindingSectionController+DebugDescription.m in Sources */, + 09CEC673F58295DC0AC67C20BBF34BB1 /* IGListBindingSectionController.m in Sources */, + D91B00BCFE6AF9500E22D1186CE7EDB0 /* IGListCollectionViewLayout.mm in Sources */, + 13C4C4D9D2E78C99D801E1C44AAE6714 /* IGListDebugger.m in Sources */, + ABA81B3789F5120C503B466A50BD1E59 /* IGListDebuggingUtilities.m in Sources */, + 2AFF76F61A56D45B8245FDC53DDC134A /* IGListDiff.mm in Sources */, + B8411692B7B14917DD3000D5A7379C2A /* IGListDisplayHandler.m in Sources */, + F10F3FF78068903596F380CFE8E5C744 /* IGListGenericSectionController.m in Sources */, + BDD8393EA90B0C5F01019843C5C38B3E /* IGListIndexPathResult.m in Sources */, + DF7905003A718FFBF42A6657D2DF3376 /* IGListIndexSetResult.m in Sources */, + 78216CC6766D7E5F260F547A05538A8C /* IGListKit-dummy.m in Sources */, + 06943A7770B67047E43476F9A2D75DDA /* IGListMoveIndex.m in Sources */, + 19D468FAC7F26841628DA94C698C92DD /* IGListMoveIndexPath.m in Sources */, + 8F8DCC7B9492623DEF7E2C5403C5689A /* IGListReloadDataUpdater.m in Sources */, + 133960EE50FD9C80826B48383BC89277 /* IGListReloadIndexPath.m in Sources */, + F9AD64692A0278B25BD940988ACB377F /* IGListSectionController.m in Sources */, + D63C6B7AD525B350DA9A719820DCD07A /* IGListSectionMap+DebugDescription.m in Sources */, + A6B66E7AB07A9D7F56BF95B98FB9A491 /* IGListSectionMap.m in Sources */, + E7190F4A240EDC86041CA9D8B45619D8 /* IGListSingleSectionController.m in Sources */, + 3029DB1A27C55F84F1AC2C46DE87D925 /* IGListStackedSectionController.m in Sources */, + 0A481DCFB6EBC9BEF7B5DB3A464AEF04 /* IGListWorkingRangeHandler.mm in Sources */, + A6777CCED9102400181E4AC99724AB02 /* NSNumber+IGListDiffable.m in Sources */, + 7025962A677A8638828C799A07B89BE1 /* NSString+IGListDiffable.m in Sources */, + 98FD1CAE76E708D5DA6AA437485946A2 /* UICollectionView+DebugDescription.m in Sources */, + B8AA6344B70B9E66F99E21D0486E8DC8 /* UICollectionView+IGListBatchUpdateData.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + E2D47BCD490B06CCED77C6FE228B9D35 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 50FC67816EB0ABB18D2BDB997EDD818B /* Pods-Marslink-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + D401FE3F025BB7458A4616A02AEB8CF1 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = IGListKit; + target = 29E719DA9F63BD3532B4DCE63D74E737 /* IGListKit */; + targetProxy = 59532D90F56EEAE0E93CFCD365BB2E24 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 4E487F173E6C9664F4E9E26B9635D23C /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGNING_REQUIRED = NO; + COPY_PHASE_STRIP = NO; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "POD_CONFIGURATION_DEBUG=1", + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + ONLY_ACTIVE_ARCH = YES; + PROVISIONING_PROFILE_SPECIFIER = NO_SIGNING/; + STRIP_INSTALLED_PRODUCT = NO; + SYMROOT = "${SRCROOT}/../build"; + }; + name = Debug; + }; + 4F35F35AFE5C4E05270502AE94A2090D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 98418E39B77A14D7AA027C0F514B3543 /* Pods-Marslink.debug.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_NO_COMMON_BLOCKS = YES; + INFOPLIST_FILE = "Target Support Files/Pods-Marslink/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-Marslink/Pods-Marslink.modulemap"; + MTL_ENABLE_DEBUG_INFO = YES; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = Pods_Marslink; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 5FA48D707BF07B361D5445BACE8A180D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 731FD910BEC9C7181D10D58DC525A5CF /* IGListKit.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_NO_COMMON_BLOCKS = YES; + GCC_PREFIX_HEADER = "Target Support Files/IGListKit/IGListKit-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/IGListKit/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/IGListKit/IGListKit.modulemap"; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_NAME = IGListKit; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 7A80B90B337461E913410441011DAF8F /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 27FD2BC30D3F440534414FAACE9C2FDB /* Pods-Marslink.release.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_NO_COMMON_BLOCKS = YES; + INFOPLIST_FILE = "Target Support Files/Pods-Marslink/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-Marslink/Pods-Marslink.modulemap"; + MTL_ENABLE_DEBUG_INFO = NO; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = Pods_Marslink; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 9AD7D4595BC00AF767D599D1E1D5270A /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 731FD910BEC9C7181D10D58DC525A5CF /* IGListKit.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_NO_COMMON_BLOCKS = YES; + GCC_PREFIX_HEADER = "Target Support Files/IGListKit/IGListKit-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/IGListKit/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/IGListKit/IGListKit.modulemap"; + MTL_ENABLE_DEBUG_INFO = YES; + PRODUCT_NAME = IGListKit; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + BDD0139D6EB93FA375F887ABD62DAB2E /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGNING_REQUIRED = NO; + COPY_PHASE_STRIP = YES; + ENABLE_NS_ASSERTIONS = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_PREPROCESSOR_DEFINITIONS = ( + "POD_CONFIGURATION_RELEASE=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + PROVISIONING_PROFILE_SPECIFIER = NO_SIGNING/; + STRIP_INSTALLED_PRODUCT = NO; + SYMROOT = "${SRCROOT}/../build"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 4E487F173E6C9664F4E9E26B9635D23C /* Debug */, + BDD0139D6EB93FA375F887ABD62DAB2E /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 64A8E4AB0D7559C50F15F2EC0878740B /* Build configuration list for PBXNativeTarget "Pods-Marslink" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 4F35F35AFE5C4E05270502AE94A2090D /* Debug */, + 7A80B90B337461E913410441011DAF8F /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + D6F1EE63D3E7F86AA989C300523F32E5 /* Build configuration list for PBXNativeTarget "IGListKit" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 9AD7D4595BC00AF767D599D1E1D5270A /* Debug */, + 5FA48D707BF07B361D5445BACE8A180D /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = D41D8CD98F00B204E9800998ECF8427E /* Project object */; +} diff --git a/Project 27 - Marslink/Pods/Target Support Files/IGListKit/IGListKit-dummy.m b/Project 29 - Marslink/Pods/Target Support Files/IGListKit/IGListKit-dummy.m similarity index 100% rename from Project 27 - Marslink/Pods/Target Support Files/IGListKit/IGListKit-dummy.m rename to Project 29 - Marslink/Pods/Target Support Files/IGListKit/IGListKit-dummy.m diff --git a/Project 29 - Marslink/Pods/Target Support Files/IGListKit/IGListKit-prefix.pch b/Project 29 - Marslink/Pods/Target Support Files/IGListKit/IGListKit-prefix.pch new file mode 100644 index 00000000..beb2a244 --- /dev/null +++ b/Project 29 - Marslink/Pods/Target Support Files/IGListKit/IGListKit-prefix.pch @@ -0,0 +1,12 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + diff --git a/Project 27 - Marslink/Pods/Target Support Files/IGListKit/IGListKit-umbrella.h b/Project 29 - Marslink/Pods/Target Support Files/IGListKit/IGListKit-umbrella.h similarity index 54% rename from Project 27 - Marslink/Pods/Target Support Files/IGListKit/IGListKit-umbrella.h rename to Project 29 - Marslink/Pods/Target Support Files/IGListKit/IGListKit-umbrella.h index 8a64ff74..03db4e79 100644 --- a/Project 27 - Marslink/Pods/Target Support Files/IGListKit/IGListKit-umbrella.h +++ b/Project 29 - Marslink/Pods/Target Support Files/IGListKit/IGListKit-umbrella.h @@ -1,36 +1,64 @@ #ifdef __OBJC__ #import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif #endif -#import "IGListAdapter.h" -#import "IGListAdapterDataSource.h" -#import "IGListAdapterDelegate.h" -#import "IGListAdapterUpdater.h" -#import "IGListAdapterUpdaterDelegate.h" #import "IGListAssert.h" #import "IGListBatchUpdateData.h" -#import "IGListCollectionContext.h" -#import "IGListCollectionView.h" +#import "IGListCompatibility.h" #import "IGListDiff.h" #import "IGListDiffable.h" -#import "IGListDisplayDelegate.h" +#import "IGListDiffKit.h" #import "IGListExperiments.h" -#import "IGListGridCollectionViewLayout.h" #import "IGListIndexPathResult.h" #import "IGListIndexSetResult.h" -#import "IGListKit.h" #import "IGListMacros.h" #import "IGListMoveIndex.h" #import "IGListMoveIndexPath.h" +#import "NSNumber+IGListDiffable.h" +#import "NSString+IGListDiffable.h" +#import "IGListAdapter.h" +#import "IGListAdapterDataSource.h" +#import "IGListAdapterDelegate.h" +#import "IGListAdapterUpdater.h" +#import "IGListAdapterUpdaterDelegate.h" +#import "IGListBatchContext.h" +#import "IGListBindable.h" +#import "IGListBindingSectionController.h" +#import "IGListBindingSectionControllerDataSource.h" +#import "IGListBindingSectionControllerSelectionDelegate.h" +#import "IGListCollectionContext.h" +#import "IGListCollectionViewLayout.h" +#import "IGListDisplayDelegate.h" +#import "IGListGenericSectionController.h" +#import "IGListKit.h" #import "IGListReloadDataUpdater.h" #import "IGListScrollDelegate.h" #import "IGListSectionController.h" -#import "IGListSectionType.h" #import "IGListSingleSectionController.h" #import "IGListStackedSectionController.h" #import "IGListSupplementaryViewSource.h" #import "IGListUpdatingDelegate.h" #import "IGListWorkingRangeDelegate.h" +#import "IGListAssert.h" +#import "IGListBatchUpdateData.h" +#import "IGListCompatibility.h" +#import "IGListDiff.h" +#import "IGListDiffable.h" +#import "IGListDiffKit.h" +#import "IGListExperiments.h" +#import "IGListIndexPathResult.h" +#import "IGListIndexSetResult.h" +#import "IGListMacros.h" +#import "IGListMoveIndex.h" +#import "IGListMoveIndexPath.h" #import "NSNumber+IGListDiffable.h" #import "NSString+IGListDiffable.h" diff --git a/Project 27 - Marslink/Pods/Target Support Files/IGListKit/IGListKit.modulemap b/Project 29 - Marslink/Pods/Target Support Files/IGListKit/IGListKit.modulemap similarity index 100% rename from Project 27 - Marslink/Pods/Target Support Files/IGListKit/IGListKit.modulemap rename to Project 29 - Marslink/Pods/Target Support Files/IGListKit/IGListKit.modulemap diff --git a/Project 27 - Marslink/Pods/Target Support Files/IGListKit/IGListKit.xcconfig b/Project 29 - Marslink/Pods/Target Support Files/IGListKit/IGListKit.xcconfig similarity index 92% rename from Project 27 - Marslink/Pods/Target Support Files/IGListKit/IGListKit.xcconfig rename to Project 29 - Marslink/Pods/Target Support Files/IGListKit/IGListKit.xcconfig index d26e3749..56c7908f 100644 --- a/Project 27 - Marslink/Pods/Target Support Files/IGListKit/IGListKit.xcconfig +++ b/Project 29 - Marslink/Pods/Target Support Files/IGListKit/IGListKit.xcconfig @@ -7,5 +7,6 @@ OTHER_LDFLAGS = -l"c++" -framework "UIKit" PODS_BUILD_DIR = $BUILD_DIR PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/IGListKit PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} SKIP_INSTALL = YES diff --git a/Project 27 - Marslink/Pods/Target Support Files/Pods-Marslink/Info.plist b/Project 29 - Marslink/Pods/Target Support Files/IGListKit/Info.plist similarity index 96% rename from Project 27 - Marslink/Pods/Target Support Files/Pods-Marslink/Info.plist rename to Project 29 - Marslink/Pods/Target Support Files/IGListKit/Info.plist index 2243fe6e..793d31a9 100644 --- a/Project 27 - Marslink/Pods/Target Support Files/Pods-Marslink/Info.plist +++ b/Project 29 - Marslink/Pods/Target Support Files/IGListKit/Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 1.0.0 + 3.1.1 CFBundleSignature ???? CFBundleVersion diff --git a/Project 27 - Marslink/Pods/Target Support Files/IGListKit/Info.plist b/Project 29 - Marslink/Pods/Target Support Files/Pods-Marslink/Info.plist similarity index 100% rename from Project 27 - Marslink/Pods/Target Support Files/IGListKit/Info.plist rename to Project 29 - Marslink/Pods/Target Support Files/Pods-Marslink/Info.plist diff --git a/Project 27 - Marslink/Pods/Target Support Files/Pods-Marslink/Pods-Marslink-acknowledgements.markdown b/Project 29 - Marslink/Pods/Target Support Files/Pods-Marslink/Pods-Marslink-acknowledgements.markdown similarity index 100% rename from Project 27 - Marslink/Pods/Target Support Files/Pods-Marslink/Pods-Marslink-acknowledgements.markdown rename to Project 29 - Marslink/Pods/Target Support Files/Pods-Marslink/Pods-Marslink-acknowledgements.markdown diff --git a/Project 27 - Marslink/Pods/Target Support Files/Pods-Marslink/Pods-Marslink-acknowledgements.plist b/Project 29 - Marslink/Pods/Target Support Files/Pods-Marslink/Pods-Marslink-acknowledgements.plist similarity index 100% rename from Project 27 - Marslink/Pods/Target Support Files/Pods-Marslink/Pods-Marslink-acknowledgements.plist rename to Project 29 - Marslink/Pods/Target Support Files/Pods-Marslink/Pods-Marslink-acknowledgements.plist diff --git a/Project 27 - Marslink/Pods/Target Support Files/Pods-Marslink/Pods-Marslink-dummy.m b/Project 29 - Marslink/Pods/Target Support Files/Pods-Marslink/Pods-Marslink-dummy.m similarity index 100% rename from Project 27 - Marslink/Pods/Target Support Files/Pods-Marslink/Pods-Marslink-dummy.m rename to Project 29 - Marslink/Pods/Target Support Files/Pods-Marslink/Pods-Marslink-dummy.m diff --git a/Project 27 - Marslink/Pods/Target Support Files/Pods-Marslink/Pods-Marslink-frameworks.sh b/Project 29 - Marslink/Pods/Target Support Files/Pods-Marslink/Pods-Marslink-frameworks.sh similarity index 89% rename from Project 27 - Marslink/Pods/Target Support Files/Pods-Marslink/Pods-Marslink-frameworks.sh rename to Project 29 - Marslink/Pods/Target Support Files/Pods-Marslink/Pods-Marslink-frameworks.sh index b452f0e2..ec299f84 100755 --- a/Project 27 - Marslink/Pods/Target Support Files/Pods-Marslink/Pods-Marslink-frameworks.sh +++ b/Project 29 - Marslink/Pods/Target Support Files/Pods-Marslink/Pods-Marslink-frameworks.sh @@ -59,8 +59,13 @@ code_sign_if_enabled() { if [ -n "${EXPANDED_CODE_SIGN_IDENTITY}" -a "${CODE_SIGNING_REQUIRED}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then # Use the current code_sign_identitiy echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" - echo "/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS} --preserve-metadata=identifier,entitlements \"$1\"" - /usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS} --preserve-metadata=identifier,entitlements "$1" + local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS} --preserve-metadata=identifier,entitlements "$1"" + + if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then + code_sign_cmd="$code_sign_cmd &" + fi + echo "$code_sign_cmd" + eval "$code_sign_cmd" fi } @@ -89,3 +94,6 @@ fi if [[ "$CONFIGURATION" == "Release" ]]; then install_framework "$BUILT_PRODUCTS_DIR/IGListKit/IGListKit.framework" fi +if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then + wait +fi diff --git a/Project 27 - Marslink/Pods/Target Support Files/Pods-Marslink/Pods-Marslink-resources.sh b/Project 29 - Marslink/Pods/Target Support Files/Pods-Marslink/Pods-Marslink-resources.sh similarity index 98% rename from Project 27 - Marslink/Pods/Target Support Files/Pods-Marslink/Pods-Marslink-resources.sh rename to Project 29 - Marslink/Pods/Target Support Files/Pods-Marslink/Pods-Marslink-resources.sh index 25e9d377..4602c68a 100755 --- a/Project 27 - Marslink/Pods/Target Support Files/Pods-Marslink/Pods-Marslink-resources.sh +++ b/Project 29 - Marslink/Pods/Target Support Files/Pods-Marslink/Pods-Marslink-resources.sh @@ -18,6 +18,9 @@ case "${TARGETED_DEVICE_FAMILY}" in 2) TARGET_DEVICE_ARGS="--target-device ipad" ;; + 3) + TARGET_DEVICE_ARGS="--target-device tv" + ;; *) TARGET_DEVICE_ARGS="--target-device mac" ;; diff --git a/Project 27 - Marslink/Pods/Target Support Files/Pods-Marslink/Pods-Marslink-umbrella.h b/Project 29 - Marslink/Pods/Target Support Files/Pods-Marslink/Pods-Marslink-umbrella.h similarity index 53% rename from Project 27 - Marslink/Pods/Target Support Files/Pods-Marslink/Pods-Marslink-umbrella.h rename to Project 29 - Marslink/Pods/Target Support Files/Pods-Marslink/Pods-Marslink-umbrella.h index 7937fc6f..8a3ce94b 100644 --- a/Project 27 - Marslink/Pods/Target Support Files/Pods-Marslink/Pods-Marslink-umbrella.h +++ b/Project 29 - Marslink/Pods/Target Support Files/Pods-Marslink/Pods-Marslink-umbrella.h @@ -1,5 +1,13 @@ #ifdef __OBJC__ #import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif #endif diff --git a/Project 27 - Marslink/Pods/Target Support Files/Pods-Marslink/Pods-Marslink.debug.xcconfig b/Project 29 - Marslink/Pods/Target Support Files/Pods-Marslink/Pods-Marslink.debug.xcconfig similarity index 92% rename from Project 27 - Marslink/Pods/Target Support Files/Pods-Marslink/Pods-Marslink.debug.xcconfig rename to Project 29 - Marslink/Pods/Target Support Files/Pods-Marslink/Pods-Marslink.debug.xcconfig index 76789ae5..39a8e31f 100644 --- a/Project 27 - Marslink/Pods/Target Support Files/Pods-Marslink/Pods-Marslink.debug.xcconfig +++ b/Project 29 - Marslink/Pods/Target Support Files/Pods-Marslink/Pods-Marslink.debug.xcconfig @@ -1,4 +1,3 @@ -ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/IGListKit" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' diff --git a/Project 27 - Marslink/Pods/Target Support Files/Pods-Marslink/Pods-Marslink.modulemap b/Project 29 - Marslink/Pods/Target Support Files/Pods-Marslink/Pods-Marslink.modulemap similarity index 100% rename from Project 27 - Marslink/Pods/Target Support Files/Pods-Marslink/Pods-Marslink.modulemap rename to Project 29 - Marslink/Pods/Target Support Files/Pods-Marslink/Pods-Marslink.modulemap diff --git a/Project 27 - Marslink/Pods/Target Support Files/Pods-Marslink/Pods-Marslink.release.xcconfig b/Project 29 - Marslink/Pods/Target Support Files/Pods-Marslink/Pods-Marslink.release.xcconfig similarity index 92% rename from Project 27 - Marslink/Pods/Target Support Files/Pods-Marslink/Pods-Marslink.release.xcconfig rename to Project 29 - Marslink/Pods/Target Support Files/Pods-Marslink/Pods-Marslink.release.xcconfig index 76789ae5..39a8e31f 100644 --- a/Project 27 - Marslink/Pods/Target Support Files/Pods-Marslink/Pods-Marslink.release.xcconfig +++ b/Project 29 - Marslink/Pods/Target Support Files/Pods-Marslink/Pods-Marslink.release.xcconfig @@ -1,4 +1,3 @@ -ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/IGListKit" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' diff --git a/Project 27 - Marslink/README.md b/Project 29 - Marslink/README.md similarity index 100% rename from Project 27 - Marslink/README.md rename to Project 29 - Marslink/README.md diff --git a/Project 30 - PhotoTagger/PhotoTagger.xcodeproj/project.pbxproj b/Project 30 - PhotoTagger/PhotoTagger.xcodeproj/project.pbxproj old mode 100755 new mode 100644 index 988f85be..ab834400 --- a/Project 30 - PhotoTagger/PhotoTagger.xcodeproj/project.pbxproj +++ b/Project 30 - PhotoTagger/PhotoTagger.xcodeproj/project.pbxproj @@ -114,7 +114,6 @@ 93EF0C9D1BF41DA20051B5B1 /* Frameworks */, 93EF0C9E1BF41DA20051B5B1 /* Resources */, 0D67ECBCFC364ECCFFB73AB8 /* [CP] Embed Pods Frameworks */, - 702AB7C2C13EF2876279B7E0 /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -132,18 +131,18 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0710; - LastUpgradeCheck = 0820; + LastUpgradeCheck = 1020; ORGANIZATIONNAME = "Razeware LLC"; TargetAttributes = { 93EF0C9F1BF41DA20051B5B1 = { CreatedOnToolsVersion = 7.1.1; - LastSwiftMigration = 0820; + LastSwiftMigration = 1020; }; }; }; buildConfigurationList = 93EF0C9B1BF41DA20051B5B1 /* Build configuration list for PBXProject "PhotoTagger" */; compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; + developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, @@ -179,28 +178,16 @@ files = ( ); inputPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-PhotoTagger/Pods-PhotoTagger-frameworks.sh", + "${BUILT_PRODUCTS_DIR}/Alamofire/Alamofire.framework", ); name = "[CP] Embed Pods Frameworks"; outputPaths = ( + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Alamofire.framework", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-PhotoTagger/Pods-PhotoTagger-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; - 702AB7C2C13EF2876279B7E0 /* [CP] Copy Pods Resources */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "[CP] Copy Pods Resources"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-PhotoTagger/Pods-PhotoTagger-resources.sh\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-PhotoTagger/Pods-PhotoTagger-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; 84A2F530B0F6F80D6E81B4EF /* [CP] Check Pods Manifest.lock */ = { @@ -209,13 +196,16 @@ files = ( ); inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", ); name = "[CP] Check Pods Manifest.lock"; outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-PhotoTagger-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ @@ -260,18 +250,27 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -294,7 +293,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.1; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -307,18 +306,27 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -335,7 +343,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.1; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; @@ -354,7 +362,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.razeware.PhotoTagger; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; }; name = Debug; }; @@ -368,7 +376,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.razeware.PhotoTagger; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; }; name = Release; }; diff --git a/Project 30 - PhotoTagger/PhotoTagger.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Project 30 - PhotoTagger/PhotoTagger.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/Project 30 - PhotoTagger/PhotoTagger.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Project 30 - PhotoTagger/PhotoTagger/AppDelegate.swift b/Project 30 - PhotoTagger/PhotoTagger/AppDelegate.swift index 468a63d2..73026cc5 100755 --- a/Project 30 - PhotoTagger/PhotoTagger/AppDelegate.swift +++ b/Project 30 - PhotoTagger/PhotoTagger/AppDelegate.swift @@ -28,7 +28,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? - func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { return true } } diff --git a/Project 30 - PhotoTagger/PhotoTagger/ViewController.swift b/Project 30 - PhotoTagger/PhotoTagger/ViewController.swift index c4304dab..ee5f1a84 100755 --- a/Project 30 - PhotoTagger/PhotoTagger/ViewController.swift +++ b/Project 30 - PhotoTagger/PhotoTagger/ViewController.swift @@ -42,7 +42,7 @@ class ViewController: UIViewController { super.viewDidLoad() if !UIImagePickerController.isSourceTypeAvailable(.camera) { - takePictureButton.setTitle("Select Photo", for: UIControlState()) + takePictureButton.setTitle("Select Photo", for: UIControl.State()) } } @@ -72,7 +72,7 @@ class ViewController: UIViewController { picker.allowsEditing = false if UIImagePickerController.isSourceTypeAvailable(.camera) { - picker.sourceType = UIImagePickerControllerSourceType.camera + picker.sourceType = UIImagePickerController.SourceType.camera } else { picker.sourceType = .photoLibrary picker.modalPresentationStyle = .fullScreen @@ -85,9 +85,11 @@ class ViewController: UIViewController { // MARK: - UIImagePickerControllerDelegate extension ViewController : UIImagePickerControllerDelegate, UINavigationControllerDelegate { - func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String: Any]) { - guard let image = info[UIImagePickerControllerOriginalImage] as? UIImage else { - print("Info did not have the required UIImage for the Original Image") + func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey: Any]) { +// Local variable inserted by Swift 4.2 migrator. +let info = convertFromUIImagePickerControllerInfoKeyDictionary(info) + + guard let image = info[convertFromUIImagePickerControllerInfoKey(UIImagePickerController.InfoKey.originalImage)] as? UIImage else { dismiss(animated: true) return } @@ -123,7 +125,7 @@ extension ViewController { func upload(image: UIImage, progressCompletion: @escaping (_ percent: Float) -> Void, completion: @escaping (_ tags: [String], _ colors: [PhotoColor]) -> Void) { - guard let imageData = UIImageJPEGRepresentation(image, 0.5) else { + guard let imageData = image.jpegData(compressionQuality: 0.5) else { print("Could not get JPEG representation of UIImage") return } @@ -145,7 +147,6 @@ extension ViewController { upload.validate() upload.responseJSON { response in guard response.result.isSuccess else { - print("Error while uploading file: \(response.result.error)") completion([String](), [PhotoColor]()) return } @@ -154,13 +155,10 @@ extension ViewController { let uploadedFiles = responseJSON["uploaded"] as? [Any], let firstFile = uploadedFiles.first as? [String: Any], let firstFileID = firstFile["id"] as? String else { - print("Invalid information received from service") completion([String](), [PhotoColor]()) return } - print("Content uploaded with ID: \(firstFileID)") - self.downloadTags(contentID: firstFileID) { tags in self.downloadColors(contentID: firstFileID) { colors in completion(tags, colors) @@ -179,7 +177,6 @@ extension ViewController { .responseJSON { response in guard response.result.isSuccess else { - print("Error while fetching tags: \(response.result.error)") completion([String]()) return } @@ -193,7 +190,7 @@ extension ViewController { return } - let tags = tagsAndConfidences.flatMap({ dict in + let tags = tagsAndConfidences.compactMap({ dict in return dict["tag"] as? String }) @@ -206,7 +203,6 @@ extension ViewController { .responseJSON { response in guard response.result.isSuccess else { - print("Error while fetching colors: \(response.result.error)") completion([PhotoColor]()) return } @@ -221,7 +217,7 @@ extension ViewController { return } - let photoColors = imageColors.flatMap({ (dict) -> PhotoColor? in + let photoColors = imageColors.compactMap({ (dict) -> PhotoColor? in guard let r = dict["r"] as? String, let g = dict["g"] as? String, let b = dict["b"] as? String, @@ -236,3 +232,13 @@ extension ViewController { } } } + +// Helper function inserted by Swift 4.2 migrator. +fileprivate func convertFromUIImagePickerControllerInfoKeyDictionary(_ input: [UIImagePickerController.InfoKey: Any]) -> [String: Any] { + return Dictionary(uniqueKeysWithValues: input.map {key, value in (key.rawValue, value)}) +} + +// Helper function inserted by Swift 4.2 migrator. +fileprivate func convertFromUIImagePickerControllerInfoKey(_ input: UIImagePickerController.InfoKey) -> String { + return input.rawValue +} diff --git a/Project 30 - PhotoTagger/Podfile.lock b/Project 30 - PhotoTagger/Podfile.lock index 7bd12c44..d12dc896 100644 --- a/Project 30 - PhotoTagger/Podfile.lock +++ b/Project 30 - PhotoTagger/Podfile.lock @@ -1,12 +1,16 @@ PODS: - - Alamofire (4.3.0) + - Alamofire (4.8.2) DEPENDENCIES: - Alamofire +SPEC REPOS: + https://github.com/cocoapods/specs.git: + - Alamofire + SPEC CHECKSUMS: - Alamofire: 856a113053a7bc9cbe5d6367a555d773fc5cfef7 + Alamofire: ae5c501addb7afdbb13687d7f2f722c78734c2d3 PODFILE CHECKSUM: f8453dd4051bfd96a771ac4fc2a7adaae7c56b05 -COCOAPODS: 1.2.0.beta.1 +COCOAPODS: 1.6.1 diff --git a/README.md b/README.md index 22fae8fb..0dd21278 100644 --- a/README.md +++ b/README.md @@ -3,36 +3,33 @@ ![Cover](./Cover.jpg) ## Contents -This repo focus on usage of: +This repo is updated with Swift 5 and compatible with iPhone X: * Simple UIKit components * UIScrollView, UITableView, UICollectionView * CAAnimations and UIView Animations -* Local Notification in iOS 10 -* MapKit and Contact Frameworks -* Core Data, Today Extension and 3D touch +* Local Notification in iOS 11 +* MapKit, Contact, and Core ML frameworks +* Core Data, Today Extension, and 3D touch * Popular Open Source Frameworks * Design Patterns +* Test Driven Development, XCTest ![Swift30Projects](./Swift30Projects.png) ## By developers and for developers -I am an iOS developer and currently learning Swift. +I am an iOS developer and currently using Swift. -This project is inspired by [Sam Lu](https://twitter.com/samvlu)'s [100 Days of Swift](http://samvlu.com/index.html) and [Allen朝辉](https://twitter.com/creativewang)'s [30DaysSwift](https://github.com/allenwong/30DaysofSwift). - -Unlike above projects coded by designers, my original goal is not only to implement general features in Swift, but also focus on code style and architecture design. - -**This repo does not merely follow tutorials, I re-architecture them with better code style and design.** +**This repo does not merely follow tutorials, I re-build them with better code style and architecture design.** For code style, I strictly follow [raywenderlich.com Swift Style Guide](https://github.com/raywenderlich/swift-style-guide); -For developers, I have a README file and screenshots for every single project, you can start coding from there. +For developers, I have a README file and screenshots for every single app in this repo, all details could be found there. -## Whats's next? +## What's next? -I will maintain the project with latest syntax and most advanced code style. More code comments is going to be covered as well. +I will maintain the project with latest syntax and most advanced code style. More code comments are going to be covered as well. Also, **unit tests** will be added to ensure the quality of the codebase. diff --git a/Swift30Projects.png b/Swift30Projects.png index 42ca6c6b..b46fec8b 100644 Binary files a/Swift30Projects.png and b/Swift30Projects.png differ