浏览代码

Added tests for new version

Mustafa 2 年之前
父节点
当前提交
34063ab2b4
共有 60 个文件被更改,包括 797 次插入922 次删除
  1. 221 225
      Appcircle.xcodeproj/project.pbxproj
  2. 1 1
      Appcircle.xcodeproj/project.xcworkspace/contents.xcworkspacedata
  3. 8 0
      Appcircle.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
  4. 9 7
      Appcircle.xcodeproj/xcshareddata/xcschemes/Appcircle.xcscheme
  5. 78 0
      Appcircle.xcodeproj/xcshareddata/xcschemes/FizzBuzzKit.xcscheme
  6. 0 16
      Appcircle/AppDelegate.h
  7. 0 41
      Appcircle/AppDelegate.m
  8. 17 0
      Appcircle/AppcircleApp.swift
  9. 11 0
      Appcircle/Assets.xcassets/AccentColor.colorset/Contents.json
  10. 二进制
      Appcircle/Assets.xcassets/AppIcon.appiconset/100.png
  11. 二进制
      Appcircle/Assets.xcassets/AppIcon.appiconset/1024.png
  12. 二进制
      Appcircle/Assets.xcassets/AppIcon.appiconset/114.png
  13. 二进制
      Appcircle/Assets.xcassets/AppIcon.appiconset/120.png
  14. 二进制
      Appcircle/Assets.xcassets/AppIcon.appiconset/144.png
  15. 二进制
      Appcircle/Assets.xcassets/AppIcon.appiconset/152.png
  16. 二进制
      Appcircle/Assets.xcassets/AppIcon.appiconset/167.png
  17. 二进制
      Appcircle/Assets.xcassets/AppIcon.appiconset/180.png
  18. 二进制
      Appcircle/Assets.xcassets/AppIcon.appiconset/20.png
  19. 二进制
      Appcircle/Assets.xcassets/AppIcon.appiconset/29.png
  20. 二进制
      Appcircle/Assets.xcassets/AppIcon.appiconset/40.png
  21. 二进制
      Appcircle/Assets.xcassets/AppIcon.appiconset/50.png
  22. 二进制
      Appcircle/Assets.xcassets/AppIcon.appiconset/57.png
  23. 二进制
      Appcircle/Assets.xcassets/AppIcon.appiconset/58.png
  24. 二进制
      Appcircle/Assets.xcassets/AppIcon.appiconset/60.png
  25. 二进制
      Appcircle/Assets.xcassets/AppIcon.appiconset/72.png
  26. 二进制
      Appcircle/Assets.xcassets/AppIcon.appiconset/76.png
  27. 二进制
      Appcircle/Assets.xcassets/AppIcon.appiconset/80.png
  28. 二进制
      Appcircle/Assets.xcassets/AppIcon.appiconset/87.png
  29. 二进制
      Appcircle/Assets.xcassets/AppIcon.appiconset/Contents.json
  30. 二进制
      Appcircle/Assets.xcassets/Appcircle.imageset/180-removebg-preview.png
  31. 0 22
      Appcircle/Assets.xcassets/Appcircle.imageset/Contents.json
  32. 3 3
      Appcircle/Assets.xcassets/Contents.json
  33. 16 0
      Appcircle/Assets.xcassets/Logo.imageset/Contents.json
  34. 12 0
      Appcircle/Assets.xcassets/Logo.imageset/appcircle.svg
  35. 0 25
      Appcircle/Base.lproj/LaunchScreen.storyboard
  36. 0 141
      Appcircle/Base.lproj/Main.storyboard
  37. 46 0
      Appcircle/ContentView.swift
  38. 0 68
      Appcircle/Info.plist
  39. 6 0
      Appcircle/Preview Content/Preview Assets.xcassets/Contents.json
  40. 0 16
      Appcircle/SceneDelegate.h
  41. 0 50
      Appcircle/SceneDelegate.m
  42. 0 15
      Appcircle/ViewController.h
  43. 0 23
      Appcircle/ViewController.m
  44. 0 20
      Appcircle/ViewController2.h
  45. 0 35
      Appcircle/ViewController2.m
  46. 0 13
      Appcircle/development.xcconfig
  47. 0 25
      Appcircle/environment.sh
  48. 0 19
      Appcircle/main.m
  49. 0 57
      AppcircleTests/AppcircleTests.m
  50. 55 0
      AppcircleTests/AppcircleTests.swift
  51. 0 22
      AppcircleTests/Info.plist
  52. 0 56
      AppcircleUITests/AppcircleUITests.m
  53. 112 0
      AppcircleUITests/AppcircleUITests.swift
  54. 32 0
      AppcircleUITests/AppcircleUITestsLaunchTests.swift
  55. 0 22
      AppcircleUITests/Info.plist
  56. 7 0
      FizzBuzzKit/.gitignore
  57. 28 0
      FizzBuzzKit/Package.swift
  58. 31 0
      FizzBuzzKit/README.md
  59. 46 0
      FizzBuzzKit/Sources/FizzBuzzKit/FizzBuzzKit.swift
  60. 58 0
      FizzBuzzKit/Tests/FizzBuzzKitTests/FizzBuzzKitTests.swift

+ 221 - 225
Appcircle.xcodeproj/project.pbxproj

@@ -3,79 +3,68 @@
 	archiveVersion = 1;
 	archiveVersion = 1;
 	classes = {
 	classes = {
 	};
 	};
-	objectVersion = 50;
+	objectVersion = 55;
 	objects = {
 	objects = {
 
 
 /* Begin PBXBuildFile section */
 /* Begin PBXBuildFile section */
-		C316CFD62371563E00EAFD54 /* ViewController2.m in Sources */ = {isa = PBXBuildFile; fileRef = C316CFD52371563E00EAFD54 /* ViewController2.m */; };
-		C335FD492347815B00627CB4 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = C335FD482347815B00627CB4 /* AppDelegate.m */; };
-		C335FD4C2347815B00627CB4 /* SceneDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = C335FD4B2347815B00627CB4 /* SceneDelegate.m */; };
-		C335FD4F2347815B00627CB4 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = C335FD4E2347815B00627CB4 /* ViewController.m */; };
-		C335FD522347815B00627CB4 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = C335FD502347815B00627CB4 /* Main.storyboard */; };
-		C335FD542347815C00627CB4 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C335FD532347815C00627CB4 /* Assets.xcassets */; };
-		C335FD572347815C00627CB4 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = C335FD552347815C00627CB4 /* LaunchScreen.storyboard */; };
-		C335FD5A2347815C00627CB4 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = C335FD592347815C00627CB4 /* main.m */; };
-		C335FD642347815C00627CB4 /* AppcircleTests.m in Sources */ = {isa = PBXBuildFile; fileRef = C335FD632347815C00627CB4 /* AppcircleTests.m */; };
-		C335FD6F2347815C00627CB4 /* AppcircleUITests.m in Sources */ = {isa = PBXBuildFile; fileRef = C335FD6E2347815C00627CB4 /* AppcircleUITests.m */; };
+		450FAD66277C4BBC00C3060D /* AppcircleApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 450FAD65277C4BBC00C3060D /* AppcircleApp.swift */; };
+		450FAD68277C4BBC00C3060D /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 450FAD67277C4BBC00C3060D /* ContentView.swift */; };
+		450FAD6A277C4BBF00C3060D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 450FAD69277C4BBF00C3060D /* Assets.xcassets */; };
+		450FAD6D277C4BBF00C3060D /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 450FAD6C277C4BBF00C3060D /* Preview Assets.xcassets */; };
+		450FAD77277C4BBF00C3060D /* AppcircleTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 450FAD76277C4BBF00C3060D /* AppcircleTests.swift */; };
+		450FAD81277C4BBF00C3060D /* AppcircleUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 450FAD80277C4BBF00C3060D /* AppcircleUITests.swift */; };
+		450FAD83277C4BBF00C3060D /* AppcircleUITestsLaunchTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 450FAD82277C4BBF00C3060D /* AppcircleUITestsLaunchTests.swift */; };
+		450FAD92277C4D4D00C3060D /* FizzBuzzKit in Frameworks */ = {isa = PBXBuildFile; productRef = 450FAD91277C4D4D00C3060D /* FizzBuzzKit */; };
 /* End PBXBuildFile section */
 /* End PBXBuildFile section */
 
 
 /* Begin PBXContainerItemProxy section */
 /* Begin PBXContainerItemProxy section */
-		C335FD602347815C00627CB4 /* PBXContainerItemProxy */ = {
+		450FAD73277C4BBF00C3060D /* PBXContainerItemProxy */ = {
 			isa = PBXContainerItemProxy;
 			isa = PBXContainerItemProxy;
-			containerPortal = C335FD3C2347815B00627CB4 /* Project object */;
+			containerPortal = 450FAD5A277C4BBC00C3060D /* Project object */;
 			proxyType = 1;
 			proxyType = 1;
-			remoteGlobalIDString = C335FD432347815B00627CB4;
+			remoteGlobalIDString = 450FAD61277C4BBC00C3060D;
 			remoteInfo = Appcircle;
 			remoteInfo = Appcircle;
 		};
 		};
-		C335FD6B2347815C00627CB4 /* PBXContainerItemProxy */ = {
+		450FAD7D277C4BBF00C3060D /* PBXContainerItemProxy */ = {
 			isa = PBXContainerItemProxy;
 			isa = PBXContainerItemProxy;
-			containerPortal = C335FD3C2347815B00627CB4 /* Project object */;
+			containerPortal = 450FAD5A277C4BBC00C3060D /* Project object */;
 			proxyType = 1;
 			proxyType = 1;
-			remoteGlobalIDString = C335FD432347815B00627CB4;
+			remoteGlobalIDString = 450FAD61277C4BBC00C3060D;
 			remoteInfo = Appcircle;
 			remoteInfo = Appcircle;
 		};
 		};
 /* End PBXContainerItemProxy section */
 /* End PBXContainerItemProxy section */
 
 
 /* Begin PBXFileReference section */
 /* Begin PBXFileReference section */
-		C316CFD42371563E00EAFD54 /* ViewController2.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController2.h; sourceTree = "<group>"; };
-		C316CFD52371563E00EAFD54 /* ViewController2.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController2.m; sourceTree = "<group>"; };
-		C335FD442347815B00627CB4 /* Appcircle.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Appcircle.app; sourceTree = BUILT_PRODUCTS_DIR; };
-		C335FD472347815B00627CB4 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = "<group>"; };
-		C335FD482347815B00627CB4 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = "<group>"; };
-		C335FD4A2347815B00627CB4 /* SceneDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SceneDelegate.h; sourceTree = "<group>"; };
-		C335FD4B2347815B00627CB4 /* SceneDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SceneDelegate.m; sourceTree = "<group>"; };
-		C335FD4D2347815B00627CB4 /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = "<group>"; };
-		C335FD4E2347815B00627CB4 /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = "<group>"; };
-		C335FD512347815B00627CB4 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
-		C335FD532347815C00627CB4 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
-		C335FD562347815C00627CB4 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
-		C335FD582347815C00627CB4 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
-		C335FD592347815C00627CB4 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
-		C335FD5F2347815C00627CB4 /* AppcircleTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = AppcircleTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
-		C335FD632347815C00627CB4 /* AppcircleTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppcircleTests.m; sourceTree = "<group>"; };
-		C335FD652347815C00627CB4 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
-		C335FD6A2347815C00627CB4 /* AppcircleUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = AppcircleUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
-		C335FD6E2347815C00627CB4 /* AppcircleUITests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppcircleUITests.m; sourceTree = "<group>"; };
-		C335FD702347815C00627CB4 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
-		C37BF8EA244D930B00D88DBC /* development.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = development.xcconfig; sourceTree = "<group>"; };
+		450FAD62277C4BBC00C3060D /* Appcircle.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Appcircle.app; sourceTree = BUILT_PRODUCTS_DIR; };
+		450FAD65277C4BBC00C3060D /* AppcircleApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppcircleApp.swift; sourceTree = "<group>"; };
+		450FAD67277C4BBC00C3060D /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = "<group>"; };
+		450FAD69277C4BBF00C3060D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
+		450FAD6C277C4BBF00C3060D /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = "<group>"; };
+		450FAD72277C4BBF00C3060D /* AppcircleTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = AppcircleTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
+		450FAD76277C4BBF00C3060D /* AppcircleTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppcircleTests.swift; sourceTree = "<group>"; };
+		450FAD7C277C4BBF00C3060D /* AppcircleUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = AppcircleUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
+		450FAD80277C4BBF00C3060D /* AppcircleUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppcircleUITests.swift; sourceTree = "<group>"; };
+		450FAD82277C4BBF00C3060D /* AppcircleUITestsLaunchTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppcircleUITestsLaunchTests.swift; sourceTree = "<group>"; };
+		450FAD8F277C4C4600C3060D /* FizzBuzzKit */ = {isa = PBXFileReference; lastKnownFileType = wrapper; path = FizzBuzzKit; sourceTree = "<group>"; };
 /* End PBXFileReference section */
 /* End PBXFileReference section */
 
 
 /* Begin PBXFrameworksBuildPhase section */
 /* Begin PBXFrameworksBuildPhase section */
