Initial commit
@ -16,6 +16,31 @@
|
|||||||
5500A3A62BB3C7EC0065A1D3 /* AIGrammarTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5500A3A52BB3C7EC0065A1D3 /* AIGrammarTests.swift */; };
|
5500A3A62BB3C7EC0065A1D3 /* AIGrammarTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5500A3A52BB3C7EC0065A1D3 /* AIGrammarTests.swift */; };
|
||||||
5500A3B02BB3C7EC0065A1D3 /* AIGrammarUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5500A3AF2BB3C7EC0065A1D3 /* AIGrammarUITests.swift */; };
|
5500A3B02BB3C7EC0065A1D3 /* AIGrammarUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5500A3AF2BB3C7EC0065A1D3 /* AIGrammarUITests.swift */; };
|
||||||
5500A3B22BB3C7EC0065A1D3 /* AIGrammarUITestsLaunchTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5500A3B12BB3C7EC0065A1D3 /* AIGrammarUITestsLaunchTests.swift */; };
|
5500A3B22BB3C7EC0065A1D3 /* AIGrammarUITestsLaunchTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5500A3B12BB3C7EC0065A1D3 /* AIGrammarUITestsLaunchTests.swift */; };
|
||||||
|
5500A3C02BB40A3B0065A1D3 /* AllTabView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5500A3BF2BB40A3B0065A1D3 /* AllTabView.swift */; };
|
||||||
|
5500A3C22BB40AB10065A1D3 /* GrammarCheckView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5500A3C12BB40AB10065A1D3 /* GrammarCheckView.swift */; };
|
||||||
|
5500A3C42BB40AC40065A1D3 /* WordsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5500A3C32BB40AC40065A1D3 /* WordsView.swift */; };
|
||||||
|
5500A3C62BB40AD30065A1D3 /* TranslateView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5500A3C52BB40AD30065A1D3 /* TranslateView.swift */; };
|
||||||
|
5500A3C82BB40ADE0065A1D3 /* SettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5500A3C72BB40ADE0065A1D3 /* SettingsView.swift */; };
|
||||||
|
5509CEEE2BB526F80056C5C2 /* ColorToString.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5509CEED2BB526F70056C5C2 /* ColorToString.swift */; };
|
||||||
|
5509CEF12BB54DD10056C5C2 /* Config.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5509CEF02BB54DD10056C5C2 /* Config.swift */; };
|
||||||
|
550B85A22C2BC624008834E5 /* InitAPP.swift in Sources */ = {isa = PBXBuildFile; fileRef = 550B85A12C2BC623008834E5 /* InitAPP.swift */; };
|
||||||
|
559E6D7C2C34EAE700C971B9 /* IapManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 559E6D7B2C34EAE700C971B9 /* IapManager.swift */; };
|
||||||
|
559E6D7E2C35355200C971B9 /* LogManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 559E6D7D2C35355200C971B9 /* LogManager.swift */; };
|
||||||
|
55A954A22BBBFD0C00BF181E /* GrammarData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 55A954A12BBBFD0C00BF181E /* GrammarData.swift */; };
|
||||||
|
55BB12792BBD4C9900D2BEA4 /* RichText.swift in Sources */ = {isa = PBXBuildFile; fileRef = 55BB12782BBD4C9900D2BEA4 /* RichText.swift */; };
|
||||||
|
55BB127B2BBD653100D2BEA4 /* ShareSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 55BB127A2BBD653100D2BEA4 /* ShareSheet.swift */; };
|
||||||
|
55BB127D2BBD6D0600D2BEA4 /* CameraView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 55BB127C2BBD6D0600D2BEA4 /* CameraView.swift */; };
|
||||||
|
55BC47492C3A383A00120A7D /* LoadingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 55BC47482C3A383A00120A7D /* LoadingView.swift */; };
|
||||||
|
55BC474F2C3A4E5E00120A7D /* ToastUI in Frameworks */ = {isa = PBXBuildFile; productRef = 55BC474E2C3A4E5E00120A7D /* ToastUI */; };
|
||||||
|
55BC47512C3D431300120A7D /* IAPView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 55BC47502C3D431300120A7D /* IAPView.swift */; };
|
||||||
|
55D632FA2C0F125D00443894 /* NetworkManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 55D632F92C0F125D00443894 /* NetworkManager.swift */; };
|
||||||
|
55DAC6552BBA959500BDD4C8 /* ResultView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 55DAC6542BBA959500BDD4C8 /* ResultView.swift */; };
|
||||||
|
55DAC6572BBA984B00BDD4C8 /* InputView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 55DAC6562BBA984B00BDD4C8 /* InputView.swift */; };
|
||||||
|
55EF5C3C2C2250900060CE47 /* IAPTestView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 55EF5C3B2C2250900060CE47 /* IAPTestView.swift */; };
|
||||||
|
55EF5C3E2C2263460060CE47 /* StoreKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 55EF5C3D2C2263460060CE47 /* StoreKit.framework */; };
|
||||||
|
67F268687FCD2E4F2F4462C0 /* Pods_AIGrammar.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 12CA1A1A0FE978794C445DBF /* Pods_AIGrammar.framework */; };
|
||||||
|
74F2A468AB0CDAB987996958 /* Pods_AIGrammarTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D848C5F909AA8F5965ADC982 /* Pods_AIGrammarTests.framework */; };
|
||||||
|
9C67AFB08807D99E5D33962E /* Pods_AIGrammar_AIGrammarUITests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 17A4761E5C3381A5C601C830 /* Pods_AIGrammar_AIGrammarUITests.framework */; };
|
||||||
/* End PBXBuildFile section */
|
/* End PBXBuildFile section */
|
||||||
|
|
||||||
/* Begin PBXContainerItemProxy section */
|
/* Begin PBXContainerItemProxy section */
|
||||||
@ -36,6 +61,10 @@
|
|||||||
/* End PBXContainerItemProxy section */
|
/* End PBXContainerItemProxy section */
|
||||||
|
|
||||||
/* Begin PBXFileReference section */
|
/* Begin PBXFileReference section */
|
||||||
|
12CA1A1A0FE978794C445DBF /* Pods_AIGrammar.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_AIGrammar.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
|
151748838A6B3B48F136656A /* Pods-AIGrammarTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AIGrammarTests.release.xcconfig"; path = "Target Support Files/Pods-AIGrammarTests/Pods-AIGrammarTests.release.xcconfig"; sourceTree = "<group>"; };
|
||||||
|
17A4761E5C3381A5C601C830 /* Pods_AIGrammar_AIGrammarUITests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_AIGrammar_AIGrammarUITests.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
|
26700CBCCF4198DB4A727889 /* Pods-AIGrammar.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AIGrammar.release.xcconfig"; path = "Target Support Files/Pods-AIGrammar/Pods-AIGrammar.release.xcconfig"; sourceTree = "<group>"; };
|
||||||
5500A38C2BB3C7E80065A1D3 /* AIGrammar.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = AIGrammar.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
5500A38C2BB3C7E80065A1D3 /* AIGrammar.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = AIGrammar.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
5500A38F2BB3C7E80065A1D3 /* AIGrammarApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AIGrammarApp.swift; sourceTree = "<group>"; };
|
5500A38F2BB3C7E80065A1D3 /* AIGrammarApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AIGrammarApp.swift; sourceTree = "<group>"; };
|
||||||
5500A3912BB3C7E80065A1D3 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = "<group>"; };
|
5500A3912BB3C7E80065A1D3 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = "<group>"; };
|
||||||
@ -48,6 +77,33 @@
|
|||||||
5500A3AB2BB3C7EC0065A1D3 /* AIGrammarUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = AIGrammarUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
|
5500A3AB2BB3C7EC0065A1D3 /* AIGrammarUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = AIGrammarUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
5500A3AF2BB3C7EC0065A1D3 /* AIGrammarUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AIGrammarUITests.swift; sourceTree = "<group>"; };
|
5500A3AF2BB3C7EC0065A1D3 /* AIGrammarUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AIGrammarUITests.swift; sourceTree = "<group>"; };
|
||||||
5500A3B12BB3C7EC0065A1D3 /* AIGrammarUITestsLaunchTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AIGrammarUITestsLaunchTests.swift; sourceTree = "<group>"; };
|
5500A3B12BB3C7EC0065A1D3 /* AIGrammarUITestsLaunchTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AIGrammarUITestsLaunchTests.swift; sourceTree = "<group>"; };
|
||||||
|
5500A3BF2BB40A3B0065A1D3 /* AllTabView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AllTabView.swift; sourceTree = "<group>"; };
|
||||||
|
5500A3C12BB40AB10065A1D3 /* GrammarCheckView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GrammarCheckView.swift; sourceTree = "<group>"; };
|
||||||
|
5500A3C32BB40AC40065A1D3 /* WordsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WordsView.swift; sourceTree = "<group>"; };
|
||||||
|
5500A3C52BB40AD30065A1D3 /* TranslateView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TranslateView.swift; sourceTree = "<group>"; };
|
||||||
|
5500A3C72BB40ADE0065A1D3 /* SettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsView.swift; sourceTree = "<group>"; };
|
||||||
|
5509CEED2BB526F70056C5C2 /* ColorToString.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ColorToString.swift; sourceTree = "<group>"; };
|
||||||
|
5509CEF02BB54DD10056C5C2 /* Config.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Config.swift; sourceTree = "<group>"; };
|
||||||
|
550B85A12C2BC623008834E5 /* InitAPP.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InitAPP.swift; sourceTree = "<group>"; };
|
||||||
|
559E6D7B2C34EAE700C971B9 /* IapManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IapManager.swift; sourceTree = "<group>"; };
|
||||||
|
559E6D7D2C35355200C971B9 /* LogManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LogManager.swift; sourceTree = "<group>"; };
|
||||||
|
55A954A12BBBFD0C00BF181E /* GrammarData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GrammarData.swift; sourceTree = "<group>"; };
|
||||||
|
55BB12782BBD4C9900D2BEA4 /* RichText.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RichText.swift; sourceTree = "<group>"; };
|
||||||
|
55BB127A2BBD653100D2BEA4 /* ShareSheet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShareSheet.swift; sourceTree = "<group>"; };
|
||||||
|
55BB127C2BBD6D0600D2BEA4 /* CameraView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CameraView.swift; sourceTree = "<group>"; };
|
||||||
|
55BC47482C3A383A00120A7D /* LoadingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoadingView.swift; sourceTree = "<group>"; };
|
||||||
|
55BC47502C3D431300120A7D /* IAPView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IAPView.swift; sourceTree = "<group>"; };
|
||||||
|
55C73D7E2C157C2200041C66 /* AIGrammar.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = AIGrammar.entitlements; sourceTree = "<group>"; };
|
||||||
|
55D632F92C0F125D00443894 /* NetworkManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkManager.swift; sourceTree = "<group>"; };
|
||||||
|
55DAC6542BBA959500BDD4C8 /* ResultView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResultView.swift; sourceTree = "<group>"; };
|
||||||
|
55DAC6562BBA984B00BDD4C8 /* InputView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InputView.swift; sourceTree = "<group>"; };
|
||||||
|
55EF5C3B2C2250900060CE47 /* IAPTestView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IAPTestView.swift; sourceTree = "<group>"; };
|
||||||
|
55EF5C3D2C2263460060CE47 /* StoreKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = StoreKit.framework; path = System/Library/Frameworks/StoreKit.framework; sourceTree = SDKROOT; };
|
||||||
|
5C33D84343808119C7E904A2 /* Pods-AIGrammarTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AIGrammarTests.debug.xcconfig"; path = "Target Support Files/Pods-AIGrammarTests/Pods-AIGrammarTests.debug.xcconfig"; sourceTree = "<group>"; };
|
||||||
|
7C535B875DDD6400217E60EC /* Pods-AIGrammar-AIGrammarUITests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AIGrammar-AIGrammarUITests.debug.xcconfig"; path = "Target Support Files/Pods-AIGrammar-AIGrammarUITests/Pods-AIGrammar-AIGrammarUITests.debug.xcconfig"; sourceTree = "<group>"; };
|
||||||
|
8AF5D0FA64AC9954B5F50C58 /* Pods-AIGrammar.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AIGrammar.debug.xcconfig"; path = "Target Support Files/Pods-AIGrammar/Pods-AIGrammar.debug.xcconfig"; sourceTree = "<group>"; };
|
||||||
|
C6DB81180B641DF0F1C587D7 /* Pods-AIGrammar-AIGrammarUITests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AIGrammar-AIGrammarUITests.release.xcconfig"; path = "Target Support Files/Pods-AIGrammar-AIGrammarUITests/Pods-AIGrammar-AIGrammarUITests.release.xcconfig"; sourceTree = "<group>"; };
|
||||||
|
D848C5F909AA8F5965ADC982 /* Pods_AIGrammarTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_AIGrammarTests.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
/* End PBXFileReference section */
|
/* End PBXFileReference section */
|
||||||
|
|
||||||
/* Begin PBXFrameworksBuildPhase section */
|
/* Begin PBXFrameworksBuildPhase section */
|
||||||
@ -55,6 +111,9 @@
|
|||||||
isa = PBXFrameworksBuildPhase;
|
isa = PBXFrameworksBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
|
55BC474F2C3A4E5E00120A7D /* ToastUI in Frameworks */,
|
||||||
|
67F268687FCD2E4F2F4462C0 /* Pods_AIGrammar.framework in Frameworks */,
|
||||||
|
55EF5C3E2C2263460060CE47 /* StoreKit.framework in Frameworks */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
@ -62,6 +121,7 @@
|
|||||||
isa = PBXFrameworksBuildPhase;
|
isa = PBXFrameworksBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
|
74F2A468AB0CDAB987996958 /* Pods_AIGrammarTests.framework in Frameworks */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
@ -69,12 +129,24 @@
|
|||||||
isa = PBXFrameworksBuildPhase;
|
isa = PBXFrameworksBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
|
9C67AFB08807D99E5D33962E /* Pods_AIGrammar_AIGrammarUITests.framework in Frameworks */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
/* End PBXFrameworksBuildPhase section */
|
/* End PBXFrameworksBuildPhase section */
|
||||||
|
|
||||||
/* Begin PBXGroup section */
|
/* Begin PBXGroup section */
|
||||||
|
40FEAE98949AC44A40547B20 /* Frameworks */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
55EF5C3D2C2263460060CE47 /* StoreKit.framework */,
|
||||||
|
12CA1A1A0FE978794C445DBF /* Pods_AIGrammar.framework */,
|
||||||
|
17A4761E5C3381A5C601C830 /* Pods_AIGrammar_AIGrammarUITests.framework */,
|
||||||
|
D848C5F909AA8F5965ADC982 /* Pods_AIGrammarTests.framework */,
|
||||||
|
);
|
||||||
|
name = Frameworks;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
5500A3832BB3C7E80065A1D3 = {
|
5500A3832BB3C7E80065A1D3 = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
@ -82,6 +154,8 @@
|
|||||||
5500A3A42BB3C7EC0065A1D3 /* AIGrammarTests */,
|
5500A3A42BB3C7EC0065A1D3 /* AIGrammarTests */,
|
||||||
5500A3AE2BB3C7EC0065A1D3 /* AIGrammarUITests */,
|
5500A3AE2BB3C7EC0065A1D3 /* AIGrammarUITests */,
|
||||||
5500A38D2BB3C7E80065A1D3 /* Products */,
|
5500A38D2BB3C7E80065A1D3 /* Products */,
|
||||||
|
B164443BE53434F82C385E52 /* Pods */,
|
||||||
|
40FEAE98949AC44A40547B20 /* Frameworks */,
|
||||||
);
|
);
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
@ -98,6 +172,13 @@
|
|||||||
5500A38E2BB3C7E80065A1D3 /* AIGrammar */ = {
|
5500A38E2BB3C7E80065A1D3 /* AIGrammar */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
|
55BC47472C3A380C00120A7D /* CommView */,
|
||||||
|
55C73D7E2C157C2200041C66 /* AIGrammar.entitlements */,
|
||||||
|
55DAC6532BBA956100BDD4C8 /* GrammarSubView */,
|
||||||
|
5509CEEF2BB54DAB0056C5C2 /* ViewModel */,
|
||||||
|
5509CEEC2BB5267F0056C5C2 /* lib */,
|
||||||
|
5500A3BF2BB40A3B0065A1D3 /* AllTabView.swift */,
|
||||||
|
5500A3BE2BB40A1F0065A1D3 /* View */,
|
||||||
5500A38F2BB3C7E80065A1D3 /* AIGrammarApp.swift */,
|
5500A38F2BB3C7E80065A1D3 /* AIGrammarApp.swift */,
|
||||||
5500A3912BB3C7E80065A1D3 /* ContentView.swift */,
|
5500A3912BB3C7E80065A1D3 /* ContentView.swift */,
|
||||||
5500A3932BB3C7EB0065A1D3 /* Assets.xcassets */,
|
5500A3932BB3C7EB0065A1D3 /* Assets.xcassets */,
|
||||||
@ -133,6 +214,73 @@
|
|||||||
path = AIGrammarUITests;
|
path = AIGrammarUITests;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
|
5500A3BE2BB40A1F0065A1D3 /* View */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
5500A3C12BB40AB10065A1D3 /* GrammarCheckView.swift */,
|
||||||
|
5500A3C32BB40AC40065A1D3 /* WordsView.swift */,
|
||||||
|
5500A3C52BB40AD30065A1D3 /* TranslateView.swift */,
|
||||||
|
5500A3C72BB40ADE0065A1D3 /* SettingsView.swift */,
|
||||||
|
55BC47502C3D431300120A7D /* IAPView.swift */,
|
||||||
|
);
|
||||||
|
path = View;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
5509CEEC2BB5267F0056C5C2 /* lib */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
550B85A12C2BC623008834E5 /* InitAPP.swift */,
|
||||||
|
5509CEED2BB526F70056C5C2 /* ColorToString.swift */,
|
||||||
|
55D632F92C0F125D00443894 /* NetworkManager.swift */,
|
||||||
|
559E6D7B2C34EAE700C971B9 /* IapManager.swift */,
|
||||||
|
559E6D7D2C35355200C971B9 /* LogManager.swift */,
|
||||||
|
);
|
||||||
|
path = lib;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
5509CEEF2BB54DAB0056C5C2 /* ViewModel */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
5509CEF02BB54DD10056C5C2 /* Config.swift */,
|
||||||
|
55A954A12BBBFD0C00BF181E /* GrammarData.swift */,
|
||||||
|
);
|
||||||
|
path = ViewModel;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
55BC47472C3A380C00120A7D /* CommView */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
55BC47482C3A383A00120A7D /* LoadingView.swift */,
|
||||||
|
);
|
||||||
|
path = CommView;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
55DAC6532BBA956100BDD4C8 /* GrammarSubView */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
55DAC6542BBA959500BDD4C8 /* ResultView.swift */,
|
||||||
|
55DAC6562BBA984B00BDD4C8 /* InputView.swift */,
|
||||||
|
55BB12782BBD4C9900D2BEA4 /* RichText.swift */,
|
||||||
|
55BB127A2BBD653100D2BEA4 /* ShareSheet.swift */,
|
||||||
|
55BB127C2BBD6D0600D2BEA4 /* CameraView.swift */,
|
||||||
|
55EF5C3B2C2250900060CE47 /* IAPTestView.swift */,
|
||||||
|
);
|
||||||
|
path = GrammarSubView;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
B164443BE53434F82C385E52 /* Pods */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
8AF5D0FA64AC9954B5F50C58 /* Pods-AIGrammar.debug.xcconfig */,
|
||||||
|
26700CBCCF4198DB4A727889 /* Pods-AIGrammar.release.xcconfig */,
|
||||||
|
7C535B875DDD6400217E60EC /* Pods-AIGrammar-AIGrammarUITests.debug.xcconfig */,
|
||||||
|
C6DB81180B641DF0F1C587D7 /* Pods-AIGrammar-AIGrammarUITests.release.xcconfig */,
|
||||||
|
5C33D84343808119C7E904A2 /* Pods-AIGrammarTests.debug.xcconfig */,
|
||||||
|
151748838A6B3B48F136656A /* Pods-AIGrammarTests.release.xcconfig */,
|
||||||
|
);
|
||||||
|
path = Pods;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
/* End PBXGroup section */
|
/* End PBXGroup section */
|
||||||
|
|
||||||
/* Begin PBXNativeTarget section */
|
/* Begin PBXNativeTarget section */
|
||||||
@ -140,15 +288,20 @@
|
|||||||
isa = PBXNativeTarget;
|
isa = PBXNativeTarget;
|
||||||
buildConfigurationList = 5500A3B52BB3C7EC0065A1D3 /* Build configuration list for PBXNativeTarget "AIGrammar" */;
|
buildConfigurationList = 5500A3B52BB3C7EC0065A1D3 /* Build configuration list for PBXNativeTarget "AIGrammar" */;
|
||||||
buildPhases = (
|
buildPhases = (
|
||||||
|
8B14D9249A058EC52D6F04F3 /* [CP] Check Pods Manifest.lock */,
|
||||||
5500A3882BB3C7E80065A1D3 /* Sources */,
|
5500A3882BB3C7E80065A1D3 /* Sources */,
|
||||||
5500A3892BB3C7E80065A1D3 /* Frameworks */,
|
5500A3892BB3C7E80065A1D3 /* Frameworks */,
|
||||||
5500A38A2BB3C7E80065A1D3 /* Resources */,
|
5500A38A2BB3C7E80065A1D3 /* Resources */,
|
||||||
|
FF9E2F6B912125F8F338EE9E /* [CP] Embed Pods Frameworks */,
|
||||||
);
|
);
|
||||||
buildRules = (
|
buildRules = (
|
||||||
);
|
);
|
||||||
dependencies = (
|
dependencies = (
|
||||||
);
|
);
|
||||||
name = AIGrammar;
|
name = AIGrammar;
|
||||||
|
packageProductDependencies = (
|
||||||
|
55BC474E2C3A4E5E00120A7D /* ToastUI */,
|
||||||
|
);
|
||||||
productName = AIGrammar;
|
productName = AIGrammar;
|
||||||
productReference = 5500A38C2BB3C7E80065A1D3 /* AIGrammar.app */;
|
productReference = 5500A38C2BB3C7E80065A1D3 /* AIGrammar.app */;
|
||||||
productType = "com.apple.product-type.application";
|
productType = "com.apple.product-type.application";
|
||||||
@ -157,6 +310,7 @@
|
|||||||
isa = PBXNativeTarget;
|
isa = PBXNativeTarget;
|
||||||
buildConfigurationList = 5500A3B82BB3C7EC0065A1D3 /* Build configuration list for PBXNativeTarget "AIGrammarTests" */;
|
buildConfigurationList = 5500A3B82BB3C7EC0065A1D3 /* Build configuration list for PBXNativeTarget "AIGrammarTests" */;
|
||||||
buildPhases = (
|
buildPhases = (
|
||||||
|
498A407B1B5D54884032EBE0 /* [CP] Check Pods Manifest.lock */,
|
||||||
5500A39D2BB3C7EC0065A1D3 /* Sources */,
|
5500A39D2BB3C7EC0065A1D3 /* Sources */,
|
||||||
5500A39E2BB3C7EC0065A1D3 /* Frameworks */,
|
5500A39E2BB3C7EC0065A1D3 /* Frameworks */,
|
||||||
5500A39F2BB3C7EC0065A1D3 /* Resources */,
|
5500A39F2BB3C7EC0065A1D3 /* Resources */,
|
||||||
@ -175,9 +329,11 @@
|
|||||||
isa = PBXNativeTarget;
|
isa = PBXNativeTarget;
|
||||||
buildConfigurationList = 5500A3BB2BB3C7EC0065A1D3 /* Build configuration list for PBXNativeTarget "AIGrammarUITests" */;
|
buildConfigurationList = 5500A3BB2BB3C7EC0065A1D3 /* Build configuration list for PBXNativeTarget "AIGrammarUITests" */;
|
||||||
buildPhases = (
|
buildPhases = (
|
||||||
|
122A24ED4A80683F7AD2CBF5 /* [CP] Check Pods Manifest.lock */,
|
||||||
5500A3A72BB3C7EC0065A1D3 /* Sources */,
|
5500A3A72BB3C7EC0065A1D3 /* Sources */,
|
||||||
5500A3A82BB3C7EC0065A1D3 /* Frameworks */,
|
5500A3A82BB3C7EC0065A1D3 /* Frameworks */,
|
||||||
5500A3A92BB3C7EC0065A1D3 /* Resources */,
|
5500A3A92BB3C7EC0065A1D3 /* Resources */,
|
||||||
|
71E9C7A697AC9238D1513188 /* [CP] Embed Pods Frameworks */,
|
||||||
);
|
);
|
||||||
buildRules = (
|
buildRules = (
|
||||||
);
|
);
|
||||||
@ -221,6 +377,9 @@
|
|||||||
Base,
|
Base,
|
||||||
);
|
);
|
||||||
mainGroup = 5500A3832BB3C7E80065A1D3;
|
mainGroup = 5500A3832BB3C7E80065A1D3;
|
||||||
|
packageReferences = (
|
||||||
|
55BC474D2C3A4E5E00120A7D /* XCRemoteSwiftPackageReference "ToastUI" */,
|
||||||
|
);
|
||||||
productRefGroup = 5500A38D2BB3C7E80065A1D3 /* Products */;
|
productRefGroup = 5500A38D2BB3C7E80065A1D3 /* Products */;
|
||||||
projectDirPath = "";
|
projectDirPath = "";
|
||||||
projectRoot = "";
|
projectRoot = "";
|
||||||
@ -258,15 +417,138 @@
|
|||||||
};
|
};
|
||||||
/* End PBXResourcesBuildPhase section */
|
/* End PBXResourcesBuildPhase section */
|
||||||
|
|
||||||
|
/* Begin PBXShellScriptBuildPhase section */
|
||||||
|
122A24ED4A80683F7AD2CBF5 /* [CP] Check Pods Manifest.lock */ = {
|
||||||
|
isa = PBXShellScriptBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
inputFileListPaths = (
|
||||||
|
);
|
||||||
|
inputPaths = (
|
||||||
|
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
|
||||||
|
"${PODS_ROOT}/Manifest.lock",
|
||||||
|
);
|
||||||
|
name = "[CP] Check Pods Manifest.lock";
|
||||||
|
outputFileListPaths = (
|
||||||
|
);
|
||||||
|
outputPaths = (
|
||||||
|
"$(DERIVED_FILE_DIR)/Pods-AIGrammar-AIGrammarUITests-checkManifestLockResult.txt",
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
shellPath = /bin/sh;
|
||||||
|
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
|
||||||
|
showEnvVarsInLog = 0;
|
||||||
|
};
|
||||||
|
498A407B1B5D54884032EBE0 /* [CP] Check Pods Manifest.lock */ = {
|
||||||
|
isa = PBXShellScriptBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
inputFileListPaths = (
|
||||||
|
);
|
||||||
|
inputPaths = (
|
||||||
|
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
|
||||||
|
"${PODS_ROOT}/Manifest.lock",
|
||||||
|
);
|
||||||
|
name = "[CP] Check Pods Manifest.lock";
|
||||||
|
outputFileListPaths = (
|
||||||
|
);
|
||||||
|
outputPaths = (
|
||||||
|
"$(DERIVED_FILE_DIR)/Pods-AIGrammarTests-checkManifestLockResult.txt",
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
shellPath = /bin/sh;
|
||||||
|
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
|
||||||
|
showEnvVarsInLog = 0;
|
||||||
|
};
|
||||||
|
71E9C7A697AC9238D1513188 /* [CP] Embed Pods Frameworks */ = {
|
||||||
|
isa = PBXShellScriptBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
inputFileListPaths = (
|
||||||
|
"${PODS_ROOT}/Target Support Files/Pods-AIGrammar-AIGrammarUITests/Pods-AIGrammar-AIGrammarUITests-frameworks-${CONFIGURATION}-input-files.xcfilelist",
|
||||||
|
);
|
||||||
|
name = "[CP] Embed Pods Frameworks";
|
||||||
|
outputFileListPaths = (
|
||||||
|
"${PODS_ROOT}/Target Support Files/Pods-AIGrammar-AIGrammarUITests/Pods-AIGrammar-AIGrammarUITests-frameworks-${CONFIGURATION}-output-files.xcfilelist",
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
shellPath = /bin/sh;
|
||||||
|
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-AIGrammar-AIGrammarUITests/Pods-AIGrammar-AIGrammarUITests-frameworks.sh\"\n";
|
||||||
|
showEnvVarsInLog = 0;
|
||||||
|
};
|
||||||
|
8B14D9249A058EC52D6F04F3 /* [CP] Check Pods Manifest.lock */ = {
|
||||||
|
isa = PBXShellScriptBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
inputFileListPaths = (
|
||||||
|
);
|
||||||
|
inputPaths = (
|
||||||
|
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
|
||||||
|
"${PODS_ROOT}/Manifest.lock",
|
||||||
|
);
|
||||||
|
name = "[CP] Check Pods Manifest.lock";
|
||||||
|
outputFileListPaths = (
|
||||||
|
);
|
||||||
|
outputPaths = (
|
||||||
|
"$(DERIVED_FILE_DIR)/Pods-AIGrammar-checkManifestLockResult.txt",
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
shellPath = /bin/sh;
|
||||||
|
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
|
||||||
|
showEnvVarsInLog = 0;
|
||||||
|
};
|
||||||
|
FF9E2F6B912125F8F338EE9E /* [CP] Embed Pods Frameworks */ = {
|
||||||
|
isa = PBXShellScriptBuildPhase;
|
||||||
|
buildActionMask = 2147483647;
|
||||||
|
files = (
|
||||||
|
);
|
||||||
|
inputFileListPaths = (
|
||||||
|
"${PODS_ROOT}/Target Support Files/Pods-AIGrammar/Pods-AIGrammar-frameworks-${CONFIGURATION}-input-files.xcfilelist",
|
||||||
|
);
|
||||||
|
name = "[CP] Embed Pods Frameworks";
|
||||||
|
outputFileListPaths = (
|
||||||
|
"${PODS_ROOT}/Target Support Files/Pods-AIGrammar/Pods-AIGrammar-frameworks-${CONFIGURATION}-output-files.xcfilelist",
|
||||||
|
);
|
||||||
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
|
shellPath = /bin/sh;
|
||||||
|
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-AIGrammar/Pods-AIGrammar-frameworks.sh\"\n";
|
||||||
|
showEnvVarsInLog = 0;
|
||||||
|
};
|
||||||
|
/* End PBXShellScriptBuildPhase section */
|
||||||
|
|
||||||
/* Begin PBXSourcesBuildPhase section */
|
/* Begin PBXSourcesBuildPhase section */
|
||||||
5500A3882BB3C7E80065A1D3 /* Sources */ = {
|
5500A3882BB3C7E80065A1D3 /* Sources */ = {
|
||||||
isa = PBXSourcesBuildPhase;
|
isa = PBXSourcesBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
5500A3992BB3C7EB0065A1D3 /* Persistence.swift in Sources */,
|
5500A3992BB3C7EB0065A1D3 /* Persistence.swift in Sources */,
|
||||||
|
55DAC6572BBA984B00BDD4C8 /* InputView.swift in Sources */,
|
||||||
|
55A954A22BBBFD0C00BF181E /* GrammarData.swift in Sources */,
|
||||||
|
55BB12792BBD4C9900D2BEA4 /* RichText.swift in Sources */,
|
||||||
|
5500A3C22BB40AB10065A1D3 /* GrammarCheckView.swift in Sources */,
|
||||||
|
55BC47512C3D431300120A7D /* IAPView.swift in Sources */,
|
||||||
|
550B85A22C2BC624008834E5 /* InitAPP.swift in Sources */,
|
||||||
|
5500A3C42BB40AC40065A1D3 /* WordsView.swift in Sources */,
|
||||||
|
5509CEF12BB54DD10056C5C2 /* Config.swift in Sources */,
|
||||||
|
55BB127B2BBD653100D2BEA4 /* ShareSheet.swift in Sources */,
|
||||||
|
5500A3C82BB40ADE0065A1D3 /* SettingsView.swift in Sources */,
|
||||||
|
55DAC6552BBA959500BDD4C8 /* ResultView.swift in Sources */,
|
||||||
|
5500A3C02BB40A3B0065A1D3 /* AllTabView.swift in Sources */,
|
||||||
|
559E6D7E2C35355200C971B9 /* LogManager.swift in Sources */,
|
||||||
|
55D632FA2C0F125D00443894 /* NetworkManager.swift in Sources */,
|
||||||
5500A3922BB3C7E80065A1D3 /* ContentView.swift in Sources */,
|
5500A3922BB3C7E80065A1D3 /* ContentView.swift in Sources */,
|
||||||
|
55BB127D2BBD6D0600D2BEA4 /* CameraView.swift in Sources */,
|
||||||
|
559E6D7C2C34EAE700C971B9 /* IapManager.swift in Sources */,
|
||||||
|
55EF5C3C2C2250900060CE47 /* IAPTestView.swift in Sources */,
|
||||||
5500A3902BB3C7E80065A1D3 /* AIGrammarApp.swift in Sources */,
|
5500A3902BB3C7E80065A1D3 /* AIGrammarApp.swift in Sources */,
|
||||||
5500A39C2BB3C7EB0065A1D3 /* AIGrammar.xcdatamodeld in Sources */,
|
5500A39C2BB3C7EB0065A1D3 /* AIGrammar.xcdatamodeld in Sources */,
|
||||||
|
5500A3C62BB40AD30065A1D3 /* TranslateView.swift in Sources */,
|
||||||
|
5509CEEE2BB526F80056C5C2 /* ColorToString.swift in Sources */,
|
||||||
|
55BC47492C3A383A00120A7D /* LoadingView.swift in Sources */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
@ -329,7 +611,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_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO;
|
||||||
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;
|
||||||
@ -340,7 +622,7 @@
|
|||||||
DEBUG_INFORMATION_FORMAT = dwarf;
|
DEBUG_INFORMATION_FORMAT = dwarf;
|
||||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||||
ENABLE_TESTABILITY = YES;
|
ENABLE_TESTABILITY = YES;
|
||||||
ENABLE_USER_SCRIPT_SANDBOXING = YES;
|
ENABLE_USER_SCRIPT_SANDBOXING = NO;
|
||||||
GCC_C_LANGUAGE_STANDARD = gnu17;
|
GCC_C_LANGUAGE_STANDARD = gnu17;
|
||||||
GCC_DYNAMIC_NO_PIC = NO;
|
GCC_DYNAMIC_NO_PIC = NO;
|
||||||
GCC_NO_COMMON_BLOCKS = YES;
|
GCC_NO_COMMON_BLOCKS = YES;
|
||||||
@ -392,7 +674,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_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO;
|
||||||
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;
|
||||||
@ -403,7 +685,7 @@
|
|||||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||||
ENABLE_NS_ASSERTIONS = NO;
|
ENABLE_NS_ASSERTIONS = NO;
|
||||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||||
ENABLE_USER_SCRIPT_SANDBOXING = YES;
|
ENABLE_USER_SCRIPT_SANDBOXING = NO;
|
||||||
GCC_C_LANGUAGE_STANDARD = gnu17;
|
GCC_C_LANGUAGE_STANDARD = gnu17;
|
||||||
GCC_NO_COMMON_BLOCKS = YES;
|
GCC_NO_COMMON_BLOCKS = YES;
|
||||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
||||||
@ -424,26 +706,30 @@
|
|||||||
};
|
};
|
||||||
5500A3B62BB3C7EC0065A1D3 /* Debug */ = {
|
5500A3B62BB3C7EC0065A1D3 /* Debug */ = {
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
|
baseConfigurationReference = 8AF5D0FA64AC9954B5F50C58 /* Pods-AIGrammar.debug.xcconfig */;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
||||||
|
CODE_SIGN_ENTITLEMENTS = AIGrammar/AIGrammar.entitlements;
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
CURRENT_PROJECT_VERSION = 1;
|
CURRENT_PROJECT_VERSION = 1;
|
||||||
DEVELOPMENT_ASSET_PATHS = "\"AIGrammar/Preview Content\"";
|
DEVELOPMENT_ASSET_PATHS = "\"AIGrammar/Preview Content\"";
|
||||||
DEVELOPMENT_TEAM = G8UMWM9TLL;
|
DEVELOPMENT_TEAM = G8UMWM9TLL;
|
||||||
ENABLE_PREVIEWS = YES;
|
ENABLE_PREVIEWS = YES;
|
||||||
GENERATE_INFOPLIST_FILE = YES;
|
GENERATE_INFOPLIST_FILE = YES;
|
||||||
|
INFOPLIST_KEY_NSCameraUsageDescription = "用户拍照获取文本";
|
||||||
INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;
|
INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;
|
||||||
INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
|
INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
|
||||||
INFOPLIST_KEY_UILaunchScreen_Generation = YES;
|
INFOPLIST_KEY_UILaunchScreen_Generation = YES;
|
||||||
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
|
INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait;
|
||||||
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
|
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown";
|
||||||
|
IPHONEOS_DEPLOYMENT_TARGET = 16.0;
|
||||||
LD_RUNPATH_SEARCH_PATHS = (
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"@executable_path/Frameworks",
|
"@executable_path/Frameworks",
|
||||||
);
|
);
|
||||||
MARKETING_VERSION = 1.0;
|
MARKETING_VERSION = 1.0;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.ostest.Grammar.AIGrammar;
|
PRODUCT_BUNDLE_IDENTIFIER = com.easyprompts.aigrammar;
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
SWIFT_EMIT_LOC_STRINGS = YES;
|
SWIFT_EMIT_LOC_STRINGS = YES;
|
||||||
SWIFT_VERSION = 5.0;
|
SWIFT_VERSION = 5.0;
|
||||||
@ -453,26 +739,30 @@
|
|||||||
};
|
};
|
||||||
5500A3B72BB3C7EC0065A1D3 /* Release */ = {
|
5500A3B72BB3C7EC0065A1D3 /* Release */ = {
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
|
baseConfigurationReference = 26700CBCCF4198DB4A727889 /* Pods-AIGrammar.release.xcconfig */;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||||
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
|
||||||
|
CODE_SIGN_ENTITLEMENTS = AIGrammar/AIGrammar.entitlements;
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
CURRENT_PROJECT_VERSION = 1;
|
CURRENT_PROJECT_VERSION = 1;
|
||||||
DEVELOPMENT_ASSET_PATHS = "\"AIGrammar/Preview Content\"";
|
DEVELOPMENT_ASSET_PATHS = "\"AIGrammar/Preview Content\"";
|
||||||
DEVELOPMENT_TEAM = G8UMWM9TLL;
|
DEVELOPMENT_TEAM = G8UMWM9TLL;
|
||||||
ENABLE_PREVIEWS = YES;
|
ENABLE_PREVIEWS = YES;
|
||||||
GENERATE_INFOPLIST_FILE = YES;
|
GENERATE_INFOPLIST_FILE = YES;
|
||||||
|
INFOPLIST_KEY_NSCameraUsageDescription = "用户拍照获取文本";
|
||||||
INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;
|
INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;
|
||||||
INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
|
INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
|
||||||
INFOPLIST_KEY_UILaunchScreen_Generation = YES;
|
INFOPLIST_KEY_UILaunchScreen_Generation = YES;
|
||||||
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
|
INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait;
|
||||||
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
|
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown";
|
||||||
|
IPHONEOS_DEPLOYMENT_TARGET = 16.0;
|
||||||
LD_RUNPATH_SEARCH_PATHS = (
|
LD_RUNPATH_SEARCH_PATHS = (
|
||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"@executable_path/Frameworks",
|
"@executable_path/Frameworks",
|
||||||
);
|
);
|
||||||
MARKETING_VERSION = 1.0;
|
MARKETING_VERSION = 1.0;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = com.ostest.Grammar.AIGrammar;
|
PRODUCT_BUNDLE_IDENTIFIER = com.easyprompts.aigrammar;
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
SWIFT_EMIT_LOC_STRINGS = YES;
|
SWIFT_EMIT_LOC_STRINGS = YES;
|
||||||
SWIFT_VERSION = 5.0;
|
SWIFT_VERSION = 5.0;
|
||||||
@ -482,6 +772,7 @@
|
|||||||
};
|
};
|
||||||
5500A3B92BB3C7EC0065A1D3 /* Debug */ = {
|
5500A3B92BB3C7EC0065A1D3 /* Debug */ = {
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
|
baseConfigurationReference = 5C33D84343808119C7E904A2 /* Pods-AIGrammarTests.debug.xcconfig */;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
|
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
|
||||||
BUNDLE_LOADER = "$(TEST_HOST)";
|
BUNDLE_LOADER = "$(TEST_HOST)";
|
||||||
@ -502,6 +793,7 @@
|
|||||||
};
|
};
|
||||||
5500A3BA2BB3C7EC0065A1D3 /* Release */ = {
|
5500A3BA2BB3C7EC0065A1D3 /* Release */ = {
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
|
baseConfigurationReference = 151748838A6B3B48F136656A /* Pods-AIGrammarTests.release.xcconfig */;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
|
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
|
||||||
BUNDLE_LOADER = "$(TEST_HOST)";
|
BUNDLE_LOADER = "$(TEST_HOST)";
|
||||||
@ -522,6 +814,7 @@
|
|||||||
};
|
};
|
||||||
5500A3BC2BB3C7EC0065A1D3 /* Debug */ = {
|
5500A3BC2BB3C7EC0065A1D3 /* Debug */ = {
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
|
baseConfigurationReference = 7C535B875DDD6400217E60EC /* Pods-AIGrammar-AIGrammarUITests.debug.xcconfig */;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
|
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
@ -540,6 +833,7 @@
|
|||||||
};
|
};
|
||||||
5500A3BD2BB3C7EC0065A1D3 /* Release */ = {
|
5500A3BD2BB3C7EC0065A1D3 /* Release */ = {
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
|
baseConfigurationReference = C6DB81180B641DF0F1C587D7 /* Pods-AIGrammar-AIGrammarUITests.release.xcconfig */;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
|
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
@ -597,6 +891,25 @@
|
|||||||
};
|
};
|
||||||
/* End XCConfigurationList section */
|
/* End XCConfigurationList section */
|
||||||
|
|
||||||
|
/* Begin XCRemoteSwiftPackageReference section */
|
||||||
|
55BC474D2C3A4E5E00120A7D /* XCRemoteSwiftPackageReference "ToastUI" */ = {
|
||||||
|
isa = XCRemoteSwiftPackageReference;
|
||||||
|
repositoryURL = "https://github.com/quanshousio/ToastUI.git";
|
||||||
|
requirement = {
|
||||||
|
kind = upToNextMajorVersion;
|
||||||
|
minimumVersion = 3.0.1;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
/* End XCRemoteSwiftPackageReference section */
|
||||||
|
|
||||||
|
/* Begin XCSwiftPackageProductDependency section */
|
||||||
|
55BC474E2C3A4E5E00120A7D /* ToastUI */ = {
|
||||||
|
isa = XCSwiftPackageProductDependency;
|
||||||
|
package = 55BC474D2C3A4E5E00120A7D /* XCRemoteSwiftPackageReference "ToastUI" */;
|
||||||
|
productName = ToastUI;
|
||||||
|
};
|
||||||
|
/* End XCSwiftPackageProductDependency section */
|
||||||
|
|
||||||
/* Begin XCVersionGroup section */
|
/* Begin XCVersionGroup section */
|
||||||
5500A39A2BB3C7EB0065A1D3 /* AIGrammar.xcdatamodeld */ = {
|
5500A39A2BB3C7EB0065A1D3 /* AIGrammar.xcdatamodeld */ = {
|
||||||
isa = XCVersionGroup;
|
isa = XCVersionGroup;
|
||||||
101
.xcodeproj/xcshareddata/xcschemes/AIGrammar.xcscheme
Normal file
@ -0,0 +1,101 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<Scheme
|
||||||
|
LastUpgradeVersion = "1520"
|
||||||
|
version = "1.7">
|
||||||
|
<BuildAction
|
||||||
|
parallelizeBuildables = "YES"
|
||||||
|
buildImplicitDependencies = "YES">
|
||||||
|
<BuildActionEntries>
|
||||||
|
<BuildActionEntry
|
||||||
|
buildForTesting = "YES"
|
||||||
|
buildForRunning = "YES"
|
||||||
|
buildForProfiling = "YES"
|
||||||
|
buildForArchiving = "YES"
|
||||||
|
buildForAnalyzing = "YES">
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "5500A38B2BB3C7E80065A1D3"
|
||||||
|
BuildableName = "AIGrammar.app"
|
||||||
|
BlueprintName = "AIGrammar"
|
||||||
|
ReferencedContainer = "container:AIGrammar.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</BuildActionEntry>
|
||||||
|
</BuildActionEntries>
|
||||||
|
</BuildAction>
|
||||||
|
<TestAction
|
||||||
|
buildConfiguration = "Debug"
|
||||||
|
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||||
|
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||||
|
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||||
|
shouldAutocreateTestPlan = "YES">
|
||||||
|
<Testables>
|
||||||
|
<TestableReference
|
||||||
|
skipped = "NO"
|
||||||
|
parallelizable = "YES">
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "5500A3A02BB3C7EC0065A1D3"
|
||||||
|
BuildableName = "AIGrammarTests.xctest"
|
||||||
|
BlueprintName = "AIGrammarTests"
|
||||||
|
ReferencedContainer = "container:AIGrammar.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</TestableReference>
|
||||||
|
<TestableReference
|
||||||
|
skipped = "NO"
|
||||||
|
parallelizable = "YES">
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "5500A3AA2BB3C7EC0065A1D3"
|
||||||
|
BuildableName = "AIGrammarUITests.xctest"
|
||||||
|
BlueprintName = "AIGrammarUITests"
|
||||||
|
ReferencedContainer = "container:AIGrammar.xcodeproj">
|
||||||
|
</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">
|
||||||
|
<BuildableProductRunnable
|
||||||
|
runnableDebuggingMode = "0">
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "5500A38B2BB3C7E80065A1D3"
|
||||||
|
BuildableName = "AIGrammar.app"
|
||||||
|
BlueprintName = "AIGrammar"
|
||||||
|
ReferencedContainer = "container:AIGrammar.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</BuildableProductRunnable>
|
||||||
|
</LaunchAction>
|
||||||
|
<ProfileAction
|
||||||
|
buildConfiguration = "Release"
|
||||||
|
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||||
|
savedToolIdentifier = ""
|
||||||
|
useCustomWorkingDirectory = "NO"
|
||||||
|
debugDocumentVersioning = "YES">
|
||||||
|
<BuildableProductRunnable
|
||||||
|
runnableDebuggingMode = "0">
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "5500A38B2BB3C7E80065A1D3"
|
||||||
|
BuildableName = "AIGrammar.app"
|
||||||
|
BlueprintName = "AIGrammar"
|
||||||
|
ReferencedContainer = "container:AIGrammar.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</BuildableProductRunnable>
|
||||||
|
</ProfileAction>
|
||||||
|
<AnalyzeAction
|
||||||
|
buildConfiguration = "Debug">
|
||||||
|
</AnalyzeAction>
|
||||||
|
<ArchiveAction
|
||||||
|
buildConfiguration = "Release"
|
||||||
|
revealArchiveInOrganizer = "YES">
|
||||||
|
</ArchiveAction>
|
||||||
|
</Scheme>
|
||||||
@ -0,0 +1,32 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>SchemeUserState</key>
|
||||||
|
<dict>
|
||||||
|
<key>AIGrammar.xcscheme_^#shared#^_</key>
|
||||||
|
<dict>
|
||||||
|
<key>orderHint</key>
|
||||||
|
<integer>13</integer>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
|
<key>SuppressBuildableAutocreation</key>
|
||||||
|
<dict>
|
||||||
|
<key>5500A38B2BB3C7E80065A1D3</key>
|
||||||
|
<dict>
|
||||||
|
<key>primary</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
<key>5500A3A02BB3C7EC0065A1D3</key>
|
||||||
|
<dict>
|
||||||
|
<key>primary</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
<key>5500A3AA2BB3C7EC0065A1D3</key>
|
||||||
|
<dict>
|
||||||
|
<key>primary</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
||||||
@ -2,13 +2,7 @@
|
|||||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
<plist version="1.0">
|
<plist version="1.0">
|
||||||
<dict>
|
<dict>
|
||||||
<key>SchemeUserState</key>
|
<key>com.apple.developer.in-app-payments</key>
|
||||||
<dict>
|
<array/>
|
||||||
<key>AIGrammar.xcscheme_^#shared#^_</key>
|
|
||||||
<dict>
|
|
||||||
<key>orderHint</key>
|
|
||||||
<integer>0</integer>
|
|
||||||
</dict>
|
|
||||||
</dict>
|
|
||||||
</dict>
|
</dict>
|
||||||
</plist>
|
</plist>
|
||||||
80
AIGrammar/AllTabView.swift
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
//
|
||||||
|
// AllTab.swift
|
||||||
|
// AIGrammar
|
||||||
|
//
|
||||||
|
// Created by oscar on 2024/3/27.
|
||||||
|
//
|
||||||
|
|
||||||
|
import SwiftUI
|
||||||
|
|
||||||
|
@main
|
||||||
|
struct LearningToolApp: App {
|
||||||
|
var body: some Scene {
|
||||||
|
WindowGroup {
|
||||||
|
ContentView()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct ContentView: View {
|
||||||
|
var body: some View {
|
||||||
|
TabView {
|
||||||
|
GrammarCheckView()
|
||||||
|
.tabItem {
|
||||||
|
Image(systemName: "book.fill")
|
||||||
|
Text("Grammar Check")
|
||||||
|
}
|
||||||
|
|
||||||
|
WordsView()
|
||||||
|
.tabItem {
|
||||||
|
Image(systemName: "text.bubble")
|
||||||
|
Text("Words")
|
||||||
|
}
|
||||||
|
|
||||||
|
TranslateView()
|
||||||
|
.tabItem {
|
||||||
|
Image(systemName: "globe")
|
||||||
|
Text("Translate")
|
||||||
|
}
|
||||||
|
|
||||||
|
SettingsView()
|
||||||
|
.tabItem {
|
||||||
|
Image(systemName: "gear")
|
||||||
|
Text("Settings")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct GrammarCheckView: View {
|
||||||
|
var body: some View {
|
||||||
|
// Your Grammar Check View content goes here.
|
||||||
|
Text("Grammar Check")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct WordsView: View {
|
||||||
|
var body: some View {
|
||||||
|
// Your Words View content goes here.
|
||||||
|
Text("Words")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct TranslateView: View {
|
||||||
|
var body: some View {
|
||||||
|
// Your Translate View content goes here.
|
||||||
|
Text("Translate")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct SettingsView: View {
|
||||||
|
var body: some View {
|
||||||
|
// Your Settings View content goes here.
|
||||||
|
Text("Settings")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#Preview {
|
||||||
|
AllTab()
|
||||||
|
}
|
||||||
@ -1,13 +1,120 @@
|
|||||||
{
|
{
|
||||||
"images" : [
|
"images": [
|
||||||
{
|
{
|
||||||
"idiom" : "universal",
|
"size": "20x20",
|
||||||
"platform" : "ios",
|
"idiom": "universal",
|
||||||
"size" : "1024x1024"
|
"filename": "icon-20@2x.png",
|
||||||
|
"scale": "2x",
|
||||||
|
"platform": "ios"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"size": "20x20",
|
||||||
|
"idiom": "universal",
|
||||||
|
"filename": "icon-20@3x.png",
|
||||||
|
"scale": "3x",
|
||||||
|
"platform": "ios"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"size": "29x29",
|
||||||
|
"idiom": "universal",
|
||||||
|
"filename": "icon-29@2x.png",
|
||||||
|
"scale": "2x",
|
||||||
|
"platform": "ios"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"size": "29x29",
|
||||||
|
"idiom": "universal",
|
||||||
|
"filename": "icon-29@3x.png",
|
||||||
|
"scale": "3x",
|
||||||
|
"platform": "ios"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"size": "38x38",
|
||||||
|
"idiom": "universal",
|
||||||
|
"filename": "icon-38@2x.png",
|
||||||
|
"scale": "2x",
|
||||||
|
"platform": "ios"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"size": "38x38",
|
||||||
|
"idiom": "universal",
|
||||||
|
"filename": "icon-38@3x.png",
|
||||||
|
"scale": "3x",
|
||||||
|
"platform": "ios"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"size": "40x40",
|
||||||
|
"idiom": "universal",
|
||||||
|
"filename": "icon-40@2x.png",
|
||||||
|
"scale": "2x",
|
||||||
|
"platform": "ios"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"size": "40x40",
|
||||||
|
"idiom": "universal",
|
||||||
|
"filename": "icon-40@3x.png",
|
||||||
|
"scale": "3x",
|
||||||
|
"platform": "ios"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"size": "60x60",
|
||||||
|
"idiom": "universal",
|
||||||
|
"filename": "icon-60@2x.png",
|
||||||
|
"scale": "2x",
|
||||||
|
"platform": "ios"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"size": "60x60",
|
||||||
|
"idiom": "universal",
|
||||||
|
"filename": "icon-60@3x.png",
|
||||||
|
"scale": "3x",
|
||||||
|
"platform": "ios"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"size": "64x64",
|
||||||
|
"idiom": "universal",
|
||||||
|
"filename": "icon-64@2x.png",
|
||||||
|
"scale": "2x",
|
||||||
|
"platform": "ios"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"size": "64x64",
|
||||||
|
"idiom": "universal",
|
||||||
|
"filename": "icon-64@3x.png",
|
||||||
|
"scale": "3x",
|
||||||
|
"platform": "ios"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"size": "68x68",
|
||||||
|
"idiom": "universal",
|
||||||
|
"filename": "icon-68@2x.png",
|
||||||
|
"scale": "2x",
|
||||||
|
"platform": "ios"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"size": "76x76",
|
||||||
|
"idiom": "universal",
|
||||||
|
"filename": "icon-76@2x.png",
|
||||||
|
"scale": "2x",
|
||||||
|
"platform": "ios"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"size": "83.5x83.5",
|
||||||
|
"idiom": "universal",
|
||||||
|
"filename": "icon-83.5@2x.png",
|
||||||
|
"scale": "2x",
|
||||||
|
"platform": "ios"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"size": "1024x1024",
|
||||||
|
"idiom": "universal",
|
||||||
|
"filename": "icon-1024.png",
|
||||||
|
"scale": "1x",
|
||||||
|
"platform": "ios"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"info": {
|
||||||
|
"version": 1,
|
||||||
|
"author": "icon.wuruihong.com"
|
||||||
}
|
}
|
||||||
],
|
|
||||||
"info" : {
|
|
||||||
"author" : "xcode",
|
|
||||||
"version" : 1
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
BIN
AIGrammar/Assets.xcassets/AppIcon.appiconset/icon-1024.png
Normal file
|
After Width: | Height: | Size: 106 KiB |
BIN
AIGrammar/Assets.xcassets/AppIcon.appiconset/icon-20@2x.png
Normal file
|
After Width: | Height: | Size: 2.4 KiB |
BIN
AIGrammar/Assets.xcassets/AppIcon.appiconset/icon-20@3x.png
Normal file
|
After Width: | Height: | Size: 3.3 KiB |
BIN
AIGrammar/Assets.xcassets/AppIcon.appiconset/icon-29@2x.png
Normal file
|
After Width: | Height: | Size: 3.1 KiB |
BIN
AIGrammar/Assets.xcassets/AppIcon.appiconset/icon-29@3x.png
Normal file
|
After Width: | Height: | Size: 5.3 KiB |
BIN
AIGrammar/Assets.xcassets/AppIcon.appiconset/icon-38@2x.png
Normal file
|
After Width: | Height: | Size: 4.5 KiB |
BIN
AIGrammar/Assets.xcassets/AppIcon.appiconset/icon-38@3x.png
Normal file
|
After Width: | Height: | Size: 7.6 KiB |
BIN
AIGrammar/Assets.xcassets/AppIcon.appiconset/icon-40@2x.png
Normal file
|
After Width: | Height: | Size: 4.8 KiB |
BIN
AIGrammar/Assets.xcassets/AppIcon.appiconset/icon-40@3x.png
Normal file
|
After Width: | Height: | Size: 8.2 KiB |
BIN
AIGrammar/Assets.xcassets/AppIcon.appiconset/icon-60@2x.png
Normal file
|
After Width: | Height: | Size: 8.2 KiB |
BIN
AIGrammar/Assets.xcassets/AppIcon.appiconset/icon-60@3x.png
Normal file
|
After Width: | Height: | Size: 14 KiB |
BIN
AIGrammar/Assets.xcassets/AppIcon.appiconset/icon-64@2x.png
Normal file
|
After Width: | Height: | Size: 8.8 KiB |
BIN
AIGrammar/Assets.xcassets/AppIcon.appiconset/icon-64@3x.png
Normal file
|
After Width: | Height: | Size: 15 KiB |
BIN
AIGrammar/Assets.xcassets/AppIcon.appiconset/icon-68@2x.png
Normal file
|
After Width: | Height: | Size: 9.4 KiB |
BIN
AIGrammar/Assets.xcassets/AppIcon.appiconset/icon-76@2x.png
Normal file
|
After Width: | Height: | Size: 11 KiB |
BIN
AIGrammar/Assets.xcassets/AppIcon.appiconset/icon-83.5@2x.png
Normal file
|
After Width: | Height: | Size: 12 KiB |
33
AIGrammar/Assets.xcassets/vipimg.imageset/Contents.json
vendored
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
{
|
||||||
|
"images" : [
|
||||||
|
{
|
||||||
|
"idiom" : "universal",
|
||||||
|
"scale" : "1x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idiom" : "universal",
|
||||||
|
"scale" : "2x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idiom" : "universal",
|
||||||
|
"scale" : "3x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "crown.png",
|
||||||
|
"idiom" : "iphone",
|
||||||
|
"scale" : "1x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idiom" : "iphone",
|
||||||
|
"scale" : "2x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idiom" : "iphone",
|
||||||
|
"scale" : "3x"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"info" : {
|
||||||
|
"author" : "xcode",
|
||||||
|
"version" : 1
|
||||||
|
}
|
||||||
|
}
|
||||||
BIN
AIGrammar/Assets.xcassets/vipimg.imageset/crown.png
vendored
Normal file
|
After Width: | Height: | Size: 7.1 KiB |
18
AIGrammar/CommView/LoadingView.swift
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
//
|
||||||
|
// LoadingView.swift
|
||||||
|
// AIGrammar
|
||||||
|
//
|
||||||
|
// Created by oscar on 2024/7/7.
|
||||||
|
//
|
||||||
|
|
||||||
|
import SwiftUI
|
||||||
|
|
||||||
|
struct LoadingView: View {
|
||||||
|
var body: some View {
|
||||||
|
Text(/*@START_MENU_TOKEN@*/"Hello, World!"/*@END_MENU_TOKEN@*/)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#Preview {
|
||||||
|
LoadingView()
|
||||||
|
}
|
||||||
18
AIGrammar/GrammarSubView/CameraView.swift
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
//
|
||||||
|
// CameraView.swift
|
||||||
|
// AIGrammar
|
||||||
|
//
|
||||||
|
// Created by oscar on 2024/4/3.
|
||||||
|
//
|
||||||
|
|
||||||
|
import SwiftUI
|
||||||
|
|
||||||
|
struct CameraView: View {
|
||||||
|
var body: some View {
|
||||||
|
Text(/*@START_MENU_TOKEN@*/"Hello, World!"/*@END_MENU_TOKEN@*/)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#Preview {
|
||||||
|
CameraView()
|
||||||
|
}
|
||||||
18
AIGrammar/GrammarSubView/IAPTestView.swift
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
//
|
||||||
|
// IAPTestView.swift
|
||||||
|
// AIGrammar
|
||||||
|
//
|
||||||
|
// Created by oscar on 2024/6/19.
|
||||||
|
//
|
||||||
|
|
||||||
|
import SwiftUI
|
||||||
|
|
||||||
|
struct IAPTestView: View {
|
||||||
|
var body: some View {
|
||||||
|
Text(/*@START_MENU_TOKEN@*/"Hello, World!"/*@END_MENU_TOKEN@*/)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#Preview {
|
||||||
|
IAPTestView()
|
||||||
|
}
|
||||||
18
AIGrammar/GrammarSubView/InputView.swift
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
//
|
||||||
|
// InputView.swift
|
||||||
|
// AIGrammar
|
||||||
|
//
|
||||||
|
// Created by oscar on 2024/4/1.
|
||||||
|
//
|
||||||
|
|
||||||
|
import SwiftUI
|
||||||
|
|
||||||
|
struct InputView: View {
|
||||||
|
var body: some View {
|
||||||
|
Text(/*@START_MENU_TOKEN@*/"Hello, World!"/*@END_MENU_TOKEN@*/)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#Preview {
|
||||||
|
InputView()
|
||||||
|
}
|
||||||
18
AIGrammar/GrammarSubView/ResultView.swift
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
//
|
||||||
|
// ResultView.swift
|
||||||
|
// AIGrammar
|
||||||
|
//
|
||||||
|
// Created by oscar on 2024/4/1.
|
||||||
|
//
|
||||||
|
|
||||||
|
import SwiftUI
|
||||||
|
|
||||||
|
struct ResultView: View {
|
||||||
|
var body: some View {
|
||||||
|
Text(/*@START_MENU_TOKEN@*/"Hello, World!"/*@END_MENU_TOKEN@*/)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#Preview {
|
||||||
|
ResultView()
|
||||||
|
}
|
||||||
18
AIGrammar/GrammarSubView/RichText.swift
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
//
|
||||||
|
// RichText.swift
|
||||||
|
// AIGrammar
|
||||||
|
//
|
||||||
|
// Created by oscar on 2024/4/3.
|
||||||
|
//
|
||||||
|
|
||||||
|
import SwiftUI
|
||||||
|
|
||||||
|
struct RichText: View {
|
||||||
|
var body: some View {
|
||||||
|
Text(/*@START_MENU_TOKEN@*/"Hello, World!"/*@END_MENU_TOKEN@*/)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#Preview {
|
||||||
|
RichText()
|
||||||
|
}
|
||||||
18
AIGrammar/GrammarSubView/ShareSheet.swift
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
//
|
||||||
|
// ShareSheet.swift
|
||||||
|
// AIGrammar
|
||||||
|
//
|
||||||
|
// Created by oscar on 2024/4/3.
|
||||||
|
//
|
||||||
|
|
||||||
|
import SwiftUI
|
||||||
|
|
||||||
|
struct ShareSheet: View {
|
||||||
|
var body: some View {
|
||||||
|
Text(/*@START_MENU_TOKEN@*/"Hello, World!"/*@END_MENU_TOKEN@*/)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#Preview {
|
||||||
|
ShareSheet()
|
||||||
|
}
|
||||||
18
AIGrammar/View/GrammarCheckView.swift
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
//
|
||||||
|
// GrammarCheckView.swift
|
||||||
|
// AIGrammar
|
||||||
|
//
|
||||||
|
// Created by oscar on 2024/3/27.
|
||||||
|
//
|
||||||
|
|
||||||
|
import SwiftUI
|
||||||
|
|
||||||
|
struct GrammarCheckView: View {
|
||||||
|
var body: some View {
|
||||||
|
Text(/*@START_MENU_TOKEN@*/"Hello, World!"/*@END_MENU_TOKEN@*/)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#Preview {
|
||||||
|
GrammarCheckView()
|
||||||
|
}
|
||||||
18
AIGrammar/View/IAPView.swift
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
//
|
||||||
|
// IAPView.swift
|
||||||
|
// AIGrammar
|
||||||
|
//
|
||||||
|
// Created by oscar on 2024/7/9.
|
||||||
|
//
|
||||||
|
|
||||||
|
import SwiftUI
|
||||||
|
|
||||||
|
struct IAPView: View {
|
||||||
|
var body: some View {
|
||||||
|
Text(/*@START_MENU_TOKEN@*/"Hello, World!"/*@END_MENU_TOKEN@*/)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#Preview {
|
||||||
|
IAPView()
|
||||||
|
}
|
||||||
18
AIGrammar/View/SettingsView.swift
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
//
|
||||||
|
// SettingsView.swift
|
||||||
|
// AIGrammar
|
||||||
|
//
|
||||||
|
// Created by oscar on 2024/3/27.
|
||||||
|
//
|
||||||
|
|
||||||
|
import SwiftUI
|
||||||
|
|
||||||
|
struct SettingsView: View {
|
||||||
|
var body: some View {
|
||||||
|
Text(/*@START_MENU_TOKEN@*/"Hello, World!"/*@END_MENU_TOKEN@*/)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#Preview {
|
||||||
|
SettingsView()
|
||||||
|
}
|
||||||
18
AIGrammar/View/TranslateView.swift
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
//
|
||||||
|
// TranslateView.swift
|
||||||
|
// AIGrammar
|
||||||
|
//
|
||||||
|
// Created by oscar on 2024/3/27.
|
||||||
|
//
|
||||||
|
|
||||||
|
import SwiftUI
|
||||||
|
|
||||||
|
struct TranslateView: View {
|
||||||
|
var body: some View {
|
||||||
|
Text(/*@START_MENU_TOKEN@*/"Hello, World!"/*@END_MENU_TOKEN@*/)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#Preview {
|
||||||
|
TranslateView()
|
||||||
|
}
|
||||||
18
AIGrammar/View/WordsView.swift
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
//
|
||||||
|
// WordsView.swift
|
||||||
|
// AIGrammar
|
||||||
|
//
|
||||||
|
// Created by oscar on 2024/3/27.
|
||||||
|
//
|
||||||
|
|
||||||
|
import SwiftUI
|
||||||
|
|
||||||
|
struct WordsView: View {
|
||||||
|
var body: some View {
|
||||||
|
Text(/*@START_MENU_TOKEN@*/"Hello, World!"/*@END_MENU_TOKEN@*/)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#Preview {
|
||||||
|
WordsView()
|
||||||
|
}
|
||||||
8
AIGrammar/ViewModel/Config.swift
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
//
|
||||||
|
// config.swift
|
||||||
|
// AIGrammar
|
||||||
|
//
|
||||||
|
// Created by oscar on 2024/3/28.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
||||||
22
AIGrammar/ViewModel/GrammarData.swift
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
//
|
||||||
|
// DemoData.swift
|
||||||
|
// AIGrammar
|
||||||
|
//
|
||||||
|
// Created by oscar on 2024/4/2.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
|
||||||
|
struct GrammarRes {
|
||||||
|
var tPlain : String
|
||||||
|
var tType : String
|
||||||
|
var tReason : String
|
||||||
|
var tCorrection : [String]
|
||||||
|
}
|
||||||
|
|
||||||
|
struct GrammarData {
|
||||||
|
var tInputText : String
|
||||||
|
var tCorrectText : String
|
||||||
|
var tResult : [GrammarRes]
|
||||||
|
}
|
||||||
|
|
||||||
8
AIGrammar/lib/ColorToString.swift
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
//
|
||||||
|
// ColorToString.swift
|
||||||
|
// AIGrammar
|
||||||
|
//
|
||||||
|
// Created by oscar on 2024/3/28.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
||||||
8
AIGrammar/lib/CommFunc.swift
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
//
|
||||||
|
// CommFunc.swift
|
||||||
|
// AIGrammar
|
||||||
|
//
|
||||||
|
// Created by oscar on 2024/8/5.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
||||||
8
AIGrammar/lib/IapManager.swift
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
//
|
||||||
|
// Iap.swift
|
||||||
|
// AIGrammar
|
||||||
|
//
|
||||||
|
// Created by oscar on 2024/7/3.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
||||||
10
AIGrammar/lib/InitAPP.swift
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
//
|
||||||
|
// InitAPP.swift
|
||||||
|
// AIGrammar
|
||||||
|
//
|
||||||
|
// Created by oscar on 2024/6/26.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
|
||||||
|
|
||||||
8
AIGrammar/lib/LogManager.swift
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
//
|
||||||
|
// LogManager.swift
|
||||||
|
// AIGrammar
|
||||||
|
//
|
||||||
|
// Created by oscar on 2024/7/3.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
||||||
233
AIGrammar/lib/NetworkManager.swift
Normal file
@ -0,0 +1,233 @@
|
|||||||
|
//
|
||||||
|
// request.swift
|
||||||
|
// AIGrammar
|
||||||
|
//
|
||||||
|
// Created by oscar on 2024/6/4.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
import Alamofire
|
||||||
|
import SwiftJWT
|
||||||
|
import SwiftyBeaver
|
||||||
|
|
||||||
|
struct MyClaims: Claims {
|
||||||
|
var deviceID: String
|
||||||
|
var gid: Int
|
||||||
|
var exp1: Int
|
||||||
|
}
|
||||||
|
|
||||||
|
struct APIResponse<T: Decodable>: Decodable {
|
||||||
|
let ret: Int
|
||||||
|
let message: String
|
||||||
|
let data: T?
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Translation: Identifiable, Codable, Equatable {
|
||||||
|
var id = UUID()
|
||||||
|
var input: String
|
||||||
|
var translation: String
|
||||||
|
}
|
||||||
|
|
||||||
|
struct TranslationResponse: Codable {
|
||||||
|
let translation: String
|
||||||
|
}
|
||||||
|
|
||||||
|
struct WordDetails {
|
||||||
|
var word: String = ""
|
||||||
|
var explanations: [String] = []
|
||||||
|
var phrases: [String] = []
|
||||||
|
var synonyms: [String] = []
|
||||||
|
}
|
||||||
|
|
||||||
|
struct WordDetailsResponse: Codable {
|
||||||
|
let word: String
|
||||||
|
let explain: [String]?
|
||||||
|
let phrase: [String]?
|
||||||
|
let sync: [String]?
|
||||||
|
|
||||||
|
// Mapping to WordDetails for use in UI
|
||||||
|
func toWordDetails() -> WordDetails {
|
||||||
|
return WordDetails(
|
||||||
|
word: word,
|
||||||
|
explanations: explain ?? [],
|
||||||
|
phrases: phrase ?? [],
|
||||||
|
synonyms: sync ?? []
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct VIPStatusResponse: Codable {
|
||||||
|
let id: Int
|
||||||
|
let userid: String
|
||||||
|
let username: String
|
||||||
|
let vip: Int
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
struct NetworkManager {
|
||||||
|
static let shared = NetworkManager()
|
||||||
|
private let jwtSecret = globalEnvironment.jwtSecret
|
||||||
|
|
||||||
|
// 语法检查功能
|
||||||
|
func checkGrammar(inputText: String, completion: @escaping ([GrammarRes]?, Error?) -> Void) {
|
||||||
|
let url = globalEnvironment.grammarURL
|
||||||
|
let headers: HTTPHeaders = createAuthorizationHeader()
|
||||||
|
|
||||||
|
let parameters: [String: Any] = [
|
||||||
|
"input": inputText,
|
||||||
|
"lang": "eng"
|
||||||
|
]
|
||||||
|
AF.request(url, method: .post, parameters: parameters, encoding: URLEncoding.httpBody, headers: headers)
|
||||||
|
.responseDecodable(of: [GrammarRes].self) { response in
|
||||||
|
switch response.result {
|
||||||
|
case .success(let results):
|
||||||
|
completion(results, nil)
|
||||||
|
case .failure(let error):
|
||||||
|
completion(nil, error)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 单词的词典功能
|
||||||
|
func fetchWordDetails(inputText: String, lang: String = "eng", completion: @escaping (Result<WordDetails, Error>) -> Void) {
|
||||||
|
|
||||||
|
guard !inputText.isEmpty else { return }
|
||||||
|
let parameters: [String: Any] = ["input": inputText, "lang": lang]
|
||||||
|
let url = globalEnvironment.dictURL
|
||||||
|
let headers: HTTPHeaders = createAuthorizationHeader()
|
||||||
|
|
||||||
|
AF.request(url, method: .post, parameters: parameters, encoding: URLEncoding.httpBody, headers: headers)
|
||||||
|
.responseDecodable(of: WordDetailsResponse.self) { response in
|
||||||
|
switch response.result {
|
||||||
|
case .success(let detailsResponse):
|
||||||
|
print("Success: Received data for \(detailsResponse.word)")
|
||||||
|
let details = detailsResponse.toWordDetails() // Convert here
|
||||||
|
completion(.success(details))
|
||||||
|
case .failure(let error):
|
||||||
|
print("Error: \(error)")
|
||||||
|
print("Response Data: \(String(data: response.data ?? Data(), encoding: .utf8) ?? "No data")")
|
||||||
|
|
||||||
|
completion(.failure(error))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 翻译功能
|
||||||
|
func translate(inputText: String, lang: String = "chs", completion: @escaping (Result<Translation, Error>) -> Void) {
|
||||||
|
|
||||||
|
guard !inputText.isEmpty else { return }
|
||||||
|
let url = globalEnvironment.translateURL
|
||||||
|
let parameters: [String: Any] = ["input": inputText, "lang": lang]
|
||||||
|
let headers: HTTPHeaders = createAuthorizationHeader()
|
||||||
|
|
||||||
|
AF.request(url, method: .post, parameters: parameters, encoding: URLEncoding.httpBody, headers: headers)
|
||||||
|
.responseDecodable(of: TranslationResponse.self) { response in
|
||||||
|
switch response.result {
|
||||||
|
case .success(let translationResponse):
|
||||||
|
let newTranslation = Translation(input: inputText, translation: translationResponse.translation)
|
||||||
|
completion(.success(newTranslation))
|
||||||
|
case .failure(let error):
|
||||||
|
completion(.failure(error))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 翻译的点赞、点踩功能
|
||||||
|
func sendFeedback(input: String, output: String, isPositive: Bool) {
|
||||||
|
let url = globalEnvironment.feedbackURL
|
||||||
|
let parameters: [String: Any] = [
|
||||||
|
"product": "trans",
|
||||||
|
"input": input,
|
||||||
|
"output": output,
|
||||||
|
"res": isPositive ? "good" : "bad"
|
||||||
|
]
|
||||||
|
|
||||||
|
let headers: HTTPHeaders = createAuthorizationHeader()
|
||||||
|
AF.request(url, method: .post, parameters: parameters, encoding: URLEncoding.httpBody, headers: headers).response { response in
|
||||||
|
switch response.result {
|
||||||
|
case .success(let data):
|
||||||
|
print("Feedback sent successfully: \(String(describing: data))")
|
||||||
|
case .failure(let error):
|
||||||
|
print("Error sending feedback: \(error)")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查询VIP状态
|
||||||
|
func getUserProfile(completion: @escaping (Result<VIPStatusResponse, Error>) -> Void) {
|
||||||
|
let url = globalEnvironment.userURL
|
||||||
|
|
||||||
|
let parameters: [String: Any] = [:]
|
||||||
|
let headers: HTTPHeaders = createAuthorizationHeader()
|
||||||
|
|
||||||
|
performRequest(
|
||||||
|
endpoint: url,
|
||||||
|
parameters: parameters,
|
||||||
|
method: .post,
|
||||||
|
encoding: URLEncoding.httpBody,
|
||||||
|
headers: headers, // 示例:使用JWT token
|
||||||
|
completion: { (result: Result<VIPStatusResponse, Error>) in
|
||||||
|
switch result {
|
||||||
|
case .success(let vipData):
|
||||||
|
logger.info("VIP Status: \(vipData.vip)")
|
||||||
|
completion(.success(vipData))
|
||||||
|
case .failure(let error):
|
||||||
|
logger.error("Error: \(error.localizedDescription)")
|
||||||
|
completion(.failure(error))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func performRequest<T: Decodable>(
|
||||||
|
endpoint: String,
|
||||||
|
parameters: Parameters, // 明确使用 Alamofire 的 Parameters 类型
|
||||||
|
method: HTTPMethod = .post,
|
||||||
|
encoding: URLEncoding = .httpBody,
|
||||||
|
headers: HTTPHeaders? = nil,
|
||||||
|
completion: @escaping (Result<T, Error>) -> Void
|
||||||
|
) {
|
||||||
|
let url = endpoint
|
||||||
|
let defaultHeaders: HTTPHeaders = [.contentType("application/x-www-form-urlencoded")]
|
||||||
|
let combinedHeaders = headers ?? defaultHeaders
|
||||||
|
|
||||||
|
// 确保参数是正确的类型
|
||||||
|
AF.request(url, method: .post, parameters: parameters, encoding: encoding, headers: combinedHeaders).responseDecodable(of: APIResponse<T>.self) { response in
|
||||||
|
switch response.result {
|
||||||
|
case .success(let apiResponse):
|
||||||
|
if apiResponse.ret == 0, let data = apiResponse.data {
|
||||||
|
completion(.success(data))
|
||||||
|
} else {
|
||||||
|
let error = NSError(domain: "", code: apiResponse.ret, userInfo: [NSLocalizedDescriptionKey: apiResponse.message])
|
||||||
|
completion(.failure(error))
|
||||||
|
}
|
||||||
|
case .failure(let error):
|
||||||
|
completion(.failure(error))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private func createAuthorizationHeader() -> HTTPHeaders {
|
||||||
|
// Generate JWT and return headers
|
||||||
|
guard let jwtToken = generateJWT(deviceID: globalEnvironment.deviceID, gID: globalEnvironment.GID, jwtSecret: jwtSecret) else {
|
||||||
|
return [:]
|
||||||
|
}
|
||||||
|
return ["Authorization": "Bearer \(jwtToken)"]
|
||||||
|
}
|
||||||
|
|
||||||
|
private func generateJWT(deviceID: String, gID: Int, jwtSecret: String) -> String? {
|
||||||
|
let claims = MyClaims(deviceID: deviceID, gid: gID, exp1: Int(Date().timeIntervalSince1970) + 86400)
|
||||||
|
var jwt = JWT(claims: claims)
|
||||||
|
do {
|
||||||
|
let jwtSigner = JWTSigner.hs256(key: Data(jwtSecret.utf8))
|
||||||
|
let signedJWT = try jwt.sign(using: jwtSigner)
|
||||||
|
return signedJWT
|
||||||
|
} catch {
|
||||||
|
logger.error("JWT encoding failed with error: \(error)")
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||