From 7ef28b31dbe8939a1d5e56e66098bc8c136c36f0 Mon Sep 17 00:00:00 2001 From: bamsak Date: Tue, 5 Sep 2023 10:32:26 +0900 Subject: [PATCH] =?UTF-8?q?[Feat]=20=EC=82=AC=EC=A0=84=EA=B3=BC=EC=A0=9C?= =?UTF-8?q?=20=EC=9E=91=EC=97=85=20=EC=A0=9C=EC=B6=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../project.pbxproj | 313 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 5 + .../UserInterfaceState.xcuserstate | Bin 0 -> 40715 bytes .../WorkspaceSettings.xcsettings | 14 + .../xcdebugger/Breakpoints_v2.xcbkptlist | 6 + .../xcschemes/xcschememanagement.plist | 14 + .../Class/MyCreditManager.swift | 239 +++++++++++++ .../Models/Grade.swift | 35 ++ .../Models/ReportCard.swift | 14 + .../MyCreditManager_2_kbs96117/main.swift | 12 + 12 files changed, 667 insertions(+) create mode 100644 MyCreditManager_2_kbs96117/MyCreditManager_2_kbs96117.xcodeproj/project.pbxproj create mode 100644 MyCreditManager_2_kbs96117/MyCreditManager_2_kbs96117.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 MyCreditManager_2_kbs96117/MyCreditManager_2_kbs96117.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 MyCreditManager_2_kbs96117/MyCreditManager_2_kbs96117.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 MyCreditManager_2_kbs96117/MyCreditManager_2_kbs96117.xcodeproj/project.xcworkspace/xcuserdata/BOMBSGIE.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 MyCreditManager_2_kbs96117/MyCreditManager_2_kbs96117.xcodeproj/project.xcworkspace/xcuserdata/BOMBSGIE.xcuserdatad/WorkspaceSettings.xcsettings create mode 100644 MyCreditManager_2_kbs96117/MyCreditManager_2_kbs96117.xcodeproj/xcuserdata/BOMBSGIE.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist create mode 100644 MyCreditManager_2_kbs96117/MyCreditManager_2_kbs96117.xcodeproj/xcuserdata/BOMBSGIE.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 MyCreditManager_2_kbs96117/MyCreditManager_2_kbs96117/Class/MyCreditManager.swift create mode 100644 MyCreditManager_2_kbs96117/MyCreditManager_2_kbs96117/Models/Grade.swift create mode 100644 MyCreditManager_2_kbs96117/MyCreditManager_2_kbs96117/Models/ReportCard.swift create mode 100644 MyCreditManager_2_kbs96117/MyCreditManager_2_kbs96117/main.swift diff --git a/MyCreditManager_2_kbs96117/MyCreditManager_2_kbs96117.xcodeproj/project.pbxproj b/MyCreditManager_2_kbs96117/MyCreditManager_2_kbs96117.xcodeproj/project.pbxproj new file mode 100644 index 0000000..e529fed --- /dev/null +++ b/MyCreditManager_2_kbs96117/MyCreditManager_2_kbs96117.xcodeproj/project.pbxproj @@ -0,0 +1,313 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 56; + objects = { + +/* Begin PBXBuildFile section */ + 7F3CC6772A8B62D400ECA079 /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F3CC6762A8B62D400ECA079 /* main.swift */; }; + 7FB2DEFC2A8DFF7800A1BA03 /* ReportCard.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7FB2DEFB2A8DFF7800A1BA03 /* ReportCard.swift */; }; + 7FB2DF002A8E042500A1BA03 /* MyCreditManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7FB2DEFF2A8E042500A1BA03 /* MyCreditManager.swift */; }; + 7FB2DF052A8FB77300A1BA03 /* Grade.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7FB2DF042A8FB77300A1BA03 /* Grade.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 7F3CC6712A8B62D400ECA079 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = /usr/share/man/man1/; + dstSubfolderSpec = 0; + files = ( + ); + runOnlyForDeploymentPostprocessing = 1; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 7F3CC6732A8B62D400ECA079 /* MyCreditManager_2_kbs96117 */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = MyCreditManager_2_kbs96117; sourceTree = BUILT_PRODUCTS_DIR; }; + 7F3CC6762A8B62D400ECA079 /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = ""; }; + 7FB2DEFB2A8DFF7800A1BA03 /* ReportCard.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReportCard.swift; sourceTree = ""; }; + 7FB2DEFF2A8E042500A1BA03 /* MyCreditManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MyCreditManager.swift; sourceTree = ""; }; + 7FB2DF042A8FB77300A1BA03 /* Grade.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Grade.swift; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 7F3CC6702A8B62D400ECA079 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 7F3CC66A2A8B62D400ECA079 = { + isa = PBXGroup; + children = ( + 7F3CC6752A8B62D400ECA079 /* MyCreditManager_2_kbs96117 */, + 7F3CC6742A8B62D400ECA079 /* Products */, + ); + sourceTree = ""; + }; + 7F3CC6742A8B62D400ECA079 /* Products */ = { + isa = PBXGroup; + children = ( + 7F3CC6732A8B62D400ECA079 /* MyCreditManager_2_kbs96117 */, + ); + name = Products; + sourceTree = ""; + }; + 7F3CC6752A8B62D400ECA079 /* MyCreditManager_2_kbs96117 */ = { + isa = PBXGroup; + children = ( + 7F3CC6762A8B62D400ECA079 /* main.swift */, + 7FB2DEFE2A8E03F900A1BA03 /* Class */, + 7FB2DEFA2A8DFF5B00A1BA03 /* Models */, + ); + path = MyCreditManager_2_kbs96117; + sourceTree = ""; + }; + 7FB2DEFA2A8DFF5B00A1BA03 /* Models */ = { + isa = PBXGroup; + children = ( + 7FB2DEFB2A8DFF7800A1BA03 /* ReportCard.swift */, + 7FB2DF042A8FB77300A1BA03 /* Grade.swift */, + ); + path = Models; + sourceTree = ""; + }; + 7FB2DEFE2A8E03F900A1BA03 /* Class */ = { + isa = PBXGroup; + children = ( + 7FB2DEFF2A8E042500A1BA03 /* MyCreditManager.swift */, + ); + path = Class; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 7F3CC6722A8B62D400ECA079 /* MyCreditManager_2_kbs96117 */ = { + isa = PBXNativeTarget; + buildConfigurationList = 7F3CC67A2A8B62D400ECA079 /* Build configuration list for PBXNativeTarget "MyCreditManager_2_kbs96117" */; + buildPhases = ( + 7F3CC66F2A8B62D400ECA079 /* Sources */, + 7F3CC6702A8B62D400ECA079 /* Frameworks */, + 7F3CC6712A8B62D400ECA079 /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = MyCreditManager_2_kbs96117; + productName = MyCreditManager_2_kbs96117; + productReference = 7F3CC6732A8B62D400ECA079 /* MyCreditManager_2_kbs96117 */; + productType = "com.apple.product-type.tool"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 7F3CC66B2A8B62D400ECA079 /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = 1; + LastSwiftUpdateCheck = 1430; + LastUpgradeCheck = 1430; + TargetAttributes = { + 7F3CC6722A8B62D400ECA079 = { + CreatedOnToolsVersion = 14.3.1; + }; + }; + }; + buildConfigurationList = 7F3CC66E2A8B62D400ECA079 /* Build configuration list for PBXProject "MyCreditManager_2_kbs96117" */; + compatibilityVersion = "Xcode 14.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 7F3CC66A2A8B62D400ECA079; + productRefGroup = 7F3CC6742A8B62D400ECA079 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 7F3CC6722A8B62D400ECA079 /* MyCreditManager_2_kbs96117 */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXSourcesBuildPhase section */ + 7F3CC66F2A8B62D400ECA079 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 7FB2DF002A8E042500A1BA03 /* MyCreditManager.swift in Sources */, + 7FB2DF052A8FB77300A1BA03 /* Grade.swift in Sources */, + 7F3CC6772A8B62D400ECA079 /* main.swift in Sources */, + 7FB2DEFC2A8DFF7800A1BA03 /* ReportCard.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 7F3CC6782A8B62D400ECA079 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 13.3; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 7F3CC6792A8B62D400ECA079 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 13.3; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + }; + name = Release; + }; + 7F3CC67B2A8B62D400ECA079 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + }; + name = Debug; + }; + 7F3CC67C2A8B62D400ECA079 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 7F3CC66E2A8B62D400ECA079 /* Build configuration list for PBXProject "MyCreditManager_2_kbs96117" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 7F3CC6782A8B62D400ECA079 /* Debug */, + 7F3CC6792A8B62D400ECA079 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 7F3CC67A2A8B62D400ECA079 /* Build configuration list for PBXNativeTarget "MyCreditManager_2_kbs96117" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 7F3CC67B2A8B62D400ECA079 /* Debug */, + 7F3CC67C2A8B62D400ECA079 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 7F3CC66B2A8B62D400ECA079 /* Project object */; +} diff --git a/MyCreditManager_2_kbs96117/MyCreditManager_2_kbs96117.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/MyCreditManager_2_kbs96117/MyCreditManager_2_kbs96117.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/MyCreditManager_2_kbs96117/MyCreditManager_2_kbs96117.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/MyCreditManager_2_kbs96117/MyCreditManager_2_kbs96117.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/MyCreditManager_2_kbs96117/MyCreditManager_2_kbs96117.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/MyCreditManager_2_kbs96117/MyCreditManager_2_kbs96117.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/MyCreditManager_2_kbs96117/MyCreditManager_2_kbs96117.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/MyCreditManager_2_kbs96117/MyCreditManager_2_kbs96117.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000..0c67376 --- /dev/null +++ b/MyCreditManager_2_kbs96117/MyCreditManager_2_kbs96117.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,5 @@ + + + + + diff --git a/MyCreditManager_2_kbs96117/MyCreditManager_2_kbs96117.xcodeproj/project.xcworkspace/xcuserdata/BOMBSGIE.xcuserdatad/UserInterfaceState.xcuserstate b/MyCreditManager_2_kbs96117/MyCreditManager_2_kbs96117.xcodeproj/project.xcworkspace/xcuserdata/BOMBSGIE.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..c23d0cd3f2177f754f705f77fd7e8ad8c82539d3 GIT binary patch literal 40715 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 GYKNk%>F@vISX|#0fEe>#5 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 literal 0 HcmV?d00001 diff --git a/MyCreditManager_2_kbs96117/MyCreditManager_2_kbs96117.xcodeproj/project.xcworkspace/xcuserdata/BOMBSGIE.xcuserdatad/WorkspaceSettings.xcsettings b/MyCreditManager_2_kbs96117/MyCreditManager_2_kbs96117.xcodeproj/project.xcworkspace/xcuserdata/BOMBSGIE.xcuserdatad/WorkspaceSettings.xcsettings new file mode 100644 index 0000000..bbfef02 --- /dev/null +++ b/MyCreditManager_2_kbs96117/MyCreditManager_2_kbs96117.xcodeproj/project.xcworkspace/xcuserdata/BOMBSGIE.xcuserdatad/WorkspaceSettings.xcsettings @@ -0,0 +1,14 @@ + + + + + BuildLocationStyle + UseAppPreferences + CustomBuildLocationType + RelativeToDerivedData + DerivedDataLocationStyle + Default + ShowSharedSchemesAutomaticallyEnabled + + + diff --git a/MyCreditManager_2_kbs96117/MyCreditManager_2_kbs96117.xcodeproj/xcuserdata/BOMBSGIE.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/MyCreditManager_2_kbs96117/MyCreditManager_2_kbs96117.xcodeproj/xcuserdata/BOMBSGIE.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist new file mode 100644 index 0000000..5a137cb --- /dev/null +++ b/MyCreditManager_2_kbs96117/MyCreditManager_2_kbs96117.xcodeproj/xcuserdata/BOMBSGIE.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -0,0 +1,6 @@ + + + diff --git a/MyCreditManager_2_kbs96117/MyCreditManager_2_kbs96117.xcodeproj/xcuserdata/BOMBSGIE.xcuserdatad/xcschemes/xcschememanagement.plist b/MyCreditManager_2_kbs96117/MyCreditManager_2_kbs96117.xcodeproj/xcuserdata/BOMBSGIE.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..c924775 --- /dev/null +++ b/MyCreditManager_2_kbs96117/MyCreditManager_2_kbs96117.xcodeproj/xcuserdata/BOMBSGIE.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,14 @@ + + + + + SchemeUserState + + MyCreditManager_2_kbs96117.xcscheme_^#shared#^_ + + orderHint + 0 + + + + diff --git a/MyCreditManager_2_kbs96117/MyCreditManager_2_kbs96117/Class/MyCreditManager.swift b/MyCreditManager_2_kbs96117/MyCreditManager_2_kbs96117/Class/MyCreditManager.swift new file mode 100644 index 0000000..33731ef --- /dev/null +++ b/MyCreditManager_2_kbs96117/MyCreditManager_2_kbs96117/Class/MyCreditManager.swift @@ -0,0 +1,239 @@ +// +// MyCreditManager.swift +// MyCreditManager_2_kbs96117 +// +// Created by BOMBSGIE on 2023/08/17. +// + +import Foundation + +final class MyCreditManager { + + private var reportCards: [ReportCard] = [] + + private let inputError: String = "입력이 잘못되었습니다. 다시 확인해주세요." + private var documentDirectory: URL { FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first! } + + private var reportCardsFileURL: URL { documentDirectory.appendingPathComponent("reportCards.json") } + + init() { + loadReportCards(filePath: reportCardsFileURL) + } + + func startMainMenu() { + print("원하는 기능을 입력하세요.") + print("1: 학생추가, 2: 학생삭제, 3: 성적추가(변경), 4: 성적삭제, 5: 평점보기, X: 종료") + guard let input = readLine() else {return} + + switch input { + case "1": addStudent() + case "2": deleteStudent() + case "3": updateReport() + case "4": deleteReport() + case "5": showingReport() + case "X": + saveReportCards(reportCards: reportCards, filePath: reportCardsFileURL) + print("프로그램을 종료합니다...") + break + default: + print("뭔가 입력이 잘못되었습니다. 1~5 사이의 숫자 혹은 X를 입력해주세요.") + startMainMenu() + } + + + } + + + + private func addStudent(){ + print("추가할 학생의 이름을 입력해주세요.") + + guard let name = readLine(), validateInput(input: name) else { + print("\(inputError)") + startMainMenu() + return + } + + if checkDuplicateName(studentName: name) { + print("\(name)은 이미 존재하는 학생입니다. 추가하지 않습니다.") + } else { + reportCards.append(ReportCard(sudentName: name, reports: [:])) + print("\(name) 학생을 추가했습니다.") + } + startMainMenu() + } + + + private func deleteStudent() { + print("삭제할 학생의 이름을 입력해주세요.") + + guard let name = readLine(), validateInput(input: name) else { + print("\(inputError)") + startMainMenu() + return + } + + if checkDuplicateName(studentName: name) { + reportCards.removeAll {$0.sudentName == name} + print("\(name) 학생을 삭제하였습니다.") + } else { + printStudentNotFount(name: name) + } + startMainMenu() + } + + + private func updateReport() { + print( + """ + 성적을 추가할 학생의 이름, 과목 이름, 성적(A+, A0, F 등)을 띄어쓰기로 구분하여 차례로 작성해주세요. + 입력예) Mickey Swift A+ + 만약에 학생의 성적 중 해당 과목이 존재하면 기존 점수가 갱신됩니다. + """) + guard let input = readLine() else { return } + let inputs: [String] = input.components(separatedBy: " ") + + guard inputs.count == 3 else { + print("\(inputError)") + startMainMenu() + return + } + + let name: String = inputs[0] + let subject: String = inputs[1] + + guard let grade = Grade(rawValue: inputs[2]), validateInput(input: name) && validateInput(input: subject) else { + print("\(inputError)") + startMainMenu() + return + } + + guard checkDuplicateName(studentName: name) else { + printStudentNotFount(name: name) + startMainMenu() + return + } + + if let studentIndex: Int = reportCards.firstIndex(where: {$0.sudentName == name}) { + reportCards[studentIndex].reports[subject] = grade + print("\(name) 학생의 \(subject) 과목이 \(grade.rawValue)로 추가(변경) 되었습니다.") + } + + startMainMenu() + } + + private func deleteReport() { + print("성적을 삭제할 학생의 이름, 과목 이름을 띄어쓰기로 구분하여 차례로 작성해주세요.") + guard let input = readLine() else { return } + let inputs: [String] = input.components(separatedBy: " ") + + guard inputs.count == 2 && validateInput(input: inputs[0]) && validateInput(input: inputs[1]) else { + print("\(inputError)") + startMainMenu() + return + } + + let name = inputs[0] + let subject = inputs[1] + + + guard let studentIndex: Int = reportCards.firstIndex(where: {$0.sudentName == name}) else { + printStudentNotFount(name: name) + startMainMenu() + return + } + + if let _ = reportCards[studentIndex].reports[subject] { + reportCards[studentIndex].reports.removeValue(forKey: subject) + print("\(name) 학생의 \(subject) 과목의 성적이 삭제되었습니다.") + + } else { + print("\(name) 학생의 \(subject) 과목의 성적이 존재하지 않습니다.") + } + + startMainMenu() + } + + private func showingReport() { + print("평점을 알고싶은 학생의 이름을 입력해주세요.") + guard let name = readLine(), validateInput(input: name) else { + print("\(inputError)") + startMainMenu() + return + } + + + guard let studentIndex: Int = reportCards.firstIndex(where: {$0.sudentName == name}) else { + printStudentNotFount(name: name) + startMainMenu() + return + } + + if !reportCards[studentIndex].reports.isEmpty { + let report = reportCards[studentIndex].reports + let totalScore: Double = report.map {$0.value.score}.reduce(0,+) + let averageScore: String = String(format: "%.2f", totalScore / Double(report.count)) + var roundedAverage: String { + averageScore.hasSuffix("0") ? String(averageScore.dropLast()) : averageScore + } + + report.forEach { subject, grade in + print("\(subject): \(grade.rawValue)") + } + print("평점: \(roundedAverage)") + + + } else { + print("\(name) 학생의 성적이 존재하지 않습니다.") + } + startMainMenu() + } + + +} + + +//MARK: - Extension MyCreditManager +extension MyCreditManager { + + private func checkDuplicateName(studentName: String) -> Bool { + return reportCards.contains { $0.sudentName == studentName} + } + + + private func validateInput(input: String) -> Bool{ + let vaildCharcterSet = CharacterSet.alphanumerics + return input.rangeOfCharacter(from: vaildCharcterSet) != nil && !input.contains(" ") + } + + + private func printStudentNotFount(name: String) { + print("\(name) 학생을 찾지 못했습니다.") + } + + //MARK: - File Persistence로 배열 저장 및 저장된 데이터 불러오는 함수 + private func saveReportCards(reportCards: [ReportCard], filePath: URL) { + do { + let encoder = JSONEncoder() + let jsonData = try encoder.encode(reportCards) + try jsonData.write(to: filePath) + } catch { + print("File Persistence 저장 안됨 \(error)") + } + } + + private func loadReportCards(filePath: URL) { + do { + let jsonData = try Data(contentsOf: filePath) + let decoder = JSONDecoder() + let loadedReportCards = try decoder.decode([ReportCard].self, from: jsonData) + reportCards = loadedReportCards + } catch { + reportCards = [] + } + } + + +} + + diff --git a/MyCreditManager_2_kbs96117/MyCreditManager_2_kbs96117/Models/Grade.swift b/MyCreditManager_2_kbs96117/MyCreditManager_2_kbs96117/Models/Grade.swift new file mode 100644 index 0000000..40effb6 --- /dev/null +++ b/MyCreditManager_2_kbs96117/MyCreditManager_2_kbs96117/Models/Grade.swift @@ -0,0 +1,35 @@ +// +// Grade.swift +// MyCreditManager_2_kbs96117 +// +// Created by BOMBSGIE on 2023/08/18. +// + +import Foundation + +enum Grade: String, Codable { + + case aPlus = "A+" + case aZero = "A0" + case bPlus = "B+" + case bZero = "B0" + case cPlus = "C+" + case cZero = "C0" + case dPlus = "D+" + case dZero = "D0" + case f = "F" + + var score: Double { + switch self { + case .aPlus: return 4.5 + case .aZero: return 4.0 + case .bPlus: return 3.5 + case .bZero: return 3.0 + case .cPlus: return 2.5 + case .cZero: return 2.0 + case .dPlus: return 1.5 + case .dZero: return 1.0 + case .f: return 0.0 + } + } +} diff --git a/MyCreditManager_2_kbs96117/MyCreditManager_2_kbs96117/Models/ReportCard.swift b/MyCreditManager_2_kbs96117/MyCreditManager_2_kbs96117/Models/ReportCard.swift new file mode 100644 index 0000000..1e42381 --- /dev/null +++ b/MyCreditManager_2_kbs96117/MyCreditManager_2_kbs96117/Models/ReportCard.swift @@ -0,0 +1,14 @@ +// +// ReportCard.swift +// MyCreditManager_2_kbs96117 +// +// Created by BOMBSGIE on 2023/08/17. +// + +import Foundation + +struct ReportCard: Codable { + var sudentName: String + var reports: [String: Grade] +} + diff --git a/MyCreditManager_2_kbs96117/MyCreditManager_2_kbs96117/main.swift b/MyCreditManager_2_kbs96117/MyCreditManager_2_kbs96117/main.swift new file mode 100644 index 0000000..452224a --- /dev/null +++ b/MyCreditManager_2_kbs96117/MyCreditManager_2_kbs96117/main.swift @@ -0,0 +1,12 @@ +// +// main.swift +// MyCreditManager_2_kbs96117 +// +// Created by BOMBSGIE on 2023/08/15. +// + +import Foundation + +let myCreditManager: MyCreditManager = MyCreditManager() +myCreditManager.startMainMenu() +