Remove demo folder
|
@ -1,12 +0,0 @@
|
||||||
disabled_rules:
|
|
||||||
- identifier_name
|
|
||||||
- line_length
|
|
||||||
- nesting
|
|
||||||
- todo
|
|
||||||
- trailing_whitespace
|
|
||||||
- type_name
|
|
||||||
- vertical_whitespace
|
|
||||||
|
|
||||||
included:
|
|
||||||
- ../Sources
|
|
||||||
- ../Tests
|
|
|
@ -1,888 +0,0 @@
|
||||||
// !$*UTF8*$!
|
|
||||||
{
|
|
||||||
archiveVersion = 1;
|
|
||||||
classes = {
|
|
||||||
};
|
|
||||||
objectVersion = 52;
|
|
||||||
objects = {
|
|
||||||
|
|
||||||
/* Begin PBXBuildFile section */
|
|
||||||
A90CD6A3257E2403008A1749 /* DateScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = A90CD6A2257E2403008A1749 /* DateScreen.swift */; };
|
|
||||||
A90CD6A8257E2412008A1749 /* DateScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = A90CD6A2257E2403008A1749 /* DateScreen.swift */; };
|
|
||||||
A90CD6AB257E241B008A1749 /* Persons.csv in Resources */ = {isa = PBXBuildFile; fileRef = A9544D772574CAFC00522141 /* Persons.csv */; };
|
|
||||||
A90CD6AC257E241B008A1749 /* DataScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9544D5E2574C51A00522141 /* DataScreen.swift */; };
|
|
||||||
A90CD6AD257E241B008A1749 /* Base64StringCoderScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9544D6F2574C81700522141 /* Base64StringCoderScreen.swift */; };
|
|
||||||
A90CD6AE257E241B008A1749 /* StandardCsvParserScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9544D732574C82300522141 /* StandardCsvParserScreen.swift */; };
|
|
||||||
A90CD6B3257E2E6E008A1749 /* DeviceScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = A90CD6B2257E2E6E008A1749 /* DeviceScreen.swift */; };
|
|
||||||
A90CD6B7257E3343008A1749 /* DeviceIdentifierScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = A90CD6B6257E3343008A1749 /* DeviceIdentifierScreen.swift */; };
|
|
||||||
A90CD6BA257E334A008A1749 /* DeviceIdentifierScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = A90CD6B6257E3343008A1749 /* DeviceIdentifierScreen.swift */; };
|
|
||||||
A9544BD62571CBC900522141 /* DemoApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9544BC32571CBC800522141 /* DemoApp.swift */; };
|
|
||||||
A9544BD72571CBC900522141 /* DemoApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9544BC32571CBC800522141 /* DemoApp.swift */; };
|
|
||||||
A9544BD82571CBC900522141 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9544BC42571CBC800522141 /* ContentView.swift */; };
|
|
||||||
A9544BD92571CBC900522141 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9544BC42571CBC800522141 /* ContentView.swift */; };
|
|
||||||
A9544BDA2571CBC900522141 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = A9544BC52571CBC900522141 /* Assets.xcassets */; };
|
|
||||||
A9544BDB2571CBC900522141 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = A9544BC52571CBC900522141 /* Assets.xcassets */; };
|
|
||||||
A9544C0F2571CD6B00522141 /* Image+Demo.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9544C0E2571CD6B00522141 /* Image+Demo.swift */; };
|
|
||||||
A9544C102571CD6B00522141 /* Image+Demo.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9544C0E2571CD6B00522141 /* Image+Demo.swift */; };
|
|
||||||
A9544D3B2574446A00522141 /* AuthenticationScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9544D3A2574446A00522141 /* AuthenticationScreen.swift */; };
|
|
||||||
A9544D3C2574446A00522141 /* AuthenticationScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9544D3A2574446A00522141 /* AuthenticationScreen.swift */; };
|
|
||||||
A9544D42257444DE00522141 /* BiometricAuthenticationServiceScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9544D41257444DE00522141 /* BiometricAuthenticationServiceScreen.swift */; };
|
|
||||||
A9544D43257444DE00522141 /* BiometricAuthenticationServiceScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9544D41257444DE00522141 /* BiometricAuthenticationServiceScreen.swift */; };
|
|
||||||
A9544D492574450600522141 /* CachedAuthenticationServiceProxyScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9544D482574450600522141 /* CachedAuthenticationServiceProxyScreen.swift */; };
|
|
||||||
A9544D4A2574450600522141 /* CachedAuthenticationServiceProxyScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9544D482574450600522141 /* CachedAuthenticationServiceProxyScreen.swift */; };
|
|
||||||
A9544D53257455CA00522141 /* SwiftUIKit in Frameworks */ = {isa = PBXBuildFile; productRef = A9544D52257455CA00522141 /* SwiftUIKit */; };
|
|
||||||
A9544D58257455DA00522141 /* SwiftUIKit in Frameworks */ = {isa = PBXBuildFile; productRef = A9544D57257455DA00522141 /* SwiftUIKit */; };
|
|
||||||
A9544D5F2574C51A00522141 /* DataScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9544D5E2574C51A00522141 /* DataScreen.swift */; };
|
|
||||||
A9544D702574C81700522141 /* Base64StringCoderScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9544D6F2574C81700522141 /* Base64StringCoderScreen.swift */; };
|
|
||||||
A9544D742574C82300522141 /* StandardCsvParserScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9544D732574C82300522141 /* StandardCsvParserScreen.swift */; };
|
|
||||||
A9544D782574CAFC00522141 /* Persons.csv in Resources */ = {isa = PBXBuildFile; fileRef = A9544D772574CAFC00522141 /* Persons.csv */; };
|
|
||||||
A971DC532860ABEE00F30DEF /* SwiftKit in Frameworks */ = {isa = PBXBuildFile; productRef = A971DC522860ABEE00F30DEF /* SwiftKit */; };
|
|
||||||
A971DC552860ABF200F30DEF /* SwiftKit in Frameworks */ = {isa = PBXBuildFile; productRef = A971DC542860ABF200F30DEF /* SwiftKit */; };
|
|
||||||
A982781B257E523B0006D64F /* ExtensionsScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = A982781A257E523B0006D64F /* ExtensionsScreen.swift */; };
|
|
||||||
A982781E257E52680006D64F /* ExtensionsScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = A982781A257E523B0006D64F /* ExtensionsScreen.swift */; };
|
|
||||||
A9827825257E53510006D64F /* FilesScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9827824257E53510006D64F /* FilesScreen.swift */; };
|
|
||||||
A9827835257E54EA0006D64F /* FilesScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9827824257E53510006D64F /* FilesScreen.swift */; };
|
|
||||||
A982783B257E55000006D64F /* FileFinderScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = A982783A257E55000006D64F /* FileFinderScreen.swift */; };
|
|
||||||
A982783C257E55000006D64F /* FileFinderScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = A982783A257E55000006D64F /* FileFinderScreen.swift */; };
|
|
||||||
A9827840257E550B0006D64F /* DirectoryServiceScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = A982783F257E550B0006D64F /* DirectoryServiceScreen.swift */; };
|
|
||||||
A9827841257E550B0006D64F /* DirectoryServiceScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = A982783F257E550B0006D64F /* DirectoryServiceScreen.swift */; };
|
|
||||||
A9827848257E5B060006D64F /* File1.txt in Resources */ = {isa = PBXBuildFile; fileRef = A9827847257E5B060006D64F /* File1.txt */; };
|
|
||||||
A9827849257E5B060006D64F /* File1.txt in Resources */ = {isa = PBXBuildFile; fileRef = A9827847257E5B060006D64F /* File1.txt */; };
|
|
||||||
A9827850257E5B2A0006D64F /* File5.jpg in Resources */ = {isa = PBXBuildFile; fileRef = A982784C257E5B290006D64F /* File5.jpg */; };
|
|
||||||
A9827851257E5B2A0006D64F /* File5.jpg in Resources */ = {isa = PBXBuildFile; fileRef = A982784C257E5B290006D64F /* File5.jpg */; };
|
|
||||||
A9827852257E5B2A0006D64F /* File4.txt in Resources */ = {isa = PBXBuildFile; fileRef = A982784D257E5B290006D64F /* File4.txt */; };
|
|
||||||
A9827853257E5B2A0006D64F /* File4.txt in Resources */ = {isa = PBXBuildFile; fileRef = A982784D257E5B290006D64F /* File4.txt */; };
|
|
||||||
A9827854257E5B2A0006D64F /* File2.pdf in Resources */ = {isa = PBXBuildFile; fileRef = A982784E257E5B290006D64F /* File2.pdf */; };
|
|
||||||
A9827855257E5B2A0006D64F /* File2.pdf in Resources */ = {isa = PBXBuildFile; fileRef = A982784E257E5B290006D64F /* File2.pdf */; };
|
|
||||||
A9827856257E5B2A0006D64F /* File3.gif in Resources */ = {isa = PBXBuildFile; fileRef = A982784F257E5B2A0006D64F /* File3.gif */; };
|
|
||||||
A9827857257E5B2A0006D64F /* File3.gif in Resources */ = {isa = PBXBuildFile; fileRef = A982784F257E5B2A0006D64F /* File3.gif */; };
|
|
||||||
A982786A257E5D550006D64F /* GeoScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9827869257E5D550006D64F /* GeoScreen.swift */; };
|
|
||||||
A982786B257E5D550006D64F /* GeoScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9827869257E5D550006D64F /* GeoScreen.swift */; };
|
|
||||||
A9827871257E5DE80006D64F /* WorldCoordinateScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9827870257E5DE80006D64F /* WorldCoordinateScreen.swift */; };
|
|
||||||
A9827872257E5DE80006D64F /* WorldCoordinateScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9827870257E5DE80006D64F /* WorldCoordinateScreen.swift */; };
|
|
||||||
A9827876257E5E0E0006D64F /* ExternalMapServicesScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9827875257E5E0E0006D64F /* ExternalMapServicesScreen.swift */; };
|
|
||||||
A9827877257E5E0E0006D64F /* ExternalMapServicesScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9827875257E5E0E0006D64F /* ExternalMapServicesScreen.swift */; };
|
|
||||||
A9827885257E67080006D64F /* KeychainScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9827884257E67080006D64F /* KeychainScreen.swift */; };
|
|
||||||
A9827886257E67080006D64F /* KeychainScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9827884257E67080006D64F /* KeychainScreen.swift */; };
|
|
||||||
A982788C257E67660006D64F /* KeychainServiceScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = A982788B257E67660006D64F /* KeychainServiceScreen.swift */; };
|
|
||||||
A982788D257E67660006D64F /* KeychainServiceScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = A982788B257E67660006D64F /* KeychainServiceScreen.swift */; };
|
|
||||||
A9827892257E73D40006D64F /* LocalizationScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9827891257E73D40006D64F /* LocalizationScreen.swift */; };
|
|
||||||
A9827893257E73D40006D64F /* LocalizationScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9827891257E73D40006D64F /* LocalizationScreen.swift */; };
|
|
||||||
A9827897257E74040006D64F /* LocalizationServiceScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9827896257E74040006D64F /* LocalizationServiceScreen.swift */; };
|
|
||||||
A9827898257E74040006D64F /* LocalizationServiceScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9827896257E74040006D64F /* LocalizationServiceScreen.swift */; };
|
|
||||||
A982789C257E740E0006D64F /* TranslatorScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = A982789B257E740E0006D64F /* TranslatorScreen.swift */; };
|
|
||||||
A982789D257E740E0006D64F /* TranslatorScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = A982789B257E740E0006D64F /* TranslatorScreen.swift */; };
|
|
||||||
A98278A0257E74440006D64F /* DeviceScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = A90CD6B2257E2E6E008A1749 /* DeviceScreen.swift */; };
|
|
||||||
A98278A8257E76940006D64F /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = A98278AB257E76940006D64F /* Localizable.strings */; };
|
|
||||||
A98278A9257E76940006D64F /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = A98278AB257E76940006D64F /* Localizable.strings */; };
|
|
||||||
A98278B6257E7AC20006D64F /* NetworkScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = A98278B5257E7AC20006D64F /* NetworkScreen.swift */; };
|
|
||||||
A98278B7257E7AC20006D64F /* NetworkScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = A98278B5257E7AC20006D64F /* NetworkScreen.swift */; };
|
|
||||||
A98278BC257E7B3D0006D64F /* ServicesScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = A98278BB257E7B3D0006D64F /* ServicesScreen.swift */; };
|
|
||||||
A98278BD257E7B3D0006D64F /* ServicesScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = A98278BB257E7B3D0006D64F /* ServicesScreen.swift */; };
|
|
||||||
A98278D3257E83250006D64F /* Color+Demo.swift in Sources */ = {isa = PBXBuildFile; fileRef = A98278D2257E83250006D64F /* Color+Demo.swift */; };
|
|
||||||
A98278D4257E83250006D64F /* Color+Demo.swift in Sources */ = {isa = PBXBuildFile; fileRef = A98278D2257E83250006D64F /* Color+Demo.swift */; };
|
|
||||||
/* End PBXBuildFile section */
|
|
||||||
|
|
||||||
/* Begin PBXFileReference section */
|
|
||||||
A90CD6A2257E2403008A1749 /* DateScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DateScreen.swift; sourceTree = "<group>"; };
|
|
||||||
A90CD6B2257E2E6E008A1749 /* DeviceScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeviceScreen.swift; sourceTree = "<group>"; };
|
|
||||||
A90CD6B6257E3343008A1749 /* DeviceIdentifierScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeviceIdentifierScreen.swift; sourceTree = "<group>"; };
|
|
||||||
A9544BC32571CBC800522141 /* DemoApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DemoApp.swift; sourceTree = "<group>"; };
|
|
||||||
A9544BC42571CBC800522141 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = "<group>"; };
|
|
||||||
A9544BC52571CBC900522141 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
|
|
||||||
A9544BCA2571CBC900522141 /* Demo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Demo.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
|
||||||
A9544BCD2571CBC900522141 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
|
||||||
A9544BD22571CBC900522141 /* Demo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Demo.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
|
||||||
A9544BD42571CBC900522141 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
|
||||||
A9544BD52571CBC900522141 /* macOS.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = macOS.entitlements; sourceTree = "<group>"; };
|
|
||||||
A9544BEB2571CC4900522141 /* LICENSE */ = {isa = PBXFileReference; lastKnownFileType = text; name = LICENSE; path = ../LICENSE; sourceTree = "<group>"; };
|
|
||||||
A9544BEC2571CC4900522141 /* Package.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = Package.swift; path = ../Package.swift; sourceTree = "<group>"; };
|
|
||||||
A9544BED2571CC4900522141 /* Release Notes.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; name = "Release Notes.md"; path = "../Release Notes.md"; sourceTree = "<group>"; };
|
|
||||||
A9544BEE2571CC4900522141 /* Package.resolved */ = {isa = PBXFileReference; lastKnownFileType = text; name = Package.resolved; path = ../Package.resolved; sourceTree = "<group>"; };
|
|
||||||
A9544BEF2571CC4900522141 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; name = README.md; path = ../README.md; sourceTree = "<group>"; };
|
|
||||||
A9544BF02571CC4900522141 /* DSSwiftKit.podspec */ = {isa = PBXFileReference; lastKnownFileType = text; name = DSSwiftKit.podspec; path = ../DSSwiftKit.podspec; sourceTree = "<group>"; };
|
|
||||||
A9544BF12571CC5800522141 /* .swiftlint.yml */ = {isa = PBXFileReference; lastKnownFileType = text.yaml; name = .swiftlint.yml; path = ../.swiftlint.yml; sourceTree = "<group>"; };
|
|
||||||
A9544BF22571CC5800522141 /* .gitignore */ = {isa = PBXFileReference; lastKnownFileType = text; name = .gitignore; path = ../.gitignore; sourceTree = "<group>"; };
|
|
||||||
A9544C0E2571CD6B00522141 /* Image+Demo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Image+Demo.swift"; sourceTree = "<group>"; };
|
|
||||||
A9544D3A2574446A00522141 /* AuthenticationScreen.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AuthenticationScreen.swift; sourceTree = "<group>"; };
|
|
||||||
A9544D41257444DE00522141 /* BiometricAuthenticationServiceScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BiometricAuthenticationServiceScreen.swift; sourceTree = "<group>"; };
|
|
||||||
A9544D482574450600522141 /* CachedAuthenticationServiceProxyScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CachedAuthenticationServiceProxyScreen.swift; sourceTree = "<group>"; };
|
|
||||||
A9544D5E2574C51A00522141 /* DataScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DataScreen.swift; sourceTree = "<group>"; };
|
|
||||||
A9544D6F2574C81700522141 /* Base64StringCoderScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Base64StringCoderScreen.swift; sourceTree = "<group>"; };
|
|
||||||
A9544D732574C82300522141 /* StandardCsvParserScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StandardCsvParserScreen.swift; sourceTree = "<group>"; };
|
|
||||||
A9544D772574CAFC00522141 /* Persons.csv */ = {isa = PBXFileReference; lastKnownFileType = text; path = Persons.csv; sourceTree = "<group>"; };
|
|
||||||
A971DC512860ABD600F30DEF /* swiftkit */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = swiftkit; path = ..; sourceTree = "<group>"; };
|
|
||||||
A982781A257E523B0006D64F /* ExtensionsScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExtensionsScreen.swift; sourceTree = "<group>"; };
|
|
||||||
A9827824257E53510006D64F /* FilesScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FilesScreen.swift; sourceTree = "<group>"; };
|
|
||||||
A982783A257E55000006D64F /* FileFinderScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FileFinderScreen.swift; sourceTree = "<group>"; };
|
|
||||||
A982783F257E550B0006D64F /* DirectoryServiceScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DirectoryServiceScreen.swift; sourceTree = "<group>"; };
|
|
||||||
A9827847257E5B060006D64F /* File1.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = File1.txt; sourceTree = "<group>"; };
|
|
||||||
A982784C257E5B290006D64F /* File5.jpg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = image.jpeg; path = File5.jpg; sourceTree = "<group>"; };
|
|
||||||
A982784D257E5B290006D64F /* File4.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = File4.txt; sourceTree = "<group>"; };
|
|
||||||
A982784E257E5B290006D64F /* File2.pdf */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = image.pdf; path = File2.pdf; sourceTree = "<group>"; };
|
|
||||||
A982784F257E5B2A0006D64F /* File3.gif */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = image.gif; path = File3.gif; sourceTree = "<group>"; };
|
|
||||||
A9827869257E5D550006D64F /* GeoScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GeoScreen.swift; sourceTree = "<group>"; };
|
|
||||||
A9827870257E5DE80006D64F /* WorldCoordinateScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WorldCoordinateScreen.swift; sourceTree = "<group>"; };
|
|
||||||
A9827875257E5E0E0006D64F /* ExternalMapServicesScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExternalMapServicesScreen.swift; sourceTree = "<group>"; };
|
|
||||||
A9827884257E67080006D64F /* KeychainScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeychainScreen.swift; sourceTree = "<group>"; };
|
|
||||||
A982788B257E67660006D64F /* KeychainServiceScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeychainServiceScreen.swift; sourceTree = "<group>"; };
|
|
||||||
A9827891257E73D40006D64F /* LocalizationScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalizationScreen.swift; sourceTree = "<group>"; };
|
|
||||||
A9827896257E74040006D64F /* LocalizationServiceScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalizationServiceScreen.swift; sourceTree = "<group>"; };
|
|
||||||
A982789B257E740E0006D64F /* TranslatorScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TranslatorScreen.swift; sourceTree = "<group>"; };
|
|
||||||
A98278AA257E76940006D64F /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = "<group>"; };
|
|
||||||
A98278AE257E76A50006D64F /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sv; path = sv.lproj/Localizable.strings; sourceTree = "<group>"; };
|
|
||||||
A98278B5257E7AC20006D64F /* NetworkScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkScreen.swift; sourceTree = "<group>"; };
|
|
||||||
A98278BB257E7B3D0006D64F /* ServicesScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ServicesScreen.swift; sourceTree = "<group>"; };
|
|
||||||
A98278D2257E83250006D64F /* Color+Demo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Color+Demo.swift"; sourceTree = "<group>"; };
|
|
||||||
/* End PBXFileReference section */
|
|
||||||
|
|
||||||
/* Begin PBXFrameworksBuildPhase section */
|
|
||||||
A9544BC72571CBC900522141 /* Frameworks */ = {
|
|
||||||
isa = PBXFrameworksBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
A9544D53257455CA00522141 /* SwiftUIKit in Frameworks */,
|
|
||||||
A971DC532860ABEE00F30DEF /* SwiftKit in Frameworks */,
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
};
|
|
||||||
A9544BCF2571CBC900522141 /* Frameworks */ = {
|
|
||||||
isa = PBXFrameworksBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
A9544D58257455DA00522141 /* SwiftUIKit in Frameworks */,
|
|
||||||
A971DC552860ABF200F30DEF /* SwiftKit in Frameworks */,
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
};
|
|
||||||
/* End PBXFrameworksBuildPhase section */
|
|
||||||
|
|
||||||
/* Begin PBXGroup section */
|
|
||||||
A90CD6A1257E23F7008A1749 /* Date */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
A90CD6A2257E2403008A1749 /* DateScreen.swift */,
|
|
||||||
);
|
|
||||||
path = Date;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
A90CD6B1257E2E5E008A1749 /* Device */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
A90CD6B2257E2E6E008A1749 /* DeviceScreen.swift */,
|
|
||||||
A90CD6B6257E3343008A1749 /* DeviceIdentifierScreen.swift */,
|
|
||||||
);
|
|
||||||
path = Device;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
A9544BBD2571CBC800522141 = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
A971DC502860ABD600F30DEF /* Packages */,
|
|
||||||
A9544BCC2571CBC900522141 /* iOS */,
|
|
||||||
A9544BD32571CBC900522141 /* macOS */,
|
|
||||||
A9544BC22571CBC800522141 /* Shared */,
|
|
||||||
A9544BCB2571CBC900522141 /* Products */,
|
|
||||||
A9544BEA2571CC3200522141 /* Project Files */,
|
|
||||||
A9544D56257455DA00522141 /* Frameworks */,
|
|
||||||
);
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
A9544BC22571CBC800522141 /* Shared */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
A9544D392574445900522141 /* Authentication */,
|
|
||||||
A9544D5D2574C50700522141 /* Data */,
|
|
||||||
A90CD6A1257E23F7008A1749 /* Date */,
|
|
||||||
A9544BF32571CCB600522141 /* Demo */,
|
|
||||||
A90CD6B1257E2E5E008A1749 /* Device */,
|
|
||||||
A9827819257E522E0006D64F /* Extensions */,
|
|
||||||
A9827823257E53440006D64F /* Files */,
|
|
||||||
A9827868257E5D4B0006D64F /* Geo */,
|
|
||||||
A9827882257E66F20006D64F /* Keychain */,
|
|
||||||
A9827890257E73C80006D64F /* Localization */,
|
|
||||||
A98278B4257E7AB50006D64F /* Network */,
|
|
||||||
A9544BF82571CCC800522141 /* Resources */,
|
|
||||||
A98278BA257E7B310006D64F /* Services */,
|
|
||||||
A98278B1257E79690006D64F /* Supporting Files */,
|
|
||||||
);
|
|
||||||
path = Shared;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
A9544BCB2571CBC900522141 /* Products */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
A9544BCA2571CBC900522141 /* Demo.app */,
|
|
||||||
A9544BD22571CBC900522141 /* Demo.app */,
|
|
||||||
);
|
|
||||||
name = Products;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
A9544BCC2571CBC900522141 /* iOS */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
A9544BCD2571CBC900522141 /* Info.plist */,
|
|
||||||
);
|
|
||||||
path = iOS;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
A9544BD32571CBC900522141 /* macOS */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
A9544BD42571CBC900522141 /* Info.plist */,
|
|
||||||
A9544BD52571CBC900522141 /* macOS.entitlements */,
|
|
||||||
);
|
|
||||||
path = macOS;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
A9544BEA2571CC3200522141 /* Project Files */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
A9544BF22571CC5800522141 /* .gitignore */,
|
|
||||||
A9544BF12571CC5800522141 /* .swiftlint.yml */,
|
|
||||||
A9544BF02571CC4900522141 /* DSSwiftKit.podspec */,
|
|
||||||
A9544BEB2571CC4900522141 /* LICENSE */,
|
|
||||||
A9544BEE2571CC4900522141 /* Package.resolved */,
|
|
||||||
A9544BEC2571CC4900522141 /* Package.swift */,
|
|
||||||
A9544BEF2571CC4900522141 /* README.md */,
|
|
||||||
A9544BED2571CC4900522141 /* Release Notes.md */,
|
|
||||||
);
|
|
||||||
name = "Project Files";
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
A9544BF32571CCB600522141 /* Demo */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
A9544BC42571CBC800522141 /* ContentView.swift */,
|
|
||||||
A9544BC32571CBC800522141 /* DemoApp.swift */,
|
|
||||||
);
|
|
||||||
path = Demo;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
A9544BF82571CCC800522141 /* Resources */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
A9544BC52571CBC900522141 /* Assets.xcassets */,
|
|
||||||
A9827846257E5AE30006D64F /* Files */,
|
|
||||||
A9544C0E2571CD6B00522141 /* Image+Demo.swift */,
|
|
||||||
A98278D2257E83250006D64F /* Color+Demo.swift */,
|
|
||||||
);
|
|
||||||
path = Resources;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
A9544D392574445900522141 /* Authentication */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
A9544D3A2574446A00522141 /* AuthenticationScreen.swift */,
|
|
||||||
A9544D41257444DE00522141 /* BiometricAuthenticationServiceScreen.swift */,
|
|
||||||
A9544D482574450600522141 /* CachedAuthenticationServiceProxyScreen.swift */,
|
|
||||||
);
|
|
||||||
path = Authentication;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
A9544D56257455DA00522141 /* Frameworks */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
);
|
|
||||||
name = Frameworks;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
A9544D5D2574C50700522141 /* Data */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
A9544D5E2574C51A00522141 /* DataScreen.swift */,
|
|
||||||
A9544D6F2574C81700522141 /* Base64StringCoderScreen.swift */,
|
|
||||||
A9544D732574C82300522141 /* StandardCsvParserScreen.swift */,
|
|
||||||
A9544D772574CAFC00522141 /* Persons.csv */,
|
|
||||||
);
|
|
||||||
path = Data;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
A971DC502860ABD600F30DEF /* Packages */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
A971DC512860ABD600F30DEF /* swiftkit */,
|
|
||||||
);
|
|
||||||
name = Packages;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
A9827819257E522E0006D64F /* Extensions */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
A982781A257E523B0006D64F /* ExtensionsScreen.swift */,
|
|
||||||
);
|
|
||||||
path = Extensions;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
A9827823257E53440006D64F /* Files */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
A9827824257E53510006D64F /* FilesScreen.swift */,
|
|
||||||
A982783F257E550B0006D64F /* DirectoryServiceScreen.swift */,
|
|
||||||
A982783A257E55000006D64F /* FileFinderScreen.swift */,
|
|
||||||
);
|
|
||||||
path = Files;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
A9827846257E5AE30006D64F /* Files */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
A9827847257E5B060006D64F /* File1.txt */,
|
|
||||||
A982784E257E5B290006D64F /* File2.pdf */,
|
|
||||||
A982784F257E5B2A0006D64F /* File3.gif */,
|
|
||||||
A982784D257E5B290006D64F /* File4.txt */,
|
|
||||||
A982784C257E5B290006D64F /* File5.jpg */,
|
|
||||||
);
|
|
||||||
path = Files;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
A9827868257E5D4B0006D64F /* Geo */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
A9827869257E5D550006D64F /* GeoScreen.swift */,
|
|
||||||
A9827870257E5DE80006D64F /* WorldCoordinateScreen.swift */,
|
|
||||||
A9827875257E5E0E0006D64F /* ExternalMapServicesScreen.swift */,
|
|
||||||
);
|
|
||||||
path = Geo;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
A9827882257E66F20006D64F /* Keychain */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
A9827884257E67080006D64F /* KeychainScreen.swift */,
|
|
||||||
A982788B257E67660006D64F /* KeychainServiceScreen.swift */,
|
|
||||||
);
|
|
||||||
path = Keychain;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
A9827890257E73C80006D64F /* Localization */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
A9827891257E73D40006D64F /* LocalizationScreen.swift */,
|
|
||||||
A9827896257E74040006D64F /* LocalizationServiceScreen.swift */,
|
|
||||||
A982789B257E740E0006D64F /* TranslatorScreen.swift */,
|
|
||||||
);
|
|
||||||
path = Localization;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
A98278B1257E79690006D64F /* Supporting Files */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
A98278AB257E76940006D64F /* Localizable.strings */,
|
|
||||||
);
|
|
||||||
name = "Supporting Files";
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
A98278B4257E7AB50006D64F /* Network */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
A98278B5257E7AC20006D64F /* NetworkScreen.swift */,
|
|
||||||
);
|
|
||||||
path = Network;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
A98278BA257E7B310006D64F /* Services */ = {
|
|
||||||
isa = PBXGroup;
|
|
||||||
children = (
|
|
||||||
A98278BB257E7B3D0006D64F /* ServicesScreen.swift */,
|
|
||||||
);
|
|
||||||
path = Services;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
/* End PBXGroup section */
|
|
||||||
|
|
||||||
/* Begin PBXNativeTarget section */
|
|
||||||
A9544BC92571CBC900522141 /* Demo (iOS) */ = {
|
|
||||||
isa = PBXNativeTarget;
|
|
||||||
buildConfigurationList = A9544BDE2571CBC900522141 /* Build configuration list for PBXNativeTarget "Demo (iOS)" */;
|
|
||||||
buildPhases = (
|
|
||||||
A98278E9257ECDAE0006D64F /* [SwiftLint] */,
|
|
||||||
A9544BC62571CBC900522141 /* Sources */,
|
|
||||||
A9544BC72571CBC900522141 /* Frameworks */,
|
|
||||||
A9544BC82571CBC900522141 /* Resources */,
|
|
||||||
);
|
|
||||||
buildRules = (
|
|
||||||
);
|
|
||||||
dependencies = (
|
|
||||||
);
|
|
||||||
name = "Demo (iOS)";
|
|
||||||
packageProductDependencies = (
|
|
||||||
A9544D52257455CA00522141 /* SwiftUIKit */,
|
|
||||||
A971DC522860ABEE00F30DEF /* SwiftKit */,
|
|
||||||
);
|
|
||||||
productName = "Demo (iOS)";
|
|
||||||
productReference = A9544BCA2571CBC900522141 /* Demo.app */;
|
|
||||||
productType = "com.apple.product-type.application";
|
|
||||||
};
|
|
||||||
A9544BD12571CBC900522141 /* Demo (macOS) */ = {
|
|
||||||
isa = PBXNativeTarget;
|
|
||||||
buildConfigurationList = A9544BE12571CBC900522141 /* Build configuration list for PBXNativeTarget "Demo (macOS)" */;
|
|
||||||
buildPhases = (
|
|
||||||
A9544BCE2571CBC900522141 /* Sources */,
|
|
||||||
A9544BCF2571CBC900522141 /* Frameworks */,
|
|
||||||
A9544BD02571CBC900522141 /* Resources */,
|
|
||||||
);
|
|
||||||
buildRules = (
|
|
||||||
);
|
|
||||||
dependencies = (
|
|
||||||
);
|
|
||||||
name = "Demo (macOS)";
|
|
||||||
packageProductDependencies = (
|
|
||||||
A9544D57257455DA00522141 /* SwiftUIKit */,
|
|
||||||
A971DC542860ABF200F30DEF /* SwiftKit */,
|
|
||||||
);
|
|
||||||
productName = "Demo (macOS)";
|
|
||||||
productReference = A9544BD22571CBC900522141 /* Demo.app */;
|
|
||||||
productType = "com.apple.product-type.application";
|
|
||||||
};
|
|
||||||
/* End PBXNativeTarget section */
|
|
||||||
|
|
||||||
/* Begin PBXProject section */
|
|
||||||
A9544BBE2571CBC800522141 /* Project object */ = {
|
|
||||||
isa = PBXProject;
|
|
||||||
attributes = {
|
|
||||||
LastSwiftUpdateCheck = 1220;
|
|
||||||
LastUpgradeCheck = 1220;
|
|
||||||
ORGANIZATIONNAME = "Daniel Saidi";
|
|
||||||
TargetAttributes = {
|
|
||||||
A9544BC92571CBC900522141 = {
|
|
||||||
CreatedOnToolsVersion = 12.2;
|
|
||||||
};
|
|
||||||
A9544BD12571CBC900522141 = {
|
|
||||||
CreatedOnToolsVersion = 12.2;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
buildConfigurationList = A9544BC12571CBC800522141 /* Build configuration list for PBXProject "Demo" */;
|
|
||||||
compatibilityVersion = "Xcode 9.3";
|
|
||||||
developmentRegion = en;
|
|
||||||
hasScannedForEncodings = 0;
|
|
||||||
knownRegions = (
|
|
||||||
en,
|
|
||||||
Base,
|
|
||||||
sv,
|
|
||||||
);
|
|
||||||
mainGroup = A9544BBD2571CBC800522141;
|
|
||||||
packageReferences = (
|
|
||||||
A9544D51257455CA00522141 /* XCRemoteSwiftPackageReference "SwiftUIKit" */,
|
|
||||||
);
|
|
||||||
productRefGroup = A9544BCB2571CBC900522141 /* Products */;
|
|
||||||
projectDirPath = "";
|
|
||||||
projectRoot = "";
|
|
||||||
targets = (
|
|
||||||
A9544BC92571CBC900522141 /* Demo (iOS) */,
|
|
||||||
A9544BD12571CBC900522141 /* Demo (macOS) */,
|
|
||||||
);
|
|
||||||
};
|
|
||||||
/* End PBXProject section */
|
|
||||||
|
|
||||||
/* Begin PBXResourcesBuildPhase section */
|
|
||||||
A9544BC82571CBC900522141 /* Resources */ = {
|
|
||||||
isa = PBXResourcesBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
A9827850257E5B2A0006D64F /* File5.jpg in Resources */,
|
|
||||||
A9827854257E5B2A0006D64F /* File2.pdf in Resources */,
|
|
||||||
A9827852257E5B2A0006D64F /* File4.txt in Resources */,
|
|
||||||
A9544BDA2571CBC900522141 /* Assets.xcassets in Resources */,
|
|
||||||
A9827848257E5B060006D64F /* File1.txt in Resources */,
|
|
||||||
A98278A8257E76940006D64F /* Localizable.strings in Resources */,
|
|
||||||
A9544D782574CAFC00522141 /* Persons.csv in Resources */,
|
|
||||||
A9827856257E5B2A0006D64F /* File3.gif in Resources */,
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
};
|
|
||||||
A9544BD02571CBC900522141 /* Resources */ = {
|
|
||||||
isa = PBXResourcesBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
A9827851257E5B2A0006D64F /* File5.jpg in Resources */,
|
|
||||||
A9827855257E5B2A0006D64F /* File2.pdf in Resources */,
|
|
||||||
A9827853257E5B2A0006D64F /* File4.txt in Resources */,
|
|
||||||
A9544BDB2571CBC900522141 /* Assets.xcassets in Resources */,
|
|
||||||
A9827849257E5B060006D64F /* File1.txt in Resources */,
|
|
||||||
A98278A9257E76940006D64F /* Localizable.strings in Resources */,
|
|
||||||
A90CD6AB257E241B008A1749 /* Persons.csv in Resources */,
|
|
||||||
A9827857257E5B2A0006D64F /* File3.gif in Resources */,
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
};
|
|
||||||
/* End PBXResourcesBuildPhase section */
|
|
||||||
|
|
||||||
/* Begin PBXShellScriptBuildPhase section */
|
|
||||||
A98278E9257ECDAE0006D64F /* [SwiftLint] */ = {
|
|
||||||
isa = PBXShellScriptBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
);
|
|
||||||
inputFileListPaths = (
|
|
||||||
);
|
|
||||||
inputPaths = (
|
|
||||||
);
|
|
||||||
name = "[SwiftLint]";
|
|
||||||
outputFileListPaths = (
|
|
||||||
);
|
|
||||||
outputPaths = (
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
shellPath = /bin/sh;
|
|
||||||
shellScript = "if which swiftlint >/dev/null; then\n swiftlint\nfi\n";
|
|
||||||
};
|
|
||||||
/* End PBXShellScriptBuildPhase section */
|
|
||||||
|
|
||||||
/* Begin PBXSourcesBuildPhase section */
|
|
||||||
A9544BC62571CBC900522141 /* Sources */ = {
|
|
||||||
isa = PBXSourcesBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
A9827876257E5E0E0006D64F /* ExternalMapServicesScreen.swift in Sources */,
|
|
||||||
A9544D742574C82300522141 /* StandardCsvParserScreen.swift in Sources */,
|
|
||||||
A982789C257E740E0006D64F /* TranslatorScreen.swift in Sources */,
|
|
||||||
A9544D42257444DE00522141 /* BiometricAuthenticationServiceScreen.swift in Sources */,
|
|
||||||
A9544BD82571CBC900522141 /* ContentView.swift in Sources */,
|
|
||||||
A90CD6B3257E2E6E008A1749 /* DeviceScreen.swift in Sources */,
|
|
||||||
A9827840257E550B0006D64F /* DirectoryServiceScreen.swift in Sources */,
|
|
||||||
A90CD6B7257E3343008A1749 /* DeviceIdentifierScreen.swift in Sources */,
|
|
||||||
A98278BC257E7B3D0006D64F /* ServicesScreen.swift in Sources */,
|
|
||||||
A9827825257E53510006D64F /* FilesScreen.swift in Sources */,
|
|
||||||
A9827871257E5DE80006D64F /* WorldCoordinateScreen.swift in Sources */,
|
|
||||||
A9544D5F2574C51A00522141 /* DataScreen.swift in Sources */,
|
|
||||||
A9827892257E73D40006D64F /* LocalizationScreen.swift in Sources */,
|
|
||||||
A90CD6A3257E2403008A1749 /* DateScreen.swift in Sources */,
|
|
||||||
A982788C257E67660006D64F /* KeychainServiceScreen.swift in Sources */,
|
|
||||||
A982781B257E523B0006D64F /* ExtensionsScreen.swift in Sources */,
|
|
||||||
A9827897257E74040006D64F /* LocalizationServiceScreen.swift in Sources */,
|
|
||||||
A9544D492574450600522141 /* CachedAuthenticationServiceProxyScreen.swift in Sources */,
|
|
||||||
A982786A257E5D550006D64F /* GeoScreen.swift in Sources */,
|
|
||||||
A9827885257E67080006D64F /* KeychainScreen.swift in Sources */,
|
|
||||||
A9544D3B2574446A00522141 /* AuthenticationScreen.swift in Sources */,
|
|
||||||
A9544C0F2571CD6B00522141 /* Image+Demo.swift in Sources */,
|
|
||||||
A98278D3257E83250006D64F /* Color+Demo.swift in Sources */,
|
|
||||||
A9544D702574C81700522141 /* Base64StringCoderScreen.swift in Sources */,
|
|
||||||
A98278B6257E7AC20006D64F /* NetworkScreen.swift in Sources */,
|
|
||||||
A982783B257E55000006D64F /* FileFinderScreen.swift in Sources */,
|
|
||||||
A9544BD62571CBC900522141 /* DemoApp.swift in Sources */,
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
};
|
|
||||||
A9544BCE2571CBC900522141 /* Sources */ = {
|
|
||||||
isa = PBXSourcesBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
A98278B7257E7AC20006D64F /* NetworkScreen.swift in Sources */,
|
|
||||||
A9544D43257444DE00522141 /* BiometricAuthenticationServiceScreen.swift in Sources */,
|
|
||||||
A9544BD92571CBC900522141 /* ContentView.swift in Sources */,
|
|
||||||
A982786B257E5D550006D64F /* GeoScreen.swift in Sources */,
|
|
||||||
A982788D257E67660006D64F /* KeychainServiceScreen.swift in Sources */,
|
|
||||||
A98278D4257E83250006D64F /* Color+Demo.swift in Sources */,
|
|
||||||
A982781E257E52680006D64F /* ExtensionsScreen.swift in Sources */,
|
|
||||||
A982783C257E55000006D64F /* FileFinderScreen.swift in Sources */,
|
|
||||||
A9827835257E54EA0006D64F /* FilesScreen.swift in Sources */,
|
|
||||||
A98278BD257E7B3D0006D64F /* ServicesScreen.swift in Sources */,
|
|
||||||
A9827893257E73D40006D64F /* LocalizationScreen.swift in Sources */,
|
|
||||||
A9544D4A2574450600522141 /* CachedAuthenticationServiceProxyScreen.swift in Sources */,
|
|
||||||
A9827872257E5DE80006D64F /* WorldCoordinateScreen.swift in Sources */,
|
|
||||||
A90CD6BA257E334A008A1749 /* DeviceIdentifierScreen.swift in Sources */,
|
|
||||||
A9827886257E67080006D64F /* KeychainScreen.swift in Sources */,
|
|
||||||
A982789D257E740E0006D64F /* TranslatorScreen.swift in Sources */,
|
|
||||||
A98278A0257E74440006D64F /* DeviceScreen.swift in Sources */,
|
|
||||||
A90CD6AC257E241B008A1749 /* DataScreen.swift in Sources */,
|
|
||||||
A9827841257E550B0006D64F /* DirectoryServiceScreen.swift in Sources */,
|
|
||||||
A90CD6AE257E241B008A1749 /* StandardCsvParserScreen.swift in Sources */,
|
|
||||||
A9544D3C2574446A00522141 /* AuthenticationScreen.swift in Sources */,
|
|
||||||
A90CD6AD257E241B008A1749 /* Base64StringCoderScreen.swift in Sources */,
|
|
||||||
A9827877257E5E0E0006D64F /* ExternalMapServicesScreen.swift in Sources */,
|
|
||||||
A9544C102571CD6B00522141 /* Image+Demo.swift in Sources */,
|
|
||||||
A9827898257E74040006D64F /* LocalizationServiceScreen.swift in Sources */,
|
|
||||||
A90CD6A8257E2412008A1749 /* DateScreen.swift in Sources */,
|
|
||||||
A9544BD72571CBC900522141 /* DemoApp.swift in Sources */,
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
};
|
|
||||||
/* End PBXSourcesBuildPhase section */
|
|
||||||
|
|
||||||
/* Begin PBXVariantGroup section */
|
|
||||||
A98278AB257E76940006D64F /* Localizable.strings */ = {
|
|
||||||
isa = PBXVariantGroup;
|
|
||||||
children = (
|
|
||||||
A98278AA257E76940006D64F /* en */,
|
|
||||||
A98278AE257E76A50006D64F /* sv */,
|
|
||||||
);
|
|
||||||
name = Localizable.strings;
|
|
||||||
sourceTree = "<group>";
|
|
||||||
};
|
|
||||||
/* End PBXVariantGroup section */
|
|
||||||
|
|
||||||
/* Begin XCBuildConfiguration section */
|
|
||||||
A9544BDC2571CBC900522141 /* Debug */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
buildSettings = {
|
|
||||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
|
||||||
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
|
|
||||||
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_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
|
|
||||||
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;
|
|
||||||
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;
|
|
||||||
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
|
|
||||||
MTL_FAST_MATH = YES;
|
|
||||||
ONLY_ACTIVE_ARCH = YES;
|
|
||||||
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
|
|
||||||
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
|
||||||
};
|
|
||||||
name = Debug;
|
|
||||||
};
|
|
||||||
A9544BDD2571CBC900522141 /* Release */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
buildSettings = {
|
|
||||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
|
||||||
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
|
|
||||||
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_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
|
|
||||||
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;
|
|
||||||
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;
|
|
||||||
MTL_ENABLE_DEBUG_INFO = NO;
|
|
||||||
MTL_FAST_MATH = YES;
|
|
||||||
SWIFT_COMPILATION_MODE = wholemodule;
|
|
||||||
SWIFT_OPTIMIZATION_LEVEL = "-O";
|
|
||||||
};
|
|
||||||
name = Release;
|
|
||||||
};
|
|
||||||
A9544BDF2571CBC900522141 /* Debug */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
buildSettings = {
|
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
|
||||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
|
||||||
CODE_SIGN_STYLE = Automatic;
|
|
||||||
DEVELOPMENT_TEAM = PMEDFW438U;
|
|
||||||
ENABLE_PREVIEWS = YES;
|
|
||||||
INFOPLIST_FILE = iOS/Info.plist;
|
|
||||||
IPHONEOS_DEPLOYMENT_TARGET = 14.0;
|
|
||||||
LD_RUNPATH_SEARCH_PATHS = (
|
|
||||||
"$(inherited)",
|
|
||||||
"@executable_path/Frameworks",
|
|
||||||
);
|
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.danielsaidi.swiftkit.demo;
|
|
||||||
PRODUCT_NAME = Demo;
|
|
||||||
SDKROOT = iphoneos;
|
|
||||||
SWIFT_VERSION = 5.0;
|
|
||||||
TARGETED_DEVICE_FAMILY = "1,2";
|
|
||||||
};
|
|
||||||
name = Debug;
|
|
||||||
};
|
|
||||||
A9544BE02571CBC900522141 /* Release */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
buildSettings = {
|
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
|
||||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
|
||||||
CODE_SIGN_STYLE = Automatic;
|
|
||||||
DEVELOPMENT_TEAM = PMEDFW438U;
|
|
||||||
ENABLE_PREVIEWS = YES;
|
|
||||||
INFOPLIST_FILE = iOS/Info.plist;
|
|
||||||
IPHONEOS_DEPLOYMENT_TARGET = 14.0;
|
|
||||||
LD_RUNPATH_SEARCH_PATHS = (
|
|
||||||
"$(inherited)",
|
|
||||||
"@executable_path/Frameworks",
|
|
||||||
);
|
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.danielsaidi.swiftkit.demo;
|
|
||||||
PRODUCT_NAME = Demo;
|
|
||||||
SDKROOT = iphoneos;
|
|
||||||
SWIFT_VERSION = 5.0;
|
|
||||||
TARGETED_DEVICE_FAMILY = "1,2";
|
|
||||||
VALIDATE_PRODUCT = YES;
|
|
||||||
};
|
|
||||||
name = Release;
|
|
||||||
};
|
|
||||||
A9544BE22571CBC900522141 /* Debug */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
buildSettings = {
|
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
|
||||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
|
||||||
CODE_SIGN_ENTITLEMENTS = macOS/macOS.entitlements;
|
|
||||||
CODE_SIGN_STYLE = Automatic;
|
|
||||||
COMBINE_HIDPI_IMAGES = YES;
|
|
||||||
DEVELOPMENT_TEAM = PMEDFW438U;
|
|
||||||
ENABLE_HARDENED_RUNTIME = YES;
|
|
||||||
ENABLE_PREVIEWS = YES;
|
|
||||||
INFOPLIST_FILE = macOS/Info.plist;
|
|
||||||
LD_RUNPATH_SEARCH_PATHS = (
|
|
||||||
"$(inherited)",
|
|
||||||
"@executable_path/../Frameworks",
|
|
||||||
);
|
|
||||||
MACOSX_DEPLOYMENT_TARGET = 11.0;
|
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.danielsaidi.swiftkit.demo;
|
|
||||||
PRODUCT_NAME = Demo;
|
|
||||||
SDKROOT = macosx;
|
|
||||||
SWIFT_VERSION = 5.0;
|
|
||||||
};
|
|
||||||
name = Debug;
|
|
||||||
};
|
|
||||||
A9544BE32571CBC900522141 /* Release */ = {
|
|
||||||
isa = XCBuildConfiguration;
|
|
||||||
buildSettings = {
|
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
|
||||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
|
||||||
CODE_SIGN_ENTITLEMENTS = macOS/macOS.entitlements;
|
|
||||||
CODE_SIGN_STYLE = Automatic;
|
|
||||||
COMBINE_HIDPI_IMAGES = YES;
|
|
||||||
DEVELOPMENT_TEAM = PMEDFW438U;
|
|
||||||
ENABLE_HARDENED_RUNTIME = YES;
|
|
||||||
ENABLE_PREVIEWS = YES;
|
|
||||||
INFOPLIST_FILE = macOS/Info.plist;
|
|
||||||
LD_RUNPATH_SEARCH_PATHS = (
|
|
||||||
"$(inherited)",
|
|
||||||
"@executable_path/../Frameworks",
|
|
||||||
);
|
|
||||||
MACOSX_DEPLOYMENT_TARGET = 11.0;
|
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.danielsaidi.swiftkit.demo;
|
|
||||||
PRODUCT_NAME = Demo;
|
|
||||||
SDKROOT = macosx;
|
|
||||||
SWIFT_VERSION = 5.0;
|
|
||||||
};
|
|
||||||
name = Release;
|
|
||||||
};
|
|
||||||
/* End XCBuildConfiguration section */
|
|
||||||
|
|
||||||
/* Begin XCConfigurationList section */
|
|
||||||
A9544BC12571CBC800522141 /* Build configuration list for PBXProject "Demo" */ = {
|
|
||||||
isa = XCConfigurationList;
|
|
||||||
buildConfigurations = (
|
|
||||||
A9544BDC2571CBC900522141 /* Debug */,
|
|
||||||
A9544BDD2571CBC900522141 /* Release */,
|
|
||||||
);
|
|
||||||
defaultConfigurationIsVisible = 0;
|
|
||||||
defaultConfigurationName = Release;
|
|
||||||
};
|
|
||||||
A9544BDE2571CBC900522141 /* Build configuration list for PBXNativeTarget "Demo (iOS)" */ = {
|
|
||||||
isa = XCConfigurationList;
|
|
||||||
buildConfigurations = (
|
|
||||||
A9544BDF2571CBC900522141 /* Debug */,
|
|
||||||
A9544BE02571CBC900522141 /* Release */,
|
|
||||||
);
|
|
||||||
defaultConfigurationIsVisible = 0;
|
|
||||||
defaultConfigurationName = Release;
|
|
||||||
};
|
|
||||||
A9544BE12571CBC900522141 /* Build configuration list for PBXNativeTarget "Demo (macOS)" */ = {
|
|
||||||
isa = XCConfigurationList;
|
|
||||||
buildConfigurations = (
|
|
||||||
A9544BE22571CBC900522141 /* Debug */,
|
|
||||||
A9544BE32571CBC900522141 /* Release */,
|
|
||||||
);
|
|
||||||
defaultConfigurationIsVisible = 0;
|
|
||||||
defaultConfigurationName = Release;
|
|
||||||
};
|
|
||||||
/* End XCConfigurationList section */
|
|
||||||
|
|
||||||
/* Begin XCRemoteSwiftPackageReference section */
|
|
||||||
A9544D51257455CA00522141 /* XCRemoteSwiftPackageReference "SwiftUIKit" */ = {
|
|
||||||
isa = XCRemoteSwiftPackageReference;
|
|
||||||
repositoryURL = "https://github.com/danielsaidi/SwiftUIKit.git";
|
|
||||||
requirement = {
|
|
||||||
kind = upToNextMajorVersion;
|
|
||||||
minimumVersion = 2.7.0;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
/* End XCRemoteSwiftPackageReference section */
|
|
||||||
|
|
||||||
/* Begin XCSwiftPackageProductDependency section */
|
|
||||||
A9544D52257455CA00522141 /* SwiftUIKit */ = {
|
|
||||||
isa = XCSwiftPackageProductDependency;
|
|
||||||
package = A9544D51257455CA00522141 /* XCRemoteSwiftPackageReference "SwiftUIKit" */;
|
|
||||||
productName = SwiftUIKit;
|
|
||||||
};
|
|
||||||
A9544D57257455DA00522141 /* SwiftUIKit */ = {
|
|
||||||
isa = XCSwiftPackageProductDependency;
|
|
||||||
package = A9544D51257455CA00522141 /* XCRemoteSwiftPackageReference "SwiftUIKit" */;
|
|
||||||
productName = SwiftUIKit;
|
|
||||||
};
|
|
||||||
A971DC522860ABEE00F30DEF /* SwiftKit */ = {
|
|
||||||
isa = XCSwiftPackageProductDependency;
|
|
||||||
productName = SwiftKit;
|
|
||||||
};
|
|
||||||
A971DC542860ABF200F30DEF /* SwiftKit */ = {
|
|
||||||
isa = XCSwiftPackageProductDependency;
|
|
||||||
productName = SwiftKit;
|
|
||||||
};
|
|
||||||
/* End XCSwiftPackageProductDependency section */
|
|
||||||
};
|
|
||||||
rootObject = A9544BBE2571CBC800522141 /* Project object */;
|
|
||||||
}
|
|
|
@ -1,7 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<Workspace
|
|
||||||
version = "1.0">
|
|
||||||
<FileRef
|
|
||||||
location = "self:">
|
|
||||||
</FileRef>
|
|
||||||
</Workspace>
|
|
|
@ -1,8 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
||||||
<plist version="1.0">
|
|
||||||
<dict>
|
|
||||||
<key>IDEDidComputeMac32BitWarning</key>
|
|
||||||
<true/>
|
|
||||||
</dict>
|
|
||||||
</plist>
|
|
|
@ -1,68 +0,0 @@
|
||||||
{
|
|
||||||
"pins" : [
|
|
||||||
{
|
|
||||||
"identity" : "cwlcatchexception",
|
|
||||||
"kind" : "remoteSourceControl",
|
|
||||||
"location" : "https://github.com/mattgallagher/CwlCatchException.git",
|
|
||||||
"state" : {
|
|
||||||
"revision" : "35f9e770f54ce62dd8526470f14c6e137cef3eea",
|
|
||||||
"version" : "2.1.1"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"identity" : "cwlpreconditiontesting",
|
|
||||||
"kind" : "remoteSourceControl",
|
|
||||||
"location" : "https://github.com/mattgallagher/CwlPreconditionTesting.git",
|
|
||||||
"state" : {
|
|
||||||
"revision" : "c21f7bab5ca8eee0a9998bbd17ca1d0eb45d4688",
|
|
||||||
"version" : "2.1.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"identity" : "mockingkit",
|
|
||||||
"kind" : "remoteSourceControl",
|
|
||||||
"location" : "https://github.com/danielsaidi/MockingKit.git",
|
|
||||||
"state" : {
|
|
||||||
"revision" : "3e51adb1a3922cdccbe84a3088b7fa4d67ae236d",
|
|
||||||
"version" : "1.1.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"identity" : "nimble",
|
|
||||||
"kind" : "remoteSourceControl",
|
|
||||||
"location" : "https://github.com/Quick/Nimble.git",
|
|
||||||
"state" : {
|
|
||||||
"revision" : "1f3bde57bde12f5e7b07909848c071e9b73d6edc",
|
|
||||||
"version" : "10.0.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"identity" : "quick",
|
|
||||||
"kind" : "remoteSourceControl",
|
|
||||||
"location" : "https://github.com/Quick/Quick.git",
|
|
||||||
"state" : {
|
|
||||||
"revision" : "f9d519828bb03dfc8125467d8f7b93131951124c",
|
|
||||||
"version" : "5.0.1"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"identity" : "swift-docc-plugin",
|
|
||||||
"kind" : "remoteSourceControl",
|
|
||||||
"location" : "https://github.com/apple/swift-docc-plugin",
|
|
||||||
"state" : {
|
|
||||||
"revision" : "3303b164430d9a7055ba484c8ead67a52f7b74f6",
|
|
||||||
"version" : "1.0.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"identity" : "swiftuikit",
|
|
||||||
"kind" : "remoteSourceControl",
|
|
||||||
"location" : "https://github.com/danielsaidi/SwiftUIKit.git",
|
|
||||||
"state" : {
|
|
||||||
"revision" : "ab6ef570c7c8100b98693394417a9905c925ccae",
|
|
||||||
"version" : "2.7.0"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"version" : 2
|
|
||||||
}
|
|
|
@ -1,78 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<Scheme
|
|
||||||
LastUpgradeVersion = "1220"
|
|
||||||
version = "1.3">
|
|
||||||
<BuildAction
|
|
||||||
parallelizeBuildables = "YES"
|
|
||||||
buildImplicitDependencies = "YES">
|
|
||||||
<BuildActionEntries>
|
|
||||||
<BuildActionEntry
|
|
||||||
buildForTesting = "YES"
|
|
||||||
buildForRunning = "YES"
|
|
||||||
buildForProfiling = "YES"
|
|
||||||
buildForArchiving = "YES"
|
|
||||||
buildForAnalyzing = "YES">
|
|
||||||
<BuildableReference
|
|
||||||
BuildableIdentifier = "primary"
|
|
||||||
BlueprintIdentifier = "A9544BC92571CBC900522141"
|
|
||||||
BuildableName = "Demo.app"
|
|
||||||
BlueprintName = "Demo (iOS)"
|
|
||||||
ReferencedContainer = "container:Demo.xcodeproj">
|
|
||||||
</BuildableReference>
|
|
||||||
</BuildActionEntry>
|
|
||||||
</BuildActionEntries>
|
|
||||||
</BuildAction>
|
|
||||||
<TestAction
|
|
||||||
buildConfiguration = "Debug"
|
|
||||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
|
||||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
|
||||||
shouldUseLaunchSchemeArgsEnv = "YES">
|
|
||||||
<Testables>
|
|
||||||
</Testables>
|
|
||||||
</TestAction>
|
|
||||||
<LaunchAction
|
|
||||||
buildConfiguration = "Debug"
|
|
||||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
|
||||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
|
||||||
launchStyle = "0"
|
|
||||||
useCustomWorkingDirectory = "NO"
|
|
||||||
ignoresPersistentStateOnLaunch = "NO"
|
|
||||||
debugDocumentVersioning = "YES"
|
|
||||||
debugServiceExtension = "internal"
|
|
||||||
allowLocationSimulation = "YES">
|
|
||||||
<BuildableProductRunnable
|
|
||||||
runnableDebuggingMode = "0">
|
|
||||||
<BuildableReference
|
|
||||||
BuildableIdentifier = "primary"
|
|
||||||
BlueprintIdentifier = "A9544BC92571CBC900522141"
|
|
||||||
BuildableName = "Demo.app"
|
|
||||||
BlueprintName = "Demo (iOS)"
|
|
||||||
ReferencedContainer = "container:Demo.xcodeproj">
|
|
||||||
</BuildableReference>
|
|
||||||
</BuildableProductRunnable>
|
|
||||||
</LaunchAction>
|
|
||||||
<ProfileAction
|
|
||||||
buildConfiguration = "Release"
|
|
||||||
shouldUseLaunchSchemeArgsEnv = "YES"
|
|
||||||
savedToolIdentifier = ""
|
|
||||||
useCustomWorkingDirectory = "NO"
|
|
||||||
debugDocumentVersioning = "YES">
|
|
||||||
<BuildableProductRunnable
|
|
||||||
runnableDebuggingMode = "0">
|
|
||||||
<BuildableReference
|
|
||||||
BuildableIdentifier = "primary"
|
|
||||||
BlueprintIdentifier = "A9544BC92571CBC900522141"
|
|
||||||
BuildableName = "Demo.app"
|
|
||||||
BlueprintName = "Demo (iOS)"
|
|
||||||
ReferencedContainer = "container:Demo.xcodeproj">
|
|
||||||
</BuildableReference>
|
|
||||||
</BuildableProductRunnable>
|
|
||||||
</ProfileAction>
|
|
||||||
<AnalyzeAction
|
|
||||||
buildConfiguration = "Debug">
|
|
||||||
</AnalyzeAction>
|
|
||||||
<ArchiveAction
|
|
||||||
buildConfiguration = "Release"
|
|
||||||
revealArchiveInOrganizer = "YES">
|
|
||||||
</ArchiveAction>
|
|
||||||
</Scheme>
|
|
|
@ -1,6 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<Bucket
|
|
||||||
uuid = "090C9251-0D52-4B5D-8A57-09BC2C5FABEA"
|
|
||||||
type = "1"
|
|
||||||
version = "2.0">
|
|
||||||
</Bucket>
|
|
|
@ -1,27 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
||||||
<plist version="1.0">
|
|
||||||
<dict>
|
|
||||||
<key>SchemeUserState</key>
|
|
||||||
<dict>
|
|
||||||
<key>Demo (iOS).xcscheme_^#shared#^_</key>
|
|
||||||
<dict>
|
|
||||||
<key>orderHint</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
<key>Demo (macOS).xcscheme_^#shared#^_</key>
|
|
||||||
<dict>
|
|
||||||
<key>orderHint</key>
|
|
||||||
<integer>1</integer>
|
|
||||||
</dict>
|
|
||||||
</dict>
|
|
||||||
<key>SuppressBuildableAutocreation</key>
|
|
||||||
<dict>
|
|
||||||
<key>A9544BC92571CBC900522141</key>
|
|
||||||
<dict>
|
|
||||||
<key>primary</key>
|
|
||||||
<true/>
|
|
||||||
</dict>
|
|
||||||
</dict>
|
|
||||||
</dict>
|
|
||||||
</plist>
|
|
|
@ -1,40 +0,0 @@
|
||||||
//
|
|
||||||
// AuthenticationScreen.swift
|
|
||||||
// Demo
|
|
||||||
//
|
|
||||||
// Created by Daniel Saidi on 2020-11-29.
|
|
||||||
// Copyright © 2020 Daniel Saidi. All rights reserved.
|
|
||||||
//
|
|
||||||
|
|
||||||
#if os(iOS) || os(macOS)
|
|
||||||
import SwiftUI
|
|
||||||
import SwiftUIKit
|
|
||||||
|
|
||||||
struct AuthenticationScreen: View {
|
|
||||||
|
|
||||||
var body: some View {
|
|
||||||
List {
|
|
||||||
Section {
|
|
||||||
ListText("SwiftKit has auth services that simplifies using biometric authentication.")
|
|
||||||
}
|
|
||||||
|
|
||||||
Section(header: Text("Services")) {
|
|
||||||
ListNavigationLink(destination: BiometricAuthenticationServiceScreen()) {
|
|
||||||
Label("Biometric Authentication", image: .authentication)
|
|
||||||
}
|
|
||||||
ListNavigationLink(destination: CachedAuthenticationServiceProxyScreen()) {
|
|
||||||
Label("Cached Authentication", image: .data)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}.navigationTitle("Authentication")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
struct AuthenticationScreen_Previews: PreviewProvider {
|
|
||||||
static var previews: some View {
|
|
||||||
NavigationView {
|
|
||||||
AuthenticationScreen()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
|
@ -1,63 +0,0 @@
|
||||||
//
|
|
||||||
// BiometricAuthenticationServiceScreen.swift
|
|
||||||
// Demo
|
|
||||||
//
|
|
||||||
// Created by Daniel Saidi on 2020-11-29.
|
|
||||||
// Copyright © 2020 Daniel Saidi. All rights reserved.
|
|
||||||
//
|
|
||||||
|
|
||||||
#if os(iOS) || os(macOS)
|
|
||||||
import SwiftKit
|
|
||||||
import SwiftUI
|
|
||||||
import SwiftUIKit
|
|
||||||
|
|
||||||
struct BiometricAuthenticationServiceScreen: View {
|
|
||||||
|
|
||||||
private let service: AuthenticationService = BiometricAuthenticationService()
|
|
||||||
|
|
||||||
@StateObject private var alertContext = AlertContext()
|
|
||||||
|
|
||||||
var body: some View {
|
|
||||||
List {
|
|
||||||
Section {
|
|
||||||
ListText("BiometricAuthenticationService can be used to identify the user with FaceID or TouchID.")
|
|
||||||
}
|
|
||||||
|
|
||||||
Section(header: Text("Actions")) {
|
|
||||||
ListButton(action: performAuthentication) {
|
|
||||||
Label("Perform authentication", image: .authentication)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}.alert(alertContext)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private extension BiometricAuthenticationServiceScreen {
|
|
||||||
|
|
||||||
func alert(_ text: String) {
|
|
||||||
let alert = Alert(title: Text(text))
|
|
||||||
DispatchQueue.main.asyncAfter(seconds: 1.0) {
|
|
||||||
alertContext.present(alert)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func handleAuthResult(_ result: AuthenticationService.AuthResult) {
|
|
||||||
switch result {
|
|
||||||
case .failure(let error): alert("Authentication failed with error .\(error)!")
|
|
||||||
case .success: alert("Authentication succeeded!")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func performAuthentication() {
|
|
||||||
service.authenticateUser(for: .standard, reason: "Test purposes", completion: handleAuthResult)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
struct BiometricAuthenticationServiceScreen_Previews: PreviewProvider {
|
|
||||||
static var previews: some View {
|
|
||||||
NavigationView {
|
|
||||||
BiometricAuthenticationServiceScreen()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
|
@ -1,74 +0,0 @@
|
||||||
//
|
|
||||||
// CachedAuthenticationServiceProxyScreen.swift
|
|
||||||
// Demo
|
|
||||||
//
|
|
||||||
// Created by Daniel Saidi on 2020-11-29.
|
|
||||||
// Copyright © 2020 Daniel Saidi. All rights reserved.
|
|
||||||
//
|
|
||||||
|
|
||||||
#if os(iOS) || os(macOS)
|
|
||||||
import SwiftKit
|
|
||||||
import SwiftUI
|
|
||||||
import SwiftUIKit
|
|
||||||
|
|
||||||
struct CachedAuthenticationServiceProxyScreen: View {
|
|
||||||
|
|
||||||
private let service: CachedAuthenticationService = CachedAuthenticationServiceProxy(
|
|
||||||
baseService: BiometricAuthenticationService())
|
|
||||||
|
|
||||||
@StateObject private var alertContext = AlertContext()
|
|
||||||
|
|
||||||
var body: some View {
|
|
||||||
List {
|
|
||||||
Section {
|
|
||||||
ListText("CachedAuthenticationServiceProxy wraps another service and stores its latest result.")
|
|
||||||
}
|
|
||||||
|
|
||||||
Section(header: Text("Actions")) {
|
|
||||||
ListButton(action: performAuthentication) {
|
|
||||||
Label("Perform authentication", image: .authentication)
|
|
||||||
}
|
|
||||||
ListButton(action: resetAuthentication) {
|
|
||||||
Label("Clear authentication", image: .clear)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.alert(alertContext)
|
|
||||||
.navigationTitle("Cached Authentication")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private extension CachedAuthenticationServiceProxyScreen {
|
|
||||||
|
|
||||||
func alert(_ text: String) {
|
|
||||||
let alert = Alert(title: Text(text))
|
|
||||||
DispatchQueue.main.asyncAfter(seconds: 1.0) {
|
|
||||||
alertContext.present(alert)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func handleAuthResult(_ result: AuthenticationService.AuthResult) {
|
|
||||||
switch result {
|
|
||||||
case .failure(let error): alert("Authentication failed with error .\(error)!")
|
|
||||||
case .success: alert("Authentication succeeded!")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func performAuthentication() {
|
|
||||||
service.authenticateUser(for: .standard, reason: "Test purposes", completion: handleAuthResult)
|
|
||||||
}
|
|
||||||
|
|
||||||
func resetAuthentication() {
|
|
||||||
service.resetUserAuthentication(for: .standard)
|
|
||||||
alert("Authentication has been reset. You now have to perform a new authentication.")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
struct CachedAuthenticationServiceProxyScreen_Previews: PreviewProvider {
|
|
||||||
static var previews: some View {
|
|
||||||
NavigationView {
|
|
||||||
CachedAuthenticationServiceProxyScreen()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
|
@ -1,46 +0,0 @@
|
||||||
//
|
|
||||||
// Base64StringCoderScreen.swift
|
|
||||||
// Demo
|
|
||||||
//
|
|
||||||
// Created by Daniel Saidi on 2020-11-30.
|
|
||||||
// Copyright © 2020 Daniel Saidi. All rights reserved.
|
|
||||||
//
|
|
||||||
|
|
||||||
import SwiftKit
|
|
||||||
import SwiftUI
|
|
||||||
import SwiftUIKit
|
|
||||||
|
|
||||||
struct Base64StringCoderScreen: View {
|
|
||||||
|
|
||||||
private let service: StringCoder = Base64StringCoder()
|
|
||||||
|
|
||||||
@State private var text = ""
|
|
||||||
|
|
||||||
private var encoded: String { service.encode(text) ?? "-" }
|
|
||||||
private var decoded: String { service.decode(encoded) ?? "-" }
|
|
||||||
|
|
||||||
var body: some View {
|
|
||||||
List {
|
|
||||||
Section {
|
|
||||||
ListText("Base64StringCoder can encode and decode base64. Type text below to encode it.")
|
|
||||||
}
|
|
||||||
|
|
||||||
Section(header: Text("Text")) {
|
|
||||||
TextField("Enter text", text: $text)
|
|
||||||
}
|
|
||||||
|
|
||||||
Section(header: Text("Result")) {
|
|
||||||
Text("Encoded: \(encoded)")
|
|
||||||
Text("Decoded: \(decoded)")
|
|
||||||
}
|
|
||||||
}.navigationTitle("Base64StringCoder")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
struct Base64StringCoderScreen_Previews: PreviewProvider {
|
|
||||||
static var previews: some View {
|
|
||||||
NavigationView {
|
|
||||||
Base64StringCoderScreen()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,38 +0,0 @@
|
||||||
//
|
|
||||||
// DataScreen.swift
|
|
||||||
// Demo
|
|
||||||
//
|
|
||||||
// Created by Daniel Saidi on 2020-11-29.
|
|
||||||
// Copyright © 2020 Daniel Saidi. All rights reserved.
|
|
||||||
//
|
|
||||||
|
|
||||||
import SwiftUI
|
|
||||||
import SwiftUIKit
|
|
||||||
|
|
||||||
struct DataScreen: View {
|
|
||||||
|
|
||||||
var body: some View {
|
|
||||||
List {
|
|
||||||
Section {
|
|
||||||
ListText("SwiftKit has data utils for encoding and decoding strings, parse csv files etc.")
|
|
||||||
}
|
|
||||||
|
|
||||||
Section(header: Text("Services")) {
|
|
||||||
ListNavigationLink(destination: Base64StringCoderScreen()) {
|
|
||||||
Label("Base64 String Coder", image: .base64)
|
|
||||||
}
|
|
||||||
ListNavigationLink(destination: StandardCsvParserScreen()) {
|
|
||||||
Label("CSV Parser", image: .file)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}.navigationTitle("Data")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
struct DataScreen_Previews: PreviewProvider {
|
|
||||||
static var previews: some View {
|
|
||||||
NavigationView {
|
|
||||||
DataScreen()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,5 +0,0 @@
|
||||||
Aaron A. Aaronson;31
|
|
||||||
Baron B. Baronson;28
|
|
||||||
Carol C. Carolson;35
|
|
||||||
Daryl D. Darylson;21
|
|
||||||
Eagle E. Eagleson;90
|
|
|
|
@ -1,60 +0,0 @@
|
||||||
//
|
|
||||||
// StandardCsvParserScreen.swift
|
|
||||||
// Demo
|
|
||||||
//
|
|
||||||
// Created by Daniel Saidi on 2020-11-30.
|
|
||||||
// Copyright © 2020-2022 Daniel Saidi. All rights reserved.
|
|
||||||
//
|
|
||||||
|
|
||||||
import SwiftKit
|
|
||||||
import SwiftUI
|
|
||||||
import SwiftUIKit
|
|
||||||
|
|
||||||
struct StandardCsvParserScreen: View {
|
|
||||||
|
|
||||||
private let parser: CsvParser = StandardCsvParser()
|
|
||||||
|
|
||||||
@State private var result = [[String]]()
|
|
||||||
|
|
||||||
var body: some View {
|
|
||||||
List {
|
|
||||||
Section {
|
|
||||||
ListText("A CsvParser can parse CSV strings. This demo uses StandardCsvParser to parse a demo file.")
|
|
||||||
}
|
|
||||||
|
|
||||||
ConditionalView(result.hasContent) {
|
|
||||||
Section(header: Text("Result")) {
|
|
||||||
ForEach(result, id: \.[0]) { person in
|
|
||||||
Text("\(person[0]) (age \(person[1]))")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Section(header: Text("Result")) {
|
|
||||||
ListButton(action: parseFile) {
|
|
||||||
Label("Parse CSV file", image: .file)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}.navigationTitle("StandardCsvParser")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private extension StandardCsvParserScreen {
|
|
||||||
|
|
||||||
func parseFile() {
|
|
||||||
guard
|
|
||||||
let path = Bundle.main.path(forResource: "Persons", ofType: "csv"),
|
|
||||||
let data = FileManager.default.contents(atPath: path),
|
|
||||||
let string = String(data: data, encoding: .utf8)
|
|
||||||
else { return }
|
|
||||||
result = parser.parseCsvString(string, componentSeparator: ";")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
struct StandardCsvParserScreen_Previews: PreviewProvider {
|
|
||||||
static var previews: some View {
|
|
||||||
NavigationView {
|
|
||||||
StandardCsvParserScreen()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,65 +0,0 @@
|
||||||
//
|
|
||||||
// DateScreen.swift
|
|
||||||
// Demo
|
|
||||||
//
|
|
||||||
// Created by Daniel Saidi on 2020-12-07.
|
|
||||||
// Copyright © 2020 Daniel Saidi. All rights reserved.
|
|
||||||
//
|
|
||||||
|
|
||||||
import SwiftKit
|
|
||||||
import SwiftUI
|
|
||||||
import SwiftUIKit
|
|
||||||
|
|
||||||
struct DateScreen: View {
|
|
||||||
|
|
||||||
init(formatter: DateFormatter = DateFormatter()) {
|
|
||||||
self.formatter = formatter
|
|
||||||
formatter.dateStyle = .medium
|
|
||||||
formatter.timeStyle = .short
|
|
||||||
}
|
|
||||||
|
|
||||||
@State private var date = Date()
|
|
||||||
|
|
||||||
private let formatter: DateFormatter
|
|
||||||
|
|
||||||
var body: some View {
|
|
||||||
List {
|
|
||||||
Section {
|
|
||||||
ListText("SwiftKit contains Date utils and extensions. For now, they're all in this one, single screen.")
|
|
||||||
}
|
|
||||||
|
|
||||||
Section(header: Text("Date")) {
|
|
||||||
DatePicker("Select date", selection: $date)
|
|
||||||
}
|
|
||||||
|
|
||||||
Section(header: Text("Difference")) {
|
|
||||||
ListText("Date is \(date.months(from: Date())) months from now")
|
|
||||||
ListText("Date is \(date.weeks(from: Date())) weeks from now")
|
|
||||||
ListText("Date is \(date.days(from: Date())) days from now")
|
|
||||||
ListText("Date is \(date.hours(from: Date())) hours from now")
|
|
||||||
}
|
|
||||||
|
|
||||||
Section(header: Text("Adding to selected date")) {
|
|
||||||
ListText("1000 seconds: \(formatter.string(from: date.adding(seconds: 1000)))")
|
|
||||||
ListText("2000 minutes: \(formatter.string(from: date.adding(minutes: 2000)))")
|
|
||||||
ListText("3000 hours: \(formatter.string(from: date.adding(hours: 3000)))")
|
|
||||||
ListText("4000 days: \(formatter.string(from: date.adding(days: 4000)))")
|
|
||||||
}
|
|
||||||
|
|
||||||
Section(header: Text("Removing from selected date")) {
|
|
||||||
ListText("1000 seconds: \(formatter.string(from: date.removing(seconds: 1000)))")
|
|
||||||
ListText("2000 minutes: \(formatter.string(from: date.removing(minutes: 2000)))")
|
|
||||||
ListText("3000 hours: \(formatter.string(from: date.removing(hours: 3000)))")
|
|
||||||
ListText("4000 days: \(formatter.string(from: date.removing(days: 4000)))")
|
|
||||||
}
|
|
||||||
}.navigationTitle("Date")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
struct DateScreen_Previews: PreviewProvider {
|
|
||||||
static var previews: some View {
|
|
||||||
NavigationView {
|
|
||||||
DateScreen()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,90 +0,0 @@
|
||||||
//
|
|
||||||
// ContentView.swift
|
|
||||||
// Demo
|
|
||||||
//
|
|
||||||
// Created by Daniel Saidi on 2020-11-27.
|
|
||||||
// Copyright © 2020 Daniel Saidi. All rights reserved.
|
|
||||||
//
|
|
||||||
|
|
||||||
import SwiftUI
|
|
||||||
import SwiftUIKit
|
|
||||||
|
|
||||||
struct ContentView: View {
|
|
||||||
|
|
||||||
var body: some View {
|
|
||||||
NavigationView {
|
|
||||||
List {
|
|
||||||
Section(header: Text("Sections")) {
|
|
||||||
list1
|
|
||||||
list2
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.navigationTitle("SwiftKit")
|
|
||||||
}.withPlatformSpecificNavigationStyle()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private extension ContentView {
|
|
||||||
|
|
||||||
var list1: some View {
|
|
||||||
Group {
|
|
||||||
#if os(iOS) || os(macOS)
|
|
||||||
ListNavigationLink(destination: AuthenticationScreen()) {
|
|
||||||
Label("Authentication", image: .authentication)
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
ListNavigationLink(destination: DataScreen()) {
|
|
||||||
Label("Data", image: .data)
|
|
||||||
}
|
|
||||||
ListNavigationLink(destination: DateScreen()) {
|
|
||||||
Label("Date", image: .date)
|
|
||||||
}
|
|
||||||
ListNavigationLink(destination: DeviceScreen()) {
|
|
||||||
Label("Device", image: .device)
|
|
||||||
}
|
|
||||||
ListNavigationLink(destination: ExtensionsScreen()) {
|
|
||||||
Label("Extensions", image: .extensions)
|
|
||||||
}
|
|
||||||
ListNavigationLink(destination: FilesScreen()) {
|
|
||||||
Label("Files", image: .files)
|
|
||||||
}
|
|
||||||
ListNavigationLink(destination: GeoScreen()) {
|
|
||||||
Label("Geo", image: .globe)
|
|
||||||
}
|
|
||||||
ListNavigationLink(destination: KeychainScreen()) {
|
|
||||||
Label("Keychain", image: .key)
|
|
||||||
}
|
|
||||||
ListNavigationLink(destination: LocalizationScreen()) {
|
|
||||||
Label("Localization", image: .flag)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var list2: some View {
|
|
||||||
Group {
|
|
||||||
ListNavigationLink(destination: NetworkScreen()) {
|
|
||||||
Label("Network", image: .cloud)
|
|
||||||
}
|
|
||||||
ListNavigationLink(destination: ServicesScreen()) {
|
|
||||||
Label("Services", image: .service)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private extension View {
|
|
||||||
|
|
||||||
func withPlatformSpecificNavigationStyle() -> some View {
|
|
||||||
#if os(iOS)
|
|
||||||
return self.navigationViewStyle(StackNavigationViewStyle())
|
|
||||||
#else
|
|
||||||
return self
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
struct ContentView_Previews: PreviewProvider {
|
|
||||||
static var previews: some View {
|
|
||||||
ContentView()
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,19 +0,0 @@
|
||||||
//
|
|
||||||
// DemoApp.swift
|
|
||||||
// Demo
|
|
||||||
//
|
|
||||||
// Created by Daniel Saidi on 2020-11-27.
|
|
||||||
// Copyright © 2020 Daniel Saidi. All rights reserved.
|
|
||||||
//
|
|
||||||
|
|
||||||
import SwiftUI
|
|
||||||
|
|
||||||
@main
|
|
||||||
struct DemoApp: App {
|
|
||||||
|
|
||||||
var body: some Scene {
|
|
||||||
WindowGroup {
|
|
||||||
ContentView()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,58 +0,0 @@
|
||||||
//
|
|
||||||
// DeviceIdentifierScreen.swift
|
|
||||||
// Demo
|
|
||||||
//
|
|
||||||
// Created by Daniel Saidi on 2020-12-07.
|
|
||||||
// Copyright © 2020 Daniel Saidi. All rights reserved.
|
|
||||||
//
|
|
||||||
|
|
||||||
import SwiftKit
|
|
||||||
import SwiftUI
|
|
||||||
import SwiftUIKit
|
|
||||||
|
|
||||||
struct DeviceIdentifierScreen: View {
|
|
||||||
|
|
||||||
enum IdentifierType: String, Identifiable {
|
|
||||||
case keychain, userDefaults
|
|
||||||
|
|
||||||
var id: String { rawValue }
|
|
||||||
}
|
|
||||||
|
|
||||||
private var identifier: DeviceIdentifier {
|
|
||||||
switch identifierType {
|
|
||||||
case .keychain: return KeychainBasedDeviceIdentifier(
|
|
||||||
keychainService: StandardKeychainService(),
|
|
||||||
backupIdentifier: UserDefaultsBasedDeviceIdentifier())
|
|
||||||
case .userDefaults: return UserDefaultsBasedDeviceIdentifier()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@State private var identifierType = IdentifierType.keychain
|
|
||||||
|
|
||||||
var body: some View {
|
|
||||||
List {
|
|
||||||
Section {
|
|
||||||
ListText("SwiftKit contains device identifiers. The keychain-based one remembers the unique id even if you delete the app, while the user defaults-based one does not. Here, the two identifiers are kept in sync.")
|
|
||||||
}
|
|
||||||
|
|
||||||
Section(header: Text("identifier")) {
|
|
||||||
Picker("Select identifier", selection: $identifierType) {
|
|
||||||
Text("Keychain").tag(IdentifierType.keychain)
|
|
||||||
Text("User Defaults").tag(IdentifierType.userDefaults)
|
|
||||||
}.pickerStyle(SegmentedPickerStyle())
|
|
||||||
}
|
|
||||||
|
|
||||||
Section(header: Text("Device identifier")) {
|
|
||||||
ListText(identifier.getDeviceIdentifier())
|
|
||||||
}
|
|
||||||
}.navigationTitle("DeviceIdentifier")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
struct DeviceIdentifierScreen_Previews: PreviewProvider {
|
|
||||||
static var previews: some View {
|
|
||||||
NavigationView {
|
|
||||||
DeviceIdentifierScreen()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,35 +0,0 @@
|
||||||
//
|
|
||||||
// DeviceScreen.swift
|
|
||||||
// Demo
|
|
||||||
//
|
|
||||||
// Created by Daniel Saidi on 2020-12-07.
|
|
||||||
// Copyright © 2020 Daniel Saidi. All rights reserved.
|
|
||||||
//
|
|
||||||
|
|
||||||
import SwiftUI
|
|
||||||
import SwiftUIKit
|
|
||||||
|
|
||||||
struct DeviceScreen: View {
|
|
||||||
|
|
||||||
var body: some View {
|
|
||||||
List {
|
|
||||||
Section {
|
|
||||||
ListText("SwiftKit has device utils for e.g. generating a unique id for the current device.")
|
|
||||||
}
|
|
||||||
|
|
||||||
Section(header: Text("Services")) {
|
|
||||||
ListNavigationLink(destination: DeviceIdentifierScreen()) {
|
|
||||||
Label("Device Identifier", image: .device)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}.navigationTitle("Device")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
struct DeviceScreen_Previews: PreviewProvider {
|
|
||||||
static var previews: some View {
|
|
||||||
NavigationView {
|
|
||||||
DeviceScreen()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,31 +0,0 @@
|
||||||
//
|
|
||||||
// ExtensionsScreen.swift
|
|
||||||
// Demo
|
|
||||||
//
|
|
||||||
// Created by Daniel Saidi on 2020-12-07.
|
|
||||||
// Copyright © 2020 Daniel Saidi. All rights reserved.
|
|
||||||
//
|
|
||||||
|
|
||||||
import SwiftUI
|
|
||||||
import SwiftUIKit
|
|
||||||
|
|
||||||
struct ExtensionsScreen: View {
|
|
||||||
|
|
||||||
var body: some View {
|
|
||||||
List {
|
|
||||||
Section {
|
|
||||||
ListText("""
|
|
||||||
SwiftKit contains a bunch of extensions that aim at making it easier to work with SwiftUI.
|
|
||||||
|
|
||||||
Since this namespace contains a lot will grow over time, extensions are not demonstrated. Instead, checkout the source code.
|
|
||||||
""")
|
|
||||||
}
|
|
||||||
}.navigationTitle("Extension")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
struct ExtensionsScreen_Previews: PreviewProvider {
|
|
||||||
static var previews: some View {
|
|
||||||
ExtensionsScreen()
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,91 +0,0 @@
|
||||||
//
|
|
||||||
// DirectoryServiceScreen.swift
|
|
||||||
// Demo
|
|
||||||
//
|
|
||||||
// Created by Daniel Saidi on 2020-12-07.
|
|
||||||
// Copyright © 2020 Daniel Saidi. All rights reserved.
|
|
||||||
//
|
|
||||||
|
|
||||||
import SwiftKit
|
|
||||||
import SwiftUI
|
|
||||||
import SwiftUIKit
|
|
||||||
|
|
||||||
struct DirectoryServiceScreen: View {
|
|
||||||
|
|
||||||
init(service: DirectoryService = StandardDirectoryService(directory: .cachesDirectory)!) {
|
|
||||||
self.service = service
|
|
||||||
refreshFiles()
|
|
||||||
}
|
|
||||||
|
|
||||||
private let service: DirectoryService
|
|
||||||
|
|
||||||
@State private var files: [String] = []
|
|
||||||
@State private var isFilterEnabled = false
|
|
||||||
|
|
||||||
var body: some View {
|
|
||||||
List {
|
|
||||||
Section {
|
|
||||||
ListText("SwiftKit has services that lets you handle files within local directoriers. This demo uses a StandardDirectoryService that targets the local cache directory.")
|
|
||||||
}
|
|
||||||
|
|
||||||
if files.hasContent {
|
|
||||||
Section(header: Text("Files")) {
|
|
||||||
ForEach(files, id: \.self) {
|
|
||||||
ListText("\($0) (\(service.getSizeOfFile(named: $0) ?? 0) bytes)")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Section(header: Text("Total")) {
|
|
||||||
ListText("\(files.count) files (\(service.getSizeOfAllFiles()) bytes)")
|
|
||||||
}
|
|
||||||
|
|
||||||
Section(header: Text("Actions")) {
|
|
||||||
ListButton(action: createRandomFile) {
|
|
||||||
Label("Create file with random name", image: .fileAdd)
|
|
||||||
}
|
|
||||||
ListButton(action: deleteRandomFile) {
|
|
||||||
Label("Delete random file", image: .trash)
|
|
||||||
}
|
|
||||||
ListButton(action: toggleFileFilter) {
|
|
||||||
Label("Show only files that start with \"1\"", image: isFilterEnabled ? .circleFilled : .circle)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.onAppear(perform: refreshFiles)
|
|
||||||
.navigationTitle("Directory Service")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private extension DirectoryServiceScreen {
|
|
||||||
|
|
||||||
func createRandomFile() {
|
|
||||||
let fileName = "\(Int.random(in: 1...10_000)).txt"
|
|
||||||
let data = "Hello, world!".data(using: .utf8)
|
|
||||||
_ = service.createFile(named: fileName, contents: data)
|
|
||||||
refreshFiles()
|
|
||||||
}
|
|
||||||
|
|
||||||
func deleteRandomFile() {
|
|
||||||
guard let fileName = files.randomElement() else { return }
|
|
||||||
try? service.removeFile(named: fileName)
|
|
||||||
refreshFiles()
|
|
||||||
}
|
|
||||||
|
|
||||||
func toggleFileFilter() {
|
|
||||||
isFilterEnabled.toggle()
|
|
||||||
refreshFiles()
|
|
||||||
}
|
|
||||||
|
|
||||||
func refreshFiles() {
|
|
||||||
self.files = service.getFileNames()
|
|
||||||
guard isFilterEnabled else { return }
|
|
||||||
self.files = files.filter { $0.hasPrefix("1") }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
struct DirectoryServiceScreen_Previews: PreviewProvider {
|
|
||||||
static var previews: some View {
|
|
||||||
DirectoryServiceScreen()
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,58 +0,0 @@
|
||||||
//
|
|
||||||
// FileFinderScreen.swift
|
|
||||||
// Demo
|
|
||||||
//
|
|
||||||
// Created by Daniel Saidi on 2020-12-07.
|
|
||||||
// Copyright © 2020 Daniel Saidi. All rights reserved.
|
|
||||||
//
|
|
||||||
|
|
||||||
import SwiftKit
|
|
||||||
import SwiftUI
|
|
||||||
import SwiftUIKit
|
|
||||||
|
|
||||||
struct FileFinderScreen: View {
|
|
||||||
|
|
||||||
init(finder: FileFinder = BundleFileFinder()) {
|
|
||||||
self.finder = finder
|
|
||||||
}
|
|
||||||
|
|
||||||
private let finder: FileFinder
|
|
||||||
|
|
||||||
private var fileFiles: [String] { finder.findFilesWithFileNamePrefix("File").sorted() }
|
|
||||||
private var textFiles: [String] { finder.findFilesWithFileNameSuffix(".txt").sorted() }
|
|
||||||
|
|
||||||
|
|
||||||
var body: some View {
|
|
||||||
List {
|
|
||||||
Section {
|
|
||||||
ListText("SwiftKit has file finders that let you get files in various ways. This demo uses a BundleFileFinder that looks for files in a certain bundle.")
|
|
||||||
}
|
|
||||||
|
|
||||||
Section(header: Text("Files that start with \"File\"")) {
|
|
||||||
if fileFiles.hasContent {
|
|
||||||
ForEach(fileFiles, id: \.self) {
|
|
||||||
ListText("\($0)")
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
ListText("No files")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Section(header: Text("Files that end with \".txt\"")) {
|
|
||||||
if textFiles.hasContent {
|
|
||||||
ForEach(textFiles, id: \.self) {
|
|
||||||
ListText("\($0)")
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
ListText("No files")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}.navigationTitle("File Finder")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
struct FileFinderScreen_Previews: PreviewProvider {
|
|
||||||
static var previews: some View {
|
|
||||||
FileFinderScreen()
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,38 +0,0 @@
|
||||||
//
|
|
||||||
// FilesScreen.swift
|
|
||||||
// Demo
|
|
||||||
//
|
|
||||||
// Created by Daniel Saidi on 2020-12-07.
|
|
||||||
// Copyright © 2020 Daniel Saidi. All rights reserved.
|
|
||||||
//
|
|
||||||
|
|
||||||
import SwiftUI
|
|
||||||
import SwiftUIKit
|
|
||||||
|
|
||||||
struct FilesScreen: View {
|
|
||||||
|
|
||||||
var body: some View {
|
|
||||||
List {
|
|
||||||
Section {
|
|
||||||
ListText("""
|
|
||||||
SwiftKit contains services that aim at making it easier to work with files.
|
|
||||||
""")
|
|
||||||
}
|
|
||||||
|
|
||||||
Section(header: Text("Services")) {
|
|
||||||
ListNavigationLink(destination: DirectoryServiceScreen()) {
|
|
||||||
Label("Directory Service", image: .folder)
|
|
||||||
}
|
|
||||||
ListNavigationLink(destination: FileFinderScreen()) {
|
|
||||||
Label("File Finder", image: .fileSearch)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}.navigationTitle("Files")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
struct FilesScreen_Previews: PreviewProvider {
|
|
||||||
static var previews: some View {
|
|
||||||
FilesScreen()
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,74 +0,0 @@
|
||||||
//
|
|
||||||
// ExternalMapServicesScreen.swift
|
|
||||||
// Demo
|
|
||||||
//
|
|
||||||
// Created by Daniel Saidi on 2020-12-07.
|
|
||||||
// Copyright © 2020 Daniel Saidi. All rights reserved.
|
|
||||||
//
|
|
||||||
|
|
||||||
import SwiftKit
|
|
||||||
import SwiftUI
|
|
||||||
import SwiftUIKit
|
|
||||||
|
|
||||||
struct ExternalMapServicesScreen: View {
|
|
||||||
|
|
||||||
@State private var coordinate = WorldCoordinate.manhattan
|
|
||||||
|
|
||||||
private let appleMaps = AppleMapsService()
|
|
||||||
private let googleMaps = GoogleMapsService()
|
|
||||||
|
|
||||||
private var coordinates: [WorldCoordinate] {
|
|
||||||
[.manhattan,.newYork, .sanFrancisco, .tokyo]
|
|
||||||
}
|
|
||||||
|
|
||||||
var body: some View {
|
|
||||||
List {
|
|
||||||
Section {
|
|
||||||
ListText("SwiftKit has external maps services that let you show a coordinate or trigger a navigation in an external map app.")
|
|
||||||
}
|
|
||||||
|
|
||||||
Section(header: Text("Coordinate")) {
|
|
||||||
Picker("Pick Coordinate", selection: $coordinate) {
|
|
||||||
ForEach(coordinates) {
|
|
||||||
Text($0.name).tag($0)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Section(header: Text("Actions")) {
|
|
||||||
ListButton(action: showInAppleMaps) {
|
|
||||||
Label("Open in Apple Maps", image: .pin)
|
|
||||||
}
|
|
||||||
ListButton(action: showInGoogleMaps) {
|
|
||||||
Label("Open in Google Maps", image: .pin)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}.navigationTitle("External Maps")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private extension ExternalMapServicesScreen {
|
|
||||||
|
|
||||||
func showInAppleMaps() {
|
|
||||||
open(appleMaps.getUrl(for: coordinate.coordinate))
|
|
||||||
}
|
|
||||||
|
|
||||||
func showInGoogleMaps() {
|
|
||||||
open(googleMaps.getUrl(for: coordinate.coordinate))
|
|
||||||
}
|
|
||||||
|
|
||||||
func open(_ url: URL?) {
|
|
||||||
guard let url = url else { return }
|
|
||||||
#if os(iOS) || os(tvOS)
|
|
||||||
UIApplication.shared.open(url, options: [:], completionHandler: nil)
|
|
||||||
#elseif os(macOS)
|
|
||||||
NSWorkspace.shared.open(url)
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
struct ExternalMapServicesScreen_Previews: PreviewProvider {
|
|
||||||
static var previews: some View {
|
|
||||||
ExternalMapServicesScreen()
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,38 +0,0 @@
|
||||||
//
|
|
||||||
// GeoScreen.swift
|
|
||||||
// Demo
|
|
||||||
//
|
|
||||||
// Created by Daniel Saidi on 2020-12-07.
|
|
||||||
// Copyright © 2020 Daniel Saidi. All rights reserved.
|
|
||||||
//
|
|
||||||
|
|
||||||
import SwiftUI
|
|
||||||
import SwiftUIKit
|
|
||||||
|
|
||||||
struct GeoScreen: View {
|
|
||||||
|
|
||||||
var body: some View {
|
|
||||||
List {
|
|
||||||
Section {
|
|
||||||
ListText("SwiftKit has geo utils that simplifies working with maps and coordinates.")
|
|
||||||
}
|
|
||||||
|
|
||||||
Section(header: Text("Utils")) {
|
|
||||||
ListNavigationLink(destination: ExternalMapServicesScreen()) {
|
|
||||||
Label("External Map Services", image: .map)
|
|
||||||
}
|
|
||||||
ListNavigationLink(destination: WorldCoordinateScreen()) {
|
|
||||||
Label("World Coordinates", image: .pin)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}.navigationTitle("Geo")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
struct GeoScreen_Previews: PreviewProvider {
|
|
||||||
static var previews: some View {
|
|
||||||
NavigationView {
|
|
||||||
GeoScreen()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,52 +0,0 @@
|
||||||
//
|
|
||||||
// WorldCoordinateScreen.swift
|
|
||||||
// Demo
|
|
||||||
//
|
|
||||||
// Created by Daniel Saidi on 2020-12-07.
|
|
||||||
// Copyright © 2020 Daniel Saidi. All rights reserved.
|
|
||||||
//
|
|
||||||
|
|
||||||
import MapKit
|
|
||||||
import SwiftKit
|
|
||||||
import SwiftUI
|
|
||||||
import SwiftUIKit
|
|
||||||
|
|
||||||
struct WorldCoordinateScreen: View {
|
|
||||||
|
|
||||||
@State private var coordinate = WorldCoordinate.manhattan
|
|
||||||
|
|
||||||
private var mapRegion: MKCoordinateRegion {
|
|
||||||
MKCoordinateRegion(center: coordinate.coordinate, latitudinalMeters: 10_000, longitudinalMeters: 10_000)
|
|
||||||
}
|
|
||||||
|
|
||||||
private var coordinates: [WorldCoordinate] {
|
|
||||||
[.manhattan,.newYork, .sanFrancisco, .tokyo]
|
|
||||||
}
|
|
||||||
|
|
||||||
var body: some View {
|
|
||||||
List {
|
|
||||||
Section {
|
|
||||||
ListText("SwiftKit has a world coordinate struct with static coordinate properties.")
|
|
||||||
}
|
|
||||||
|
|
||||||
Section(header: Text("Coordinate")) {
|
|
||||||
Picker("Pick Coordinate", selection: $coordinate) {
|
|
||||||
ForEach(coordinates) {
|
|
||||||
Text($0.name).tag($0)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Section(header: Text("Result")) {
|
|
||||||
Map(coordinateRegion: .constant(mapRegion))
|
|
||||||
.frame(height: 250)
|
|
||||||
}
|
|
||||||
}.navigationTitle("World Coordinate")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
struct WorldCoordinateScreen_Previews: PreviewProvider {
|
|
||||||
static var previews: some View {
|
|
||||||
WorldCoordinateScreen()
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,35 +0,0 @@
|
||||||
//
|
|
||||||
// KeychainScreen.swift
|
|
||||||
// Demo
|
|
||||||
//
|
|
||||||
// Created by Daniel Saidi on 2020-12-07.
|
|
||||||
// Copyright © 2020 Daniel Saidi. All rights reserved.
|
|
||||||
//
|
|
||||||
|
|
||||||
import SwiftUI
|
|
||||||
import SwiftUIKit
|
|
||||||
|
|
||||||
struct KeychainScreen: View {
|
|
||||||
|
|
||||||
var body: some View {
|
|
||||||
List {
|
|
||||||
Section {
|
|
||||||
ListText("SwiftKit has utils that simplify working with the device keychain.")
|
|
||||||
}
|
|
||||||
|
|
||||||
Section(header: Text("Services")) {
|
|
||||||
ListNavigationLink(destination: KeychainServiceScreen()) {
|
|
||||||
Label("Keychain Service", image: .key)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}.navigationTitle("Keychain")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
struct KeychainScreen_Previews: PreviewProvider {
|
|
||||||
static var previews: some View {
|
|
||||||
NavigationView {
|
|
||||||
KeychainScreen()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,131 +0,0 @@
|
||||||
//
|
|
||||||
// KeychainServiceScreen.swift
|
|
||||||
// Demo
|
|
||||||
//
|
|
||||||
// Created by Daniel Saidi on 2020-12-07.
|
|
||||||
// Copyright © 2020 Daniel Saidi. All rights reserved.
|
|
||||||
//
|
|
||||||
|
|
||||||
import SwiftKit
|
|
||||||
import SwiftUI
|
|
||||||
import SwiftUIKit
|
|
||||||
|
|
||||||
struct KeychainServiceScreen: View {
|
|
||||||
|
|
||||||
init(service: KeychainService = StandardKeychainService()) {
|
|
||||||
self.service = service
|
|
||||||
}
|
|
||||||
|
|
||||||
private let service: KeychainService
|
|
||||||
|
|
||||||
@State private var boolText = ""
|
|
||||||
@State private var doubleText = ""
|
|
||||||
@State private var intText = ""
|
|
||||||
@State private var stringText = ""
|
|
||||||
|
|
||||||
var body: some View {
|
|
||||||
List {
|
|
||||||
Section {
|
|
||||||
ListText("SwiftKit has services that let you use the keychain like UserDefaults, but where the data is still around if the user deletes the app.")
|
|
||||||
}
|
|
||||||
|
|
||||||
Section(header: Text("Persisted Data")) {
|
|
||||||
ListText("Bool: \(boolText)")
|
|
||||||
ListText("Double: \(doubleText)")
|
|
||||||
ListText("Int: \(intText)")
|
|
||||||
ListText("String: \(stringText)")
|
|
||||||
}
|
|
||||||
|
|
||||||
Section(header: Text("Actions")) {
|
|
||||||
ListButton(action: storeRandomBool) {
|
|
||||||
Label("Store Random Bool", image: .data)
|
|
||||||
}
|
|
||||||
ListButton(action: storeRandomDouble) {
|
|
||||||
Label("Store Random Double", image: .data)
|
|
||||||
}
|
|
||||||
ListButton(action: storeRandomInt) {
|
|
||||||
Label("Store Random Int", image: .data)
|
|
||||||
}
|
|
||||||
ListButton(action: storeRandomString) {
|
|
||||||
Label("Store Random String", image: .data)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.onAppear(perform: refresh)
|
|
||||||
.navigationTitle("Keychain Services")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private extension KeychainServiceScreen {
|
|
||||||
|
|
||||||
func key(for type: String) -> String {
|
|
||||||
"com.swiftkit.demo.keychain.\(type)"
|
|
||||||
}
|
|
||||||
|
|
||||||
func storeRandomBool() {
|
|
||||||
service.set(Bool.random(), for: key(for: "bool"), with: nil)
|
|
||||||
refresh()
|
|
||||||
}
|
|
||||||
|
|
||||||
func storeRandomDouble() {
|
|
||||||
service.set(Double.random(in: 0...10_000), for: key(for: "double"), with: nil)
|
|
||||||
refresh()
|
|
||||||
}
|
|
||||||
|
|
||||||
func storeRandomInt() {
|
|
||||||
service.set(Int.random(in: 0...10_000), for: key(for: "int"), with: nil)
|
|
||||||
refresh()
|
|
||||||
}
|
|
||||||
|
|
||||||
func storeRandomString() {
|
|
||||||
service.set("\(Int.random(in: 0...10_000))", for: key(for: "string"), with: nil)
|
|
||||||
refresh()
|
|
||||||
}
|
|
||||||
|
|
||||||
func refresh() {
|
|
||||||
refreshBool()
|
|
||||||
refreshDouble()
|
|
||||||
refreshInteger()
|
|
||||||
refreshString()
|
|
||||||
}
|
|
||||||
|
|
||||||
func refreshBool() {
|
|
||||||
if let bool = service.bool(for: key(for: "bool"), with: nil) {
|
|
||||||
boolText = "\(bool)"
|
|
||||||
} else {
|
|
||||||
boolText = "-"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func refreshDouble() {
|
|
||||||
if let double = service.double(for: key(for: "double"), with: nil) {
|
|
||||||
doubleText = "\(double)"
|
|
||||||
} else {
|
|
||||||
doubleText = "-"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func refreshInteger() {
|
|
||||||
if let int = service.integer(for: key(for: "int"), with: nil) {
|
|
||||||
intText = "\(int)"
|
|
||||||
} else {
|
|
||||||
intText = "-"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func refreshString() {
|
|
||||||
if let string = service.string(for: key(for: "string"), with: nil) {
|
|
||||||
stringText = "\(string)"
|
|
||||||
} else {
|
|
||||||
stringText = "-"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
struct KeychainServiceScreen_Previews: PreviewProvider {
|
|
||||||
static var previews: some View {
|
|
||||||
NavigationView {
|
|
||||||
KeychainServiceScreen()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,38 +0,0 @@
|
||||||
//
|
|
||||||
// LocalizationScreen.swift
|
|
||||||
// Demo
|
|
||||||
//
|
|
||||||
// Created by Daniel Saidi on 2020-12-07.
|
|
||||||
// Copyright © 2020 Daniel Saidi. All rights reserved.
|
|
||||||
//
|
|
||||||
|
|
||||||
import SwiftUI
|
|
||||||
import SwiftUIKit
|
|
||||||
|
|
||||||
struct LocalizationScreen: View {
|
|
||||||
|
|
||||||
var body: some View {
|
|
||||||
List {
|
|
||||||
Section {
|
|
||||||
ListText("SwiftKit has utils for working with localized content.")
|
|
||||||
}
|
|
||||||
|
|
||||||
Section(header: Text("Services")) {
|
|
||||||
ListNavigationLink(destination: LocalizationServiceScreen()) {
|
|
||||||
Label("Localization Service", image: .service)
|
|
||||||
}
|
|
||||||
ListNavigationLink(destination: TranslatorScreen()) {
|
|
||||||
Label("Translator", image: .flag)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}.navigationTitle("Keychain")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
struct LocalizationScreen_Previews: PreviewProvider {
|
|
||||||
static var previews: some View {
|
|
||||||
NavigationView {
|
|
||||||
LocalizationScreen()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,73 +0,0 @@
|
||||||
//
|
|
||||||
// LocalizationServiceScreen.swift
|
|
||||||
// Demo
|
|
||||||
//
|
|
||||||
// Created by Daniel Saidi on 2020-12-07.
|
|
||||||
// Copyright © 2020 Daniel Saidi. All rights reserved.
|
|
||||||
//
|
|
||||||
|
|
||||||
import SwiftKit
|
|
||||||
import SwiftUI
|
|
||||||
import SwiftUIKit
|
|
||||||
|
|
||||||
struct LocalizationServiceScreen: View {
|
|
||||||
|
|
||||||
init(service: LocalizationService = StandardLocalizationService()) {
|
|
||||||
self.service = service
|
|
||||||
}
|
|
||||||
|
|
||||||
class ViewModel: ObservableObject {
|
|
||||||
|
|
||||||
@Published var locale = Locale(identifier: "en")
|
|
||||||
}
|
|
||||||
|
|
||||||
private let service: LocalizationService
|
|
||||||
private let english = Locale(identifier: "en")
|
|
||||||
private let swedish = Locale(identifier: "sv")
|
|
||||||
|
|
||||||
@State private var title = ""
|
|
||||||
@State private var text = ""
|
|
||||||
@StateObject private var state = ViewModel()
|
|
||||||
|
|
||||||
var body: some View {
|
|
||||||
List {
|
|
||||||
Section {
|
|
||||||
ListText("SwiftKit has services for working with localized content and changing locale without restarting the app. This demo uses a StandardLocalizationService.")
|
|
||||||
}
|
|
||||||
|
|
||||||
Section(header: Text("Locales")) {
|
|
||||||
Picker("Select locale", selection: $state.locale) {
|
|
||||||
Text("English").tag(english)
|
|
||||||
Text("Swedish").tag(swedish)
|
|
||||||
}.pickerStyle(SegmentedPickerStyle())
|
|
||||||
}
|
|
||||||
|
|
||||||
Section(header: Text("Translations")) {
|
|
||||||
ListText(title).font(.headline)
|
|
||||||
ListText(text)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.onAppear(perform: refresh)
|
|
||||||
.onReceive(state.$locale, perform: { _ in refreshAsync() })
|
|
||||||
.navigationTitle("Localization Service")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
extension LocalizationServiceScreen {
|
|
||||||
|
|
||||||
func refresh() {
|
|
||||||
try? service.setLocale(state.locale)
|
|
||||||
title = service.translate("localization_service_title")
|
|
||||||
text = service.translate("localization_service_text")
|
|
||||||
}
|
|
||||||
|
|
||||||
func refreshAsync() {
|
|
||||||
DispatchQueue.main.async(execute: refresh)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
struct LocalizationServiceScreen_Previews: PreviewProvider {
|
|
||||||
static var previews: some View {
|
|
||||||
LocalizationServiceScreen()
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,52 +0,0 @@
|
||||||
//
|
|
||||||
// TranslatorScreen.swift
|
|
||||||
// Demo
|
|
||||||
//
|
|
||||||
// Created by Daniel Saidi on 2020-12-07.
|
|
||||||
// Copyright © 2020 Daniel Saidi. All rights reserved.
|
|
||||||
//
|
|
||||||
|
|
||||||
import SwiftKit
|
|
||||||
import SwiftUI
|
|
||||||
import SwiftUIKit
|
|
||||||
|
|
||||||
struct TranslatorScreen: View {
|
|
||||||
|
|
||||||
init(service: Translator = StandardTranslator()) {
|
|
||||||
self.service = service
|
|
||||||
}
|
|
||||||
|
|
||||||
private let service: Translator
|
|
||||||
|
|
||||||
@State private var title = ""
|
|
||||||
@State private var text = ""
|
|
||||||
|
|
||||||
var body: some View {
|
|
||||||
List {
|
|
||||||
Section {
|
|
||||||
ListText("SwiftKit has translators that can be used to abstract how localized strings are translated. This demo uses a StandardTranslator, which uses the latest locale set for this app.")
|
|
||||||
}
|
|
||||||
|
|
||||||
Section(header: Text("Translations")) {
|
|
||||||
ListText(title).font(.headline)
|
|
||||||
ListText(text)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.onAppear(perform: refresh)
|
|
||||||
.navigationTitle("Translator")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
extension TranslatorScreen {
|
|
||||||
|
|
||||||
func refresh() {
|
|
||||||
title = service.translate("localization_service_title")
|
|
||||||
text = service.translate("localization_service_text")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
struct TranslatorScreen_Previews: PreviewProvider {
|
|
||||||
static var previews: some View {
|
|
||||||
TranslatorScreen()
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,31 +0,0 @@
|
||||||
//
|
|
||||||
// NetworkScreen.swift
|
|
||||||
// Demo
|
|
||||||
//
|
|
||||||
// Created by Daniel Saidi on 2020-12-07.
|
|
||||||
// Copyright © 2020 Daniel Saidi. All rights reserved.
|
|
||||||
//
|
|
||||||
|
|
||||||
import SwiftUI
|
|
||||||
import SwiftUIKit
|
|
||||||
|
|
||||||
struct NetworkScreen: View {
|
|
||||||
|
|
||||||
var body: some View {
|
|
||||||
List {
|
|
||||||
Section {
|
|
||||||
ListText("""
|
|
||||||
SwiftKit contains a bunch of utils for working with network and api-related operations, like requesting and parsing data from an external api.
|
|
||||||
|
|
||||||
This namespace is currently not available as a demo. Instead, checkout the source code.
|
|
||||||
""")
|
|
||||||
}
|
|
||||||
}.navigationTitle("Network")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
struct NetworkScreen_Previews: PreviewProvider {
|
|
||||||
static var previews: some View {
|
|
||||||
NetworkScreen()
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,20 +0,0 @@
|
||||||
{
|
|
||||||
"colors" : [
|
|
||||||
{
|
|
||||||
"color" : {
|
|
||||||
"color-space" : "display-p3",
|
|
||||||
"components" : {
|
|
||||||
"alpha" : "1.000",
|
|
||||||
"blue" : "0x32",
|
|
||||||
"green" : "0x6A",
|
|
||||||
"red" : "0xFF"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"idiom" : "universal"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"info" : {
|
|
||||||
"author" : "xcode",
|
|
||||||
"version" : 1
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,176 +0,0 @@
|
||||||
{
|
|
||||||
"images" : [
|
|
||||||
{
|
|
||||||
"filename" : "Icon-40.png",
|
|
||||||
"idiom" : "iphone",
|
|
||||||
"scale" : "2x",
|
|
||||||
"size" : "20x20"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename" : "Icon-60.png",
|
|
||||||
"idiom" : "iphone",
|
|
||||||
"scale" : "3x",
|
|
||||||
"size" : "20x20"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename" : "Icon-58.png",
|
|
||||||
"idiom" : "iphone",
|
|
||||||
"scale" : "2x",
|
|
||||||
"size" : "29x29"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename" : "Icon-87.png",
|
|
||||||
"idiom" : "iphone",
|
|
||||||
"scale" : "3x",
|
|
||||||
"size" : "29x29"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename" : "Icon-80.png",
|
|
||||||
"idiom" : "iphone",
|
|
||||||
"scale" : "2x",
|
|
||||||
"size" : "40x40"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename" : "Icon-120.png",
|
|
||||||
"idiom" : "iphone",
|
|
||||||
"scale" : "3x",
|
|
||||||
"size" : "40x40"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename" : "Icon-120.png",
|
|
||||||
"idiom" : "iphone",
|
|
||||||
"scale" : "2x",
|
|
||||||
"size" : "60x60"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename" : "Icon-180.png",
|
|
||||||
"idiom" : "iphone",
|
|
||||||
"scale" : "3x",
|
|
||||||
"size" : "60x60"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename" : "Icon-20.png",
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"scale" : "1x",
|
|
||||||
"size" : "20x20"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename" : "Icon-40.png",
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"scale" : "2x",
|
|
||||||
"size" : "20x20"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename" : "Icon-29.png",
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"scale" : "1x",
|
|
||||||
"size" : "29x29"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename" : "Icon-58.png",
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"scale" : "2x",
|
|
||||||
"size" : "29x29"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename" : "Icon-40.png",
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"scale" : "1x",
|
|
||||||
"size" : "40x40"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename" : "Icon-80.png",
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"scale" : "2x",
|
|
||||||
"size" : "40x40"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename" : "Icon-76.png",
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"scale" : "1x",
|
|
||||||
"size" : "76x76"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename" : "Icon-152.png",
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"scale" : "2x",
|
|
||||||
"size" : "76x76"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename" : "Icon-167.png",
|
|
||||||
"idiom" : "ipad",
|
|
||||||
"scale" : "2x",
|
|
||||||
"size" : "83.5x83.5"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename" : "Icon-1024.png",
|
|
||||||
"idiom" : "ios-marketing",
|
|
||||||
"scale" : "1x",
|
|
||||||
"size" : "1024x1024"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename" : "Icon-16.png",
|
|
||||||
"idiom" : "mac",
|
|
||||||
"scale" : "1x",
|
|
||||||
"size" : "16x16"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename" : "Icon-32.png",
|
|
||||||
"idiom" : "mac",
|
|
||||||
"scale" : "2x",
|
|
||||||
"size" : "16x16"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename" : "Icon-32.png",
|
|
||||||
"idiom" : "mac",
|
|
||||||
"scale" : "1x",
|
|
||||||
"size" : "32x32"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename" : "Icon-64.png",
|
|
||||||
"idiom" : "mac",
|
|
||||||
"scale" : "2x",
|
|
||||||
"size" : "32x32"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename" : "Icon-128.png",
|
|
||||||
"idiom" : "mac",
|
|
||||||
"scale" : "1x",
|
|
||||||
"size" : "128x128"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename" : "Icon-256.png",
|
|
||||||
"idiom" : "mac",
|
|
||||||
"scale" : "2x",
|
|
||||||
"size" : "128x128"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename" : "Icon-256.png",
|
|
||||||
"idiom" : "mac",
|
|
||||||
"scale" : "1x",
|
|
||||||
"size" : "256x256"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename" : "Icon-512.png",
|
|
||||||
"idiom" : "mac",
|
|
||||||
"scale" : "2x",
|
|
||||||
"size" : "256x256"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename" : "Icon-512.png",
|
|
||||||
"idiom" : "mac",
|
|
||||||
"scale" : "1x",
|
|
||||||
"size" : "512x512"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"filename" : "Icon-1024.png",
|
|
||||||
"idiom" : "mac",
|
|
||||||
"scale" : "2x",
|
|
||||||
"size" : "512x512"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"info" : {
|
|
||||||
"author" : "xcode",
|
|
||||||
"version" : 1
|
|
||||||
}
|
|
||||||
}
|
|
Before Width: | Height: | Size: 543 KiB |
Before Width: | Height: | Size: 18 KiB |
Before Width: | Height: | Size: 20 KiB |
Before Width: | Height: | Size: 26 KiB |
Before Width: | Height: | Size: 814 B |
Before Width: | Height: | Size: 30 KiB |
Before Width: | Height: | Size: 35 KiB |
Before Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 59 KiB |
Before Width: | Height: | Size: 1.9 KiB |
Before Width: | Height: | Size: 2.2 KiB |
Before Width: | Height: | Size: 3.1 KiB |
Before Width: | Height: | Size: 175 KiB |
Before Width: | Height: | Size: 5.7 KiB |
Before Width: | Height: | Size: 6.0 KiB |
Before Width: | Height: | Size: 6.8 KiB |
Before Width: | Height: | Size: 8.7 KiB |
Before Width: | Height: | Size: 9.6 KiB |
Before Width: | Height: | Size: 11 KiB |
|
@ -1,18 +0,0 @@
|
||||||
//
|
|
||||||
// Color+Demo.swift
|
|
||||||
// Demo
|
|
||||||
//
|
|
||||||
// Created by Daniel Saidi on 2020-12-07.
|
|
||||||
// Copyright © 2020 Daniel Saidi. All rights reserved.
|
|
||||||
//
|
|
||||||
|
|
||||||
#if os(iOS)
|
|
||||||
import UIKit
|
|
||||||
|
|
||||||
extension UIColor {
|
|
||||||
|
|
||||||
static var accent: UIColor {
|
|
||||||
UIColor(named: "AccentColor") ?? .black
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
|
@ -1 +0,0 @@
|
||||||
|
|
|
@ -1 +0,0 @@
|
||||||
|
|
|
@ -1 +0,0 @@
|
||||||
|
|
|
@ -1 +0,0 @@
|
||||||
|
|
|
@ -1 +0,0 @@
|
||||||
|
|
|
@ -1,39 +0,0 @@
|
||||||
//
|
|
||||||
// Image+Demo.swift
|
|
||||||
// Demo
|
|
||||||
//
|
|
||||||
// Created by Daniel Saidi on 2020-11-26.
|
|
||||||
// Copyright © 2020 Daniel Saidi. All rights reserved.
|
|
||||||
//
|
|
||||||
|
|
||||||
import SwiftUI
|
|
||||||
|
|
||||||
extension Image {
|
|
||||||
|
|
||||||
static var alert: Image { Image(systemName: "rectangle.center.inset.fill") }
|
|
||||||
static var authentication: Image { Image(systemName: "faceid") }
|
|
||||||
static var base64: Image { Image(systemName: "hryvniasign.square") }
|
|
||||||
static var bundle: Image { Image(systemName: "app.gift") }
|
|
||||||
static var circle: Image { Image(systemName: "circle") }
|
|
||||||
static var circleFilled: Image { Image(systemName: "circle.fill") }
|
|
||||||
static var clear: Image { Image(systemName: "xmark.circle") }
|
|
||||||
static var cloud: Image { Image(systemName: "cloud") }
|
|
||||||
static var data: Image { Image(systemName: "cylinder.split.1x2") }
|
|
||||||
static var date: Image { Image(systemName: "calendar") }
|
|
||||||
static var device: Image { Image(systemName: "apps.iphone") }
|
|
||||||
static var dismiss: Image { Image(systemName: "xmark") }
|
|
||||||
static var extensions: Image { Image(systemName: "puzzlepiece") }
|
|
||||||
static var file: Image { Image(systemName: "doc") }
|
|
||||||
static var fileAdd: Image { Image(systemName: "doc.badge.plus") }
|
|
||||||
static var fileSearch: Image { Image(systemName: "doc.text.magnifyingglass") }
|
|
||||||
static var files: Image { Image(systemName: "doc.on.doc") }
|
|
||||||
static var flag: Image { Image(systemName: "flag") }
|
|
||||||
static var folder: Image { Image(systemName: "folder") }
|
|
||||||
static var globe: Image { Image(systemName: "globe") }
|
|
||||||
static var ioc: Image { Image(systemName: "shippingbox") }
|
|
||||||
static var key: Image { Image(systemName: "key") }
|
|
||||||
static var map: Image { Image(systemName: "map") }
|
|
||||||
static var pin: Image { Image(systemName: "mappin") }
|
|
||||||
static var service: Image { Image(systemName: "gearshape") }
|
|
||||||
static var trash: Image { Image(systemName: "trash") }
|
|
||||||
}
|
|
|
@ -1,31 +0,0 @@
|
||||||
//
|
|
||||||
// ServicesScreen.swift
|
|
||||||
// Demo
|
|
||||||
//
|
|
||||||
// Created by Daniel Saidi on 2020-12-07.
|
|
||||||
// Copyright © 2020 Daniel Saidi. All rights reserved.
|
|
||||||
//
|
|
||||||
|
|
||||||
import SwiftUI
|
|
||||||
import SwiftUIKit
|
|
||||||
|
|
||||||
struct ServicesScreen: View {
|
|
||||||
|
|
||||||
var body: some View {
|
|
||||||
List {
|
|
||||||
Section {
|
|
||||||
ListText("""
|
|
||||||
SwiftKit contains a bunch of service base classes, which helps you implement service decorators, proxies etc.
|
|
||||||
|
|
||||||
This namespace is currently not available as a demo. Instead, checkout the source code.
|
|
||||||
""")
|
|
||||||
}
|
|
||||||
}.navigationTitle("Services")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
struct ServicesScreen_Previews: PreviewProvider {
|
|
||||||
static var previews: some View {
|
|
||||||
ServicesScreen()
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,10 +0,0 @@
|
||||||
/*
|
|
||||||
Localizable.strings
|
|
||||||
Demo
|
|
||||||
|
|
||||||
Created by Daniel Saidi on 2020-12-07.
|
|
||||||
Copyright © 2020 Daniel Saidi. All rights reserved.
|
|
||||||
*/
|
|
||||||
|
|
||||||
"localization_service_title" = "Hello!";
|
|
||||||
"localization_service_text" = "Welcome to the SwiftKit demo! This is an English text. I hope you like it :)";
|
|
|
@ -1,10 +0,0 @@
|
||||||
/*
|
|
||||||
Localizable.strings
|
|
||||||
Demo
|
|
||||||
|
|
||||||
Created by Daniel Saidi on 2020-12-07.
|
|
||||||
Copyright © 2020 Daniel Saidi. All rights reserved.
|
|
||||||
*/
|
|
||||||
|
|
||||||
"localization_service_title" = "Hallå!";
|
|
||||||
"localization_service_text" = "Välkommen till SwiftKit-demot! Det här är en svensk text. Jag hoppas att du gillar den :)";
|
|
|
@ -1,54 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
||||||
<plist version="1.0">
|
|
||||||
<dict>
|
|
||||||
<key>CFBundleDevelopmentRegion</key>
|
|
||||||
<string>$(DEVELOPMENT_LANGUAGE)</string>
|
|
||||||
<key>CFBundleExecutable</key>
|
|
||||||
<string>$(EXECUTABLE_NAME)</string>
|
|
||||||
<key>CFBundleIdentifier</key>
|
|
||||||
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
|
|
||||||
<key>CFBundleInfoDictionaryVersion</key>
|
|
||||||
<string>6.0</string>
|
|
||||||
<key>CFBundleName</key>
|
|
||||||
<string>$(PRODUCT_NAME)</string>
|
|
||||||
<key>CFBundleDisplayName</key>
|
|
||||||
<string>SwiftKit</string>
|
|
||||||
<key>CFBundlePackageType</key>
|
|
||||||
<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
|
|
||||||
<key>CFBundleShortVersionString</key>
|
|
||||||
<string>1.0</string>
|
|
||||||
<key>CFBundleVersion</key>
|
|
||||||
<string>1</string>
|
|
||||||
<key>LSRequiresIPhoneOS</key>
|
|
||||||
<true/>
|
|
||||||
<key>UIApplicationSceneManifest</key>
|
|
||||||
<dict>
|
|
||||||
<key>UIApplicationSupportsMultipleScenes</key>
|
|
||||||
<true/>
|
|
||||||
</dict>
|
|
||||||
<key>UIApplicationSupportsIndirectInputEvents</key>
|
|
||||||
<true/>
|
|
||||||
<key>UILaunchScreen</key>
|
|
||||||
<dict/>
|
|
||||||
<key>UIRequiredDeviceCapabilities</key>
|
|
||||||
<array>
|
|
||||||
<string>armv7</string>
|
|
||||||
</array>
|
|
||||||
<key>UISupportedInterfaceOrientations</key>
|
|
||||||
<array>
|
|
||||||
<string>UIInterfaceOrientationPortrait</string>
|
|
||||||
<string>UIInterfaceOrientationLandscapeLeft</string>
|
|
||||||
<string>UIInterfaceOrientationLandscapeRight</string>
|
|
||||||
</array>
|
|
||||||
<key>UISupportedInterfaceOrientations~ipad</key>
|
|
||||||
<array>
|
|
||||||
<string>UIInterfaceOrientationPortrait</string>
|
|
||||||
<string>UIInterfaceOrientationPortraitUpsideDown</string>
|
|
||||||
<string>UIInterfaceOrientationLandscapeLeft</string>
|
|
||||||
<string>UIInterfaceOrientationLandscapeRight</string>
|
|
||||||
</array>
|
|
||||||
<key>UIViewControllerBasedStatusBarAppearance</key>
|
|
||||||
<false/>
|
|
||||||
</dict>
|
|
||||||
</plist>
|
|
|
@ -1,28 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
||||||
<plist version="1.0">
|
|
||||||
<dict>
|
|
||||||
<key>CFBundleDevelopmentRegion</key>
|
|
||||||
<string>$(DEVELOPMENT_LANGUAGE)</string>
|
|
||||||
<key>CFBundleExecutable</key>
|
|
||||||
<string>$(EXECUTABLE_NAME)</string>
|
|
||||||
<key>CFBundleIconFile</key>
|
|
||||||
<string></string>
|
|
||||||
<key>CFBundleIdentifier</key>
|
|
||||||
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
|
|
||||||
<key>CFBundleInfoDictionaryVersion</key>
|
|
||||||
<string>6.0</string>
|
|
||||||
<key>CFBundleName</key>
|
|
||||||
<string>$(PRODUCT_NAME)</string>
|
|
||||||
<key>CFBundleDisplayName</key>
|
|
||||||
<string>SwiftKit</string>
|
|
||||||
<key>CFBundlePackageType</key>
|
|
||||||
<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
|
|
||||||
<key>CFBundleShortVersionString</key>
|
|
||||||
<string>1.0</string>
|
|
||||||
<key>CFBundleVersion</key>
|
|
||||||
<string>1</string>
|
|
||||||
<key>LSMinimumSystemVersion</key>
|
|
||||||
<string>$(MACOSX_DEPLOYMENT_TARGET)</string>
|
|
||||||
</dict>
|
|
||||||
</plist>
|
|
|
@ -1,10 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
||||||
<plist version="1.0">
|
|
||||||
<dict>
|
|
||||||
<key>com.apple.security.app-sandbox</key>
|
|
||||||
<true/>
|
|
||||||
<key>com.apple.security.files.user-selected.read-only</key>
|
|
||||||
<true/>
|
|
||||||
</dict>
|
|
||||||
</plist>
|
|
|
@ -11,15 +11,19 @@ This version contains a few breaking changes, that should be easy to fix.
|
||||||
|
|
||||||
* `DateFormatter+Init` has a new convenience initializer.
|
* `DateFormatter+Init` has a new convenience initializer.
|
||||||
* `CsvParser` can now parse CSV files at urls as well.
|
* `CsvParser` can now parse CSV files at urls as well.
|
||||||
|
* `CsvParserError` has a new convenience initializer.
|
||||||
|
|
||||||
### 💡 Behavior changes
|
### 💡 Behavior changes
|
||||||
|
|
||||||
* `StandardCsvParser` now throws native errors for file parsing.
|
* `StandardCsvParser` now throws native errors for file parsing.
|
||||||
|
|
||||||
|
### 🗑 Deprecations
|
||||||
|
|
||||||
|
* The `Network` namespace has been deprecated and moved to `ApiKit`.
|
||||||
|
|
||||||
### 💥 Breaking changes
|
### 💥 Breaking changes
|
||||||
|
|
||||||
* `CsvParserError` has a new convenience initializer.
|
* `String+Slugified` has been removed due to conflicts with TagKit.
|
||||||
* `String+Slugifies` has been removed due to conflicts with TagKit.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
After Width: | Height: | Size: 376 KiB |
|
@ -20,7 +20,7 @@ extension LAContext {
|
||||||
- localizedReason: The localized reason to show to the user.
|
- localizedReason: The localized reason to show to the user.
|
||||||
*/
|
*/
|
||||||
func evaluatePolicy(_ policy: LAPolicy, localizedReason reason: String) async throws -> Bool {
|
func evaluatePolicy(_ policy: LAPolicy, localizedReason reason: String) async throws -> Bool {
|
||||||
return try await withCheckedThrowingContinuation { cont in
|
try await withCheckedThrowingContinuation { cont in
|
||||||
LAContext().evaluatePolicy(policy, localizedReason: reason) { result, error in
|
LAContext().evaluatePolicy(policy, localizedReason: reason) { result, error in
|
||||||
if let error = error { return cont.resume(throwing: error) }
|
if let error = error { return cont.resume(throwing: error) }
|
||||||
cont.resume(returning: result)
|
cont.resume(returning: result)
|
||||||
|
|
|
@ -13,15 +13,25 @@ import Foundation
|
||||||
public extension String {
|
public extension String {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
URL encode the string.
|
Encode the string to work with `x-www-form-urlencoded`.
|
||||||
|
|
||||||
|
This will first call `urlEncoded()`, then replace every
|
||||||
|
`+` with `%2B`.
|
||||||
|
*/
|
||||||
|
func formEncoded() -> String? {
|
||||||
|
self.urlEncoded()?
|
||||||
|
.replacingOccurrences(of: "+", with: "%2B")
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Encode the string to work with quary parameters.
|
||||||
|
|
||||||
This will first call `addingPercentEncoding`, using the
|
This will first call `addingPercentEncoding`, using the
|
||||||
`.urlPathAllowed` character set, then replace every `&`
|
`.urlPathAllowed` character set, then replace every `&`
|
||||||
with `%26` and + with %2B.
|
with `%26`.
|
||||||
*/
|
*/
|
||||||
func urlEncoded() -> String? {
|
func urlEncoded() -> String? {
|
||||||
addingPercentEncoding(withAllowedCharacters: .urlPathAllowed)?
|
self.addingPercentEncoding(withAllowedCharacters: .urlPathAllowed)?
|
||||||
.replacingOccurrences(of: "&", with: "%26")
|
.replacingOccurrences(of: "&", with: "%26")
|
||||||
.replacingOccurrences(of: "+", with: "%2B")
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,18 +0,0 @@
|
||||||
//
|
|
||||||
// ApiEnvironment.swift
|
|
||||||
// SwiftKit
|
|
||||||
//
|
|
||||||
// Created by Daniel Saidi on 2020-10-24.
|
|
||||||
// Copyright © 2020 Cineasterna. All rights reserved.
|
|
||||||
//
|
|
||||||
|
|
||||||
import Foundation
|
|
||||||
|
|
||||||
/**
|
|
||||||
This protocol represents an external api environment with a
|
|
||||||
specific root `url`, e.g. test, staging or production.
|
|
||||||
*/
|
|
||||||
public protocol ApiEnvironment {
|
|
||||||
|
|
||||||
var url: URL { get }
|
|
||||||
}
|
|
|
@ -34,7 +34,7 @@ public extension ApiService {
|
||||||
This function returns a `URLRequest` that is configured
|
This function returns a `URLRequest` that is configured
|
||||||
for the given `httpMethod` and the route's `queryItems`.
|
for the given `httpMethod` and the route's `queryItems`.
|
||||||
*/
|
*/
|
||||||
func request(for route: ApiRoute, httpMethod: HttpMethod) -> URLRequest {
|
func request(for route: ApiRoute) -> URLRequest {
|
||||||
route.request(for: environment, httpMethod: httpMethod)
|
route.request(for: environment, httpMethod: httpMethod)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -42,7 +42,8 @@ public extension ApiService {
|
||||||
for route: ApiRoute,
|
for route: ApiRoute,
|
||||||
type: Model.Type,
|
type: Model.Type,
|
||||||
httpMethod: HttpMethod = .get,
|
httpMethod: HttpMethod = .get,
|
||||||
completion: @escaping ApiCompletion<Model.LocalModel>) -> URLSessionDataTask {
|
completion: @escaping ApiCompletion<Model.LocalModel>
|
||||||
|
) -> URLSessionDataTask {
|
||||||
let request = self.request(for: route, httpMethod: httpMethod)
|
let request = self.request(for: route, httpMethod: httpMethod)
|
||||||
return task(for: request, type: type, completion: completion)
|
return task(for: request, type: type, completion: completion)
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
import Foundation
|
||||||
|
|
||||||
|
// @available(*, deprecated, message: "Use ApiKit instead.")
|
||||||
|
public protocol ApiEnvironment {
|
||||||
|
|
||||||
|
var url: URL { get }
|
||||||
|
}
|
|
@ -1,20 +1,13 @@
|
||||||
//
|
|
||||||
// ApiRoute.swift
|
|
||||||
// SwiftKit
|
|
||||||
//
|
|
||||||
// Created by Daniel Saidi on 2020-10-24.
|
|
||||||
// Copyright © 2020 Cineasterna. All rights reserved.
|
|
||||||
//
|
|
||||||
|
|
||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
/**
|
// @available(*, deprecated, message: "Use ApiKit instead.")
|
||||||
This protocol represents an external api route, e.g. `login`
|
|
||||||
or `user`. Each route is a separate action that defines all
|
|
||||||
information required to perform an api request.
|
|
||||||
*/
|
|
||||||
public protocol ApiRoute {
|
public protocol ApiRoute {
|
||||||
|
|
||||||
|
/**
|
||||||
|
The HTTP method to use.
|
||||||
|
*/
|
||||||
|
var httpMethod: HttpMethod { get }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
The route's environment-relative path, that is appended
|
The route's environment-relative path, that is appended
|
||||||
to the environment's url when performing a request.
|
to the environment's url when performing a request.
|
||||||
|
@ -43,6 +36,7 @@ public protocol ApiRoute {
|
||||||
var queryParams: [String: String] { get }
|
var queryParams: [String: String] { get }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// @available(*, deprecated, message: "Use ApiKit instead.")
|
||||||
public extension ApiRoute {
|
public extension ApiRoute {
|
||||||
|
|
||||||
/**
|
/**
|
|
@ -1,17 +1,6 @@
|
||||||
//
|
|
||||||
// HttpMethod.swift
|
|
||||||
// SwiftKit
|
|
||||||
//
|
|
||||||
// Created by Daniel Saidi on 2020-09-30.
|
|
||||||
// Copyright © 2021 Daniel Saidi. All rights reserved.
|
|
||||||
//
|
|
||||||
|
|
||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
/**
|
// @available(*, deprecated, message: "Use ApiKit instead.")
|
||||||
This enum lists the various HTTP methods that are supported
|
|
||||||
by REST.
|
|
||||||
*/
|
|
||||||
public enum HttpMethod: String {
|
public enum HttpMethod: String {
|
||||||
|
|
||||||
case connect
|
case connect
|
|
@ -1,88 +0,0 @@
|
||||||
//
|
|
||||||
// ApiRouteTests.swift
|
|
||||||
// SwiftKitTests
|
|
||||||
//
|
|
||||||
// Created by Daniel Saidi on 2020-10-25.
|
|
||||||
// Copyright © 2020 Daniel Saidi. All rights reserved.
|
|
||||||
//
|
|
||||||
|
|
||||||
import Quick
|
|
||||||
import Nimble
|
|
||||||
import Foundation
|
|
||||||
import SwiftKit
|
|
||||||
|
|
||||||
class ApiRouteTests: QuickSpec {
|
|
||||||
|
|
||||||
override func spec() {
|
|
||||||
|
|
||||||
let env = TestEnvironment()
|
|
||||||
let route = TestRoute()
|
|
||||||
|
|
||||||
describe("post params string") {
|
|
||||||
|
|
||||||
it("url encodes values") {
|
|
||||||
let str = route.postParamsString
|
|
||||||
expect(str).to(equal("baz?=BAM%3F&foo&=bar%26"))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
describe("form data request") {
|
|
||||||
|
|
||||||
it("is correctly configured") {
|
|
||||||
let req = route.formDataRequest(for: env)
|
|
||||||
let expectedData = "baz?=BAM%3F&foo&=bar%26".data(using: .utf8)
|
|
||||||
expect(req.url?.absoluteString).to(equal("http://example.com/1/2/3?anyone?=there?&hello%26=world%26"))
|
|
||||||
expect(req.allHTTPHeaderFields?["Content-Type"]).to(equal("application/x-www-form-urlencoded"))
|
|
||||||
expect(req.httpBody).to(equal(expectedData))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
describe("query items") {
|
|
||||||
|
|
||||||
it("are mapped query params without url encoding") {
|
|
||||||
let items = route.queryItems.sorted { $0.name < $1.name }
|
|
||||||
expect(items.count).to(equal(2))
|
|
||||||
expect(items[0].name).to(equal("anyone?"))
|
|
||||||
expect(items[0].value).to(equal("there?"))
|
|
||||||
expect(items[1].name).to(equal("hello&"))
|
|
||||||
expect(items[1].value).to(equal("world&"))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
describe("data request") {
|
|
||||||
|
|
||||||
it("is correctly configured") {
|
|
||||||
let req = route.request(for: env)
|
|
||||||
expect(req.url?.absoluteString).to(equal("http://example.com/1/2/3?anyone?=there?&hello%26=world%26"))
|
|
||||||
expect(req.allHTTPHeaderFields?["Content-Type"]).to(equal("application/json"))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
describe("url in environment") {
|
|
||||||
|
|
||||||
it("appends path to environment url") {
|
|
||||||
let env = TestEnvironment()
|
|
||||||
let route = TestRoute()
|
|
||||||
let url = route.url(in: env).absoluteString
|
|
||||||
expect(url).to(equal("http://example.com/1/2/3"))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private struct TestEnvironment: ApiEnvironment {
|
|
||||||
|
|
||||||
var url: URL {
|
|
||||||
guard let url = URL(string: "http://example.com") else { fatalError() }
|
|
||||||
return url
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private struct TestRoute: ApiRoute {
|
|
||||||
|
|
||||||
var path: String { "1/2/3" }
|
|
||||||
var postData: Data? { nil }
|
|
||||||
var postParams: [String: String] { ["foo&": "bar&", "baz?": "BAM?"] }
|
|
||||||
var queryParams: [String: String] { ["hello&": "world&", "anyone?": "there?"] }
|
|
||||||
var urlEncodeParams: Bool { true }
|
|
||||||
}
|
|
|
@ -1,35 +0,0 @@
|
||||||
//
|
|
||||||
// HttpMethodTests.swift
|
|
||||||
// SwiftKitTests
|
|
||||||
//
|
|
||||||
// Created by Daniel Saidi on 2020-10-25.
|
|
||||||
// Copyright © 2020 Daniel Saidi. All rights reserved.
|
|
||||||
//
|
|
||||||
|
|
||||||
import Quick
|
|
||||||
import Nimble
|
|
||||||
import SwiftKit
|
|
||||||
|
|
||||||
class HttpMethodTests: QuickSpec {
|
|
||||||
|
|
||||||
override func spec() {
|
|
||||||
|
|
||||||
describe("method") {
|
|
||||||
|
|
||||||
func result(for method: HttpMethod) -> String {
|
|
||||||
method.method
|
|
||||||
}
|
|
||||||
|
|
||||||
it("is correct for all cases") {
|
|
||||||
expect(result(for: .connect)).to(equal("CONNECT"))
|
|
||||||
expect(result(for: .delete)).to(equal("DELETE"))
|
|
||||||
expect(result(for: .get)).to(equal("GET"))
|
|
||||||
expect(result(for: .head)).to(equal("HEAD"))
|
|
||||||
expect(result(for: .options)).to(equal("OPTIONS"))
|
|
||||||
expect(result(for: .post)).to(equal("POST"))
|
|
||||||
expect(result(for: .put)).to(equal("PUT"))
|
|
||||||
expect(result(for: .trace)).to(equal("TRACE"))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|