-		C335FD412347815B00627CB4 /* Frameworks */ = {
+		450FAD5F277C4BBC00C3060D /* Frameworks */ = {
 			isa = PBXFrameworksBuildPhase;
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			buildActionMask = 2147483647;
 			files = (
 			files = (
+				450FAD92277C4D4D00C3060D /* FizzBuzzKit in Frameworks */,
 			);
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			runOnlyForDeploymentPostprocessing = 0;
 		};
 		};
-		C335FD5C2347815C00627CB4 /* Frameworks */ = {
+		450FAD6F277C4BBF00C3060D /* Frameworks */ = {
 			isa = PBXFrameworksBuildPhase;
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			buildActionMask = 2147483647;
 			files = (
 			files = (
 			);
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			runOnlyForDeploymentPostprocessing = 0;
 		};
 		};
-		C335FD672347815C00627CB4 /* Frameworks */ = {
+		450FAD79277C4BBF00C3060D /* Frameworks */ = {
 			isa = PBXFrameworksBuildPhase;
 			isa = PBXFrameworksBuildPhase;
 			buildActionMask = 2147483647;
 			buildActionMask = 2147483647;
 			files = (
 			files = (
@@ -85,182 +74,191 @@
 /* End PBXFrameworksBuildPhase section */
 /* End PBXFrameworksBuildPhase section */
 
 
 /* Begin PBXGroup section */
 /* Begin PBXGroup section */
-		C335FD3B2347815B00627CB4 = {
+		450FAD59277C4BBC00C3060D = {
 			isa = PBXGroup;
 			isa = PBXGroup;
 			children = (
 			children = (
-				C335FD462347815B00627CB4 /* Appcircle */,
-				C335FD622347815C00627CB4 /* AppcircleTests */,
-				C335FD6D2347815C00627CB4 /* AppcircleUITests */,
-				C335FD452347815B00627CB4 /* Products */,
+				450FAD8F277C4C4600C3060D /* FizzBuzzKit */,
+				450FAD64277C4BBC00C3060D /* Appcircle */,
+				450FAD75277C4BBF00C3060D /* AppcircleTests */,
+				450FAD7F277C4BBF00C3060D /* AppcircleUITests */,
+				450FAD63277C4BBC00C3060D /* Products */,
+				450FAD90277C4D4D00C3060D /* Frameworks */,
 			);
 			);
 			sourceTree = "<group>";
 			sourceTree = "<group>";
 		};
 		};
-		C335FD452347815B00627CB4 /* Products */ = {
+		450FAD63277C4BBC00C3060D /* Products */ = {
 			isa = PBXGroup;
 			isa = PBXGroup;
 			children = (
 			children = (
-				C335FD442347815B00627CB4 /* Appcircle.app */,
-				C335FD5F2347815C00627CB4 /* AppcircleTests.xctest */,
-				C335FD6A2347815C00627CB4 /* AppcircleUITests.xctest */,
+				450FAD62277C4BBC00C3060D /* Appcircle.app */,
+				450FAD72277C4BBF00C3060D /* AppcircleTests.xctest */,
+				450FAD7C277C4BBF00C3060D /* AppcircleUITests.xctest */,
 			);
 			);
 			name = Products;
 			name = Products;
 			sourceTree = "<group>";
 			sourceTree = "<group>";
 		};
 		};
-		C335FD462347815B00627CB4 /* Appcircle */ = {
+		450FAD64277C4BBC00C3060D /* Appcircle */ = {
 			isa = PBXGroup;
 			isa = PBXGroup;
 			children = (
 			children = (
-				C335FD472347815B00627CB4 /* AppDelegate.h */,
-				C335FD482347815B00627CB4 /* AppDelegate.m */,
-				C335FD4A2347815B00627CB4 /* SceneDelegate.h */,
-				C335FD4B2347815B00627CB4 /* SceneDelegate.m */,
-				C335FD4D2347815B00627CB4 /* ViewController.h */,
-				C335FD4E2347815B00627CB4 /* ViewController.m */,
-				C316CFD42371563E00EAFD54 /* ViewController2.h */,
-				C316CFD52371563E00EAFD54 /* ViewController2.m */,
-				C335FD502347815B00627CB4 /* Main.storyboard */,
-				C335FD532347815C00627CB4 /* Assets.xcassets */,
-				C335FD552347815C00627CB4 /* LaunchScreen.storyboard */,
-				C335FD582347815C00627CB4 /* Info.plist */,
-				C335FD592347815C00627CB4 /* main.m */,
-				C37BF8EA244D930B00D88DBC /* development.xcconfig */,
+				450FAD65277C4BBC00C3060D /* AppcircleApp.swift */,
+				450FAD67277C4BBC00C3060D /* ContentView.swift */,
+				450FAD69277C4BBF00C3060D /* Assets.xcassets */,
+				450FAD6B277C4BBF00C3060D /* Preview Content */,
 			);
 			);
 			path = Appcircle;
 			path = Appcircle;
 			sourceTree = "<group>";
 			sourceTree = "<group>";
 		};
 		};
-		C335FD622347815C00627CB4 /* AppcircleTests */ = {
+		450FAD6B277C4BBF00C3060D /* Preview Content */ = {
 			isa = PBXGroup;
 			isa = PBXGroup;
 			children = (
 			children = (
-				C335FD632347815C00627CB4 /* AppcircleTests.m */,
-				C335FD652347815C00627CB4 /* Info.plist */,
+				450FAD6C277C4BBF00C3060D /* Preview Assets.xcassets */,
+			);
+			path = "Preview Content";
+			sourceTree = "<group>";
+		};
+		450FAD75277C4BBF00C3060D /* AppcircleTests */ = {
+			isa = PBXGroup;
+			children = (
+				450FAD76277C4BBF00C3060D /* AppcircleTests.swift */,
 			);
 			);
 			path = AppcircleTests;
 			path = AppcircleTests;
 			sourceTree = "<group>";
 			sourceTree = "<group>";
 		};
 		};
-		C335FD6D2347815C00627CB4 /* AppcircleUITests */ = {
+		450FAD7F277C4BBF00C3060D /* AppcircleUITests */ = {
 			isa = PBXGroup;
 			isa = PBXGroup;
 			children = (
 			children = (
-				C335FD6E2347815C00627CB4 /* AppcircleUITests.m */,
-				C335FD702347815C00627CB4 /* Info.plist */,
+				450FAD80277C4BBF00C3060D /* AppcircleUITests.swift */,
+				450FAD82277C4BBF00C3060D /* AppcircleUITestsLaunchTests.swift */,
 			);
 			);
 			path = AppcircleUITests;
 			path = AppcircleUITests;
 			sourceTree = "<group>";
 			sourceTree = "<group>";
 		};
 		};
+		450FAD90277C4D4D00C3060D /* Frameworks */ = {
+			isa = PBXGroup;
+			children = (
+			);
+			name = Frameworks;
+			sourceTree = "<group>";
+		};
 /* End PBXGroup section */
 /* End PBXGroup section */
 
 
 /* Begin PBXNativeTarget section */
 /* Begin PBXNativeTarget section */
-		C335FD432347815B00627CB4 /* Appcircle */ = {
+		450FAD61277C4BBC00C3060D /* Appcircle */ = {
 			isa = PBXNativeTarget;
 			isa = PBXNativeTarget;
-			buildConfigurationList = C335FD732347815C00627CB4 /* Build configuration list for PBXNativeTarget "Appcircle" */;
+			buildConfigurationList = 450FAD86277C4BBF00C3060D /* Build configuration list for PBXNativeTarget "Appcircle" */;
 			buildPhases = (
 			buildPhases = (
-				C335FD402347815B00627CB4 /* Sources */,
-				C335FD412347815B00627CB4 /* Frameworks */,
-				C335FD422347815B00627CB4 /* Resources */,
+				450FAD5E277C4BBC00C3060D /* Sources */,
+				450FAD5F277C4BBC00C3060D /* Frameworks */,
+				450FAD60277C4BBC00C3060D /* Resources */,
 			);
 			);
 			buildRules = (
 			buildRules = (
 			);
 			);
 			dependencies = (
 			dependencies = (
 			);
 			);
 			name = Appcircle;
 			name = Appcircle;
+			packageProductDependencies = (
+				450FAD91277C4D4D00C3060D /* FizzBuzzKit */,
+			);
 			productName = Appcircle;
 			productName = Appcircle;
-			productReference = C335FD442347815B00627CB4 /* Appcircle.app */;
+			productReference = 450FAD62277C4BBC00C3060D /* Appcircle.app */;
 			productType = "com.apple.product-type.application";
 			productType = "com.apple.product-type.application";
 		};
 		};
-		C335FD5E2347815C00627CB4 /* AppcircleTests */ = {
+		450FAD71277C4BBF00C3060D /* AppcircleTests */ = {
 			isa = PBXNativeTarget;
 			isa = PBXNativeTarget;
-			buildConfigurationList = C335FD762347815C00627CB4 /* Build configuration list for PBXNativeTarget "AppcircleTests" */;
+			buildConfigurationList = 450FAD89277C4BBF00C3060D /* Build configuration list for PBXNativeTarget "AppcircleTests" */;
 			buildPhases = (
 			buildPhases = (
-				C335FD5B2347815C00627CB4 /* Sources */,
-				C335FD5C2347815C00627CB4 /* Frameworks */,
-				C335FD5D2347815C00627CB4 /* Resources */,
+				450FAD6E277C4BBF00C3060D /* Sources */,
+				450FAD6F277C4BBF00C3060D /* Frameworks */,
+				450FAD70277C4BBF00C3060D /* Resources */,
 			);
 			);
 			buildRules = (
 			buildRules = (
 			);
 			);
 			dependencies = (
 			dependencies = (
-				C335FD612347815C00627CB4 /* PBXTargetDependency */,
+				450FAD74277C4BBF00C3060D /* PBXTargetDependency */,
 			);
 			);
 			name = AppcircleTests;
 			name = AppcircleTests;
 			productName = AppcircleTests;
 			productName = AppcircleTests;
-			productReference = C335FD5F2347815C00627CB4 /* AppcircleTests.xctest */;
+			productReference = 450FAD72277C4BBF00C3060D /* AppcircleTests.xctest */;
 			productType = "com.apple.product-type.bundle.unit-test";
 			productType = "com.apple.product-type.bundle.unit-test";
 		};
 		};
-		C335FD692347815C00627CB4 /* AppcircleUITests */ = {
+		450FAD7B277C4BBF00C3060D /* AppcircleUITests */ = {
 			isa = PBXNativeTarget;
 			isa = PBXNativeTarget;
-			buildConfigurationList = C335FD792347815C00627CB4 /* Build configuration list for PBXNativeTarget "AppcircleUITests" */;
+			buildConfigurationList = 450FAD8C277C4BBF00C3060D /* Build configuration list for PBXNativeTarget "AppcircleUITests" */;
 			buildPhases = (
 			buildPhases = (
-				C335FD662347815C00627CB4 /* Sources */,
-				C335FD672347815C00627CB4 /* Frameworks */,
-				C335FD682347815C00627CB4 /* Resources */,
+				450FAD78277C4BBF00C3060D /* Sources */,
+				450FAD79277C4BBF00C3060D /* Frameworks */,
+				450FAD7A277C4BBF00C3060D /* Resources */,
 			);
 			);
 			buildRules = (
 			buildRules = (
 			);
 			);
 			dependencies = (
 			dependencies = (
-				C335FD6C2347815C00627CB4 /* PBXTargetDependency */,
+				450FAD7E277C4BBF00C3060D /* PBXTargetDependency */,
 			);
 			);
 			name = AppcircleUITests;
 			name = AppcircleUITests;
 			productName = AppcircleUITests;
 			productName = AppcircleUITests;
-			productReference = C335FD6A2347815C00627CB4 /* AppcircleUITests.xctest */;
+			productReference = 450FAD7C277C4BBF00C3060D /* AppcircleUITests.xctest */;
 			productType = "com.apple.product-type.bundle.ui-testing";
 			productType = "com.apple.product-type.bundle.ui-testing";
 		};
 		};
 /* End PBXNativeTarget section */
 /* End PBXNativeTarget section */
 
 
 /* Begin PBXProject section */
 /* Begin PBXProject section */
-		C335FD3C2347815B00627CB4 /* Project object */ = {
+		450FAD5A277C4BBC00C3060D /* Project object */ = {
 			isa = PBXProject;
 			isa = PBXProject;
 			attributes = {
 			attributes = {
-				LastUpgradeCheck = 1100;
-				ORGANIZATIONNAME = "Dogan Ekici";
+				BuildIndependentTargetsInParallel = 1;
+				LastSwiftUpdateCheck = 1320;
+				LastUpgradeCheck = 1320;
 				TargetAttributes = {
 				TargetAttributes = {
-					C335FD432347815B00627CB4 = {
-						CreatedOnToolsVersion = 11.0;
+					450FAD61277C4BBC00C3060D = {
+						CreatedOnToolsVersion = 13.2.1;
 					};
 					};
-					C335FD5E2347815C00627CB4 = {
-						CreatedOnToolsVersion = 11.0;
-						TestTargetID = C335FD432347815B00627CB4;
+					450FAD71277C4BBF00C3060D = {
+						CreatedOnToolsVersion = 13.2.1;
+						TestTargetID = 450FAD61277C4BBC00C3060D;
 					};
 					};
-					C335FD692347815C00627CB4 = {
-						CreatedOnToolsVersion = 11.0;
-						TestTargetID = C335FD432347815B00627CB4;
+					450FAD7B277C4BBF00C3060D = {
+						CreatedOnToolsVersion = 13.2.1;
+						TestTargetID = 450FAD61277C4BBC00C3060D;
 					};
 					};
 				};
 				};
 			};
 			};
-			buildConfigurationList = C335FD3F2347815B00627CB4 /* Build configuration list for PBXProject "Appcircle" */;
-			compatibilityVersion = "Xcode 9.3";
+			buildConfigurationList = 450FAD5D277C4BBC00C3060D /* Build configuration list for PBXProject "Appcircle" */;
+			compatibilityVersion = "Xcode 13.0";
 			developmentRegion = en;
 			developmentRegion = en;
 			hasScannedForEncodings = 0;
 			hasScannedForEncodings = 0;
 			knownRegions = (
 			knownRegions = (
 				en,
 				en,
 				Base,
 				Base,
 			);
 			);
-			mainGroup = C335FD3B2347815B00627CB4;
-			productRefGroup = C335FD452347815B00627CB4 /* Products */;
+			mainGroup = 450FAD59277C4BBC00C3060D;
+			productRefGroup = 450FAD63277C4BBC00C3060D /* Products */;
 			projectDirPath = "";
 			projectDirPath = "";
 			projectRoot = "";
 			projectRoot = "";
 			targets = (
 			targets = (
-				C335FD432347815B00627CB4 /* Appcircle */,
-				C335FD5E2347815C00627CB4 /* AppcircleTests */,
-				C335FD692347815C00627CB4 /* AppcircleUITests */,
+				450FAD61277C4BBC00C3060D /* Appcircle */,
+				450FAD71277C4BBF00C3060D /* AppcircleTests */,
+				450FAD7B277C4BBF00C3060D /* AppcircleUITests */,
 			);
 			);
 		};
 		};
 /* End PBXProject section */
 /* End PBXProject section */
 
 
 /* Begin PBXResourcesBuildPhase section */
 /* Begin PBXResourcesBuildPhase section */
-		C335FD422347815B00627CB4 /* Resources */ = {
+		450FAD60277C4BBC00C3060D /* Resources */ = {
 			isa = PBXResourcesBuildPhase;
 			isa = PBXResourcesBuildPhase;
 			buildActionMask = 2147483647;
 			buildActionMask = 2147483647;
 			files = (
 			files = (
-				C335FD572347815C00627CB4 /* LaunchScreen.storyboard in Resources */,
-				C335FD542347815C00627CB4 /* Assets.xcassets in Resources */,
-				C335FD522347815B00627CB4 /* Main.storyboard in Resources */,
+				450FAD6D277C4BBF00C3060D /* Preview Assets.xcassets in Resources */,
+				450FAD6A277C4BBF00C3060D /* Assets.xcassets in Resources */,
 			);
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			runOnlyForDeploymentPostprocessing = 0;
 		};
 		};
-		C335FD5D2347815C00627CB4 /* Resources */ = {
+		450FAD70277C4BBF00C3060D /* Resources */ = {
 			isa = PBXResourcesBuildPhase;
 			isa = PBXResourcesBuildPhase;
 			buildActionMask = 2147483647;
 			buildActionMask = 2147483647;
 			files = (
 			files = (
 			);
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			runOnlyForDeploymentPostprocessing = 0;
 		};
 		};
-		C335FD682347815C00627CB4 /* Resources */ = {
+		450FAD7A277C4BBF00C3060D /* Resources */ = {
 			isa = PBXResourcesBuildPhase;
 			isa = PBXResourcesBuildPhase;
 			buildActionMask = 2147483647;
 			buildActionMask = 2147483647;
 			files = (
 			files = (
@@ -270,77 +268,55 @@
 /* End PBXResourcesBuildPhase section */
 /* End PBXResourcesBuildPhase section */
 
 
 /* Begin PBXSourcesBuildPhase section */
 /* Begin PBXSourcesBuildPhase section */
-		C335FD402347815B00627CB4 /* Sources */ = {
+		450FAD5E277C4BBC00C3060D /* Sources */ = {
 			isa = PBXSourcesBuildPhase;
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			buildActionMask = 2147483647;
 			files = (
 			files = (
-				C335FD4F2347815B00627CB4 /* ViewController.m in Sources */,
-				C335FD492347815B00627CB4 /* AppDelegate.m in Sources */,
-				C316CFD62371563E00EAFD54 /* ViewController2.m in Sources */,
-				C335FD5A2347815C00627CB4 /* main.m in Sources */,
-				C335FD4C2347815B00627CB4 /* SceneDelegate.m in Sources */,
+				450FAD68277C4BBC00C3060D /* ContentView.swift in Sources */,
+				450FAD66277C4BBC00C3060D /* AppcircleApp.swift in Sources */,
 			);
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			runOnlyForDeploymentPostprocessing = 0;
 		};
 		};
-		C335FD5B2347815C00627CB4 /* Sources */ = {
+		450FAD6E277C4BBF00C3060D /* Sources */ = {
 			isa = PBXSourcesBuildPhase;
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			buildActionMask = 2147483647;
 			files = (
 			files = (
-				C335FD642347815C00627CB4 /* AppcircleTests.m in Sources */,
+				450FAD77277C4BBF00C3060D /* AppcircleTests.swift in Sources */,
 			);
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			runOnlyForDeploymentPostprocessing = 0;
 		};
 		};
-		C335FD662347815C00627CB4 /* Sources */ = {
+		450FAD78277C4BBF00C3060D /* Sources */ = {
 			isa = PBXSourcesBuildPhase;
 			isa = PBXSourcesBuildPhase;
 			buildActionMask = 2147483647;
 			buildActionMask = 2147483647;
 			files = (
 			files = (
-				C335FD6F2347815C00627CB4 /* AppcircleUITests.m in Sources */,
+				450FAD83277C4BBF00C3060D /* AppcircleUITestsLaunchTests.swift in Sources */,
+				450FAD81277C4BBF00C3060D /* AppcircleUITests.swift in Sources */,
 			);
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 			runOnlyForDeploymentPostprocessing = 0;
 		};
 		};
 /* End PBXSourcesBuildPhase section */
 /* End PBXSourcesBuildPhase section */
 
 
 /* Begin PBXTargetDependency section */
 /* Begin PBXTargetDependency section */
-		C335FD612347815C00627CB4 /* PBXTargetDependency */ = {
+		450FAD74277C4BBF00C3060D /* PBXTargetDependency */ = {
 			isa = PBXTargetDependency;
 			isa = PBXTargetDependency;
-			target = C335FD432347815B00627CB4 /* Appcircle */;
-			targetProxy = C335FD602347815C00627CB4 /* PBXContainerItemProxy */;
+			target = 450FAD61277C4BBC00C3060D /* Appcircle */;
+			targetProxy = 450FAD73277C4BBF00C3060D /* PBXContainerItemProxy */;
 		};
 		};
-		C335FD6C2347815C00627CB4 /* PBXTargetDependency */ = {
+		450FAD7E277C4BBF00C3060D /* PBXTargetDependency */ = {
 			isa = PBXTargetDependency;
 			isa = PBXTargetDependency;
-			target = C335FD432347815B00627CB4 /* Appcircle */;
-			targetProxy = C335FD6B2347815C00627CB4 /* PBXContainerItemProxy */;
+			target = 450FAD61277C4BBC00C3060D /* Appcircle */;
+			targetProxy = 450FAD7D277C4BBF00C3060D /* PBXContainerItemProxy */;
 		};
 		};
 /* End PBXTargetDependency section */
 /* End PBXTargetDependency section */
 
 
-/* Begin PBXVariantGroup section */
-		C335FD502347815B00627CB4 /* Main.storyboard */ = {
-			isa = PBXVariantGroup;
-			children = (
-				C335FD512347815B00627CB4 /* Base */,
-			);
-			name = Main.storyboard;
-			sourceTree = "<group>";
-		};
-		C335FD552347815C00627CB4 /* LaunchScreen.storyboard */ = {
-			isa = PBXVariantGroup;
-			children = (
-				C335FD562347815C00627CB4 /* Base */,
-			);
-			name = LaunchScreen.storyboard;
-			sourceTree = "<group>";
-		};
-/* End PBXVariantGroup section */
-
 /* Begin XCBuildConfiguration section */
 /* Begin XCBuildConfiguration section */
-		C335FD712347815C00627CB4 /* Debug */ = {
+		450FAD84277C4BBF00C3060D /* Debug */ = {
 			isa = XCBuildConfiguration;
 			isa = XCBuildConfiguration;
-			baseConfigurationReference = C37BF8EA244D930B00D88DBC /* development.xcconfig */;
 			buildSettings = {
 			buildSettings = {
 				ALWAYS_SEARCH_USER_PATHS = NO;
 				ALWAYS_SEARCH_USER_PATHS = NO;
 				CLANG_ANALYZER_NONNULL = YES;
 				CLANG_ANALYZER_NONNULL = YES;
 				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
 				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
-				CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
+				CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
 				CLANG_CXX_LIBRARY = "libc++";
 				CLANG_CXX_LIBRARY = "libc++";
 				CLANG_ENABLE_MODULES = YES;
 				CLANG_ENABLE_MODULES = YES;
 				CLANG_ENABLE_OBJC_ARC = YES;
 				CLANG_ENABLE_OBJC_ARC = YES;
@@ -360,6 +336,7 @@
 				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
 				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
 				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
 				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
 				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
 				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+				CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
 				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
 				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
 				CLANG_WARN_STRICT_PROTOTYPES = YES;
 				CLANG_WARN_STRICT_PROTOTYPES = YES;
 				CLANG_WARN_SUSPICIOUS_MOVE = YES;
 				CLANG_WARN_SUSPICIOUS_MOVE = YES;
@@ -384,22 +361,23 @@
 				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
 				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
 				GCC_WARN_UNUSED_FUNCTION = YES;
 				GCC_WARN_UNUSED_FUNCTION = YES;
 				GCC_WARN_UNUSED_VARIABLE = YES;
 				GCC_WARN_UNUSED_VARIABLE = YES;
-				IPHONEOS_DEPLOYMENT_TARGET = 13.0;
+				IPHONEOS_DEPLOYMENT_TARGET = 15.2;
 				MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
 				MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
 				MTL_FAST_MATH = YES;
 				MTL_FAST_MATH = YES;
 				ONLY_ACTIVE_ARCH = YES;
 				ONLY_ACTIVE_ARCH = YES;
 				SDKROOT = iphoneos;
 				SDKROOT = iphoneos;
+				SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
+				SWIFT_OPTIMIZATION_LEVEL = "-Onone";
 			};
 			};
 			name = Debug;
 			name = Debug;
 		};
 		};
-		C335FD722347815C00627CB4 /* Release */ = {
+		450FAD85277C4BBF00C3060D /* Release */ = {
 			isa = XCBuildConfiguration;
 			isa = XCBuildConfiguration;
-			baseConfigurationReference = C37BF8EA244D930B00D88DBC /* development.xcconfig */;
 			buildSettings = {
 			buildSettings = {
 				ALWAYS_SEARCH_USER_PATHS = NO;
 				ALWAYS_SEARCH_USER_PATHS = NO;
 				CLANG_ANALYZER_NONNULL = YES;
 				CLANG_ANALYZER_NONNULL = YES;
 				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
 				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
-				CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
+				CLANG_CXX_LANGUAGE_STANDARD = "gnu++17";
 				CLANG_CXX_LIBRARY = "libc++";
 				CLANG_CXX_LIBRARY = "libc++";
 				CLANG_ENABLE_MODULES = YES;
 				CLANG_ENABLE_MODULES = YES;
 				CLANG_ENABLE_OBJC_ARC = YES;
 				CLANG_ENABLE_OBJC_ARC = YES;
@@ -419,6 +397,7 @@
 				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
 				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
 				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
 				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
 				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
 				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+				CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
 				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
 				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
 				CLANG_WARN_STRICT_PROTOTYPES = YES;
 				CLANG_WARN_STRICT_PROTOTYPES = YES;
 				CLANG_WARN_SUSPICIOUS_MOVE = YES;
 				CLANG_WARN_SUSPICIOUS_MOVE = YES;
@@ -437,131 +416,141 @@
 				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
 				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
 				GCC_WARN_UNUSED_FUNCTION = YES;
 				GCC_WARN_UNUSED_FUNCTION = YES;
 				GCC_WARN_UNUSED_VARIABLE = YES;
 				GCC_WARN_UNUSED_VARIABLE = YES;
-				IPHONEOS_DEPLOYMENT_TARGET = 13.0;
+				IPHONEOS_DEPLOYMENT_TARGET = 15.2;
 				MTL_ENABLE_DEBUG_INFO = NO;
 				MTL_ENABLE_DEBUG_INFO = NO;
 				MTL_FAST_MATH = YES;
 				MTL_FAST_MATH = YES;
 				SDKROOT = iphoneos;
 				SDKROOT = iphoneos;
+				SWIFT_COMPILATION_MODE = wholemodule;
+				SWIFT_OPTIMIZATION_LEVEL = "-O";
 				VALIDATE_PRODUCT = YES;
 				VALIDATE_PRODUCT = YES;
 			};
 			};
 			name = Release;
 			name = Release;
 		};
 		};
-		C335FD742347815C00627CB4 /* Debug */ = {
+		450FAD87277C4BBF00C3060D /* Debug */ = {
 			isa = XCBuildConfiguration;
 			isa = XCBuildConfiguration;
-			baseConfigurationReference = C37BF8EA244D930B00D88DBC /* development.xcconfig */;
 			buildSettings = {
 			buildSettings = {
 				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
 				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
 				CODE_SIGN_STYLE = Automatic;
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 2;
+				CURRENT_PROJECT_VERSION = 1;
+				DEVELOPMENT_ASSET_PATHS = "\"Appcircle/Preview Content\"";
 				DEVELOPMENT_TEAM = 8U2Z24R99J;
 				DEVELOPMENT_TEAM = 8U2Z24R99J;
-				INFOPLIST_FILE = Appcircle/Info.plist;
-				IPHONEOS_DEPLOYMENT_TARGET = 11.0;
+				ENABLE_PREVIEWS = YES;
+				GENERATE_INFOPLIST_FILE = YES;
+				INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;
+				INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
+				INFOPLIST_KEY_UILaunchScreen_Generation = YES;
+				INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
+				INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
 				LD_RUNPATH_SEARCH_PATHS = (
 				LD_RUNPATH_SEARCH_PATHS = (
 					"$(inherited)",
 					"$(inherited)",
 					"@executable_path/Frameworks",
 					"@executable_path/Frameworks",
 				);
 				);
-				MARKETING_VERSION = 1.2;
+				MARKETING_VERSION = 1.0;
 				PRODUCT_BUNDLE_IDENTIFIER = io.appcircle.dashboard;
 				PRODUCT_BUNDLE_IDENTIFIER = io.appcircle.dashboard;
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				PRODUCT_NAME = "$(TARGET_NAME)";
+				SWIFT_EMIT_LOC_STRINGS = YES;
+				SWIFT_VERSION = 5.0;
 				TARGETED_DEVICE_FAMILY = "1,2";
 				TARGETED_DEVICE_FAMILY = "1,2";
 			};
 			};
 			name = Debug;
 			name = Debug;
 		};
 		};
-		C335FD752347815C00627CB4 /* Release */ = {
+		450FAD88277C4BBF00C3060D /* Release */ = {
 			isa = XCBuildConfiguration;
 			isa = XCBuildConfiguration;
-			baseConfigurationReference = C37BF8EA244D930B00D88DBC /* development.xcconfig */;
 			buildSettings = {
 			buildSettings = {
 				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
 				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
 				CODE_SIGN_STYLE = Automatic;
 				CODE_SIGN_STYLE = Automatic;
-				CURRENT_PROJECT_VERSION = 2;
+				CURRENT_PROJECT_VERSION = 1;
+				DEVELOPMENT_ASSET_PATHS = "\"Appcircle/Preview Content\"";
 				DEVELOPMENT_TEAM = 8U2Z24R99J;
 				DEVELOPMENT_TEAM = 8U2Z24R99J;
-				INFOPLIST_FILE = Appcircle/Info.plist;
-				IPHONEOS_DEPLOYMENT_TARGET = 11.0;
+				ENABLE_PREVIEWS = YES;
+				GENERATE_INFOPLIST_FILE = YES;
+				INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;
+				INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
+				INFOPLIST_KEY_UILaunchScreen_Generation = YES;
+				INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
+				INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
 				LD_RUNPATH_SEARCH_PATHS = (
 				LD_RUNPATH_SEARCH_PATHS = (
 					"$(inherited)",
 					"$(inherited)",
 					"@executable_path/Frameworks",
 					"@executable_path/Frameworks",
 				);
 				);
-				MARKETING_VERSION = 1.2;
+				MARKETING_VERSION = 1.0;
 				PRODUCT_BUNDLE_IDENTIFIER = io.appcircle.dashboard;
 				PRODUCT_BUNDLE_IDENTIFIER = io.appcircle.dashboard;
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				PRODUCT_NAME = "$(TARGET_NAME)";
+				SWIFT_EMIT_LOC_STRINGS = YES;
+				SWIFT_VERSION = 5.0;
 				TARGETED_DEVICE_FAMILY = "1,2";
 				TARGETED_DEVICE_FAMILY = "1,2";
 			};
 			};
 			name = Release;
 			name = Release;
 		};
 		};
-		C335FD772347815C00627CB4 /* Debug */ = {
+		450FAD8A277C4BBF00C3060D /* Debug */ = {
 			isa = XCBuildConfiguration;
 			isa = XCBuildConfiguration;
-			baseConfigurationReference = C37BF8EA244D930B00D88DBC /* development.xcconfig */;
 			buildSettings = {
 			buildSettings = {
+				ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
 				BUNDLE_LOADER = "$(TEST_HOST)";
 				BUNDLE_LOADER = "$(TEST_HOST)";
 				CODE_SIGN_STYLE = Automatic;
 				CODE_SIGN_STYLE = Automatic;
-				DEVELOPMENT_TEAM = 8U2Z24R99J;
-				INFOPLIST_FILE = AppcircleTests/Info.plist;
-				IPHONEOS_DEPLOYMENT_TARGET = 13.0;
-				LD_RUNPATH_SEARCH_PATHS = (
-					"$(inherited)",
-					"@executable_path/Frameworks",
-					"@loader_path/Frameworks",
-				);
-				PRODUCT_BUNDLE_IDENTIFIER = com.appcircle.AppcircleTests;
+				CURRENT_PROJECT_VERSION = 1;
+				GENERATE_INFOPLIST_FILE = YES;
+				IPHONEOS_DEPLOYMENT_TARGET = 15.2;
+				MARKETING_VERSION = 1.0;
+				PRODUCT_BUNDLE_IDENTIFIER = io.appcircle.AppcircleTests;
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				PRODUCT_NAME = "$(TARGET_NAME)";
+				SWIFT_EMIT_LOC_STRINGS = NO;
+				SWIFT_VERSION = 5.0;
 				TARGETED_DEVICE_FAMILY = "1,2";
 				TARGETED_DEVICE_FAMILY = "1,2";
 				TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Appcircle.app/Appcircle";
 				TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Appcircle.app/Appcircle";
 			};
 			};
 			name = Debug;
 			name = Debug;
 		};
 		};
-		C335FD782347815C00627CB4 /* Release */ = {
+		450FAD8B277C4BBF00C3060D /* Release */ = {
 			isa = XCBuildConfiguration;
 			isa = XCBuildConfiguration;
-			baseConfigurationReference = C37BF8EA244D930B00D88DBC /* development.xcconfig */;
 			buildSettings = {
 			buildSettings = {
+				ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
 				BUNDLE_LOADER = "$(TEST_HOST)";
 				BUNDLE_LOADER = "$(TEST_HOST)";
 				CODE_SIGN_STYLE = Automatic;
 				CODE_SIGN_STYLE = Automatic;
-				DEVELOPMENT_TEAM = 8U2Z24R99J;
-				INFOPLIST_FILE = AppcircleTests/Info.plist;
-				IPHONEOS_DEPLOYMENT_TARGET = 13.0;
-				LD_RUNPATH_SEARCH_PATHS = (
-					"$(inherited)",
-					"@executable_path/Frameworks",
-					"@loader_path/Frameworks",
-				);
-				PRODUCT_BUNDLE_IDENTIFIER = com.appcircle.AppcircleTests;
+				CURRENT_PROJECT_VERSION = 1;
+				GENERATE_INFOPLIST_FILE = YES;
+				IPHONEOS_DEPLOYMENT_TARGET = 15.2;
+				MARKETING_VERSION = 1.0;
+				PRODUCT_BUNDLE_IDENTIFIER = io.appcircle.AppcircleTests;
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				PRODUCT_NAME = "$(TARGET_NAME)";
+				SWIFT_EMIT_LOC_STRINGS = NO;
+				SWIFT_VERSION = 5.0;
 				TARGETED_DEVICE_FAMILY = "1,2";
 				TARGETED_DEVICE_FAMILY = "1,2";
 				TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Appcircle.app/Appcircle";
 				TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Appcircle.app/Appcircle";
 			};
 			};
 			name = Release;
 			name = Release;
 		};
 		};
-		C335FD7A2347815C00627CB4 /* Debug */ = {
+		450FAD8D277C4BBF00C3060D /* Debug */ = {
 			isa = XCBuildConfiguration;
 			isa = XCBuildConfiguration;
-			baseConfigurationReference = C37BF8EA244D930B00D88DBC /* development.xcconfig */;
 			buildSettings = {
 			buildSettings = {
+				ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
 				CODE_SIGN_STYLE = Automatic;
 				CODE_SIGN_STYLE = Automatic;
-				DEVELOPMENT_TEAM = 8U2Z24R99J;
-				INFOPLIST_FILE = AppcircleUITests/Info.plist;
-				LD_RUNPATH_SEARCH_PATHS = (
-					"$(inherited)",
-					"@executable_path/Frameworks",
-					"@loader_path/Frameworks",
-				);
-				PRODUCT_BUNDLE_IDENTIFIER = com.appcircle.AppcircleUITests;
+				CURRENT_PROJECT_VERSION = 1;
+				GENERATE_INFOPLIST_FILE = YES;
+				MARKETING_VERSION = 1.0;
+				PRODUCT_BUNDLE_IDENTIFIER = io.appcircle.AppcircleUITests;
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				PRODUCT_NAME = "$(TARGET_NAME)";
+				SWIFT_EMIT_LOC_STRINGS = NO;
+				SWIFT_VERSION = 5.0;
 				TARGETED_DEVICE_FAMILY = "1,2";
 				TARGETED_DEVICE_FAMILY = "1,2";
 				TEST_TARGET_NAME = Appcircle;
 				TEST_TARGET_NAME = Appcircle;
 			};
 			};
 			name = Debug;
 			name = Debug;
 		};
 		};
-		C335FD7B2347815C00627CB4 /* Release */ = {
+		450FAD8E277C4BBF00C3060D /* Release */ = {
 			isa = XCBuildConfiguration;
 			isa = XCBuildConfiguration;
-			baseConfigurationReference = C37BF8EA244D930B00D88DBC /* development.xcconfig */;
 			buildSettings = {
 			buildSettings = {
+				ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
 				CODE_SIGN_STYLE = Automatic;
 				CODE_SIGN_STYLE = Automatic;
-				DEVELOPMENT_TEAM = 8U2Z24R99J;
-				INFOPLIST_FILE = AppcircleUITests/Info.plist;
-				LD_RUNPATH_SEARCH_PATHS = (
-					"$(inherited)",
-					"@executable_path/Frameworks",
-					"@loader_path/Frameworks",
-				);
-				PRODUCT_BUNDLE_IDENTIFIER = com.appcircle.AppcircleUITests;
+				CURRENT_PROJECT_VERSION = 1;
+				GENERATE_INFOPLIST_FILE = YES;
+				MARKETING_VERSION = 1.0;
+				PRODUCT_BUNDLE_IDENTIFIER = io.appcircle.AppcircleUITests;
 				PRODUCT_NAME = "$(TARGET_NAME)";
 				PRODUCT_NAME = "$(TARGET_NAME)";
+				SWIFT_EMIT_LOC_STRINGS = NO;
+				SWIFT_VERSION = 5.0;
 				TARGETED_DEVICE_FAMILY = "1,2";
 				TARGETED_DEVICE_FAMILY = "1,2";
 				TEST_TARGET_NAME = Appcircle;
 				TEST_TARGET_NAME = Appcircle;
 			};
 			};
@@ -570,43 +559,50 @@
 /* End XCBuildConfiguration section */
 /* End XCBuildConfiguration section */
 
 
 /* Begin XCConfigurationList section */
 /* Begin XCConfigurationList section */
-		C335FD3F2347815B00627CB4 /* Build configuration list for PBXProject "Appcircle" */ = {
+		450FAD5D277C4BBC00C3060D /* Build configuration list for PBXProject "Appcircle" */ = {
 			isa = XCConfigurationList;
 			isa = XCConfigurationList;
 			buildConfigurations = (
 			buildConfigurations = (
-				C335FD712347815C00627CB4 /* Debug */,
-				C335FD722347815C00627CB4 /* Release */,
+				450FAD84277C4BBF00C3060D /* Debug */,
+				450FAD85277C4BBF00C3060D /* Release */,
 			);
 			);
 			defaultConfigurationIsVisible = 0;
 			defaultConfigurationIsVisible = 0;
 			defaultConfigurationName = Release;
 			defaultConfigurationName = Release;
 		};
 		};
-		C335FD732347815C00627CB4 /* Build configuration list for PBXNativeTarget "Appcircle" */ = {
+		450FAD86277C4BBF00C3060D /* Build configuration list for PBXNativeTarget "Appcircle" */ = {
 			isa = XCConfigurationList;
 			isa = XCConfigurationList;
 			buildConfigurations = (
 			buildConfigurations = (
-				C335FD742347815C00627CB4 /* Debug */,
-				C335FD752347815C00627CB4 /* Release */,
+				450FAD87277C4BBF00C3060D /* Debug */,
+				450FAD88277C4BBF00C3060D /* Release */,
 			);
 			);
 			defaultConfigurationIsVisible = 0;
 			defaultConfigurationIsVisible = 0;
 			defaultConfigurationName = Release;
 			defaultConfigurationName = Release;
 		};
 		};
-		C335FD762347815C00627CB4 /* Build configuration list for PBXNativeTarget "AppcircleTests" */ = {
+		450FAD89277C4BBF00C3060D /* Build configuration list for PBXNativeTarget "AppcircleTests" */ = {
 			isa = XCConfigurationList;
 			isa = XCConfigurationList;
 			buildConfigurations = (
 			buildConfigurations = (
-				C335FD772347815C00627CB4 /* Debug */,
-				C335FD782347815C00627CB4 /* Release */,
+				450FAD8A277C4BBF00C3060D /* Debug */,
+				450FAD8B277C4BBF00C3060D /* Release */,
 			);
 			);
 			defaultConfigurationIsVisible = 0;
 			defaultConfigurationIsVisible = 0;
 			defaultConfigurationName = Release;
 			defaultConfigurationName = Release;
 		};
 		};
-		C335FD792347815C00627CB4 /* Build configuration list for PBXNativeTarget "AppcircleUITests" */ = {
+		450FAD8C277C4BBF00C3060D /* Build configuration list for PBXNativeTarget "AppcircleUITests" */ = {
 			isa = XCConfigurationList;
 			isa = XCConfigurationList;
 			buildConfigurations = (
 			buildConfigurations = (
-				C335FD7A2347815C00627CB4 /* Debug */,
-				C335FD7B2347815C00627CB4 /* Release */,
+				450FAD8D277C4BBF00C3060D /* Debug */,
+				450FAD8E277C4BBF00C3060D /* Release */,
 			);
 			);
 			defaultConfigurationIsVisible = 0;
 			defaultConfigurationIsVisible = 0;
 			defaultConfigurationName = Release;
 			defaultConfigurationName = Release;
 		};
 		};
 /* End XCConfigurationList section */
 /* End XCConfigurationList section */
+
+/* Begin XCSwiftPackageProductDependency section */
+		450FAD91277C4D4D00C3060D /* FizzBuzzKit */ = {
+			isa = XCSwiftPackageProductDependency;
+			productName = FizzBuzzKit;
+		};
+/* End XCSwiftPackageProductDependency section */
 	};
 	};
-	rootObject = C335FD3C2347815B00627CB4 /* Project object */;
+	rootObject = 450FAD5A277C4BBC00C3060D /* Project object */;
 }
 }

+ 1 - 1
Appcircle.xcodeproj/project.xcworkspace/contents.xcworkspacedata

@@ -2,6 +2,6 @@
 <Workspace
 <Workspace
    version = "1.0">
    version = "1.0">
    <FileRef
    <FileRef
-      location = "self:Appcircle.xcodeproj">
+      location = "self:">
    </FileRef>
    </FileRef>
 </Workspace>
 </Workspace>

+ 8 - 0
Appcircle.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist

@@ -0,0 +1,8 @@
+<?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>

+ 9 - 7
Appcircle.xcodeproj/xcshareddata/xcschemes/Appcircle.xcscheme

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <?xml version="1.0" encoding="UTF-8"?>
 <Scheme
 <Scheme
-   LastUpgradeVersion = "1130"
+   LastUpgradeVersion = "1330"
    version = "1.3">
    version = "1.3">
    <BuildAction
    <BuildAction
       parallelizeBuildables = "YES"
       parallelizeBuildables = "YES"
@@ -14,7 +14,7 @@
             buildForAnalyzing = "YES">
             buildForAnalyzing = "YES">
             <BuildableReference
             <BuildableReference
                BuildableIdentifier = "primary"
                BuildableIdentifier = "primary"
-               BlueprintIdentifier = "C335FD432347815B00627CB4"
+               BlueprintIdentifier = "450FAD61277C4BBC00C3060D"
                BuildableName = "Appcircle.app"
                BuildableName = "Appcircle.app"
                BlueprintName = "Appcircle"
                BlueprintName = "Appcircle"
                ReferencedContainer = "container:Appcircle.xcodeproj">
                ReferencedContainer = "container:Appcircle.xcodeproj">
@@ -26,13 +26,15 @@
       buildConfiguration = "Debug"
       buildConfiguration = "Debug"
       selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
       selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
       selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
       selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
-      shouldUseLaunchSchemeArgsEnv = "YES">
+      shouldUseLaunchSchemeArgsEnv = "YES"
+      systemAttachmentLifetime = "keepAlways"
+      codeCoverageEnabled = "YES">
       <Testables>
       <Testables>
          <TestableReference
          <TestableReference
             skipped = "NO">
             skipped = "NO">
             <BuildableReference
             <BuildableReference
                BuildableIdentifier = "primary"
                BuildableIdentifier = "primary"
-               BlueprintIdentifier = "C335FD5E2347815C00627CB4"
+               BlueprintIdentifier = "450FAD71277C4BBF00C3060D"
                BuildableName = "AppcircleTests.xctest"
                BuildableName = "AppcircleTests.xctest"
                BlueprintName = "AppcircleTests"
                BlueprintName = "AppcircleTests"
                ReferencedContainer = "container:Appcircle.xcodeproj">
                ReferencedContainer = "container:Appcircle.xcodeproj">
@@ -42,7 +44,7 @@
             skipped = "NO">
             skipped = "NO">
             <BuildableReference
             <BuildableReference
                BuildableIdentifier = "primary"
                BuildableIdentifier = "primary"
-               BlueprintIdentifier = "C335FD692347815C00627CB4"
+               BlueprintIdentifier = "450FAD7B277C4BBF00C3060D"
                BuildableName = "AppcircleUITests.xctest"
                BuildableName = "AppcircleUITests.xctest"
                BlueprintName = "AppcircleUITests"
                BlueprintName = "AppcircleUITests"
                ReferencedContainer = "container:Appcircle.xcodeproj">
                ReferencedContainer = "container:Appcircle.xcodeproj">
@@ -64,7 +66,7 @@
          runnableDebuggingMode = "0">
          runnableDebuggingMode = "0">
          <BuildableReference
          <BuildableReference
             BuildableIdentifier = "primary"
             BuildableIdentifier = "primary"
-            BlueprintIdentifier = "C335FD432347815B00627CB4"
+            BlueprintIdentifier = "450FAD61277C4BBC00C3060D"
             BuildableName = "Appcircle.app"
             BuildableName = "Appcircle.app"
             BlueprintName = "Appcircle"
             BlueprintName = "Appcircle"
             ReferencedContainer = "container:Appcircle.xcodeproj">
             ReferencedContainer = "container:Appcircle.xcodeproj">
@@ -81,7 +83,7 @@
          runnableDebuggingMode = "0">
          runnableDebuggingMode = "0">
          <BuildableReference
          <BuildableReference
             BuildableIdentifier = "primary"
             BuildableIdentifier = "primary"
-            BlueprintIdentifier = "C335FD432347815B00627CB4"
+            BlueprintIdentifier = "450FAD61277C4BBC00C3060D"
             BuildableName = "Appcircle.app"
             BuildableName = "Appcircle.app"
             BlueprintName = "Appcircle"
             BlueprintName = "Appcircle"
             ReferencedContainer = "container:Appcircle.xcodeproj">
             ReferencedContainer = "container:Appcircle.xcodeproj">

+ 78 - 0
Appcircle.xcodeproj/xcshareddata/xcschemes/FizzBuzzKit.xcscheme

@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Scheme
+   LastUpgradeVersion = "1320"
+   version = "1.3">
+   <BuildAction
+      parallelizeBuildables = "YES"
+      buildImplicitDependencies = "YES">
+      <BuildActionEntries>
+         <BuildActionEntry
+            buildForTesting = "YES"
+            buildForRunning = "YES"
+            buildForProfiling = "YES"
+            buildForArchiving = "YES"
+            buildForAnalyzing = "YES">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "FizzBuzzKit"
+               BuildableName = "FizzBuzzKit"
+               BlueprintName = "FizzBuzzKit"
+               ReferencedContainer = "container:FizzBuzzKit">
+            </BuildableReference>
+         </BuildActionEntry>
+      </BuildActionEntries>
+   </BuildAction>
+   <TestAction
+      buildConfiguration = "Debug"
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      shouldUseLaunchSchemeArgsEnv = "YES"
+      codeCoverageEnabled = "YES">
+      <Testables>
+         <TestableReference
+            skipped = "NO">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "FizzBuzzKitTests"
+               BuildableName = "FizzBuzzKitTests"
+               BlueprintName = "FizzBuzzKitTests"
+               ReferencedContainer = "container:FizzBuzzKit">
+            </BuildableReference>
+         </TestableReference>
+      </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">
+   </LaunchAction>
+   <ProfileAction
+      buildConfiguration = "Release"
+      shouldUseLaunchSchemeArgsEnv = "YES"
+      savedToolIdentifier = ""
+      useCustomWorkingDirectory = "NO"
+      debugDocumentVersioning = "YES">
+      <MacroExpansion>
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "FizzBuzzKit"
+            BuildableName = "FizzBuzzKit"
+            BlueprintName = "FizzBuzzKit"
+            ReferencedContainer = "container:FizzBuzzKit">
+         </BuildableReference>
+      </MacroExpansion>
+   </ProfileAction>
+   <AnalyzeAction
+      buildConfiguration = "Debug">
+   </AnalyzeAction>
+   <ArchiveAction
+      buildConfiguration = "Release"
+      revealArchiveInOrganizer = "YES">
+   </ArchiveAction>
+</Scheme>

+ 0 - 16
Appcircle/AppDelegate.h

@@ -1,16 +0,0 @@
-//
-//  AppDelegate.h
-//  Appcircle
-//
-//  Created by Dogan Ekici on 4.10.2019.
-//  Copyright © 2019 Dogan Ekici. All rights reserved.
-//
-
-#import <UIKit/UIKit.h>
-
-@interface AppDelegate : UIResponder <UIApplicationDelegate>
-
-@property (strong, nonatomic) UIWindow *window;
-
-@end
-

+ 0 - 41
Appcircle/AppDelegate.m

@@ -1,41 +0,0 @@
-//
-//  AppDelegate.m
-//  Appcircle
-//
-//  Created by Dogan Ekici on 4.10.2019.
-//  Copyright © 2019 Dogan Ekici. All rights reserved.
-//
-
-#import "AppDelegate.h"
-
-@interface AppDelegate ()
-
-@end
-
-@implementation AppDelegate
-
-
-- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
-    // Override point for customization after application launch.
-    return YES;
-}
-
-
-#pragma mark - UISceneSession lifecycle
-
-
-- (UISceneConfiguration *)application:(UIApplication *)application configurationForConnectingSceneSession:(UISceneSession *)connectingSceneSession options:(UISceneConnectionOptions *)options {
-    // Called when a new scene session is being created.
-    // Use this method to select a configuration to create the new scene with.
-    return [[UISceneConfiguration alloc] initWithName:@"Default Configuration" sessionRole:connectingSceneSession.role];
-}
-
-
-- (void)application:(UIApplication *)application didDiscardSceneSessions:(NSSet<UISceneSession *> *)sceneSessions {
-    // Called when the user discards a scene session.
-    // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
-    // Use this method to release any resources that were specific to the discarded scenes, as they will not return.
-}
-
-
-@end

+ 17 - 0
Appcircle/AppcircleApp.swift

@@ -0,0 +1,17 @@
+//
+//  AppcircleApp.swift
+//  Appcircle
+//
+//  Created by Mustafa on 29.12.2021.
+//
+
+import SwiftUI
+
+@main
+struct AppcircleApp: App {
+    var body: some Scene {
+        WindowGroup {
+            ContentView()
+        }
+    }
+}

+ 11 - 0
Appcircle/Assets.xcassets/AccentColor.colorset/Contents.json

@@ -0,0 +1,11 @@
+{
+  "colors" : [
+    {
+      "idiom" : "universal"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

二进制
Appcircle/Assets.xcassets/AppIcon.appiconset/100.png


二进制
Appcircle/Assets.xcassets/AppIcon.appiconset/1024.png


二进制
Appcircle/Assets.xcassets/AppIcon.appiconset/114.png


二进制
Appcircle/Assets.xcassets/AppIcon.appiconset/120.png


二进制
Appcircle/Assets.xcassets/AppIcon.appiconset/144.png


二进制
Appcircle/Assets.xcassets/AppIcon.appiconset/152.png


二进制
Appcircle/Assets.xcassets/AppIcon.appiconset/167.png


二进制
Appcircle/Assets.xcassets/AppIcon.appiconset/180.png


二进制
Appcircle/Assets.xcassets/AppIcon.appiconset/20.png


二进制
Appcircle/Assets.xcassets/AppIcon.appiconset/29.png


二进制
Appcircle/Assets.xcassets/AppIcon.appiconset/40.png


二进制
Appcircle/Assets.xcassets/AppIcon.appiconset/50.png


二进制
Appcircle/Assets.xcassets/AppIcon.appiconset/57.png


二进制
Appcircle/Assets.xcassets/AppIcon.appiconset/58.png


二进制
Appcircle/Assets.xcassets/AppIcon.appiconset/60.png


二进制
Appcircle/Assets.xcassets/AppIcon.appiconset/72.png


二进制
Appcircle/Assets.xcassets/AppIcon.appiconset/76.png


二进制
Appcircle/Assets.xcassets/AppIcon.appiconset/80.png


二进制
Appcircle/Assets.xcassets/AppIcon.appiconset/87.png


二进制
Appcircle/Assets.xcassets/AppIcon.appiconset/Contents.json


二进制
Appcircle/Assets.xcassets/Appcircle.imageset/180-removebg-preview.png


+ 0 - 22
Appcircle/Assets.xcassets/Appcircle.imageset/Contents.json

@@ -1,22 +0,0 @@
-{
-  "images" : [
-    {
-      "idiom" : "universal",
-      "scale" : "1x"
-    },
-    {
-      "idiom" : "universal",
-      "filename" : "180-removebg-preview.png",
-      "scale" : "2x"
-    },
-    {
-      "idiom" : "universal",
-      "filename" : "180-removebg-preview-1.png",
-      "scale" : "3x"
-    }
-  ],
-  "info" : {
-    "version" : 1,
-    "author" : "xcode"
-  }
-}

+ 3 - 3
Appcircle/Assets.xcassets/Contents.json

@@ -1,6 +1,6 @@
 {
 {
   "info" : {
   "info" : {
-    "version" : 1,
-    "author" : "xcode"
+    "author" : "xcode",
+    "version" : 1
   }
   }
-}
+}

+ 16 - 0
Appcircle/Assets.xcassets/Logo.imageset/Contents.json

@@ -0,0 +1,16 @@
+{
+  "images" : [
+    {
+      "filename" : "appcircle.svg",
+      "idiom" : "universal"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  },
+  "properties" : {
+    "preserves-vector-representation" : true,
+    "template-rendering-intent" : "original"
+  }
+}

+ 12 - 0
Appcircle/Assets.xcassets/Logo.imageset/appcircle.svg

@@ -0,0 +1,12 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="564" height="564" viewBox="0 0 564 564">
+  <defs>
+    <linearGradient id="app_circle_app_logo-a" x1="50%" x2="50%" y1="0%" y2="100%">
+      <stop offset="0%" stop-color="#FF8E34"/>
+      <stop offset="100%" stop-color="#FF7734"/>
+    </linearGradient>
+  </defs>
+  <g fill="none" fill-rule="evenodd">
+    <rect width="564" height="564" fill="url(#app_circle_app_logo-a)" rx="159"/>
+    <path fill="#FFF" d="M231.232772,360.278371 C259.469885,383.308855 264.223471,407.777876 245.49353,433.685432 C222.405605,464.8797 179.672147,476.21047 143.49948,458.661524 L143.196514,458.514542 C143.109051,458.47211 143.021663,458.429522 142.934351,458.386779 C102.271494,438.480513 85.4579831,389.406134 105.380324,348.776086 L150.471975,256.81521 L175.810005,205.140291 L206.262063,143.035715 C221.059964,112.856558 251.924168,95.7754342 283.519167,97.0684781 C314.039798,96.952875 343.414814,113.892722 357.737937,143.103605 L458.619676,348.843977 C478.542017,389.474024 461.728506,438.548403 421.065649,458.454669 C420.978337,458.497412 420.890949,458.54 420.803486,458.582432 L420.50052,458.729414 C380.087592,478.335497 331.48557,461.8943 311.239235,421.978945 C300.745384,399.92716 307.743953,379.112776 332.234941,359.535795 L332.226841,359.535795 C350.64597,344.669201 362.425778,321.917168 362.425778,296.416033 C362.425778,251.627151 326.087895,215.318588 281.262845,215.318588 C236.437795,215.318588 200.099912,251.627151 200.099912,296.416033 C200.099912,322.345588 212.278847,345.432895 231.232772,360.278371 Z M281.336152,338.9178 C257.784007,338.9178 238.691222,319.84042 238.691222,296.307279 C238.691222,272.774137 257.784007,253.696757 281.336152,253.696757 C304.888297,253.696757 323.981083,272.774137 323.981083,296.307279 C323.981083,319.84042 304.888297,338.9178 281.336152,338.9178 Z"/>
+  </g>
+</svg>

+ 0 - 25
Appcircle/Base.lproj/LaunchScreen.storyboard

@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="13122.16" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
-    <dependencies>
-        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13104.12"/>
-        <capability name="Safe area layout guides" minToolsVersion="9.0"/>
-        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
-    </dependencies>
-    <scenes>
-        <!--View Controller-->
-        <scene sceneID="EHf-IW-A2E">
-            <objects>
-                <viewController id="01J-lp-oVM" sceneMemberID="viewController">
-                    <view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
-                        <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
-                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
-                        <color key="backgroundColor" xcode11CocoaTouchSystemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
-                        <viewLayoutGuide key="safeArea" id="6Tk-OE-BBY"/>
-                    </view>
-                </viewController>
-                <placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
-            </objects>
-            <point key="canvasLocation" x="53" y="375"/>
-        </scene>
-    </scenes>
-</document>

+ 0 - 141
Appcircle/Base.lproj/Main.storyboard

@@ -1,141 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="15705" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="7aF-YI-2t0">
-    <device id="retina6_1" orientation="portrait" appearance="light"/>
-    <dependencies>
-        <deployment identifier="iOS"/>
-        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="15706"/>
-        <capability name="Safe area layout guides" minToolsVersion="9.0"/>
-        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
-    </dependencies>
-    <scenes>
-        <!--Page 1-->
-        <scene sceneID="tne-QT-ifu">
-            <objects>
-                <viewController id="BYZ-38-t0r" customClass="ViewController" sceneMemberID="viewController">
-                    <view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC">
-                        <rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
-                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
-                        <subviews>
-                            <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="dbY-Yo-aTf">
-                                <rect key="frame" x="160" y="483" width="94" height="36"/>
-                                <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="20"/>
-                                <state key="normal" title="Next Page"/>
-                                <connections>
-                                    <segue destination="W5I-xn-GsK" kind="show" id="w4n-7z-4bp"/>
-                                </connections>
-                            </button>
-                            <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="Appcircle" translatesAutoresizingMaskIntoConstraints="NO" id="Chf-CY-MZC">
-                                <rect key="frame" x="177" y="200" width="60" height="60"/>
-                                <constraints>
-                                    <constraint firstAttribute="height" constant="60" id="7wh-kF-ozf"/>
-                                    <constraint firstAttribute="width" constant="60" id="UWB-hP-KUg"/>
-                                </constraints>
-                            </imageView>
-                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Appcircle.io" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="VPj-S8-XbZ">
-                                <rect key="frame" x="0.0" y="270" width="414" height="36"/>
-                                <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="30"/>
-                                <nil key="textColor"/>
-                                <nil key="highlightedColor"/>
-                            </label>
-                        </subviews>
-                        <color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
-                        <constraints>
-                            <constraint firstItem="dbY-Yo-aTf" firstAttribute="centerY" secondItem="6Tk-OE-BBY" secondAttribute="centerY" id="8mW-C2-zJN"/>
-                            <constraint firstItem="Chf-CY-MZC" firstAttribute="top" secondItem="6Tk-OE-BBY" secondAttribute="top" constant="60" id="a8u-fm-ON0"/>
-                            <constraint firstItem="dbY-Yo-aTf" firstAttribute="centerX" secondItem="6Tk-OE-BBY" secondAttribute="centerX" id="d5D-xx-iax"/>
-                            <constraint firstItem="VPj-S8-XbZ" firstAttribute="top" secondItem="Chf-CY-MZC" secondAttribute="bottom" constant="10" id="r5n-TF-X0F"/>
-                            <constraint firstItem="VPj-S8-XbZ" firstAttribute="trailing" secondItem="6Tk-OE-BBY" secondAttribute="trailing" id="rTL-gx-o2b"/>
-                            <constraint firstItem="Chf-CY-MZC" firstAttribute="centerX" secondItem="6Tk-OE-BBY" secondAttribute="centerX" id="unc-hy-R3p"/>
-                            <constraint firstItem="VPj-S8-XbZ" firstAttribute="leading" secondItem="6Tk-OE-BBY" secondAttribute="leading" id="zTa-iW-YRD"/>
-                        </constraints>
-                        <viewLayoutGuide key="safeArea" id="6Tk-OE-BBY"/>
-                    </view>
-                    <navigationItem key="navigationItem" title="Page 1" id="HBB-iR-JEJ"/>
-                </viewController>
-                <placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
-            </objects>
-            <point key="canvasLocation" x="1047.8260869565217" y="133.92857142857142"/>
-        </scene>
-        <!--Page 2-->
-        <scene sceneID="gNa-el-FDv">
-            <objects>
-                <viewController id="W5I-xn-GsK" customClass="ViewController2" sceneMemberID="viewController">
-                    <view key="view" contentMode="scaleToFill" id="u6a-Kk-NxX">
-                        <rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
-                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
-                        <subviews>
-                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Appcircle.io" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="JHs-nA-rYW">
-                                <rect key="frame" x="0.0" y="477" width="414" height="48"/>
-                                <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="40"/>
-                                <nil key="textColor"/>
-                                <nil key="highlightedColor"/>
-                            </label>
-                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="v1.1" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="DL3-Qa-VWz">
-                                <rect key="frame" x="0.0" y="533" width="414" height="20.5"/>
-                                <fontDescription key="fontDescription" type="boldSystem" pointSize="17"/>
-                                <nil key="textColor"/>
-                                <nil key="highlightedColor"/>
-                            </label>
-                            <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="Appcircle" translatesAutoresizingMaskIntoConstraints="NO" id="8FF-zy-vuc">
-                                <rect key="frame" x="167" y="389" width="80" height="80"/>
-                                <constraints>
-                                    <constraint firstAttribute="height" constant="80" id="6oH-AG-w8z"/>
-                                    <constraint firstAttribute="width" constant="80" id="oNl-rM-Q1m"/>
-                                </constraints>
-                            </imageView>
-                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="sVQ-zL-X3b">
-                                <rect key="frame" x="20" y="834" width="374" height="18"/>
-                                <fontDescription key="fontDescription" type="system" weight="medium" pointSize="15"/>
-                                <nil key="textColor"/>
-                                <nil key="highlightedColor"/>
-                            </label>
-                        </subviews>
-                        <color key="backgroundColor" systemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
-                        <constraints>
-                            <constraint firstItem="JHs-nA-rYW" firstAttribute="top" secondItem="8FF-zy-vuc" secondAttribute="bottom" constant="8" id="0ya-9F-KQv"/>
-                            <constraint firstItem="JHs-nA-rYW" firstAttribute="leading" secondItem="JoR-XE-yvE" secondAttribute="leading" id="399-U0-d8k"/>
-                            <constraint firstItem="sVQ-zL-X3b" firstAttribute="bottom" secondItem="JoR-XE-yvE" secondAttribute="bottom" constant="-10" id="8kZ-UM-zal"/>
-                            <constraint firstItem="DL3-Qa-VWz" firstAttribute="leading" secondItem="JoR-XE-yvE" secondAttribute="leading" id="9H6-BC-MVH"/>
-                            <constraint firstItem="sVQ-zL-X3b" firstAttribute="leading" secondItem="JoR-XE-yvE" secondAttribute="leading" constant="20" id="GUs-f9-TsZ"/>
-                            <constraint firstItem="DL3-Qa-VWz" firstAttribute="top" secondItem="JHs-nA-rYW" secondAttribute="bottom" constant="8" id="Leh-rL-jaf"/>
-                            <constraint firstItem="JoR-XE-yvE" firstAttribute="trailing" secondItem="sVQ-zL-X3b" secondAttribute="trailing" constant="20" id="ZQb-Ch-TiO"/>
-                            <constraint firstItem="8FF-zy-vuc" firstAttribute="centerX" secondItem="JHs-nA-rYW" secondAttribute="centerX" id="fbv-wS-7t1"/>
-                            <constraint firstItem="DL3-Qa-VWz" firstAttribute="trailing" secondItem="JoR-XE-yvE" secondAttribute="trailing" id="hpm-4Y-adh"/>
-                            <constraint firstItem="JoR-XE-yvE" firstAttribute="trailing" secondItem="JHs-nA-rYW" secondAttribute="trailing" id="lPI-fN-W8e"/>
-                            <constraint firstItem="JHs-nA-rYW" firstAttribute="centerY" secondItem="JoR-XE-yvE" secondAttribute="centerY" id="nkg-NN-bc5"/>
-                        </constraints>
-                        <viewLayoutGuide key="safeArea" id="JoR-XE-yvE"/>
-                    </view>
-                    <navigationItem key="navigationItem" title="Page 2" id="GN7-V9-c7e"/>
-                    <connections>
-                        <outlet property="lblApi" destination="sVQ-zL-X3b" id="K5W-tl-fAZ"/>
-                        <outlet property="lblVersion" destination="DL3-Qa-VWz" id="VEF-4v-FJT"/>
-                    </connections>
-                </viewController>
-                <placeholder placeholderIdentifier="IBFirstResponder" id="pce-j3-UIb" sceneMemberID="firstResponder"/>
-            </objects>
-            <point key="canvasLocation" x="1831.8840579710147" y="133.92857142857142"/>
-        </scene>
-        <!--Navigation Controller-->
-        <scene sceneID="wwX-uu-wgJ">
-            <objects>
-                <navigationController automaticallyAdjustsScrollViewInsets="NO" id="7aF-YI-2t0" sceneMemberID="viewController">
-                    <toolbarItems/>
-                    <navigationBar key="navigationBar" contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" largeTitles="YES" id="g0J-SG-cuq">
-                        <rect key="frame" x="0.0" y="44" width="414" height="96"/>
-                        <autoresizingMask key="autoresizingMask"/>
-                    </navigationBar>
-                    <nil name="viewControllers"/>
-                    <connections>
-                        <segue destination="BYZ-38-t0r" kind="relationship" relationship="rootViewController" id="7cQ-i0-X0k"/>
-                    </connections>
-                </navigationController>
-                <placeholder placeholderIdentifier="IBFirstResponder" id="h3G-6Q-mq5" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
-            </objects>
-            <point key="canvasLocation" x="137.68115942028987" y="133.92857142857142"/>
-        </scene>
-    </scenes>
-    <resources>
-        <image name="Appcircle" width="90" height="90"/>
-    </resources>
-</document>

+ 46 - 0
Appcircle/ContentView.swift

@@ -0,0 +1,46 @@
+//
+//  ContentView.swift
+//  Appcircle
+//
+//  Created by Mustafa on 29.12.2021.
+//
+
+import SwiftUI
+import FizzBuzzKit
+
+struct FizzBuzzView: View {
+    var number: Int
+    let fbkit = FizzBuzzKit()
+    var body: some View {
+        HStack {
+            Text("Result: ")
+            Text(fbkit.handle(number: number))
+                .accessibilityIdentifier("result")
+        }
+    }
+}
+
+struct ContentView: View {
+    @State var numberString: String = ""
+    var body: some View {
+
+        Text("Appcircle")
+        Image("Logo")
+            .resizable()
+            .frame(width: 64, height: 64)
+
+        Form {
+            TextField(text: $numberString, prompt: Text("Enter a number")) {
+                Text("Number")
+            }
+            FizzBuzzView(number: Int(numberString) ?? 0)
+        }
+
+    }
+}
+
+struct ContentView_Previews: PreviewProvider {
+    static var previews: some View {
+        ContentView()
+    }
+}

+ 0 - 68
Appcircle/Info.plist

@@ -1,68 +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>API_KEY</key>
-	<string>$(API_KEY)</string>
-	<key>API_URL</key>
-	<string>$(API_URL)</string>
-	<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>CFBundlePackageType</key>
-	<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
-	<key>CFBundleShortVersionString</key>
-	<string>$(MARKETING_VERSION)</string>
-	<key>CFBundleVersion</key>
-	<string>$(CURRENT_PROJECT_VERSION)</string>
-	<key>LSRequiresIPhoneOS</key>
-	<true/>
-	<key>UIApplicationSceneManifest</key>
-	<dict>
-		<key>UIApplicationSupportsMultipleScenes</key>
-		<false/>
-		<key>UISceneConfigurations</key>
-		<dict>
-			<key>UIWindowSceneSessionRoleApplication</key>
-			<array>
-				<dict>
-					<key>UISceneConfigurationName</key>
-					<string>Default Configuration</string>
-					<key>UISceneDelegateClassName</key>
-					<string>SceneDelegate</string>
-					<key>UISceneStoryboardFile</key>
-					<string>Main</string>
-				</dict>
-			</array>
-		</dict>
-	</dict>
-	<key>UILaunchStoryboardName</key>
-	<string>LaunchScreen</string>
-	<key>UIMainStoryboardFile</key>
-	<string>Main</string>
-	<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>
-</dict>
-</plist>

+ 6 - 0
Appcircle/Preview Content/Preview Assets.xcassets/Contents.json

@@ -0,0 +1,6 @@
+{
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

+ 0 - 16
Appcircle/SceneDelegate.h

@@ -1,16 +0,0 @@
-//
-//  SceneDelegate.h
-//  Appcircle
-//
-//  Created by Dogan Ekici on 4.10.2019.
-//  Copyright © 2019 Dogan Ekici. All rights reserved.
-//
-
-#import <UIKit/UIKit.h>
-
-@interface SceneDelegate : UIResponder <UIWindowSceneDelegate>
-
-@property (strong, nonatomic) UIWindow * window;
-
-@end
-

+ 0 - 50
Appcircle/SceneDelegate.m

@@ -1,50 +0,0 @@
-#import "SceneDelegate.h"
-
-@interface SceneDelegate ()
-
-@end
-
-@implementation SceneDelegate
-
-
-- (void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session options:(UISceneConnectionOptions *)connectionOptions {
-    // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
-    // If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
-    // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
-}
-
-
-- (void)sceneDidDisconnect:(UIScene *)scene {
-    // Called as the scene is being released by the system.
-    // This occurs shortly after the scene enters the background, or when its session is discarded.
-    // Release any resources associated with this scene that can be re-created the next time the scene connects.
-    // The scene may re-connect later, as its session was not neccessarily discarded (see `application:didDiscardSceneSessions` instead).
-}
-
-
-- (void)sceneDidBecomeActive:(UIScene *)scene {
-    // Called when the scene has moved from an inactive state to an active state.
-    // Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive.
-}
-
-
-- (void)sceneWillResignActive:(UIScene *)scene {
-    // Called when the scene will move from an active state to an inactive state.
-    // This may occur due to temporary interruptions (ex. an incoming phone call).
-}
-
-
-- (void)sceneWillEnterForeground:(UIScene *)scene {
-    // Called as the scene transitions from the background to the foreground.
-    // Use this method to undo the changes made on entering the background.
-}
-
-
-- (void)sceneDidEnterBackground:(UIScene *)scene {
-    // Called as the scene transitions from the foreground to the background.
-    // Use this method to save data, release shared resources, and store enough scene-specific state information
-    // to restore the scene back to its current state.
-}
-
-
-@end

+ 0 - 15
Appcircle/ViewController.h

@@ -1,15 +0,0 @@
-//
-//  ViewController.h
-//  Appcircle
-//
-//  Created by Dogan Ekici on 4.10.2019.
-//  Copyright © 2019 Dogan Ekici. All rights reserved.
-//
-
-#import <UIKit/UIKit.h>
-
-@interface ViewController : UIViewController
-
-
-@end
-

+ 0 - 23
Appcircle/ViewController.m

@@ -1,23 +0,0 @@
-//
-//  ViewController.m
-//  Appcircle
-//
-//  Created by Dogan Ekici on 4.10.2019.
-//  Copyright © 2019 Dogan Ekici. All rights reserved.
-//
-
-#import "ViewController.h"
-
-@interface ViewController ()
-
-@end
-
-@implementation ViewController
-
-- (void)viewDidLoad {
-    [super viewDidLoad];
-    // Do any additional setup after loading the view.
-}
-
-
-@end

+ 0 - 20
Appcircle/ViewController2.h

@@ -1,20 +0,0 @@
-//
-//  ViewController2.h
-//  Appcircle
-//
-//  Created by Dogan Ekici on 5.11.2019.
-//  Copyright © 2019 Dogan Ekici. All rights reserved.
-//
-
-#import <UIKit/UIKit.h>
-
-NS_ASSUME_NONNULL_BEGIN
-
-@interface ViewController2 : UIViewController
-
-@property (weak, nonatomic) IBOutlet UILabel *lblVersion;
-@property (weak, nonatomic) IBOutlet UILabel *lblApi;
-
-@end
-
-NS_ASSUME_NONNULL_END

+ 0 - 35
Appcircle/ViewController2.m

@@ -1,35 +0,0 @@
-//
-//  ViewController2.m
-//  Appcircle
-//
-//  Created by Dogan Ekici on 5.11.2019.
-//  Copyright © 2019 Dogan Ekici. All rights reserved.
-//
-
-#import "ViewController2.h"
-
-@interface ViewController2 ()
-
-@end
-
-@implementation ViewController2
-
-- (void)viewDidLoad {
-    [super viewDidLoad];
-   
-    self.lblVersion.text =  [NSString stringWithFormat:@"v%@",[[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"]];
-    self.lblApi.text = [NSString stringWithFormat:@"Api URL: %@\nApi KEY: %@",[[NSBundle mainBundle] objectForInfoDictionaryKey:@"API_URL"],[[NSBundle mainBundle] objectForInfoDictionaryKey:@"API_KEY"]];
-    // Do any additional setup after loading the view.
-}
-
-/*
-#pragma mark - Navigation
-
-// In a storyboard-based application, you will often want to do a little preparation before navigation
-- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
-    // Get the new view controller using [segue destinationViewController].
-    // Pass the selected object to the new view controller.
-}
-*/
-
-@end

+ 0 - 13
Appcircle/development.xcconfig

@@ -1,13 +0,0 @@
-//
-//  development.xcconfig
-//  Appcircle
-//
-//  Created by Dogan Ekici on 20.04.2020.
-//  Copyright © 2020 Dogan Ekici. All rights reserved.
-//
-
-// Configuration settings file format documentation can be found at:
-// https://help.apple.com/xcode/#/dev745c5c974
-
-API_URL=Development URL
-API_KEY=Development KEY

+ 0 - 25
Appcircle/environment.sh

@@ -1,25 +0,0 @@
-FILE="$1"
-
-if [ ! -f "$FILE" ]; then
-    echo ".xcconfig file not found!"
-    exit 0;
-fi
-
-KEY_ARRAY=()
-while IFS= read -r line; do
-	if [[ $line != //* ]] && [[ $line == *"="* ]]; then
-		IFS=' = ' read -r -a array <<< "$line"
-		KEY_ARRAY+=("${array[0]}")
-	fi
-done < "$FILE"
-
-for i in "${KEY_ARRAY[@]}"
-do
-   if [ -n "${!i}" ]; then
-   	echo "Key : ${i}"
-   	echo "Value : ${!i}"
-    
-   	sed -i '' "s/\(^${i}=\).*/\1$( echo "${!i}" | sed -e 's/[\/&]/\\&/g' )/" "$FILE"
-   fi
-done
-exit 0;

+ 0 - 19
Appcircle/main.m

@@ -1,19 +0,0 @@
-//
-//  main.m
-//  Appcircle
-//
-//  Created by Dogan Ekici on 4.10.2019.
-//  Copyright © 2019 Dogan Ekici. All rights reserved.
-//
-
-#import <UIKit/UIKit.h>
-#import "AppDelegate.h"
-
-int main(int argc, char * argv[]) {
-    NSString * appDelegateClassName;
-    @autoreleasepool {
-        // Setup code that might create autoreleased objects goes here.
-        appDelegateClassName = NSStringFromClass([AppDelegate class]);
-    }
-    return UIApplicationMain(argc, argv, nil, appDelegateClassName);
-}

+ 0 - 57
AppcircleTests/AppcircleTests.m

@@ -1,57 +0,0 @@
-//
-//  AppcircleTests.m
-//  AppcircleTests
-//
-//  Created by Dogan Ekici on 4.10.2019.
-//  Copyright © 2019 Dogan Ekici. All rights reserved.
-//
-
-#import <XCTest/XCTest.h>
-
-@interface AppcircleTests : XCTestCase
-
-@end
-
-@implementation AppcircleTests
-
-- (void)setUp {
-    // Put setup code here. This method is called before the invocation of each test method in the class.
-}
-
-- (void)tearDown {
-    // Put teardown code here. This method is called after the invocation of each test method in the class.
-}
-
-- (void)testExample {
-    // This is an example of a functional test case.
-    // Use XCTAssert and related functions to verify your tests produce the correct results.
-}
-
-- (void)testArrayCount {
-    NSArray *array = [[NSArray alloc] initWithObjects:@"First",@"Second", nil];
-    XCTAssertEqual(array.count, 2);
-}
-
-- (void)testArrayFirstObject {
-    NSArray *array = [[NSArray alloc] initWithObjects:@"First",@"Second", nil];
-    XCTAssertEqual(array.firstObject, @"First");
-}
-
-- (void)testArrayLastObject {
-    NSArray *array = [[NSArray alloc] initWithObjects:@"First",@"Second", nil];
-    XCTAssertEqual(array.lastObject, @"Second");
-}
-
-- (void)testType {
-    NSArray *array = [[NSArray alloc] initWithObjects:@"First",@"Second", nil];
-    XCTAssert([array isKindOfClass:[NSArray class]]);
-}
-
-- (void)testPerformanceExample {
-    // This is an example of a performance test case.
-    [self measureBlock:^{
-        // Put the code you want to measure the time of here.
-    }];
-}
-
-@end

+ 55 - 0
AppcircleTests/AppcircleTests.swift

@@ -0,0 +1,55 @@
+//
+//  AppcircleTests.swift
+//  AppcircleTests
+//
+//  Created by Mustafa on 29.12.2021.
+//
+
+import XCTest
+@testable import Appcircle
+
+class AppcircleTests: XCTestCase {
+
+    override func setUpWithError() throws {
+        // Put setup code here. This method is called before the invocation of each test method in the class.
+    }
+
+    override func tearDownWithError() throws {
+        // Put teardown code here. This method is called after the invocation of each test method in the class.
+    }
+
+    func testSkipiPhone8() throws {
+        let simulator = ProcessInfo.processInfo.environment["SIMULATOR_DEVICE_NAME"] ?? "No Name"
+        try XCTSkipIf(simulator.contains("iPhone 8"), "Skip this test on iPhone 8*")
+        XCTAssertTrue(true,"iPhone 8 Test")
+    }
+    
+    func testSkipiPhone14() throws {
+        let simulator = ProcessInfo.processInfo.environment["SIMULATOR_DEVICE_NAME"] ?? "No Name"
+        try XCTSkipIf(simulator.contains("iPhone 14"), "Skip this test on iPhone 14*")
+        XCTAssertTrue(true,"iPhone 14 Test")
+    }
+
+    
+    func testExpectedFailure() throws {
+        let thingThatFails: Bool = false
+        XCTExpectFailure("Working on a fix for this problem.")
+        XCTAssertTrue(thingThatFails, "This is not working right now.")
+    }
+        
+    func testPass() throws {
+        XCTAssertTrue(true, "This test should pass")
+    }
+    
+    func testFail() throws {
+        XCTAssertTrue(false,"This test should fail")
+    }
+    
+    func testPerformanceExample() throws {
+        // This is an example of a performance test case.
+        self.measure {
+            // Put the code you want to measure the time of here.
+        }
+    }
+
+}

+ 0 - 22
AppcircleTests/Info.plist

@@ -1,22 +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>CFBundlePackageType</key>
-	<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
-	<key>CFBundleShortVersionString</key>
-	<string>1.0</string>
-	<key>CFBundleVersion</key>
-	<string>1</string>
-</dict>
-</plist>

+ 0 - 56
AppcircleUITests/AppcircleUITests.m

@@ -1,56 +0,0 @@
-//
-//  AppcircleUITests.m
-//  AppcircleUITests
-//
-//  Created by Dogan Ekici on 4.10.2019.
-//  Copyright © 2019 Dogan Ekici. All rights reserved.
-//
-
-#import <XCTest/XCTest.h>
-
-@interface AppcircleUITests : XCTestCase
-
-@end
-
-@implementation AppcircleUITests
-
-- (void)setUp {
-    // Put setup code here. This method is called before the invocation of each test method in the class.
-
-    // In UI tests it is usually best to stop immediately when a failure occurs.
-    self.continueAfterFailure = NO;
-
-    // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this.
-}
-
-- (void)tearDown {
-    // Put teardown code here. This method is called after the invocation of each test method in the class.
-}
-
-- (void)testExample {
-    // UI tests must launch the application that they test.
-    XCUIApplication *app = [[XCUIApplication alloc] init];
-    [app launch];
-    
-    XCTAssertTrue(app.buttons[@"Next Page"].exists);
-    [app.buttons[@"Next Page"] tap];
-    XCTAssertTrue(app.staticTexts[@"Appcircle.io"].exists);
-    
-    sleep(1);
-    
-    XCTAttachment *attachment = [XCTAttachment attachmentWithScreenshot:[app screenshot]];
-    attachment.name = @"Attachment";
-    attachment.lifetime = XCTAttachmentLifetimeKeepAlways;
-    [self addAttachment:attachment];
-}
-
-- (void)testLaunchPerformance {
-    if (@available(macOS 10.15, iOS 13.0, tvOS 13.0, *)) {
-        // This measures how long it takes to launch your application.
-        [self measureWithMetrics:@[XCTOSSignpostMetric.applicationLaunchMetric] block:^{
-            [[[XCUIApplication alloc] init] launch];
-        }];
-    }
-}
-
-@end

+ 112 - 0
AppcircleUITests/AppcircleUITests.swift

@@ -0,0 +1,112 @@
+//
+//  AppcircleUITests.swift
+//  AppcircleUITests
+//
+//  Created by Mustafa on 29.12.2021.
+//
+
+import XCTest
+
+extension XCUIElement {
+
+    func clearAndEnterText(_ text: String) {
+        guard let stringValue = self.value as? String else {
+            XCTFail("Tried to clear and enter text into a non string value")
+            return
+        }
+
+        self.tap()
+
+        let deleteString = stringValue.map { _ in "\u{8}" }.joined(separator: "")
+
+        self.typeText(deleteString)
+        self.typeText(text)
+    }
+
+}
+
+class AppcircleUITests: XCTestCase {
+
+    override func setUpWithError() throws {
+        // Put setup code here. This method is called before the invocation of each test method in the class.
+
+        // In UI tests it is usually best to stop immediately when a failure occurs.
+        continueAfterFailure = false
+
+    }
+
+    override func tearDownWithError() throws {
+        // Put teardown code here. This method is called after the invocation of each test method in the class.
+    }
+
+    func testFizz() throws {
+        // UI tests must launch the application that they test.
+        let app = XCUIApplication()
+        app.launch()
+        
+        let numberCell = app.textFields["Enter a number"]
+        let resultText = app.staticTexts["result"]
+        numberCell.tap()
+        numberCell.typeText("3")
+        XCTAssertEqual(resultText.label,"Fizz")
+    }
+    
+    func testBuzz() throws {
+        // UI tests must launch the application that they test.
+        let app = XCUIApplication()
+        app.launch()
+        
+        let numberCell = app.textFields["Enter a number"]
+        let resultText = app.staticTexts["result"]
+
+        numberCell.tap()
+        numberCell.clearAndEnterText("15")
+        XCTAssertEqual(resultText.label,"FizzBuzz")
+    }
+    
+    func testOthers() throws {
+        // UI tests must launch the application that they test.
+        let app = XCUIApplication()
+        app.launch()
+        
+        let numberCell = app.textFields["Enter a number"]
+        let resultText = app.staticTexts["result"]
+
+        numberCell.tap()
+        numberCell.clearAndEnterText("4")
+        XCTAssertEqual(resultText.label,"4")
+    }
+    
+    func testFail() throws {
+        // UI tests must launch the application that they test.
+        let app = XCUIApplication()
+        app.launch()
+        
+        let numberCell = app.textFields["Enter a number"]
+        let resultText = app.staticTexts["result"]
+
+        numberCell.tap()
+        numberCell.clearAndEnterText("7")
+        XCTAssertEqual(resultText.label,"Fizz")
+    }
+
+    func testDataAttachment() throws {
+        let app = XCUIApplication()
+        app.launch()
+        let text = "Appcircle"
+        let attachment = XCTAttachment(data: Data(text.utf8))
+        attachment.lifetime = .keepAlways
+        add(attachment)
+    }
+    
+    func testJsonAttachment() throws {
+        let app = XCUIApplication()
+        app.launch()
+        let json = "{\"hello\":\"world\"}"
+        let attachment = XCTAttachment(data: Data(json.utf8),uniformTypeIdentifier: "public.json")
+        attachment.lifetime = .keepAlways
+        add(attachment)
+    }
+
+
+}

+ 32 - 0
AppcircleUITests/AppcircleUITestsLaunchTests.swift

@@ -0,0 +1,32 @@
+//
+//  AppcircleUITestsLaunchTests.swift
+//  AppcircleUITests
+//
+//  Created by Mustafa on 29.12.2021.
+//
+
+import XCTest
+
+class AppcircleUITestsLaunchTests: XCTestCase {
+
+    override class var runsForEachTargetApplicationUIConfiguration: Bool {
+        true
+    }
+
+    override func setUpWithError() throws {
+        continueAfterFailure = false
+    }
+
+    func testLaunch() throws {
+        let app = XCUIApplication()
+        app.launch()
+
+        // Insert steps here to perform after app launch but before taking a screenshot,
+        // such as logging into a test account or navigating somewhere in the app
+
+        let attachment = XCTAttachment(screenshot: app.screenshot())
+        attachment.name = "Launch Screen"
+        attachment.lifetime = .keepAlways
+        add(attachment)
+    }
+}

+ 0 - 22
AppcircleUITests/Info.plist

@@ -1,22 +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>CFBundlePackageType</key>
-	<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
-	<key>CFBundleShortVersionString</key>
-	<string>1.0</string>
-	<key>CFBundleVersion</key>
-	<string>1</string>
-</dict>
-</plist>

+ 7 - 0
FizzBuzzKit/.gitignore

@@ -0,0 +1,7 @@
+.DS_Store
+/.build
+/Packages
+/*.xcodeproj
+xcuserdata/
+DerivedData/
+.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata

+ 28 - 0
FizzBuzzKit/Package.swift

@@ -0,0 +1,28 @@
+// swift-tools-version:5.5
+// The swift-tools-version declares the minimum version of Swift required to build this package.
+
+import PackageDescription
+
+let package = Package(
+    name: "FizzBuzzKit",
+    products: [
+        // Products define the executables and libraries a package produces, and make them visible to other packages.
+        .library(
+            name: "FizzBuzzKit",
+            targets: ["FizzBuzzKit"])
+    ],
+    dependencies: [
+        // Dependencies declare other packages that this package depends on.
+        // .package(url: /* package url */, from: "1.0.0"),
+    ],
+    targets: [
+        // Targets are the basic building blocks of a package. A target can define a module or a test suite.
+        // Targets can depend on other targets in this package, and on products in packages this package depends on.
+        .target(
+            name: "FizzBuzzKit",
+            dependencies: []),
+        .testTarget(
+            name: "FizzBuzzKitTests",
+            dependencies: ["FizzBuzzKit"])
+    ]
+)

+ 31 - 0
FizzBuzzKit/README.md

@@ -0,0 +1,31 @@
+# FizzBuzzKit
+
+This package solves the famous FizzBuzz problem.
+
+## Usage
+
+### Handle Single Number
+
+```swift
+let fbkit = FizzBuzzKit()
+var result = fbkit.handle(number: 3) // "Fizz"
+result = fbkit.handle(number: 4) // "4"
+result = fbkit.handle(number: 5) // "Buzz"
+result = fbkit.handle(number: 15) // "FizzBuzz"
+```
+
+### Handle Multiple Numbers
+
+```swift
+let fbkit = FizzBuzzKit()
+let result = fbkit.handle(numbers: [1, 7, 30, 3]) // ["1", "7", "FizzBuzz", "Fizz"]
+```
+
+### Using Different Rules
+
+```swift
+let fbkit = FizzBuzzKit(rules: [(7, "Potato"), (11, "Tomato")])
+var result =  fbkit.handle(number: 7) // "Potato"
+result = fbkit.handle(number: 4) // "4"
+result = fbkit.handle(number: 11) // "Tomato"
+```

+ 46 - 0
FizzBuzzKit/Sources/FizzBuzzKit/FizzBuzzKit.swift

@@ -0,0 +1,46 @@
+public class FizzBuzzKit {
+    /// Filter function that takes a number and returns `true` if the number satisfies a rule
+    public typealias FilterFunction = (Int) -> Bool
+
+    var rules: [( FilterFunction, String)]
+
+    /// Initialize FizzBuzzKit with filter functions and result strings
+    /// - Parameter rules: Array of (FilterFunction,String) which sets the rules
+    /// - FilterFunction acceps a number and returns `true` if the number satisfies a rule.
+    public init(rules: [( FilterFunction, String)]) {
+        self.rules = rules
+    }
+
+    /// Initialize FizzBuzzKit with divisible numbers and result strings
+    /// - Parameter rules: Array of (Int,String) which sets the rules
+    /// - Default values are `3` for **Fizz** and `5` for **Buzz**
+    ///
+    public init(rules: [(Int, String)] = [(3, "Fizz"), (5, "Buzz")]) {
+        self.rules = rules.map({ (number: Int, result: String) in
+            ({$0 % number == 0}, result)
+        })
+    }
+
+    /// Handle the number according to rules
+    /// - Parameter number: Number to check
+    /// - Returns: Result of the check
+    public func handle(number: Int) -> String {
+        if number <= 0 {
+            return "0"
+        }
+        let filtered = rules.filter { $0.0(number) }
+        var result = filtered.map { $0.1 }.joined()
+        if result == "" {
+            result = "\(number)"
+        }
+        return result
+    }
+
+    /// Handle multiple numbers according to rules
+    /// - Parameter numbers: Array of numbers to check.
+    /// - Returns: Result array of each check
+    public func handle(numbers: [Int]) -> [String] {
+        return numbers.compactMap { handle(number: $0) }
+    }
+
+}

+ 58 - 0
FizzBuzzKit/Tests/FizzBuzzKitTests/FizzBuzzKitTests.swift

@@ -0,0 +1,58 @@
+import XCTest
+@testable import FizzBuzzKit
+
+final class FizzBuzzKitTests: XCTestCase {
+
+    func testZero() throws {
+        let fbkit = FizzBuzzKit()
+        let result = fbkit.handle(number: 0)
+        XCTAssertEqual(result, "0")
+    }
+
+    func testFizz() throws {
+        let fbkit = FizzBuzzKit()
+        let result = fbkit.handle(number: 3)
+        XCTAssertEqual(result, "Fizz")
+    }
+
+    func testBuzz() throws {
+        let fbkit = FizzBuzzKit()
+        let result = fbkit.handle(number: 5)
+        XCTAssertEqual(result, "Buzz")
+    }
+
+    func testFizzBuzz() throws {
+        let fbkit = FizzBuzzKit()
+        let result = fbkit.handle(number: 15)
+        XCTAssertEqual(result, "FizzBuzz")
+    }
+
+    func testNumber() throws {
+        let fbkit = FizzBuzzKit()
+        let result = fbkit.handle(number: 7)
+        XCTAssertEqual(result, "7")
+    }
+
+    func testMulitple() throws {
+        let fbkit = FizzBuzzKit()
+        let result = fbkit.handle(numbers: [1, 7, 30, 3])
+        XCTAssertEqual(result, ["1", "7", "FizzBuzz", "Fizz"])
+    }
+
+    func testDifferentRules() throws {
+        let fbkit = FizzBuzzKit(rules: [(7, "Potato"), (11, "Tomato")])
+        var result =  fbkit.handle(number: 7)
+        XCTAssertEqual(result, "Potato")
+        result =  fbkit.handle(number: 11)
+        XCTAssertEqual(result, "Tomato")
+    }
+
+    func testComplexRules() throws {
+        let fbkit = FizzBuzzKit(rules: [({$0 %  2 == 0}, "Even"), ({$0 %  2 == 1}, "Odd")])
+        var result =  fbkit.handle(number: 3)
+        XCTAssertEqual(result, "Odd")
+        result =  fbkit.handle(number: 8)
+        XCTAssertEqual(result, "Even")
+    }
+
+}