From 87eabb74f1ee8018deb9a0d3e757794fa941fb9c Mon Sep 17 00:00:00 2001 From: GeonWoo Date: Mon, 27 Jan 2025 17:58:13 +0900 Subject: [PATCH 01/21] #2 added artwork, posting features --- .../DesignSystem.xcodeproj/project.pbxproj | 0 .../contents.xcworkspacedata | 0 .../xcschemes/DesignSystem.xcscheme | 67 +++ .../DesignSystem/DesignSystem.h | 0 .../ArtworkFeature.xcodeproj/project.pbxproj | 472 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + .../ArtworkFeature/ArtworkFeature.swift | 10 + .../ArtworkFeatureInterface.h | 18 + .../PostingFeature.xcodeproj/project.pbxproj | 472 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + .../PostingFeature/PostingFeature.swift | 10 + .../PostingFeatureInterface.h | 18 + .../contents.xcworkspacedata | 30 +- 13 files changed, 1105 insertions(+), 6 deletions(-) rename {DesignSystem => Core}/DesignSystem.xcodeproj/project.pbxproj (100%) rename {DesignSystem => Core}/DesignSystem.xcodeproj/project.xcworkspace/contents.xcworkspacedata (100%) create mode 100644 Core/DesignSystem.xcodeproj/xcshareddata/xcschemes/DesignSystem.xcscheme rename {DesignSystem => Core}/DesignSystem/DesignSystem.h (100%) create mode 100644 Features/ArtworkFeature/ArtworkFeature.xcodeproj/project.pbxproj create mode 100644 Features/ArtworkFeature/ArtworkFeature.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Features/ArtworkFeature/ArtworkFeature/ArtworkFeature.swift create mode 100644 Features/ArtworkFeature/ArtworkFeatureInterface/ArtworkFeatureInterface.h create mode 100644 Features/PostingFeature/PostingFeature.xcodeproj/project.pbxproj create mode 100644 Features/PostingFeature/PostingFeature.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Features/PostingFeature/PostingFeature/PostingFeature.swift create mode 100644 Features/PostingFeature/PostingFeatureInterface/PostingFeatureInterface.h diff --git a/DesignSystem/DesignSystem.xcodeproj/project.pbxproj b/Core/DesignSystem.xcodeproj/project.pbxproj similarity index 100% rename from DesignSystem/DesignSystem.xcodeproj/project.pbxproj rename to Core/DesignSystem.xcodeproj/project.pbxproj diff --git a/DesignSystem/DesignSystem.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Core/DesignSystem.xcodeproj/project.xcworkspace/contents.xcworkspacedata similarity index 100% rename from DesignSystem/DesignSystem.xcodeproj/project.xcworkspace/contents.xcworkspacedata rename to Core/DesignSystem.xcodeproj/project.xcworkspace/contents.xcworkspacedata diff --git a/Core/DesignSystem.xcodeproj/xcshareddata/xcschemes/DesignSystem.xcscheme b/Core/DesignSystem.xcodeproj/xcshareddata/xcschemes/DesignSystem.xcscheme new file mode 100644 index 0000000..a052514 --- /dev/null +++ b/Core/DesignSystem.xcodeproj/xcshareddata/xcschemes/DesignSystem.xcscheme @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/DesignSystem/DesignSystem/DesignSystem.h b/Core/DesignSystem/DesignSystem.h similarity index 100% rename from DesignSystem/DesignSystem/DesignSystem.h rename to Core/DesignSystem/DesignSystem.h diff --git a/Features/ArtworkFeature/ArtworkFeature.xcodeproj/project.pbxproj b/Features/ArtworkFeature/ArtworkFeature.xcodeproj/project.pbxproj new file mode 100644 index 0000000..dca9106 --- /dev/null +++ b/Features/ArtworkFeature/ArtworkFeature.xcodeproj/project.pbxproj @@ -0,0 +1,472 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 77; + objects = { + +/* Begin PBXCopyFilesBuildPhase section */ + 1A0B4B132D477FED002D10DE /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = "include/$(PRODUCT_NAME)"; + dstSubfolderSpec = 16; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 1A0B4B152D477FED002D10DE /* libArtworkFeature.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libArtworkFeature.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 1A0B4B242D477FFB002D10DE /* ArtworkFeatureInterface.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ArtworkFeatureInterface.framework; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */ + 1A0B4B282D477FFB002D10DE /* Exceptions for "ArtworkFeatureInterface" folder in "ArtworkFeatureInterface" target */ = { + isa = PBXFileSystemSynchronizedBuildFileExceptionSet; + publicHeaders = ( + ArtworkFeatureInterface.h, + ); + target = 1A0B4B232D477FFB002D10DE /* ArtworkFeatureInterface */; + }; +/* End PBXFileSystemSynchronizedBuildFileExceptionSet section */ + +/* Begin PBXFileSystemSynchronizedRootGroup section */ + 1A0B4B172D477FED002D10DE /* ArtworkFeature */ = { + isa = PBXFileSystemSynchronizedRootGroup; + path = ArtworkFeature; + sourceTree = ""; + }; + 1A0B4B252D477FFB002D10DE /* ArtworkFeatureInterface */ = { + isa = PBXFileSystemSynchronizedRootGroup; + exceptions = ( + 1A0B4B282D477FFB002D10DE /* Exceptions for "ArtworkFeatureInterface" folder in "ArtworkFeatureInterface" target */, + ); + path = ArtworkFeatureInterface; + sourceTree = ""; + }; +/* End PBXFileSystemSynchronizedRootGroup section */ + +/* Begin PBXFrameworksBuildPhase section */ + 1A0B4B122D477FED002D10DE /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 1A0B4B212D477FFB002D10DE /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 1A0B4B0C2D477FED002D10DE = { + isa = PBXGroup; + children = ( + 1A0B4B172D477FED002D10DE /* ArtworkFeature */, + 1A0B4B252D477FFB002D10DE /* ArtworkFeatureInterface */, + 1A0B4B162D477FED002D10DE /* Products */, + ); + sourceTree = ""; + }; + 1A0B4B162D477FED002D10DE /* Products */ = { + isa = PBXGroup; + children = ( + 1A0B4B152D477FED002D10DE /* libArtworkFeature.a */, + 1A0B4B242D477FFB002D10DE /* ArtworkFeatureInterface.framework */, + ); + name = Products; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 1A0B4B1F2D477FFB002D10DE /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 1A0B4B142D477FED002D10DE /* ArtworkFeature */ = { + isa = PBXNativeTarget; + buildConfigurationList = 1A0B4B1C2D477FED002D10DE /* Build configuration list for PBXNativeTarget "ArtworkFeature" */; + buildPhases = ( + 1A0B4B112D477FED002D10DE /* Sources */, + 1A0B4B122D477FED002D10DE /* Frameworks */, + 1A0B4B132D477FED002D10DE /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + ); + fileSystemSynchronizedGroups = ( + 1A0B4B172D477FED002D10DE /* ArtworkFeature */, + ); + name = ArtworkFeature; + packageProductDependencies = ( + ); + productName = ArtworkFeature; + productReference = 1A0B4B152D477FED002D10DE /* libArtworkFeature.a */; + productType = "com.apple.product-type.library.static"; + }; + 1A0B4B232D477FFB002D10DE /* ArtworkFeatureInterface */ = { + isa = PBXNativeTarget; + buildConfigurationList = 1A0B4B292D477FFB002D10DE /* Build configuration list for PBXNativeTarget "ArtworkFeatureInterface" */; + buildPhases = ( + 1A0B4B1F2D477FFB002D10DE /* Headers */, + 1A0B4B202D477FFB002D10DE /* Sources */, + 1A0B4B212D477FFB002D10DE /* Frameworks */, + 1A0B4B222D477FFB002D10DE /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + fileSystemSynchronizedGroups = ( + 1A0B4B252D477FFB002D10DE /* ArtworkFeatureInterface */, + ); + name = ArtworkFeatureInterface; + packageProductDependencies = ( + ); + productName = ArtworkFeatureInterface; + productReference = 1A0B4B242D477FFB002D10DE /* ArtworkFeatureInterface.framework */; + productType = "com.apple.product-type.framework"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 1A0B4B0D2D477FED002D10DE /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = 1; + LastSwiftUpdateCheck = 1600; + LastUpgradeCheck = 1600; + TargetAttributes = { + 1A0B4B142D477FED002D10DE = { + CreatedOnToolsVersion = 16.0; + }; + 1A0B4B232D477FFB002D10DE = { + CreatedOnToolsVersion = 16.0; + }; + }; + }; + buildConfigurationList = 1A0B4B102D477FED002D10DE /* Build configuration list for PBXProject "ArtworkFeature" */; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 1A0B4B0C2D477FED002D10DE; + minimizedProjectReferenceProxies = 1; + preferredProjectObjectVersion = 77; + productRefGroup = 1A0B4B162D477FED002D10DE /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 1A0B4B142D477FED002D10DE /* ArtworkFeature */, + 1A0B4B232D477FFB002D10DE /* ArtworkFeatureInterface */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 1A0B4B222D477FFB002D10DE /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 1A0B4B112D477FED002D10DE /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 1A0B4B202D477FFB002D10DE /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 1A0B4B1A2D477FED002D10DE /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + 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; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 18.0; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 1A0B4B1B2D477FED002D10DE /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + 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; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 18.0; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 1A0B4B1D2D477FED002D10DE /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + OTHER_LDFLAGS = "-ObjC"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 1A0B4B1E2D477FED002D10DE /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + OTHER_LDFLAGS = "-ObjC"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; + 1A0B4B2A2D477FFB002D10DE /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20"; + PRODUCT_BUNDLE_IDENTIFIER = kr.com.ArtworkFeatureInterface; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SKIP_INSTALL = YES; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_INSTALL_OBJC_HEADER = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 1A0B4B2B2D477FFB002D10DE /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20"; + PRODUCT_BUNDLE_IDENTIFIER = kr.com.ArtworkFeatureInterface; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SKIP_INSTALL = YES; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_INSTALL_OBJC_HEADER = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 1A0B4B102D477FED002D10DE /* Build configuration list for PBXProject "ArtworkFeature" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1A0B4B1A2D477FED002D10DE /* Debug */, + 1A0B4B1B2D477FED002D10DE /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 1A0B4B1C2D477FED002D10DE /* Build configuration list for PBXNativeTarget "ArtworkFeature" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1A0B4B1D2D477FED002D10DE /* Debug */, + 1A0B4B1E2D477FED002D10DE /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 1A0B4B292D477FFB002D10DE /* Build configuration list for PBXNativeTarget "ArtworkFeatureInterface" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1A0B4B2A2D477FFB002D10DE /* Debug */, + 1A0B4B2B2D477FFB002D10DE /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 1A0B4B0D2D477FED002D10DE /* Project object */; +} diff --git a/Features/ArtworkFeature/ArtworkFeature.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Features/ArtworkFeature/ArtworkFeature.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/Features/ArtworkFeature/ArtworkFeature.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Features/ArtworkFeature/ArtworkFeature/ArtworkFeature.swift b/Features/ArtworkFeature/ArtworkFeature/ArtworkFeature.swift new file mode 100644 index 0000000..53e5e56 --- /dev/null +++ b/Features/ArtworkFeature/ArtworkFeature/ArtworkFeature.swift @@ -0,0 +1,10 @@ +// +// ArtworkFeature.swift +// ArtworkFeature +// +// Created by Geon Woo lee on 1/27/25. +// + +class ArtworkFeature { + +} diff --git a/Features/ArtworkFeature/ArtworkFeatureInterface/ArtworkFeatureInterface.h b/Features/ArtworkFeature/ArtworkFeatureInterface/ArtworkFeatureInterface.h new file mode 100644 index 0000000..6ae4a2c --- /dev/null +++ b/Features/ArtworkFeature/ArtworkFeatureInterface/ArtworkFeatureInterface.h @@ -0,0 +1,18 @@ +// +// ArtworkFeatureInterface.h +// ArtworkFeatureInterface +// +// Created by Geon Woo lee on 1/27/25. +// + +#import + +//! Project version number for ArtworkFeatureInterface. +FOUNDATION_EXPORT double ArtworkFeatureInterfaceVersionNumber; + +//! Project version string for ArtworkFeatureInterface. +FOUNDATION_EXPORT const unsigned char ArtworkFeatureInterfaceVersionString[]; + +// In this header, you should import all the public headers of your framework using statements like #import + + diff --git a/Features/PostingFeature/PostingFeature.xcodeproj/project.pbxproj b/Features/PostingFeature/PostingFeature.xcodeproj/project.pbxproj new file mode 100644 index 0000000..c792315 --- /dev/null +++ b/Features/PostingFeature/PostingFeature.xcodeproj/project.pbxproj @@ -0,0 +1,472 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 77; + objects = { + +/* Begin PBXCopyFilesBuildPhase section */ + 1A0B4B332D478020002D10DE /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = "include/$(PRODUCT_NAME)"; + dstSubfolderSpec = 16; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 1A0B4B352D478020002D10DE /* libPostingFeature.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libPostingFeature.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 1A0B4B442D478032002D10DE /* PostingFeatureInterface.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = PostingFeatureInterface.framework; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */ + 1A0B4B482D478032002D10DE /* Exceptions for "PostingFeatureInterface" folder in "PostingFeatureInterface" target */ = { + isa = PBXFileSystemSynchronizedBuildFileExceptionSet; + publicHeaders = ( + PostingFeatureInterface.h, + ); + target = 1A0B4B432D478032002D10DE /* PostingFeatureInterface */; + }; +/* End PBXFileSystemSynchronizedBuildFileExceptionSet section */ + +/* Begin PBXFileSystemSynchronizedRootGroup section */ + 1A0B4B372D478020002D10DE /* PostingFeature */ = { + isa = PBXFileSystemSynchronizedRootGroup; + path = PostingFeature; + sourceTree = ""; + }; + 1A0B4B452D478032002D10DE /* PostingFeatureInterface */ = { + isa = PBXFileSystemSynchronizedRootGroup; + exceptions = ( + 1A0B4B482D478032002D10DE /* Exceptions for "PostingFeatureInterface" folder in "PostingFeatureInterface" target */, + ); + path = PostingFeatureInterface; + sourceTree = ""; + }; +/* End PBXFileSystemSynchronizedRootGroup section */ + +/* Begin PBXFrameworksBuildPhase section */ + 1A0B4B322D478020002D10DE /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 1A0B4B412D478032002D10DE /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 1A0B4B2C2D478020002D10DE = { + isa = PBXGroup; + children = ( + 1A0B4B372D478020002D10DE /* PostingFeature */, + 1A0B4B452D478032002D10DE /* PostingFeatureInterface */, + 1A0B4B362D478020002D10DE /* Products */, + ); + sourceTree = ""; + }; + 1A0B4B362D478020002D10DE /* Products */ = { + isa = PBXGroup; + children = ( + 1A0B4B352D478020002D10DE /* libPostingFeature.a */, + 1A0B4B442D478032002D10DE /* PostingFeatureInterface.framework */, + ); + name = Products; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 1A0B4B3F2D478032002D10DE /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 1A0B4B342D478020002D10DE /* PostingFeature */ = { + isa = PBXNativeTarget; + buildConfigurationList = 1A0B4B3C2D478020002D10DE /* Build configuration list for PBXNativeTarget "PostingFeature" */; + buildPhases = ( + 1A0B4B312D478020002D10DE /* Sources */, + 1A0B4B322D478020002D10DE /* Frameworks */, + 1A0B4B332D478020002D10DE /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + ); + fileSystemSynchronizedGroups = ( + 1A0B4B372D478020002D10DE /* PostingFeature */, + ); + name = PostingFeature; + packageProductDependencies = ( + ); + productName = PostingFeature; + productReference = 1A0B4B352D478020002D10DE /* libPostingFeature.a */; + productType = "com.apple.product-type.library.static"; + }; + 1A0B4B432D478032002D10DE /* PostingFeatureInterface */ = { + isa = PBXNativeTarget; + buildConfigurationList = 1A0B4B492D478032002D10DE /* Build configuration list for PBXNativeTarget "PostingFeatureInterface" */; + buildPhases = ( + 1A0B4B3F2D478032002D10DE /* Headers */, + 1A0B4B402D478032002D10DE /* Sources */, + 1A0B4B412D478032002D10DE /* Frameworks */, + 1A0B4B422D478032002D10DE /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + fileSystemSynchronizedGroups = ( + 1A0B4B452D478032002D10DE /* PostingFeatureInterface */, + ); + name = PostingFeatureInterface; + packageProductDependencies = ( + ); + productName = PostingFeatureInterface; + productReference = 1A0B4B442D478032002D10DE /* PostingFeatureInterface.framework */; + productType = "com.apple.product-type.framework"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 1A0B4B2D2D478020002D10DE /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = 1; + LastSwiftUpdateCheck = 1600; + LastUpgradeCheck = 1600; + TargetAttributes = { + 1A0B4B342D478020002D10DE = { + CreatedOnToolsVersion = 16.0; + }; + 1A0B4B432D478032002D10DE = { + CreatedOnToolsVersion = 16.0; + }; + }; + }; + buildConfigurationList = 1A0B4B302D478020002D10DE /* Build configuration list for PBXProject "PostingFeature" */; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 1A0B4B2C2D478020002D10DE; + minimizedProjectReferenceProxies = 1; + preferredProjectObjectVersion = 77; + productRefGroup = 1A0B4B362D478020002D10DE /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 1A0B4B342D478020002D10DE /* PostingFeature */, + 1A0B4B432D478032002D10DE /* PostingFeatureInterface */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 1A0B4B422D478032002D10DE /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 1A0B4B312D478020002D10DE /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 1A0B4B402D478032002D10DE /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 1A0B4B3A2D478020002D10DE /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + 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; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 18.0; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 1A0B4B3B2D478020002D10DE /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + 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; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 18.0; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 1A0B4B3D2D478020002D10DE /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + OTHER_LDFLAGS = "-ObjC"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 1A0B4B3E2D478020002D10DE /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + OTHER_LDFLAGS = "-ObjC"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; + 1A0B4B4A2D478032002D10DE /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20"; + PRODUCT_BUNDLE_IDENTIFIER = kr.com.PostingFeatureInterface; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SKIP_INSTALL = YES; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_INSTALL_OBJC_HEADER = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 1A0B4B4B2D478032002D10DE /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20"; + PRODUCT_BUNDLE_IDENTIFIER = kr.com.PostingFeatureInterface; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SKIP_INSTALL = YES; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_INSTALL_OBJC_HEADER = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 1A0B4B302D478020002D10DE /* Build configuration list for PBXProject "PostingFeature" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1A0B4B3A2D478020002D10DE /* Debug */, + 1A0B4B3B2D478020002D10DE /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 1A0B4B3C2D478020002D10DE /* Build configuration list for PBXNativeTarget "PostingFeature" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1A0B4B3D2D478020002D10DE /* Debug */, + 1A0B4B3E2D478020002D10DE /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 1A0B4B492D478032002D10DE /* Build configuration list for PBXNativeTarget "PostingFeatureInterface" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1A0B4B4A2D478032002D10DE /* Debug */, + 1A0B4B4B2D478032002D10DE /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 1A0B4B2D2D478020002D10DE /* Project object */; +} diff --git a/Features/PostingFeature/PostingFeature.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Features/PostingFeature/PostingFeature.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/Features/PostingFeature/PostingFeature.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Features/PostingFeature/PostingFeature/PostingFeature.swift b/Features/PostingFeature/PostingFeature/PostingFeature.swift new file mode 100644 index 0000000..0cb8f5a --- /dev/null +++ b/Features/PostingFeature/PostingFeature/PostingFeature.swift @@ -0,0 +1,10 @@ +// +// PostingFeature.swift +// PostingFeature +// +// Created by Geon Woo lee on 1/27/25. +// + +class PostingFeature { + +} diff --git a/Features/PostingFeature/PostingFeatureInterface/PostingFeatureInterface.h b/Features/PostingFeature/PostingFeatureInterface/PostingFeatureInterface.h new file mode 100644 index 0000000..11c0c81 --- /dev/null +++ b/Features/PostingFeature/PostingFeatureInterface/PostingFeatureInterface.h @@ -0,0 +1,18 @@ +// +// PostingFeatureInterface.h +// PostingFeatureInterface +// +// Created by Geon Woo lee on 1/27/25. +// + +#import + +//! Project version number for PostingFeatureInterface. +FOUNDATION_EXPORT double PostingFeatureInterfaceVersionNumber; + +//! Project version string for PostingFeatureInterface. +FOUNDATION_EXPORT const unsigned char PostingFeatureInterfaceVersionString[]; + +// In this header, you should import all the public headers of your framework using statements like #import + + diff --git a/ziine-app-ios.xcworkspace/contents.xcworkspacedata b/ziine-app-ios.xcworkspace/contents.xcworkspacedata index 9440652..5acba72 100644 --- a/ziine-app-ios.xcworkspace/contents.xcworkspacedata +++ b/ziine-app-ios.xcworkspace/contents.xcworkspacedata @@ -1,10 +1,28 @@ - - - - + + + + + + + + + + + + + + From 73db863325e923c663a83234ef36d0c2483cb593 Mon Sep 17 00:00:00 2001 From: GeonWoo Date: Mon, 27 Jan 2025 23:23:12 +0900 Subject: [PATCH 02/21] #2 add feature interface --- App/ZiineApp.xcodeproj/project.pbxproj | 4 + .../xcshareddata/xcschemes/ZiineApp.xcscheme | 78 +++++++ Core/DesignSystem.xcodeproj/project.pbxproj | 1 + .../ArtworkFeature.xcodeproj/project.pbxproj | 191 ++++++++++------- .../xcschemes/ArtworkFeature.xcscheme | 67 ++++++ .../ArtworkFeature/ArtworkFeature.h | 18 ++ .../ArtworkFeature/ArtworkFeature.swift | 10 - .../PostingFeature.xcodeproj/project.pbxproj | 194 +++++++++++------- .../PostingFeature/PostingFeature.swift | 10 - .../PostingFeature/PostingFeature2.swift | 10 + 10 files changed, 419 insertions(+), 164 deletions(-) create mode 100644 App/ZiineApp.xcodeproj/xcshareddata/xcschemes/ZiineApp.xcscheme create mode 100644 Features/ArtworkFeature/ArtworkFeature.xcodeproj/xcshareddata/xcschemes/ArtworkFeature.xcscheme create mode 100644 Features/ArtworkFeature/ArtworkFeature/ArtworkFeature.h delete mode 100644 Features/ArtworkFeature/ArtworkFeature/ArtworkFeature.swift delete mode 100644 Features/PostingFeature/PostingFeature/PostingFeature.swift create mode 100644 Features/PostingFeature/PostingFeature/PostingFeature2.swift diff --git a/App/ZiineApp.xcodeproj/project.pbxproj b/App/ZiineApp.xcodeproj/project.pbxproj index d74c455..8bb180c 100644 --- a/App/ZiineApp.xcodeproj/project.pbxproj +++ b/App/ZiineApp.xcodeproj/project.pbxproj @@ -28,6 +28,8 @@ /* Begin PBXFileReference section */ 1A95D5952D44BF16008B7DEA /* ZiineApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ZiineApp.app; sourceTree = BUILT_PRODUCTS_DIR; }; 1A95D61A2D44CA00008B7DEA /* DesignSystem.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = DesignSystem.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 1A9648122D47826200268B29 /* ArtworkFeatureInterface.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = ArtworkFeatureInterface.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 1A9648132D47826200268B29 /* libArtworkFeature.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; path = libArtworkFeature.a; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */ @@ -83,6 +85,8 @@ 1A95D6192D44CA00008B7DEA /* Frameworks */ = { isa = PBXGroup; children = ( + 1A9648122D47826200268B29 /* ArtworkFeatureInterface.framework */, + 1A9648132D47826200268B29 /* libArtworkFeature.a */, 1A95D61A2D44CA00008B7DEA /* DesignSystem.framework */, ); name = Frameworks; diff --git a/App/ZiineApp.xcodeproj/xcshareddata/xcschemes/ZiineApp.xcscheme b/App/ZiineApp.xcodeproj/xcshareddata/xcschemes/ZiineApp.xcscheme new file mode 100644 index 0000000..3f4b318 --- /dev/null +++ b/App/ZiineApp.xcodeproj/xcshareddata/xcschemes/ZiineApp.xcscheme @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Core/DesignSystem.xcodeproj/project.pbxproj b/Core/DesignSystem.xcodeproj/project.pbxproj index eeff27b..4ed5de0 100644 --- a/Core/DesignSystem.xcodeproj/project.pbxproj +++ b/Core/DesignSystem.xcodeproj/project.pbxproj @@ -101,6 +101,7 @@ isa = PBXProject; attributes = { BuildIndependentTargetsInParallel = 1; + LastSwiftUpdateCheck = 1600; LastUpgradeCheck = 1600; TargetAttributes = { 1A95D5FC2D44C6CE008B7DEA = { diff --git a/Features/ArtworkFeature/ArtworkFeature.xcodeproj/project.pbxproj b/Features/ArtworkFeature/ArtworkFeature.xcodeproj/project.pbxproj index dca9106..23ccbcf 100644 --- a/Features/ArtworkFeature/ArtworkFeature.xcodeproj/project.pbxproj +++ b/Features/ArtworkFeature/ArtworkFeature.xcodeproj/project.pbxproj @@ -6,21 +6,9 @@ objectVersion = 77; objects = { -/* Begin PBXCopyFilesBuildPhase section */ - 1A0B4B132D477FED002D10DE /* CopyFiles */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = "include/$(PRODUCT_NAME)"; - dstSubfolderSpec = 16; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXCopyFilesBuildPhase section */ - /* Begin PBXFileReference section */ - 1A0B4B152D477FED002D10DE /* libArtworkFeature.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libArtworkFeature.a; sourceTree = BUILT_PRODUCTS_DIR; }; 1A0B4B242D477FFB002D10DE /* ArtworkFeatureInterface.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ArtworkFeatureInterface.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 1A9648D52D47CD7700268B29 /* ArtworkFeature.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ArtworkFeature.framework; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */ @@ -31,14 +19,16 @@ ); target = 1A0B4B232D477FFB002D10DE /* ArtworkFeatureInterface */; }; + 1A9648D92D47CD7700268B29 /* Exceptions for "ArtworkFeature" folder in "ArtworkFeature" target */ = { + isa = PBXFileSystemSynchronizedBuildFileExceptionSet; + publicHeaders = ( + ArtworkFeature.h, + ); + target = 1A9648D42D47CD7700268B29 /* ArtworkFeature */; + }; /* End PBXFileSystemSynchronizedBuildFileExceptionSet section */ /* Begin PBXFileSystemSynchronizedRootGroup section */ - 1A0B4B172D477FED002D10DE /* ArtworkFeature */ = { - isa = PBXFileSystemSynchronizedRootGroup; - path = ArtworkFeature; - sourceTree = ""; - }; 1A0B4B252D477FFB002D10DE /* ArtworkFeatureInterface */ = { isa = PBXFileSystemSynchronizedRootGroup; exceptions = ( @@ -47,17 +37,25 @@ path = ArtworkFeatureInterface; sourceTree = ""; }; + 1A9648D62D47CD7700268B29 /* ArtworkFeature */ = { + isa = PBXFileSystemSynchronizedRootGroup; + exceptions = ( + 1A9648D92D47CD7700268B29 /* Exceptions for "ArtworkFeature" folder in "ArtworkFeature" target */, + ); + path = ArtworkFeature; + sourceTree = ""; + }; /* End PBXFileSystemSynchronizedRootGroup section */ /* Begin PBXFrameworksBuildPhase section */ - 1A0B4B122D477FED002D10DE /* Frameworks */ = { + 1A0B4B212D477FFB002D10DE /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - 1A0B4B212D477FFB002D10DE /* Frameworks */ = { + 1A9648D22D47CD7700268B29 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( @@ -70,8 +68,8 @@ 1A0B4B0C2D477FED002D10DE = { isa = PBXGroup; children = ( - 1A0B4B172D477FED002D10DE /* ArtworkFeature */, 1A0B4B252D477FFB002D10DE /* ArtworkFeatureInterface */, + 1A9648D62D47CD7700268B29 /* ArtworkFeature */, 1A0B4B162D477FED002D10DE /* Products */, ); sourceTree = ""; @@ -79,8 +77,8 @@ 1A0B4B162D477FED002D10DE /* Products */ = { isa = PBXGroup; children = ( - 1A0B4B152D477FED002D10DE /* libArtworkFeature.a */, 1A0B4B242D477FFB002D10DE /* ArtworkFeatureInterface.framework */, + 1A9648D52D47CD7700268B29 /* ArtworkFeature.framework */, ); name = Products; sourceTree = ""; @@ -95,52 +93,60 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 1A9648D02D47CD7700268B29 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ - 1A0B4B142D477FED002D10DE /* ArtworkFeature */ = { + 1A0B4B232D477FFB002D10DE /* ArtworkFeatureInterface */ = { isa = PBXNativeTarget; - buildConfigurationList = 1A0B4B1C2D477FED002D10DE /* Build configuration list for PBXNativeTarget "ArtworkFeature" */; + buildConfigurationList = 1A0B4B292D477FFB002D10DE /* Build configuration list for PBXNativeTarget "ArtworkFeatureInterface" */; buildPhases = ( - 1A0B4B112D477FED002D10DE /* Sources */, - 1A0B4B122D477FED002D10DE /* Frameworks */, - 1A0B4B132D477FED002D10DE /* CopyFiles */, + 1A0B4B1F2D477FFB002D10DE /* Headers */, + 1A0B4B202D477FFB002D10DE /* Sources */, + 1A0B4B212D477FFB002D10DE /* Frameworks */, + 1A0B4B222D477FFB002D10DE /* Resources */, ); buildRules = ( ); dependencies = ( ); fileSystemSynchronizedGroups = ( - 1A0B4B172D477FED002D10DE /* ArtworkFeature */, + 1A0B4B252D477FFB002D10DE /* ArtworkFeatureInterface */, ); - name = ArtworkFeature; + name = ArtworkFeatureInterface; packageProductDependencies = ( ); - productName = ArtworkFeature; - productReference = 1A0B4B152D477FED002D10DE /* libArtworkFeature.a */; - productType = "com.apple.product-type.library.static"; + productName = ArtworkFeatureInterface; + productReference = 1A0B4B242D477FFB002D10DE /* ArtworkFeatureInterface.framework */; + productType = "com.apple.product-type.framework"; }; - 1A0B4B232D477FFB002D10DE /* ArtworkFeatureInterface */ = { + 1A9648D42D47CD7700268B29 /* ArtworkFeature */ = { isa = PBXNativeTarget; - buildConfigurationList = 1A0B4B292D477FFB002D10DE /* Build configuration list for PBXNativeTarget "ArtworkFeatureInterface" */; + buildConfigurationList = 1A9648DA2D47CD7700268B29 /* Build configuration list for PBXNativeTarget "ArtworkFeature" */; buildPhases = ( - 1A0B4B1F2D477FFB002D10DE /* Headers */, - 1A0B4B202D477FFB002D10DE /* Sources */, - 1A0B4B212D477FFB002D10DE /* Frameworks */, - 1A0B4B222D477FFB002D10DE /* Resources */, + 1A9648D02D47CD7700268B29 /* Headers */, + 1A9648D12D47CD7700268B29 /* Sources */, + 1A9648D22D47CD7700268B29 /* Frameworks */, + 1A9648D32D47CD7700268B29 /* Resources */, ); buildRules = ( ); dependencies = ( ); fileSystemSynchronizedGroups = ( - 1A0B4B252D477FFB002D10DE /* ArtworkFeatureInterface */, + 1A9648D62D47CD7700268B29 /* ArtworkFeature */, ); - name = ArtworkFeatureInterface; + name = ArtworkFeature; packageProductDependencies = ( ); - productName = ArtworkFeatureInterface; - productReference = 1A0B4B242D477FFB002D10DE /* ArtworkFeatureInterface.framework */; + productName = ArtworkFeature; + productReference = 1A9648D52D47CD7700268B29 /* ArtworkFeature.framework */; productType = "com.apple.product-type.framework"; }; /* End PBXNativeTarget section */ @@ -153,10 +159,10 @@ LastSwiftUpdateCheck = 1600; LastUpgradeCheck = 1600; TargetAttributes = { - 1A0B4B142D477FED002D10DE = { + 1A0B4B232D477FFB002D10DE = { CreatedOnToolsVersion = 16.0; }; - 1A0B4B232D477FFB002D10DE = { + 1A9648D42D47CD7700268B29 = { CreatedOnToolsVersion = 16.0; }; }; @@ -175,8 +181,8 @@ projectDirPath = ""; projectRoot = ""; targets = ( - 1A0B4B142D477FED002D10DE /* ArtworkFeature */, 1A0B4B232D477FFB002D10DE /* ArtworkFeatureInterface */, + 1A9648D42D47CD7700268B29 /* ArtworkFeature */, ); }; /* End PBXProject section */ @@ -189,17 +195,24 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 1A9648D32D47CD7700268B29 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ - 1A0B4B112D477FED002D10DE /* Sources */ = { + 1A0B4B202D477FFB002D10DE /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - 1A0B4B202D477FFB002D10DE /* Sources */ = { + 1A9648D12D47CD7700268B29 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( @@ -328,39 +341,83 @@ }; name = Release; }; - 1A0B4B1D2D477FED002D10DE /* Debug */ = { + 1A0B4B2A2D477FFB002D10DE /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; CODE_SIGN_STYLE = Automatic; - OTHER_LDFLAGS = "-ObjC"; - PRODUCT_NAME = "$(TARGET_NAME)"; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20"; + PRODUCT_BUNDLE_IDENTIFIER = kr.com.ArtworkFeatureInterface; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SKIP_INSTALL = YES; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTS_MACCATALYST = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_INSTALL_OBJC_HEADER = NO; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; }; name = Debug; }; - 1A0B4B1E2D477FED002D10DE /* Release */ = { + 1A0B4B2B2D477FFB002D10DE /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; CODE_SIGN_STYLE = Automatic; - OTHER_LDFLAGS = "-ObjC"; - PRODUCT_NAME = "$(TARGET_NAME)"; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20"; + PRODUCT_BUNDLE_IDENTIFIER = kr.com.ArtworkFeatureInterface; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SKIP_INSTALL = YES; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTS_MACCATALYST = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_INSTALL_OBJC_HEADER = NO; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; }; name = Release; }; - 1A0B4B2A2D477FFB002D10DE /* Debug */ = { + 1A9648DB2D47CD7700268B29 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { BUILD_LIBRARY_FOR_DISTRIBUTION = YES; @@ -382,13 +439,9 @@ MARKETING_VERSION = 1.0; MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20"; - PRODUCT_BUNDLE_IDENTIFIER = kr.com.ArtworkFeatureInterface; + PRODUCT_BUNDLE_IDENTIFIER = kr.com.ArtworkFeature; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SKIP_INSTALL = YES; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - SUPPORTS_MACCATALYST = NO; - SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; - SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_INSTALL_OBJC_HEADER = NO; SWIFT_VERSION = 5.0; @@ -398,7 +451,7 @@ }; name = Debug; }; - 1A0B4B2B2D477FFB002D10DE /* Release */ = { + 1A9648DC2D47CD7700268B29 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { BUILD_LIBRARY_FOR_DISTRIBUTION = YES; @@ -420,13 +473,9 @@ MARKETING_VERSION = 1.0; MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20"; - PRODUCT_BUNDLE_IDENTIFIER = kr.com.ArtworkFeatureInterface; + PRODUCT_BUNDLE_IDENTIFIER = kr.com.ArtworkFeature; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SKIP_INSTALL = YES; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - SUPPORTS_MACCATALYST = NO; - SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; - SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_INSTALL_OBJC_HEADER = NO; SWIFT_VERSION = 5.0; @@ -448,20 +497,20 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 1A0B4B1C2D477FED002D10DE /* Build configuration list for PBXNativeTarget "ArtworkFeature" */ = { + 1A0B4B292D477FFB002D10DE /* Build configuration list for PBXNativeTarget "ArtworkFeatureInterface" */ = { isa = XCConfigurationList; buildConfigurations = ( - 1A0B4B1D2D477FED002D10DE /* Debug */, - 1A0B4B1E2D477FED002D10DE /* Release */, + 1A0B4B2A2D477FFB002D10DE /* Debug */, + 1A0B4B2B2D477FFB002D10DE /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 1A0B4B292D477FFB002D10DE /* Build configuration list for PBXNativeTarget "ArtworkFeatureInterface" */ = { + 1A9648DA2D47CD7700268B29 /* Build configuration list for PBXNativeTarget "ArtworkFeature" */ = { isa = XCConfigurationList; buildConfigurations = ( - 1A0B4B2A2D477FFB002D10DE /* Debug */, - 1A0B4B2B2D477FFB002D10DE /* Release */, + 1A9648DB2D47CD7700268B29 /* Debug */, + 1A9648DC2D47CD7700268B29 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; diff --git a/Features/ArtworkFeature/ArtworkFeature.xcodeproj/xcshareddata/xcschemes/ArtworkFeature.xcscheme b/Features/ArtworkFeature/ArtworkFeature.xcodeproj/xcshareddata/xcschemes/ArtworkFeature.xcscheme new file mode 100644 index 0000000..b21f9d2 --- /dev/null +++ b/Features/ArtworkFeature/ArtworkFeature.xcodeproj/xcshareddata/xcschemes/ArtworkFeature.xcscheme @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Features/ArtworkFeature/ArtworkFeature/ArtworkFeature.h b/Features/ArtworkFeature/ArtworkFeature/ArtworkFeature.h new file mode 100644 index 0000000..fcef608 --- /dev/null +++ b/Features/ArtworkFeature/ArtworkFeature/ArtworkFeature.h @@ -0,0 +1,18 @@ +// +// ArtworkFeature.h +// ArtworkFeature +// +// Created by Geon Woo lee on 1/27/25. +// + +#import + +//! Project version number for ArtworkFeature. +FOUNDATION_EXPORT double ArtworkFeatureVersionNumber; + +//! Project version string for ArtworkFeature. +FOUNDATION_EXPORT const unsigned char ArtworkFeatureVersionString[]; + +// In this header, you should import all the public headers of your framework using statements like #import + + diff --git a/Features/ArtworkFeature/ArtworkFeature/ArtworkFeature.swift b/Features/ArtworkFeature/ArtworkFeature/ArtworkFeature.swift deleted file mode 100644 index 53e5e56..0000000 --- a/Features/ArtworkFeature/ArtworkFeature/ArtworkFeature.swift +++ /dev/null @@ -1,10 +0,0 @@ -// -// ArtworkFeature.swift -// ArtworkFeature -// -// Created by Geon Woo lee on 1/27/25. -// - -class ArtworkFeature { - -} diff --git a/Features/PostingFeature/PostingFeature.xcodeproj/project.pbxproj b/Features/PostingFeature/PostingFeature.xcodeproj/project.pbxproj index c792315..5f36655 100644 --- a/Features/PostingFeature/PostingFeature.xcodeproj/project.pbxproj +++ b/Features/PostingFeature/PostingFeature.xcodeproj/project.pbxproj @@ -6,21 +6,10 @@ objectVersion = 77; objects = { -/* Begin PBXCopyFilesBuildPhase section */ - 1A0B4B332D478020002D10DE /* CopyFiles */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = "include/$(PRODUCT_NAME)"; - dstSubfolderSpec = 16; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXCopyFilesBuildPhase section */ - /* Begin PBXFileReference section */ - 1A0B4B352D478020002D10DE /* libPostingFeature.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libPostingFeature.a; sourceTree = BUILT_PRODUCTS_DIR; }; 1A0B4B442D478032002D10DE /* PostingFeatureInterface.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = PostingFeatureInterface.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 1A9648182D47827300268B29 /* libArtworkFeature.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; path = libArtworkFeature.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 1A96481F2D4783E600268B29 /* PostingFeature.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = PostingFeature.framework; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */ @@ -34,11 +23,6 @@ /* End PBXFileSystemSynchronizedBuildFileExceptionSet section */ /* Begin PBXFileSystemSynchronizedRootGroup section */ - 1A0B4B372D478020002D10DE /* PostingFeature */ = { - isa = PBXFileSystemSynchronizedRootGroup; - path = PostingFeature; - sourceTree = ""; - }; 1A0B4B452D478032002D10DE /* PostingFeatureInterface */ = { isa = PBXFileSystemSynchronizedRootGroup; exceptions = ( @@ -47,17 +31,22 @@ path = PostingFeatureInterface; sourceTree = ""; }; + 1A9648592D4784A800268B29 /* PostingFeature */ = { + isa = PBXFileSystemSynchronizedRootGroup; + path = PostingFeature; + sourceTree = ""; + }; /* End PBXFileSystemSynchronizedRootGroup section */ /* Begin PBXFrameworksBuildPhase section */ - 1A0B4B322D478020002D10DE /* Frameworks */ = { + 1A0B4B412D478032002D10DE /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - 1A0B4B412D478032002D10DE /* Frameworks */ = { + 1A96481C2D4783E600268B29 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( @@ -70,8 +59,9 @@ 1A0B4B2C2D478020002D10DE = { isa = PBXGroup; children = ( - 1A0B4B372D478020002D10DE /* PostingFeature */, 1A0B4B452D478032002D10DE /* PostingFeatureInterface */, + 1A9648592D4784A800268B29 /* PostingFeature */, + 1A9648172D47827300268B29 /* Frameworks */, 1A0B4B362D478020002D10DE /* Products */, ); sourceTree = ""; @@ -79,12 +69,20 @@ 1A0B4B362D478020002D10DE /* Products */ = { isa = PBXGroup; children = ( - 1A0B4B352D478020002D10DE /* libPostingFeature.a */, 1A0B4B442D478032002D10DE /* PostingFeatureInterface.framework */, + 1A96481F2D4783E600268B29 /* PostingFeature.framework */, ); name = Products; sourceTree = ""; }; + 1A9648172D47827300268B29 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 1A9648182D47827300268B29 /* libArtworkFeature.a */, + ); + name = Frameworks; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ @@ -95,31 +93,16 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 1A96481A2D4783E600268B29 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ - 1A0B4B342D478020002D10DE /* PostingFeature */ = { - isa = PBXNativeTarget; - buildConfigurationList = 1A0B4B3C2D478020002D10DE /* Build configuration list for PBXNativeTarget "PostingFeature" */; - buildPhases = ( - 1A0B4B312D478020002D10DE /* Sources */, - 1A0B4B322D478020002D10DE /* Frameworks */, - 1A0B4B332D478020002D10DE /* CopyFiles */, - ); - buildRules = ( - ); - dependencies = ( - ); - fileSystemSynchronizedGroups = ( - 1A0B4B372D478020002D10DE /* PostingFeature */, - ); - name = PostingFeature; - packageProductDependencies = ( - ); - productName = PostingFeature; - productReference = 1A0B4B352D478020002D10DE /* libPostingFeature.a */; - productType = "com.apple.product-type.library.static"; - }; 1A0B4B432D478032002D10DE /* PostingFeatureInterface */ = { isa = PBXNativeTarget; buildConfigurationList = 1A0B4B492D478032002D10DE /* Build configuration list for PBXNativeTarget "PostingFeatureInterface" */; @@ -143,6 +126,26 @@ productReference = 1A0B4B442D478032002D10DE /* PostingFeatureInterface.framework */; productType = "com.apple.product-type.framework"; }; + 1A96481E2D4783E600268B29 /* PostingFeature */ = { + isa = PBXNativeTarget; + buildConfigurationList = 1A9648242D4783E600268B29 /* Build configuration list for PBXNativeTarget "PostingFeature" */; + buildPhases = ( + 1A96481A2D4783E600268B29 /* Headers */, + 1A96481B2D4783E600268B29 /* Sources */, + 1A96481C2D4783E600268B29 /* Frameworks */, + 1A96481D2D4783E600268B29 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = PostingFeature; + packageProductDependencies = ( + ); + productName = PostingFeature; + productReference = 1A96481F2D4783E600268B29 /* PostingFeature.framework */; + productType = "com.apple.product-type.framework"; + }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ @@ -153,10 +156,10 @@ LastSwiftUpdateCheck = 1600; LastUpgradeCheck = 1600; TargetAttributes = { - 1A0B4B342D478020002D10DE = { + 1A0B4B432D478032002D10DE = { CreatedOnToolsVersion = 16.0; }; - 1A0B4B432D478032002D10DE = { + 1A96481E2D4783E600268B29 = { CreatedOnToolsVersion = 16.0; }; }; @@ -175,8 +178,8 @@ projectDirPath = ""; projectRoot = ""; targets = ( - 1A0B4B342D478020002D10DE /* PostingFeature */, 1A0B4B432D478032002D10DE /* PostingFeatureInterface */, + 1A96481E2D4783E600268B29 /* PostingFeature */, ); }; /* End PBXProject section */ @@ -189,17 +192,24 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + 1A96481D2D4783E600268B29 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ - 1A0B4B312D478020002D10DE /* Sources */ = { + 1A0B4B402D478032002D10DE /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - 1A0B4B402D478032002D10DE /* Sources */ = { + 1A96481B2D4783E600268B29 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( @@ -263,6 +273,7 @@ GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 18.0; LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MACH_O_TYPE = mh_dylib; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; @@ -320,6 +331,7 @@ GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 18.0; LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MACH_O_TYPE = mh_dylib; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; SDKROOT = iphoneos; @@ -328,39 +340,83 @@ }; name = Release; }; - 1A0B4B3D2D478020002D10DE /* Debug */ = { + 1A0B4B4A2D478032002D10DE /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; CODE_SIGN_STYLE = Automatic; - OTHER_LDFLAGS = "-ObjC"; - PRODUCT_NAME = "$(TARGET_NAME)"; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20"; + PRODUCT_BUNDLE_IDENTIFIER = kr.com.PostingFeatureInterface; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SKIP_INSTALL = YES; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTS_MACCATALYST = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_INSTALL_OBJC_HEADER = NO; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; }; name = Debug; }; - 1A0B4B3E2D478020002D10DE /* Release */ = { + 1A0B4B4B2D478032002D10DE /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; CODE_SIGN_STYLE = Automatic; - OTHER_LDFLAGS = "-ObjC"; - PRODUCT_NAME = "$(TARGET_NAME)"; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20"; + PRODUCT_BUNDLE_IDENTIFIER = kr.com.PostingFeatureInterface; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SKIP_INSTALL = YES; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; SUPPORTS_MACCATALYST = NO; SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_INSTALL_OBJC_HEADER = NO; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; }; name = Release; }; - 1A0B4B4A2D478032002D10DE /* Debug */ = { + 1A9648252D4783E600268B29 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { BUILD_LIBRARY_FOR_DISTRIBUTION = YES; @@ -382,13 +438,9 @@ MARKETING_VERSION = 1.0; MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20"; - PRODUCT_BUNDLE_IDENTIFIER = kr.com.PostingFeatureInterface; + PRODUCT_BUNDLE_IDENTIFIER = kr.com.PostingFeature; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SKIP_INSTALL = YES; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - SUPPORTS_MACCATALYST = NO; - SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; - SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_INSTALL_OBJC_HEADER = NO; SWIFT_VERSION = 5.0; @@ -398,7 +450,7 @@ }; name = Debug; }; - 1A0B4B4B2D478032002D10DE /* Release */ = { + 1A9648262D4783E600268B29 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { BUILD_LIBRARY_FOR_DISTRIBUTION = YES; @@ -420,13 +472,9 @@ MARKETING_VERSION = 1.0; MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20"; - PRODUCT_BUNDLE_IDENTIFIER = kr.com.PostingFeatureInterface; + PRODUCT_BUNDLE_IDENTIFIER = kr.com.PostingFeature; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SKIP_INSTALL = YES; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - SUPPORTS_MACCATALYST = NO; - SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; - SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_INSTALL_OBJC_HEADER = NO; SWIFT_VERSION = 5.0; @@ -448,20 +496,20 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 1A0B4B3C2D478020002D10DE /* Build configuration list for PBXNativeTarget "PostingFeature" */ = { + 1A0B4B492D478032002D10DE /* Build configuration list for PBXNativeTarget "PostingFeatureInterface" */ = { isa = XCConfigurationList; buildConfigurations = ( - 1A0B4B3D2D478020002D10DE /* Debug */, - 1A0B4B3E2D478020002D10DE /* Release */, + 1A0B4B4A2D478032002D10DE /* Debug */, + 1A0B4B4B2D478032002D10DE /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 1A0B4B492D478032002D10DE /* Build configuration list for PBXNativeTarget "PostingFeatureInterface" */ = { + 1A9648242D4783E600268B29 /* Build configuration list for PBXNativeTarget "PostingFeature" */ = { isa = XCConfigurationList; buildConfigurations = ( - 1A0B4B4A2D478032002D10DE /* Debug */, - 1A0B4B4B2D478032002D10DE /* Release */, + 1A9648252D4783E600268B29 /* Debug */, + 1A9648262D4783E600268B29 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; diff --git a/Features/PostingFeature/PostingFeature/PostingFeature.swift b/Features/PostingFeature/PostingFeature/PostingFeature.swift deleted file mode 100644 index 0cb8f5a..0000000 --- a/Features/PostingFeature/PostingFeature/PostingFeature.swift +++ /dev/null @@ -1,10 +0,0 @@ -// -// PostingFeature.swift -// PostingFeature -// -// Created by Geon Woo lee on 1/27/25. -// - -class PostingFeature { - -} diff --git a/Features/PostingFeature/PostingFeature/PostingFeature2.swift b/Features/PostingFeature/PostingFeature/PostingFeature2.swift new file mode 100644 index 0000000..d7991b0 --- /dev/null +++ b/Features/PostingFeature/PostingFeature/PostingFeature2.swift @@ -0,0 +1,10 @@ +// +// PostingFeature2.swift +// PostingFeature2 +// +// Created by Geon Woo lee on 1/27/25. +// + +class PostingFeature2 { + +} From 7f486a6a710d3620509e162b2ef699b176ec5c0b Mon Sep 17 00:00:00 2001 From: GeonWoo Date: Tue, 28 Jan 2025 01:54:14 +0900 Subject: [PATCH 03/21] #2 added artwork rib --- App/ZiineApp.xcodeproj/project.pbxproj | 30 ++++++++ .../ArtworkFeature.xcodeproj/project.pbxproj | 68 +++++++++++++++++++ .../Source/ArtworkViewController.swift | 18 +++++ .../PostingFeature.xcodeproj/project.pbxproj | 54 +++++++++++++++ 4 files changed, 170 insertions(+) create mode 100644 Features/ArtworkFeature/ArtworkFeature/Source/ArtworkViewController.swift diff --git a/App/ZiineApp.xcodeproj/project.pbxproj b/App/ZiineApp.xcodeproj/project.pbxproj index 8bb180c..5c24945 100644 --- a/App/ZiineApp.xcodeproj/project.pbxproj +++ b/App/ZiineApp.xcodeproj/project.pbxproj @@ -9,6 +9,16 @@ /* Begin PBXBuildFile section */ 1A95D61B2D44CA00008B7DEA /* DesignSystem.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1A95D61A2D44CA00008B7DEA /* DesignSystem.framework */; }; 1A95D61C2D44CA00008B7DEA /* DesignSystem.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 1A95D61A2D44CA00008B7DEA /* DesignSystem.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 1A9648F72D47CFFB00268B29 /* ArtworkFeature.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1A9648F22D47CFFB00268B29 /* ArtworkFeature.framework */; }; + 1A9648F82D47CFFB00268B29 /* ArtworkFeature.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 1A9648F22D47CFFB00268B29 /* ArtworkFeature.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 1A9648F92D47CFFB00268B29 /* ArtworkFeatureInterface.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1A9648F32D47CFFB00268B29 /* ArtworkFeatureInterface.framework */; }; + 1A9648FA2D47CFFB00268B29 /* ArtworkFeatureInterface.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 1A9648F32D47CFFB00268B29 /* ArtworkFeatureInterface.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 1A9648FB2D47CFFB00268B29 /* DesignSystem.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1A9648F42D47CFFB00268B29 /* DesignSystem.framework */; }; + 1A9648FC2D47CFFB00268B29 /* DesignSystem.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 1A9648F42D47CFFB00268B29 /* DesignSystem.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 1A9648FD2D47CFFB00268B29 /* PostingFeature.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1A9648F52D47CFFB00268B29 /* PostingFeature.framework */; }; + 1A9648FE2D47CFFB00268B29 /* PostingFeature.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 1A9648F52D47CFFB00268B29 /* PostingFeature.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 1A9648FF2D47CFFB00268B29 /* PostingFeatureInterface.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1A9648F62D47CFFB00268B29 /* PostingFeatureInterface.framework */; }; + 1A9649002D47CFFB00268B29 /* PostingFeatureInterface.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 1A9648F62D47CFFB00268B29 /* PostingFeatureInterface.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -18,7 +28,12 @@ dstPath = ""; dstSubfolderSpec = 10; files = ( + 1A9649002D47CFFB00268B29 /* PostingFeatureInterface.framework in Embed Frameworks */, + 1A9648F82D47CFFB00268B29 /* ArtworkFeature.framework in Embed Frameworks */, + 1A9648FC2D47CFFB00268B29 /* DesignSystem.framework in Embed Frameworks */, 1A95D61C2D44CA00008B7DEA /* DesignSystem.framework in Embed Frameworks */, + 1A9648FE2D47CFFB00268B29 /* PostingFeature.framework in Embed Frameworks */, + 1A9648FA2D47CFFB00268B29 /* ArtworkFeatureInterface.framework in Embed Frameworks */, ); name = "Embed Frameworks"; runOnlyForDeploymentPostprocessing = 0; @@ -30,6 +45,11 @@ 1A95D61A2D44CA00008B7DEA /* DesignSystem.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = DesignSystem.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 1A9648122D47826200268B29 /* ArtworkFeatureInterface.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = ArtworkFeatureInterface.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 1A9648132D47826200268B29 /* libArtworkFeature.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; path = libArtworkFeature.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 1A9648F22D47CFFB00268B29 /* ArtworkFeature.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = ArtworkFeature.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 1A9648F32D47CFFB00268B29 /* ArtworkFeatureInterface.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = ArtworkFeatureInterface.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 1A9648F42D47CFFB00268B29 /* DesignSystem.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = DesignSystem.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 1A9648F52D47CFFB00268B29 /* PostingFeature.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = PostingFeature.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 1A9648F62D47CFFB00268B29 /* PostingFeatureInterface.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = PostingFeatureInterface.framework; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */ @@ -58,7 +78,12 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 1A9648FF2D47CFFB00268B29 /* PostingFeatureInterface.framework in Frameworks */, + 1A9648F72D47CFFB00268B29 /* ArtworkFeature.framework in Frameworks */, + 1A9648FB2D47CFFB00268B29 /* DesignSystem.framework in Frameworks */, 1A95D61B2D44CA00008B7DEA /* DesignSystem.framework in Frameworks */, + 1A9648FD2D47CFFB00268B29 /* PostingFeature.framework in Frameworks */, + 1A9648F92D47CFFB00268B29 /* ArtworkFeatureInterface.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -85,6 +110,11 @@ 1A95D6192D44CA00008B7DEA /* Frameworks */ = { isa = PBXGroup; children = ( + 1A9648F22D47CFFB00268B29 /* ArtworkFeature.framework */, + 1A9648F32D47CFFB00268B29 /* ArtworkFeatureInterface.framework */, + 1A9648F42D47CFFB00268B29 /* DesignSystem.framework */, + 1A9648F52D47CFFB00268B29 /* PostingFeature.framework */, + 1A9648F62D47CFFB00268B29 /* PostingFeatureInterface.framework */, 1A9648122D47826200268B29 /* ArtworkFeatureInterface.framework */, 1A9648132D47826200268B29 /* libArtworkFeature.a */, 1A95D61A2D44CA00008B7DEA /* DesignSystem.framework */, diff --git a/Features/ArtworkFeature/ArtworkFeature.xcodeproj/project.pbxproj b/Features/ArtworkFeature/ArtworkFeature.xcodeproj/project.pbxproj index 23ccbcf..c27502c 100644 --- a/Features/ArtworkFeature/ArtworkFeature.xcodeproj/project.pbxproj +++ b/Features/ArtworkFeature/ArtworkFeature.xcodeproj/project.pbxproj @@ -6,9 +6,43 @@ objectVersion = 77; objects = { +/* Begin PBXBuildFile section */ + 1A9648E22D47CF7100268B29 /* ArtworkFeatureInterface.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1A0B4B242D477FFB002D10DE /* ArtworkFeatureInterface.framework */; }; + 1A9648E32D47CF7100268B29 /* ArtworkFeatureInterface.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 1A0B4B242D477FFB002D10DE /* ArtworkFeatureInterface.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 1A9648ED2D47CF9C00268B29 /* DesignSystem.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1A9648EC2D47CF9C00268B29 /* DesignSystem.framework */; }; + 1A9648EE2D47CF9C00268B29 /* DesignSystem.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 1A9648EC2D47CF9C00268B29 /* DesignSystem.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 1A9648E42D47CF7100268B29 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 1A0B4B0D2D477FED002D10DE /* Project object */; + proxyType = 1; + remoteGlobalIDString = 1A0B4B232D477FFB002D10DE; + remoteInfo = ArtworkFeatureInterface; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 1A9648E62D47CF7100268B29 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 1A9648E32D47CF7100268B29 /* ArtworkFeatureInterface.framework in Embed Frameworks */, + 1A9648EE2D47CF9C00268B29 /* DesignSystem.framework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + /* Begin PBXFileReference section */ 1A0B4B242D477FFB002D10DE /* ArtworkFeatureInterface.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ArtworkFeatureInterface.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 1A9648D52D47CD7700268B29 /* ArtworkFeature.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ArtworkFeature.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 1A9648DE2D47CF1500268B29 /* PostingFeatureInterface.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = PostingFeatureInterface.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 1A9648EC2D47CF9C00268B29 /* DesignSystem.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = DesignSystem.framework; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */ @@ -59,6 +93,8 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 1A9648E22D47CF7100268B29 /* ArtworkFeatureInterface.framework in Frameworks */, + 1A9648ED2D47CF9C00268B29 /* DesignSystem.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -70,6 +106,7 @@ children = ( 1A0B4B252D477FFB002D10DE /* ArtworkFeatureInterface */, 1A9648D62D47CD7700268B29 /* ArtworkFeature */, + 1A9648DD2D47CF1500268B29 /* Frameworks */, 1A0B4B162D477FED002D10DE /* Products */, ); sourceTree = ""; @@ -83,6 +120,15 @@ name = Products; sourceTree = ""; }; + 1A9648DD2D47CF1500268B29 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 1A9648EC2D47CF9C00268B29 /* DesignSystem.framework */, + 1A9648DE2D47CF1500268B29 /* PostingFeatureInterface.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ @@ -134,10 +180,12 @@ 1A9648D12D47CD7700268B29 /* Sources */, 1A9648D22D47CD7700268B29 /* Frameworks */, 1A9648D32D47CD7700268B29 /* Resources */, + 1A9648E62D47CF7100268B29 /* Embed Frameworks */, ); buildRules = ( ); dependencies = ( + 1A9648E52D47CF7100268B29 /* PBXTargetDependency */, ); fileSystemSynchronizedGroups = ( 1A9648D62D47CD7700268B29 /* ArtworkFeature */, @@ -164,6 +212,7 @@ }; 1A9648D42D47CD7700268B29 = { CreatedOnToolsVersion = 16.0; + LastSwiftMigration = 1600; }; }; }; @@ -221,6 +270,14 @@ }; /* End PBXSourcesBuildPhase section */ +/* Begin PBXTargetDependency section */ + 1A9648E52D47CF7100268B29 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 1A0B4B232D477FFB002D10DE /* ArtworkFeatureInterface */; + targetProxy = 1A9648E42D47CF7100268B29 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + /* Begin XCBuildConfiguration section */ 1A0B4B1A2D477FED002D10DE /* Debug */ = { isa = XCBuildConfiguration; @@ -421,6 +478,7 @@ isa = XCBuildConfiguration; buildSettings = { BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CLANG_ENABLE_MODULES = YES; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; DEFINES_MODULE = YES; @@ -442,8 +500,13 @@ PRODUCT_BUNDLE_IDENTIFIER = kr.com.ArtworkFeature; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SKIP_INSTALL = YES; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_INSTALL_OBJC_HEADER = NO; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; @@ -455,6 +518,7 @@ isa = XCBuildConfiguration; buildSettings = { BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CLANG_ENABLE_MODULES = YES; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; DEFINES_MODULE = YES; @@ -476,6 +540,10 @@ PRODUCT_BUNDLE_IDENTIFIER = kr.com.ArtworkFeature; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SKIP_INSTALL = YES; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_INSTALL_OBJC_HEADER = NO; SWIFT_VERSION = 5.0; diff --git a/Features/ArtworkFeature/ArtworkFeature/Source/ArtworkViewController.swift b/Features/ArtworkFeature/ArtworkFeature/Source/ArtworkViewController.swift new file mode 100644 index 0000000..cc69809 --- /dev/null +++ b/Features/ArtworkFeature/ArtworkFeature/Source/ArtworkViewController.swift @@ -0,0 +1,18 @@ +// +// ArtworkViewController.swift +// ArtworkFeature +// +// Created by Geon Woo lee on 1/28/25. +// + +import UIKit + +final class ArtworRouter { } + +final class ArtworkViewBuilder { } + +final class ArtworkInteractor { } + +final class ArtworkViewController: UIViewController { + +} diff --git a/Features/PostingFeature/PostingFeature.xcodeproj/project.pbxproj b/Features/PostingFeature/PostingFeature.xcodeproj/project.pbxproj index 5f36655..66f21c3 100644 --- a/Features/PostingFeature/PostingFeature.xcodeproj/project.pbxproj +++ b/Features/PostingFeature/PostingFeature.xcodeproj/project.pbxproj @@ -6,10 +6,43 @@ objectVersion = 77; objects = { +/* Begin PBXBuildFile section */ + 1A9648E72D47CF7600268B29 /* PostingFeatureInterface.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1A0B4B442D478032002D10DE /* PostingFeatureInterface.framework */; }; + 1A9648E82D47CF7600268B29 /* PostingFeatureInterface.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 1A0B4B442D478032002D10DE /* PostingFeatureInterface.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 1A9648F02D47CFA600268B29 /* DesignSystem.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1A9648EF2D47CFA600268B29 /* DesignSystem.framework */; }; + 1A9648F12D47CFA600268B29 /* DesignSystem.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 1A9648EF2D47CFA600268B29 /* DesignSystem.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 1A9648E92D47CF7600268B29 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 1A0B4B2D2D478020002D10DE /* Project object */; + proxyType = 1; + remoteGlobalIDString = 1A0B4B432D478032002D10DE; + remoteInfo = PostingFeatureInterface; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 1A9648EB2D47CF7600268B29 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 1A9648E82D47CF7600268B29 /* PostingFeatureInterface.framework in Embed Frameworks */, + 1A9648F12D47CFA600268B29 /* DesignSystem.framework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + /* Begin PBXFileReference section */ 1A0B4B442D478032002D10DE /* PostingFeatureInterface.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = PostingFeatureInterface.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 1A9648182D47827300268B29 /* libArtworkFeature.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; path = libArtworkFeature.a; sourceTree = BUILT_PRODUCTS_DIR; }; 1A96481F2D4783E600268B29 /* PostingFeature.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = PostingFeature.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 1A9648EF2D47CFA600268B29 /* DesignSystem.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = DesignSystem.framework; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */ @@ -50,6 +83,8 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 1A9648E72D47CF7600268B29 /* PostingFeatureInterface.framework in Frameworks */, + 1A9648F02D47CFA600268B29 /* DesignSystem.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -78,6 +113,7 @@ 1A9648172D47827300268B29 /* Frameworks */ = { isa = PBXGroup; children = ( + 1A9648EF2D47CFA600268B29 /* DesignSystem.framework */, 1A9648182D47827300268B29 /* libArtworkFeature.a */, ); name = Frameworks; @@ -134,10 +170,12 @@ 1A96481B2D4783E600268B29 /* Sources */, 1A96481C2D4783E600268B29 /* Frameworks */, 1A96481D2D4783E600268B29 /* Resources */, + 1A9648EB2D47CF7600268B29 /* Embed Frameworks */, ); buildRules = ( ); dependencies = ( + 1A9648EA2D47CF7600268B29 /* PBXTargetDependency */, ); name = PostingFeature; packageProductDependencies = ( @@ -218,6 +256,14 @@ }; /* End PBXSourcesBuildPhase section */ +/* Begin PBXTargetDependency section */ + 1A9648EA2D47CF7600268B29 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 1A0B4B432D478032002D10DE /* PostingFeatureInterface */; + targetProxy = 1A9648E92D47CF7600268B29 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + /* Begin XCBuildConfiguration section */ 1A0B4B3A2D478020002D10DE /* Debug */ = { isa = XCBuildConfiguration; @@ -441,6 +487,10 @@ PRODUCT_BUNDLE_IDENTIFIER = kr.com.PostingFeature; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SKIP_INSTALL = YES; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_INSTALL_OBJC_HEADER = NO; SWIFT_VERSION = 5.0; @@ -475,6 +525,10 @@ PRODUCT_BUNDLE_IDENTIFIER = kr.com.PostingFeature; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SKIP_INSTALL = YES; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_INSTALL_OBJC_HEADER = NO; SWIFT_VERSION = 5.0; From 582702074677a3bbe7d98ce00b81ff871a7ba3ec Mon Sep 17 00:00:00 2001 From: GeonWoo Date: Tue, 28 Jan 2025 13:22:32 +0900 Subject: [PATCH 04/21] #2 Implement artwork feature using VIPER architecture --- .../Source/ArtworkViewController.swift | 86 ++++++++++++++++++- 1 file changed, 83 insertions(+), 3 deletions(-) diff --git a/Features/ArtworkFeature/ArtworkFeature/Source/ArtworkViewController.swift b/Features/ArtworkFeature/ArtworkFeature/Source/ArtworkViewController.swift index cc69809..40c5d71 100644 --- a/Features/ArtworkFeature/ArtworkFeature/Source/ArtworkViewController.swift +++ b/Features/ArtworkFeature/ArtworkFeature/Source/ArtworkViewController.swift @@ -7,12 +7,92 @@ import UIKit -final class ArtworRouter { } +// MARK: - Builder final class ArtworkViewBuilder { } -final class ArtworkInteractor { } +// MARK: - Router -final class ArtworkViewController: UIViewController { +protocol ArtworkRouting: AnyObject { } + +final class ArtworRouter: ArtworkRouting { + var navigationContoller: UINavigationController? + + init(navigationContoller: UINavigationController) { + self.navigationContoller = navigationContoller + } +} + +// MARK: - Interactor + +protocol ArtworkInteractorOutput: AnyObject { } + +protocol ArtworkInteractorable: AnyObject { + var router: ArtworkRouting? { get set } + + // !!!: - add to listener +} + +final class ArtworkInteractor: ArtworkInteractorable, + ArtworkViewPresentableListener +{ + weak var router: ArtworkRouting? + weak var listener: ArtworkViewPresentableListener? + + weak var presenter: ArtworkViewPresentable? + + init(presenter: ArtworkViewPresentable) { + self.presenter = presenter + + presenter.listener = self + } + + func fetch() { } + + func itemSelected(indexPath: IndexPath) { + print(#file, #function) + } + +} + +// MARK: - Presneter + +protocol ArtworkViewPresentable: AnyObject { + var listener: ArtworkViewPresentableListener? { get set } +} + +protocol ArtworkViewPresentableListener: AnyObject { + func itemSelected(indexPath: IndexPath) +} + +final class ArtworkViewController: UIViewController, + ArtworkViewPresentable, + UICollectionViewDelegate +{ + weak var listener: ArtworkViewPresentableListener? + + init() { + super.init(nibName: nil, bundle: nil) + configureUI() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + // MARK: - UIComponents + + private let collectionView = UICollectionView() + + private func configureUI() { + // TODO: - 스냅킷 도입 예정 + } + + // TODO: - 컬렉션 UI 도입해서 분리할 예정 + + func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { + listener?.itemSelected(indexPath: indexPath) + } +} From bb3687ab6fe5477b67fdf60e14b711fa17fcd943 Mon Sep 17 00:00:00 2001 From: GeonWoo Date: Tue, 28 Jan 2025 14:42:45 +0900 Subject: [PATCH 05/21] #2 add simple riblet template --- .../Source/ArtworkViewController.swift | 79 ++++++++++++++++--- 1 file changed, 68 insertions(+), 11 deletions(-) diff --git a/Features/ArtworkFeature/ArtworkFeature/Source/ArtworkViewController.swift b/Features/ArtworkFeature/ArtworkFeature/Source/ArtworkViewController.swift index 40c5d71..abb07d4 100644 --- a/Features/ArtworkFeature/ArtworkFeature/Source/ArtworkViewController.swift +++ b/Features/ArtworkFeature/ArtworkFeature/Source/ArtworkViewController.swift @@ -7,22 +7,79 @@ import UIKit +class UploadViewController: UIViewController { + override func viewDidLoad() { + super.viewDidLoad() + view.backgroundColor = .green + } +} + // MARK: - Builder -final class ArtworkViewBuilder { } +public protocol ArtworkListener: AnyObject { } + +public protocol ArtworkViewBuildable { + func build(withListener listener: ArtworkListener?) -> ArtworkRouting +} + +public final class ArtworkViewBuilder: ArtworkViewBuildable { + let navigationController: UINavigationController + + init(navigationController: UINavigationController) { + self.navigationController = navigationController + + // TODO: - replace dependency + } + + public func build(withListener listener: ArtworkListener?) -> ArtworkRouting { + let viewController = ArtworkViewController() + + let interactor = ArtworkInteractor(presenter: viewController) + interactor.listener = listener + + let router = ArtworkRouter( + navigationController: navigationController, + interactor: interactor + ) + + return router + } +} // MARK: - Router -protocol ArtworkRouting: AnyObject { +public protocol ArtworkRouting: AnyObject { + var viewController: UIViewController { get } + func pushToUpload() } -final class ArtworRouter: ArtworkRouting { - var navigationContoller: UINavigationController? +final class ArtworkRouter: ArtworkRouting { - init(navigationContoller: UINavigationController) { - self.navigationContoller = navigationContoller + var viewController: UIViewController { self.navigationController } + let navigationController: UINavigationController + + weak var interactor: ArtworkInteractorable? + + init( + navigationController: UINavigationController, + interactor: ArtworkInteractorable + ) { + self.navigationController = navigationController + self.interactor = interactor + + interactor.router = self + } + + // MARK: - Upload + + func pushToUpload() { + print(#function) + + let viewController = UploadViewController() + navigationController.pushViewController(viewController, animated: true) } + } // MARK: - Interactor @@ -31,16 +88,14 @@ protocol ArtworkInteractorOutput: AnyObject { } protocol ArtworkInteractorable: AnyObject { var router: ArtworkRouting? { get set } - - // !!!: - add to listener + var listener: ArtworkListener? { get set } } final class ArtworkInteractor: ArtworkInteractorable, ArtworkViewPresentableListener { weak var router: ArtworkRouting? - weak var listener: ArtworkViewPresentableListener? - + weak var listener: ArtworkListener? weak var presenter: ArtworkViewPresentable? init(presenter: ArtworkViewPresentable) { @@ -53,8 +108,9 @@ final class ArtworkInteractor: ArtworkInteractorable, func itemSelected(indexPath: IndexPath) { print(#file, #function) + + router?.pushToUpload() } - } // MARK: - Presneter @@ -75,6 +131,7 @@ final class ArtworkViewController: UIViewController, init() { super.init(nibName: nil, bundle: nil) + configureUI() } From 9ef33749f30719fa8ccce23d62c2e850630de34f Mon Sep 17 00:00:00 2001 From: GeonWoo Date: Tue, 28 Jan 2025 22:45:02 +0900 Subject: [PATCH 06/21] =?UTF-8?q?#2=20RIBs=20=EC=97=86=EC=9D=B4=20UI=20?= =?UTF-8?q?=EB=9D=84=EC=9A=B0=EB=8A=94=EA=B1=B0=20=EA=B0=80=EB=8A=A5?= =?UTF-8?q?=ED=95=9C=20=ED=98=95=ED=83=9C=EB=A1=9C=20=EA=B5=AC=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- App/ZiineApp/ViewController.swift | 28 +++++++++++++++- .../Source/ArtworkViewController.swift | 33 +++++++++---------- 2 files changed, 43 insertions(+), 18 deletions(-) diff --git a/App/ZiineApp/ViewController.swift b/App/ZiineApp/ViewController.swift index 65b2b38..296661c 100644 --- a/App/ZiineApp/ViewController.swift +++ b/App/ZiineApp/ViewController.swift @@ -6,14 +6,40 @@ // import UIKit +import ArtworkFeature class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. + + let btn = UIButton() + btn.addTarget(self, action: #selector(didTap), for: .touchUpInside) + btn.setTitle("button", for: .normal) + + view.addSubview(btn) + btn.translatesAutoresizingMaskIntoConstraints = false + NSLayoutConstraint.activate([ + btn.centerXAnchor.constraint(equalTo: view.centerXAnchor), + btn.centerYAnchor.constraint(equalTo: view.centerYAnchor), + ]) + + view.backgroundColor = .orange + } + + @objc func didTap() { + push() } - + func push() { + let builder = ArtworkViewBuilder(navigationController: self.navigationController!) + let routing = builder.build(withListener: nil) + let viewContorller = routing +// + print(#function, self.navigationController, routing.viewController) +// + self.present(routing.viewController!, animated: true) + } } diff --git a/Features/ArtworkFeature/ArtworkFeature/Source/ArtworkViewController.swift b/Features/ArtworkFeature/ArtworkFeature/Source/ArtworkViewController.swift index abb07d4..518b767 100644 --- a/Features/ArtworkFeature/ArtworkFeature/Source/ArtworkViewController.swift +++ b/Features/ArtworkFeature/ArtworkFeature/Source/ArtworkViewController.swift @@ -25,7 +25,7 @@ public protocol ArtworkViewBuildable { public final class ArtworkViewBuilder: ArtworkViewBuildable { let navigationController: UINavigationController - init(navigationController: UINavigationController) { + public init(navigationController: UINavigationController) { self.navigationController = navigationController // TODO: - replace dependency @@ -35,13 +35,16 @@ public final class ArtworkViewBuilder: ArtworkViewBuildable { let viewController = ArtworkViewController() let interactor = ArtworkInteractor(presenter: viewController) - interactor.listener = listener let router = ArtworkRouter( navigationController: navigationController, - interactor: interactor + viewController: viewController ) + interactor.presenter = viewController + interactor.listener = listener + interactor.router = router + return router } } @@ -49,26 +52,22 @@ public final class ArtworkViewBuilder: ArtworkViewBuildable { // MARK: - Router public protocol ArtworkRouting: AnyObject { - var viewController: UIViewController { get } + var viewController: UIViewController? { get } func pushToUpload() } final class ArtworkRouter: ArtworkRouting { - var viewController: UIViewController { self.navigationController } let navigationController: UINavigationController - - weak var interactor: ArtworkInteractorable? + var viewController: UIViewController? init( navigationController: UINavigationController, - interactor: ArtworkInteractorable + viewController: UIViewController? ) { self.navigationController = navigationController - self.interactor = interactor - - interactor.router = self + self.viewController = viewController } // MARK: - Upload @@ -84,8 +83,6 @@ final class ArtworkRouter: ArtworkRouting { // MARK: - Interactor -protocol ArtworkInteractorOutput: AnyObject { } - protocol ArtworkInteractorable: AnyObject { var router: ArtworkRouting? { get set } var listener: ArtworkListener? { get set } @@ -141,15 +138,17 @@ final class ArtworkViewController: UIViewController, // MARK: - UIComponents - private let collectionView = UICollectionView() +// private let collectionView = UICollectionView() private func configureUI() { // TODO: - 스냅킷 도입 예정 + + view.backgroundColor = .red } // TODO: - 컬렉션 UI 도입해서 분리할 예정 - func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { - listener?.itemSelected(indexPath: indexPath) - } +// func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { +// listener?.itemSelected(indexPath: indexPath) +// } } From dcab4a8cf14b9d0914fc9a61d573ec959998e472 Mon Sep 17 00:00:00 2001 From: GeonWoo Date: Tue, 28 Jan 2025 22:53:12 +0900 Subject: [PATCH 07/21] =?UTF-8?q?#2=20=EC=9D=B8=ED=84=B0=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EC=8A=A4=20=EB=AA=A8=EB=93=88=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- App/ZiineApp/ViewController.swift | 1 + .../ArtworkFeature.xcodeproj/project.pbxproj | 4 ++++ .../Source/ArtworkViewController.swift | 13 +++--------- .../Source/ArtworkViewBuildable.swift | 20 +++++++++++++++++++ 4 files changed, 28 insertions(+), 10 deletions(-) create mode 100644 Features/ArtworkFeature/ArtworkFeatureInterface/Source/ArtworkViewBuildable.swift diff --git a/App/ZiineApp/ViewController.swift b/App/ZiineApp/ViewController.swift index 296661c..6aabf83 100644 --- a/App/ZiineApp/ViewController.swift +++ b/App/ZiineApp/ViewController.swift @@ -7,6 +7,7 @@ import UIKit import ArtworkFeature +import ArtworkFeatureInterface class ViewController: UIViewController { diff --git a/Features/ArtworkFeature/ArtworkFeature.xcodeproj/project.pbxproj b/Features/ArtworkFeature/ArtworkFeature.xcodeproj/project.pbxproj index c27502c..5e5ccab 100644 --- a/Features/ArtworkFeature/ArtworkFeature.xcodeproj/project.pbxproj +++ b/Features/ArtworkFeature/ArtworkFeature.xcodeproj/project.pbxproj @@ -209,6 +209,7 @@ TargetAttributes = { 1A0B4B232D477FFB002D10DE = { CreatedOnToolsVersion = 16.0; + LastSwiftMigration = 1600; }; 1A9648D42D47CD7700268B29 = { CreatedOnToolsVersion = 16.0; @@ -402,6 +403,7 @@ isa = XCBuildConfiguration; buildSettings = { BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CLANG_ENABLE_MODULES = YES; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; DEFINES_MODULE = YES; @@ -429,6 +431,7 @@ SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_INSTALL_OBJC_HEADER = NO; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; @@ -440,6 +443,7 @@ isa = XCBuildConfiguration; buildSettings = { BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CLANG_ENABLE_MODULES = YES; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; DEFINES_MODULE = YES; diff --git a/Features/ArtworkFeature/ArtworkFeature/Source/ArtworkViewController.swift b/Features/ArtworkFeature/ArtworkFeature/Source/ArtworkViewController.swift index 518b767..797fb22 100644 --- a/Features/ArtworkFeature/ArtworkFeature/Source/ArtworkViewController.swift +++ b/Features/ArtworkFeature/ArtworkFeature/Source/ArtworkViewController.swift @@ -6,6 +6,7 @@ // import UIKit +import ArtworkFeatureInterface class UploadViewController: UIViewController { override func viewDidLoad() { @@ -16,11 +17,9 @@ class UploadViewController: UIViewController { // MARK: - Builder -public protocol ArtworkListener: AnyObject { } -public protocol ArtworkViewBuildable { - func build(withListener listener: ArtworkListener?) -> ArtworkRouting -} + + public final class ArtworkViewBuilder: ArtworkViewBuildable { let navigationController: UINavigationController @@ -51,12 +50,6 @@ public final class ArtworkViewBuilder: ArtworkViewBuildable { // MARK: - Router -public protocol ArtworkRouting: AnyObject { - var viewController: UIViewController? { get } - - func pushToUpload() -} - final class ArtworkRouter: ArtworkRouting { let navigationController: UINavigationController diff --git a/Features/ArtworkFeature/ArtworkFeatureInterface/Source/ArtworkViewBuildable.swift b/Features/ArtworkFeature/ArtworkFeatureInterface/Source/ArtworkViewBuildable.swift new file mode 100644 index 0000000..3676fc7 --- /dev/null +++ b/Features/ArtworkFeature/ArtworkFeatureInterface/Source/ArtworkViewBuildable.swift @@ -0,0 +1,20 @@ +// +// ArtworkViewBuildable.swift +// ArtworkFeature +// +// Created by Geon Woo lee on 1/28/25. +// + +import UIKit + +public protocol ArtworkListener: AnyObject { } + +public protocol ArtworkViewBuildable { + func build(withListener listener: ArtworkListener?) -> ArtworkRouting +} + +public protocol ArtworkRouting: AnyObject { + var viewController: UIViewController? { get } + + func pushToUpload() +} From 04ed24c6303dbaf96d25757fa3db61aa43c891db Mon Sep 17 00:00:00 2001 From: GeonWoo Date: Tue, 28 Jan 2025 22:56:53 +0900 Subject: [PATCH 08/21] =?UTF-8?q?#2=20=EC=BD=94=EB=93=9C=20=EA=B9=94?= =?UTF-8?q?=EB=81=94=ED=95=98=EA=B2=8C=20=EC=A0=95=EB=A6=AC=ED=95=98?= =?UTF-8?q?=EA=B3=A0=20=EB=B6=84=EB=A6=AC=ED=95=98=EA=B8=B0=20=EC=9C=84?= =?UTF-8?q?=ED=95=B4=EC=84=9C=20=EB=84=A4=EC=9D=B4=EB=B0=8D=20=EA=B0=9C?= =?UTF-8?q?=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- App/ZiineApp/ViewController.swift | 2 +- .../Source/ArtworkViewController.swift | 12 +++++------- .../Source/ArtworkViewBuildable.swift | 2 +- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/App/ZiineApp/ViewController.swift b/App/ZiineApp/ViewController.swift index 6aabf83..3ba6297 100644 --- a/App/ZiineApp/ViewController.swift +++ b/App/ZiineApp/ViewController.swift @@ -35,7 +35,7 @@ class ViewController: UIViewController { func push() { let builder = ArtworkViewBuilder(navigationController: self.navigationController!) - let routing = builder.build(withListener: nil) + let routing = builder.build(with: nil) let viewContorller = routing // print(#function, self.navigationController, routing.viewController) diff --git a/Features/ArtworkFeature/ArtworkFeature/Source/ArtworkViewController.swift b/Features/ArtworkFeature/ArtworkFeature/Source/ArtworkViewController.swift index 797fb22..ba4e3b3 100644 --- a/Features/ArtworkFeature/ArtworkFeature/Source/ArtworkViewController.swift +++ b/Features/ArtworkFeature/ArtworkFeature/Source/ArtworkViewController.swift @@ -30,10 +30,10 @@ public final class ArtworkViewBuilder: ArtworkViewBuildable { // TODO: - replace dependency } - public func build(withListener listener: ArtworkListener?) -> ArtworkRouting { + public func build(with listener: ArtworkListener?) -> ArtworkRouting { let viewController = ArtworkViewController() - let interactor = ArtworkInteractor(presenter: viewController) + let interactor = ArtworkInteractor() let router = ArtworkRouter( navigationController: navigationController, @@ -88,11 +88,7 @@ final class ArtworkInteractor: ArtworkInteractorable, weak var listener: ArtworkListener? weak var presenter: ArtworkViewPresentable? - init(presenter: ArtworkViewPresentable) { - self.presenter = presenter - - presenter.listener = self - } + init() {} func fetch() { } @@ -123,6 +119,8 @@ final class ArtworkViewController: UIViewController, super.init(nibName: nil, bundle: nil) configureUI() + + listener?.itemSelected(indexPath: .init(row: 0, section: 0)) } required init?(coder: NSCoder) { diff --git a/Features/ArtworkFeature/ArtworkFeatureInterface/Source/ArtworkViewBuildable.swift b/Features/ArtworkFeature/ArtworkFeatureInterface/Source/ArtworkViewBuildable.swift index 3676fc7..1489188 100644 --- a/Features/ArtworkFeature/ArtworkFeatureInterface/Source/ArtworkViewBuildable.swift +++ b/Features/ArtworkFeature/ArtworkFeatureInterface/Source/ArtworkViewBuildable.swift @@ -10,7 +10,7 @@ import UIKit public protocol ArtworkListener: AnyObject { } public protocol ArtworkViewBuildable { - func build(withListener listener: ArtworkListener?) -> ArtworkRouting + func build(with listener: ArtworkListener?) -> ArtworkRouting } public protocol ArtworkRouting: AnyObject { From 18e79a2fe13fa93ed7f5a6f1353533beb26ca4ac Mon Sep 17 00:00:00 2001 From: GeonWoo Date: Tue, 28 Jan 2025 23:45:19 +0900 Subject: [PATCH 09/21] =?UTF-8?q?#2=20=EC=9D=B8=ED=84=B0=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EC=8A=A4=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Source/ArtworkInteractor.swift | 38 ++++++++ .../ArtworkFeature/Source/ArtworkRouter.swift | 34 +++++++ .../Source/ArtworkViewBuilder.swift | 35 +++++++ .../Source/ArtworkViewController.swift | 97 ------------------- ...orkViewBuildable.swift => Interface.swift} | 2 +- 5 files changed, 108 insertions(+), 98 deletions(-) create mode 100644 Features/ArtworkFeature/ArtworkFeature/Source/ArtworkInteractor.swift create mode 100644 Features/ArtworkFeature/ArtworkFeature/Source/ArtworkRouter.swift create mode 100644 Features/ArtworkFeature/ArtworkFeature/Source/ArtworkViewBuilder.swift rename Features/ArtworkFeature/ArtworkFeatureInterface/Source/{ArtworkViewBuildable.swift => Interface.swift} (87%) diff --git a/Features/ArtworkFeature/ArtworkFeature/Source/ArtworkInteractor.swift b/Features/ArtworkFeature/ArtworkFeature/Source/ArtworkInteractor.swift new file mode 100644 index 0000000..a82fa78 --- /dev/null +++ b/Features/ArtworkFeature/ArtworkFeature/Source/ArtworkInteractor.swift @@ -0,0 +1,38 @@ +// +// ArtworkInteractorable.swift +// ArtworkFeature +// +// Created by Geon Woo lee on 1/28/25. +// + +import UIKit +import ArtworkFeatureInterface + +protocol ArtworkViewPresentable: AnyObject { + var listener: ArtworkViewPresentableListener? { get set } +} + +protocol ArtworkInteractorable: AnyObject { + var router: ArtworkRouting? { get set } + var listener: ArtworkListener? { get set } +} + +protocol ArtworkInteractorDependency: AnyObject { } + +final class ArtworkInteractor: ArtworkInteractorable, + ArtworkViewPresentableListener +{ + weak var router: ArtworkRouting? + weak var listener: ArtworkListener? + weak var presenter: ArtworkViewPresentable? + + init() {} + + func fetch() { } + + func itemSelected(indexPath: IndexPath) { + print(#file, #function) + + router?.pushToUpload() + } +} diff --git a/Features/ArtworkFeature/ArtworkFeature/Source/ArtworkRouter.swift b/Features/ArtworkFeature/ArtworkFeature/Source/ArtworkRouter.swift new file mode 100644 index 0000000..2f4d4bd --- /dev/null +++ b/Features/ArtworkFeature/ArtworkFeature/Source/ArtworkRouter.swift @@ -0,0 +1,34 @@ +// +// ArtworkRouter.swift +// ArtworkFeature +// +// Created by Geon Woo lee on 1/28/25. +// + +import UIKit +import ArtworkFeatureInterface + +final class ArtworkRouter: ArtworkRouting { + + private let navigationController: UINavigationController + var viewController: UIViewController + + init( + navigationController: UINavigationController, + viewController: UIViewController + ) { + self.navigationController = navigationController + self.viewController = viewController + } + + // MARK: - Upload + + func pushToUpload() { + print(#function) + + let vc = UIViewController() + vc.view.backgroundColor = .systemBlue + navigationController.pushViewController(viewController, animated: true) + } + +} diff --git a/Features/ArtworkFeature/ArtworkFeature/Source/ArtworkViewBuilder.swift b/Features/ArtworkFeature/ArtworkFeature/Source/ArtworkViewBuilder.swift new file mode 100644 index 0000000..c1ce41f --- /dev/null +++ b/Features/ArtworkFeature/ArtworkFeature/Source/ArtworkViewBuilder.swift @@ -0,0 +1,35 @@ +// +// ArtworkViewBuilder.swift +// ArtworkFeature +// +// Created by Geon Woo lee on 1/28/25. +// + +import UIKit +import ArtworkFeatureInterface + +public final class ArtworkViewBuilder: ArtworkViewBuildable { + let navigationController: UINavigationController + + public init(navigationController: UINavigationController) { + self.navigationController = navigationController + + // TODO: - replace dependency + } + + public func build(with listener: ArtworkListener?) -> ArtworkRouting { + let viewController = ArtworkViewController() + let interactor = ArtworkInteractor() + + let router = ArtworkRouter( + navigationController: navigationController, + viewController: viewController + ) + + interactor.presenter = viewController + interactor.listener = listener + interactor.router = router + + return router + } +} diff --git a/Features/ArtworkFeature/ArtworkFeature/Source/ArtworkViewController.swift b/Features/ArtworkFeature/ArtworkFeature/Source/ArtworkViewController.swift index ba4e3b3..8d2eefa 100644 --- a/Features/ArtworkFeature/ArtworkFeature/Source/ArtworkViewController.swift +++ b/Features/ArtworkFeature/ArtworkFeature/Source/ArtworkViewController.swift @@ -8,103 +8,6 @@ import UIKit import ArtworkFeatureInterface -class UploadViewController: UIViewController { - override func viewDidLoad() { - super.viewDidLoad() - view.backgroundColor = .green - } -} - -// MARK: - Builder - - - - - -public final class ArtworkViewBuilder: ArtworkViewBuildable { - let navigationController: UINavigationController - - public init(navigationController: UINavigationController) { - self.navigationController = navigationController - - // TODO: - replace dependency - } - - public func build(with listener: ArtworkListener?) -> ArtworkRouting { - let viewController = ArtworkViewController() - - let interactor = ArtworkInteractor() - - let router = ArtworkRouter( - navigationController: navigationController, - viewController: viewController - ) - - interactor.presenter = viewController - interactor.listener = listener - interactor.router = router - - return router - } -} - -// MARK: - Router - -final class ArtworkRouter: ArtworkRouting { - - let navigationController: UINavigationController - var viewController: UIViewController? - - init( - navigationController: UINavigationController, - viewController: UIViewController? - ) { - self.navigationController = navigationController - self.viewController = viewController - } - - // MARK: - Upload - - func pushToUpload() { - print(#function) - - let viewController = UploadViewController() - navigationController.pushViewController(viewController, animated: true) - } - -} - -// MARK: - Interactor - -protocol ArtworkInteractorable: AnyObject { - var router: ArtworkRouting? { get set } - var listener: ArtworkListener? { get set } -} - -final class ArtworkInteractor: ArtworkInteractorable, - ArtworkViewPresentableListener -{ - weak var router: ArtworkRouting? - weak var listener: ArtworkListener? - weak var presenter: ArtworkViewPresentable? - - init() {} - - func fetch() { } - - func itemSelected(indexPath: IndexPath) { - print(#file, #function) - - router?.pushToUpload() - } -} - -// MARK: - Presneter - -protocol ArtworkViewPresentable: AnyObject { - var listener: ArtworkViewPresentableListener? { get set } -} - protocol ArtworkViewPresentableListener: AnyObject { func itemSelected(indexPath: IndexPath) } diff --git a/Features/ArtworkFeature/ArtworkFeatureInterface/Source/ArtworkViewBuildable.swift b/Features/ArtworkFeature/ArtworkFeatureInterface/Source/Interface.swift similarity index 87% rename from Features/ArtworkFeature/ArtworkFeatureInterface/Source/ArtworkViewBuildable.swift rename to Features/ArtworkFeature/ArtworkFeatureInterface/Source/Interface.swift index 1489188..498d02a 100644 --- a/Features/ArtworkFeature/ArtworkFeatureInterface/Source/ArtworkViewBuildable.swift +++ b/Features/ArtworkFeature/ArtworkFeatureInterface/Source/Interface.swift @@ -14,7 +14,7 @@ public protocol ArtworkViewBuildable { } public protocol ArtworkRouting: AnyObject { - var viewController: UIViewController? { get } + var viewController: UIViewController { get } func pushToUpload() } From bc76d2b14fc151b1fcdbd448516ab24c5ae9a667 Mon Sep 17 00:00:00 2001 From: GeonWoo Date: Wed, 29 Jan 2025 02:22:19 +0900 Subject: [PATCH 10/21] #2 add appRoot --- App/ZiineApp/AppDelegate.swift | 11 +------ App/ZiineApp/AppRoot/AppRootBuilder.swift | 31 +++++++++++++++++++ App/ZiineApp/SceneDelegate.swift | 7 ++++- App/ZiineApp/ViewController.swift | 10 +++--- .../ArtworkFeature/Source/ArtworkRouter.swift | 11 +++---- .../Source/ArtworkViewBuilder.swift | 8 +---- 6 files changed, 47 insertions(+), 31 deletions(-) create mode 100644 App/ZiineApp/AppRoot/AppRootBuilder.swift diff --git a/App/ZiineApp/AppDelegate.swift b/App/ZiineApp/AppDelegate.swift index a48ae32..8c5a713 100644 --- a/App/ZiineApp/AppDelegate.swift +++ b/App/ZiineApp/AppDelegate.swift @@ -10,26 +10,17 @@ import UIKit @main class AppDelegate: UIResponder, UIApplicationDelegate { - - func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { - // Override point for customization after application launch. return true } // MARK: UISceneSession Lifecycle func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration { - // Called when a new scene session is being created. - // Use this method to select a configuration to create the new scene with. return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role) } - func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set) { - // Called when the user discards a scene session. - // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions. - // Use this method to release any resources that were specific to the discarded scenes, as they will not return. - } + func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set) {} } diff --git a/App/ZiineApp/AppRoot/AppRootBuilder.swift b/App/ZiineApp/AppRoot/AppRootBuilder.swift new file mode 100644 index 0000000..2fe0006 --- /dev/null +++ b/App/ZiineApp/AppRoot/AppRootBuilder.swift @@ -0,0 +1,31 @@ +// +// AppRootBuildable.swift +// ZiineApp +// +// Created by Geon Woo lee on 1/29/25. +// + +import UIKit +import ArtworkFeature +import ArtworkFeatureInterface + +final class AppRootBuilder { + + func build() -> AppRootRouter { + let artworkBuilder = ArtworkViewBuilder() + let router = AppRootRouter(artworkBuildable: artworkBuilder) + + return router + } +} + +final class AppRootRouter { + + let artworkBuildable: ArtworkViewBuildable + var artworkRouting: ArtworkRouting? + + init(artworkBuildable: ArtworkViewBuildable) { + self.artworkBuildable = artworkBuildable + self.artworkRouting = artworkBuildable.build(with: nil) + } +} diff --git a/App/ZiineApp/SceneDelegate.swift b/App/ZiineApp/SceneDelegate.swift index d16c747..4b3336d 100644 --- a/App/ZiineApp/SceneDelegate.swift +++ b/App/ZiineApp/SceneDelegate.swift @@ -18,7 +18,12 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { window = UIWindow(windowScene: windowScene) window?.backgroundColor = .systemBackground - window?.rootViewController = UINavigationController(rootViewController: ViewController()) +// window?.rootViewController = UINavigationController(rootViewController: ViewController()) + + let router = AppRootBuilder().build() + + window?.rootViewController = router.artworkRouting?.viewController + window?.makeKeyAndVisible() } } diff --git a/App/ZiineApp/ViewController.swift b/App/ZiineApp/ViewController.swift index 3ba6297..7c1e11f 100644 --- a/App/ZiineApp/ViewController.swift +++ b/App/ZiineApp/ViewController.swift @@ -34,13 +34,11 @@ class ViewController: UIViewController { } func push() { - let builder = ArtworkViewBuilder(navigationController: self.navigationController!) - let routing = builder.build(with: nil) - let viewContorller = routing -// - print(#function, self.navigationController, routing.viewController) +// let builder = ArtworkViewBuilder(navigationController: self.navigationController!) +// let routing = builder.build(with: nil) +// let viewContorller = routing // - self.present(routing.viewController!, animated: true) +// self.present(routing.viewController, animated: true) } } diff --git a/Features/ArtworkFeature/ArtworkFeature/Source/ArtworkRouter.swift b/Features/ArtworkFeature/ArtworkFeature/Source/ArtworkRouter.swift index 2f4d4bd..4c187d4 100644 --- a/Features/ArtworkFeature/ArtworkFeature/Source/ArtworkRouter.swift +++ b/Features/ArtworkFeature/ArtworkFeature/Source/ArtworkRouter.swift @@ -10,14 +10,9 @@ import ArtworkFeatureInterface final class ArtworkRouter: ArtworkRouting { - private let navigationController: UINavigationController var viewController: UIViewController - init( - navigationController: UINavigationController, - viewController: UIViewController - ) { - self.navigationController = navigationController + init(viewController: UIViewController) { self.viewController = viewController } @@ -28,7 +23,9 @@ final class ArtworkRouter: ArtworkRouting { let vc = UIViewController() vc.view.backgroundColor = .systemBlue - navigationController.pushViewController(viewController, animated: true) +// navigationController.pushViewController(viewController, animated: true) + + viewController.navigationController?.pushViewController(vc, animated: true) } } diff --git a/Features/ArtworkFeature/ArtworkFeature/Source/ArtworkViewBuilder.swift b/Features/ArtworkFeature/ArtworkFeature/Source/ArtworkViewBuilder.swift index c1ce41f..f0e2b88 100644 --- a/Features/ArtworkFeature/ArtworkFeature/Source/ArtworkViewBuilder.swift +++ b/Features/ArtworkFeature/ArtworkFeature/Source/ArtworkViewBuilder.swift @@ -9,20 +9,14 @@ import UIKit import ArtworkFeatureInterface public final class ArtworkViewBuilder: ArtworkViewBuildable { - let navigationController: UINavigationController - public init(navigationController: UINavigationController) { - self.navigationController = navigationController - - // TODO: - replace dependency - } + public init() {} public func build(with listener: ArtworkListener?) -> ArtworkRouting { let viewController = ArtworkViewController() let interactor = ArtworkInteractor() let router = ArtworkRouter( - navigationController: navigationController, viewController: viewController ) From d263db63f1a2fb1544a3924924277b4f4a9d0d07 Mon Sep 17 00:00:00 2001 From: GeonWoo Date: Wed, 29 Jan 2025 15:05:38 +0900 Subject: [PATCH 11/21] =?UTF-8?q?#2=20=EB=84=A4=EB=B9=84=EA=B2=8C=EC=9D=B4?= =?UTF-8?q?=EC=85=98=20=EB=B0=8F=20=ED=94=84=EB=A0=88=EC=A0=A0=ED=8A=B8=20?= =?UTF-8?q?=ED=99=95=EC=9D=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- App/ZiineApp/AppRoot/AppRootBuilder.swift | 18 ++++++++++---- App/ZiineApp/SceneDelegate.swift | 4 ++-- .../Source/ArtworkInteractor.swift | 5 ++-- .../ArtworkFeature/Source/ArtworkRouter.swift | 6 +++-- .../Source/ArtworkViewBuilder.swift | 7 +++++- .../Source/ArtworkViewController.swift | 24 ++++++++++++++++--- 6 files changed, 48 insertions(+), 16 deletions(-) diff --git a/App/ZiineApp/AppRoot/AppRootBuilder.swift b/App/ZiineApp/AppRoot/AppRootBuilder.swift index 2fe0006..d54d6c3 100644 --- a/App/ZiineApp/AppRoot/AppRootBuilder.swift +++ b/App/ZiineApp/AppRoot/AppRootBuilder.swift @@ -9,19 +9,27 @@ import UIKit import ArtworkFeature import ArtworkFeatureInterface -final class AppRootBuilder { +protocol AppRootBuildable { - func build() -> AppRootRouter { - let artworkBuilder = ArtworkViewBuilder() +} + +final class AppRootBuilder: AppRootBuildable { + + func build() -> AppRootRouting { + let artworkBuilder = ArtworkViewBuilder() let router = AppRootRouter(artworkBuildable: artworkBuilder) return router } } -final class AppRootRouter { +protocol AppRootRouting { + var artworkRouting: ArtworkRouting? { get } +} + +final class AppRootRouter: AppRootRouting { - let artworkBuildable: ArtworkViewBuildable + private let artworkBuildable: ArtworkViewBuildable var artworkRouting: ArtworkRouting? init(artworkBuildable: ArtworkViewBuildable) { diff --git a/App/ZiineApp/SceneDelegate.swift b/App/ZiineApp/SceneDelegate.swift index 4b3336d..e1c4969 100644 --- a/App/ZiineApp/SceneDelegate.swift +++ b/App/ZiineApp/SceneDelegate.swift @@ -21,8 +21,8 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { // window?.rootViewController = UINavigationController(rootViewController: ViewController()) let router = AppRootBuilder().build() - - window?.rootViewController = router.artworkRouting?.viewController + let nc = UINavigationController(rootViewController: router.artworkRouting!.viewController) + window?.rootViewController = nc window?.makeKeyAndVisible() } diff --git a/Features/ArtworkFeature/ArtworkFeature/Source/ArtworkInteractor.swift b/Features/ArtworkFeature/ArtworkFeature/Source/ArtworkInteractor.swift index a82fa78..10ae74d 100644 --- a/Features/ArtworkFeature/ArtworkFeature/Source/ArtworkInteractor.swift +++ b/Features/ArtworkFeature/ArtworkFeature/Source/ArtworkInteractor.swift @@ -22,9 +22,8 @@ protocol ArtworkInteractorDependency: AnyObject { } final class ArtworkInteractor: ArtworkInteractorable, ArtworkViewPresentableListener { - weak var router: ArtworkRouting? - weak var listener: ArtworkListener? - weak var presenter: ArtworkViewPresentable? + var router: ArtworkRouting? + var listener: ArtworkListener? init() {} diff --git a/Features/ArtworkFeature/ArtworkFeature/Source/ArtworkRouter.swift b/Features/ArtworkFeature/ArtworkFeature/Source/ArtworkRouter.swift index 4c187d4..ea6e1d2 100644 --- a/Features/ArtworkFeature/ArtworkFeature/Source/ArtworkRouter.swift +++ b/Features/ArtworkFeature/ArtworkFeature/Source/ArtworkRouter.swift @@ -10,10 +10,12 @@ import ArtworkFeatureInterface final class ArtworkRouter: ArtworkRouting { - var viewController: UIViewController + var viewController: UIViewController init(viewController: UIViewController) { self.viewController = viewController + + print("🍋🍋🍋", viewController) } // MARK: - Upload @@ -24,7 +26,7 @@ final class ArtworkRouter: ArtworkRouting { let vc = UIViewController() vc.view.backgroundColor = .systemBlue // navigationController.pushViewController(viewController, animated: true) - +// viewController.present(vc, animated: true) viewController.navigationController?.pushViewController(vc, animated: true) } diff --git a/Features/ArtworkFeature/ArtworkFeature/Source/ArtworkViewBuilder.swift b/Features/ArtworkFeature/ArtworkFeature/Source/ArtworkViewBuilder.swift index f0e2b88..d22923c 100644 --- a/Features/ArtworkFeature/ArtworkFeature/Source/ArtworkViewBuilder.swift +++ b/Features/ArtworkFeature/ArtworkFeature/Source/ArtworkViewBuilder.swift @@ -20,7 +20,12 @@ public final class ArtworkViewBuilder: ArtworkViewBuildable { viewController: viewController ) - interactor.presenter = viewController + print(viewController.listener, interactor) + + viewController.listener = interactor + + print(viewController.listener, interactor) + print("🥕",viewController) interactor.listener = listener interactor.router = router diff --git a/Features/ArtworkFeature/ArtworkFeature/Source/ArtworkViewController.swift b/Features/ArtworkFeature/ArtworkFeature/Source/ArtworkViewController.swift index 8d2eefa..0bd21de 100644 --- a/Features/ArtworkFeature/ArtworkFeature/Source/ArtworkViewController.swift +++ b/Features/ArtworkFeature/ArtworkFeature/Source/ArtworkViewController.swift @@ -16,14 +16,16 @@ final class ArtworkViewController: UIViewController, ArtworkViewPresentable, UICollectionViewDelegate { - weak var listener: ArtworkViewPresentableListener? + var listener: ArtworkViewPresentableListener? { + didSet { + print("🍋🍋", listener) + } + } init() { super.init(nibName: nil, bundle: nil) configureUI() - - listener?.itemSelected(indexPath: .init(row: 0, section: 0)) } required init?(coder: NSCoder) { @@ -38,6 +40,22 @@ final class ArtworkViewController: UIViewController, // TODO: - 스냅킷 도입 예정 view.backgroundColor = .red + + let btn = UIButton() + btn.setTitle("Go to Detail", for: .normal) + btn.addTarget(self, action: #selector(onTapGoToDetail), for: .touchUpInside) + btn.translatesAutoresizingMaskIntoConstraints = false + view.addSubview(btn) + NSLayoutConstraint.activate([ + btn.centerXAnchor.constraint(equalTo: view.centerXAnchor), + btn.centerYAnchor.constraint(equalTo: view.centerYAnchor), + ]) + + } + + @objc func onTapGoToDetail() { + print("🍋",listener, self) + listener?.itemSelected(indexPath: .init(item: 0, section: 0)) } // TODO: - 컬렉션 UI 도입해서 분리할 예정 From aae0c5282e92907f5345ac106699a99c946f7410 Mon Sep 17 00:00:00 2001 From: GeonWoo Date: Wed, 29 Jan 2025 20:48:45 +0900 Subject: [PATCH 12/21] =?UTF-8?q?#2=20=ED=83=AD=EB=B0=94=20=EB=B0=8F=20?= =?UTF-8?q?=ED=99=94=EB=A9=B4=EC=A0=84=ED=99=98=EA=B9=8C=EC=A7=80=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- App/ZiineApp/AppRoot/AppRootBuilder.swift | 37 +++++++++++++++++-- App/ZiineApp/SceneDelegate.swift | 14 +++++-- .../Source/ArtworkViewController.swift | 6 +-- 3 files changed, 44 insertions(+), 13 deletions(-) diff --git a/App/ZiineApp/AppRoot/AppRootBuilder.swift b/App/ZiineApp/AppRoot/AppRootBuilder.swift index d54d6c3..3d95ba2 100644 --- a/App/ZiineApp/AppRoot/AppRootBuilder.swift +++ b/App/ZiineApp/AppRoot/AppRootBuilder.swift @@ -10,7 +10,7 @@ import ArtworkFeature import ArtworkFeatureInterface protocol AppRootBuildable { - + func build() -> AppRootRouting } final class AppRootBuilder: AppRootBuildable { @@ -23,17 +23,46 @@ final class AppRootBuilder: AppRootBuildable { } } + +final class AppRootInteractor {} + protocol AppRootRouting { - var artworkRouting: ArtworkRouting? { get } + func configureTabs() -> [UIViewController] } final class AppRootRouter: AppRootRouting { private let artworkBuildable: ArtworkViewBuildable - var artworkRouting: ArtworkRouting? + private var artworkRouting: ArtworkRouting? init(artworkBuildable: ArtworkViewBuildable) { self.artworkBuildable = artworkBuildable - self.artworkRouting = artworkBuildable.build(with: nil) + } + + func configureTabs() -> [UIViewController] { + let artworkRouting = artworkBuildable.build(with: nil) + + self.artworkRouting = artworkRouting + + let viewControllers = [ + artworkRouting.viewController + ] + + return viewControllers + } +} + +final class AppRootTabBarController: UITabBarController { + + override func viewDidLoad() { + super.viewDidLoad() + + tabBar.isTranslucent = false + tabBar.tintColor = .black + tabBar.backgroundColor = .white + } + + func setViewControllers(_ viewControllers: [UIViewController]) { + super.setViewControllers(viewControllers, animated: false) } } diff --git a/App/ZiineApp/SceneDelegate.swift b/App/ZiineApp/SceneDelegate.swift index e1c4969..ed3e85f 100644 --- a/App/ZiineApp/SceneDelegate.swift +++ b/App/ZiineApp/SceneDelegate.swift @@ -18,11 +18,17 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { window = UIWindow(windowScene: windowScene) window?.backgroundColor = .systemBackground -// window?.rootViewController = UINavigationController(rootViewController: ViewController()) - let router = AppRootBuilder().build() - let nc = UINavigationController(rootViewController: router.artworkRouting!.viewController) - window?.rootViewController = nc + let builder = AppRootBuilder() + let routing = builder.build() + let tabs = routing.configureTabs() + + let tabBarViewController = AppRootTabBarController() + tabBarViewController.setViewControllers(tabs) + + let rootViewController = UINavigationController(rootViewController: tabBarViewController) + + window?.rootViewController = rootViewController window?.makeKeyAndVisible() } diff --git a/Features/ArtworkFeature/ArtworkFeature/Source/ArtworkViewController.swift b/Features/ArtworkFeature/ArtworkFeature/Source/ArtworkViewController.swift index 0bd21de..3926d6b 100644 --- a/Features/ArtworkFeature/ArtworkFeature/Source/ArtworkViewController.swift +++ b/Features/ArtworkFeature/ArtworkFeature/Source/ArtworkViewController.swift @@ -16,11 +16,7 @@ final class ArtworkViewController: UIViewController, ArtworkViewPresentable, UICollectionViewDelegate { - var listener: ArtworkViewPresentableListener? { - didSet { - print("🍋🍋", listener) - } - } + var listener: ArtworkViewPresentableListener? init() { super.init(nibName: nil, bundle: nil) From eb2304efc4bb853e9e981a2f3ba9b1f4fc115c77 Mon Sep 17 00:00:00 2001 From: GeonWoo Date: Wed, 29 Jan 2025 21:01:45 +0900 Subject: [PATCH 13/21] =?UTF-8?q?#2=20ViewControllable=20=ED=94=84?= =?UTF-8?q?=EB=A1=9C=ED=86=A0=EC=BD=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- App/ZiineApp/AppRoot/AppRootBuilder.swift | 36 +++++++++++++++---- App/ZiineApp/SceneDelegate.swift | 8 ++--- .../Source/ArtworkViewBuilder.swift | 10 +----- 3 files changed, 35 insertions(+), 19 deletions(-) diff --git a/App/ZiineApp/AppRoot/AppRootBuilder.swift b/App/ZiineApp/AppRoot/AppRootBuilder.swift index 3d95ba2..0c16774 100644 --- a/App/ZiineApp/AppRoot/AppRootBuilder.swift +++ b/App/ZiineApp/AppRoot/AppRootBuilder.swift @@ -16,15 +16,24 @@ protocol AppRootBuildable { final class AppRootBuilder: AppRootBuildable { func build() -> AppRootRouting { + let interactor = AppRootInteractor() + + let artworkBuilder = ArtworkViewBuilder() - let router = AppRootRouter(artworkBuildable: artworkBuilder) + + let router = AppRootRouter( + interactor: interactor, + artworkBuildable: artworkBuilder + ) return router } } -final class AppRootInteractor {} +protocol AppRootInteractable: ArtworkListener { } + +final class AppRootInteractor: AppRootInteractable {} protocol AppRootRouting { func configureTabs() -> [UIViewController] @@ -32,16 +41,22 @@ protocol AppRootRouting { final class AppRootRouter: AppRootRouting { + var interactor: AppRootInteractable? + private let artworkBuildable: ArtworkViewBuildable private var artworkRouting: ArtworkRouting? - init(artworkBuildable: ArtworkViewBuildable) { + init( + interactor :AppRootInteractable, + artworkBuildable: ArtworkViewBuildable + ) { + self.interactor = interactor + self.artworkBuildable = artworkBuildable } func configureTabs() -> [UIViewController] { - let artworkRouting = artworkBuildable.build(with: nil) - + let artworkRouting = artworkBuildable.build(with: interactor) self.artworkRouting = artworkRouting let viewControllers = [ @@ -52,7 +67,12 @@ final class AppRootRouter: AppRootRouting { } } -final class AppRootTabBarController: UITabBarController { +protocol AppRootTabBarControllable { + func build() -> UITabBarController + func setViewControllers(_ viewControllers: [UIViewController]) +} + +final class AppRootTabBarController: UITabBarController, AppRootTabBarControllable { override func viewDidLoad() { super.viewDidLoad() @@ -65,4 +85,8 @@ final class AppRootTabBarController: UITabBarController { func setViewControllers(_ viewControllers: [UIViewController]) { super.setViewControllers(viewControllers, animated: false) } + + func build() -> UITabBarController { + return self + } } diff --git a/App/ZiineApp/SceneDelegate.swift b/App/ZiineApp/SceneDelegate.swift index ed3e85f..4c426a8 100644 --- a/App/ZiineApp/SceneDelegate.swift +++ b/App/ZiineApp/SceneDelegate.swift @@ -23,12 +23,12 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { let routing = builder.build() let tabs = routing.configureTabs() - let tabBarViewController = AppRootTabBarController() + let tabBarViewController: AppRootTabBarControllable = AppRootTabBarController() tabBarViewController.setViewControllers(tabs) + let rootViewController = tabBarViewController.build() + let navigationController = UINavigationController(rootViewController: rootViewController) - let rootViewController = UINavigationController(rootViewController: tabBarViewController) - - window?.rootViewController = rootViewController + window?.rootViewController = navigationController window?.makeKeyAndVisible() } diff --git a/Features/ArtworkFeature/ArtworkFeature/Source/ArtworkViewBuilder.swift b/Features/ArtworkFeature/ArtworkFeature/Source/ArtworkViewBuilder.swift index d22923c..fcc0530 100644 --- a/Features/ArtworkFeature/ArtworkFeature/Source/ArtworkViewBuilder.swift +++ b/Features/ArtworkFeature/ArtworkFeature/Source/ArtworkViewBuilder.swift @@ -15,17 +15,9 @@ public final class ArtworkViewBuilder: ArtworkViewBuildable { public func build(with listener: ArtworkListener?) -> ArtworkRouting { let viewController = ArtworkViewController() let interactor = ArtworkInteractor() - - let router = ArtworkRouter( - viewController: viewController - ) - - print(viewController.listener, interactor) + let router = ArtworkRouter(viewController: viewController) viewController.listener = interactor - - print(viewController.listener, interactor) - print("🥕",viewController) interactor.listener = listener interactor.router = router From 7acddb6b80d424b941621b76b1c7e3bcbd91b852 Mon Sep 17 00:00:00 2001 From: GeonWoo Date: Wed, 29 Jan 2025 21:07:35 +0900 Subject: [PATCH 14/21] =?UTF-8?q?#2=20=ED=8F=AC=EC=8A=A4=ED=8C=85=20?= =?UTF-8?q?=EC=9D=B8=ED=84=B0=ED=8E=98=EC=9D=B4=EC=8A=A4=EB=A7=8C=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- App/ZiineApp/AppRoot/AppRootBuilder.swift | 1 - App/ZiineApp/SceneDelegate.swift | 1 - .../Source/ArtworkInteractor.swift | 7 +++---- .../ArtworkFeature/Source/ArtworkRouter.swift | 4 ---- .../Source/Interface.swift | 4 ++-- .../PostingFeature.xcodeproj/project.pbxproj | 4 ++++ .../PostingFeatureInterface/Interface.swift | 20 +++++++++++++++++++ 7 files changed, 29 insertions(+), 12 deletions(-) create mode 100644 Features/PostingFeature/PostingFeatureInterface/Interface.swift diff --git a/App/ZiineApp/AppRoot/AppRootBuilder.swift b/App/ZiineApp/AppRoot/AppRootBuilder.swift index 0c16774..4a0f2db 100644 --- a/App/ZiineApp/AppRoot/AppRootBuilder.swift +++ b/App/ZiineApp/AppRoot/AppRootBuilder.swift @@ -18,7 +18,6 @@ final class AppRootBuilder: AppRootBuildable { func build() -> AppRootRouting { let interactor = AppRootInteractor() - let artworkBuilder = ArtworkViewBuilder() let router = AppRootRouter( diff --git a/App/ZiineApp/SceneDelegate.swift b/App/ZiineApp/SceneDelegate.swift index 4c426a8..9096064 100644 --- a/App/ZiineApp/SceneDelegate.swift +++ b/App/ZiineApp/SceneDelegate.swift @@ -11,7 +11,6 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { var window: UIWindow? - func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { guard let windowScene = (scene as? UIWindowScene) else { return } diff --git a/Features/ArtworkFeature/ArtworkFeature/Source/ArtworkInteractor.swift b/Features/ArtworkFeature/ArtworkFeature/Source/ArtworkInteractor.swift index 10ae74d..af2a755 100644 --- a/Features/ArtworkFeature/ArtworkFeature/Source/ArtworkInteractor.swift +++ b/Features/ArtworkFeature/ArtworkFeature/Source/ArtworkInteractor.swift @@ -19,8 +19,9 @@ protocol ArtworkInteractorable: AnyObject { protocol ArtworkInteractorDependency: AnyObject { } -final class ArtworkInteractor: ArtworkInteractorable, - ArtworkViewPresentableListener +final class ArtworkInteractor: + ArtworkInteractorable, + ArtworkViewPresentableListener { var router: ArtworkRouting? var listener: ArtworkListener? @@ -30,8 +31,6 @@ final class ArtworkInteractor: ArtworkInteractorable, func fetch() { } func itemSelected(indexPath: IndexPath) { - print(#file, #function) - router?.pushToUpload() } } diff --git a/Features/ArtworkFeature/ArtworkFeature/Source/ArtworkRouter.swift b/Features/ArtworkFeature/ArtworkFeature/Source/ArtworkRouter.swift index ea6e1d2..c7d74d5 100644 --- a/Features/ArtworkFeature/ArtworkFeature/Source/ArtworkRouter.swift +++ b/Features/ArtworkFeature/ArtworkFeature/Source/ArtworkRouter.swift @@ -14,15 +14,11 @@ final class ArtworkRouter: ArtworkRouting { init(viewController: UIViewController) { self.viewController = viewController - - print("🍋🍋🍋", viewController) } // MARK: - Upload func pushToUpload() { - print(#function) - let vc = UIViewController() vc.view.backgroundColor = .systemBlue // navigationController.pushViewController(viewController, animated: true) diff --git a/Features/ArtworkFeature/ArtworkFeatureInterface/Source/Interface.swift b/Features/ArtworkFeature/ArtworkFeatureInterface/Source/Interface.swift index 498d02a..7ea0bfd 100644 --- a/Features/ArtworkFeature/ArtworkFeatureInterface/Source/Interface.swift +++ b/Features/ArtworkFeature/ArtworkFeatureInterface/Source/Interface.swift @@ -1,6 +1,6 @@ // -// ArtworkViewBuildable.swift -// ArtworkFeature +// Interface.swift +// ArtworkFeatureInterface // // Created by Geon Woo lee on 1/28/25. // diff --git a/Features/PostingFeature/PostingFeature.xcodeproj/project.pbxproj b/Features/PostingFeature/PostingFeature.xcodeproj/project.pbxproj index 66f21c3..469a6d7 100644 --- a/Features/PostingFeature/PostingFeature.xcodeproj/project.pbxproj +++ b/Features/PostingFeature/PostingFeature.xcodeproj/project.pbxproj @@ -196,6 +196,7 @@ TargetAttributes = { 1A0B4B432D478032002D10DE = { CreatedOnToolsVersion = 16.0; + LastSwiftMigration = 1600; }; 1A96481E2D4783E600268B29 = { CreatedOnToolsVersion = 16.0; @@ -390,6 +391,7 @@ isa = XCBuildConfiguration; buildSettings = { BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CLANG_ENABLE_MODULES = YES; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; DEFINES_MODULE = YES; @@ -417,6 +419,7 @@ SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_INSTALL_OBJC_HEADER = NO; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; @@ -428,6 +431,7 @@ isa = XCBuildConfiguration; buildSettings = { BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CLANG_ENABLE_MODULES = YES; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; DEFINES_MODULE = YES; diff --git a/Features/PostingFeature/PostingFeatureInterface/Interface.swift b/Features/PostingFeature/PostingFeatureInterface/Interface.swift new file mode 100644 index 0000000..c7ad5b2 --- /dev/null +++ b/Features/PostingFeature/PostingFeatureInterface/Interface.swift @@ -0,0 +1,20 @@ +// +// Interface.swift +// PostingFeatureInterface +// +// Created by Geon Woo lee on 1/29/25. +// + +import UIKit + +public protocol PostingListener: AnyObject { } + +public protocol PostingViewBuildable { + func build(with listener: PostingListener?) -> PostingRouting +} + +public protocol PostingRouting: AnyObject { + var viewController: UIViewController { get } + + func pushToUpload() +} From 4b9515019793f58e3a659e992fc1b7c39d244a28 Mon Sep 17 00:00:00 2001 From: GeonWoo Date: Wed, 29 Jan 2025 21:17:46 +0900 Subject: [PATCH 15/21] =?UTF-8?q?#2=20postingFeature=20=EB=AA=A8=EB=93=88?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- App/ZiineApp.xcodeproj/project.pbxproj | 24 ++-- App/ZiineApp/AppRoot/AppRootBuilder.swift | 2 + .../PostingFeature.xcodeproj/project.pbxproj | 109 ++++++------------ .../PostingFeature/PostingFeature.h | 18 +++ .../PostingFeature/PostingFeature2.swift | 10 -- 5 files changed, 71 insertions(+), 92 deletions(-) create mode 100644 Features/PostingFeature/PostingFeature/PostingFeature.h delete mode 100644 Features/PostingFeature/PostingFeature/PostingFeature2.swift diff --git a/App/ZiineApp.xcodeproj/project.pbxproj b/App/ZiineApp.xcodeproj/project.pbxproj index 5c24945..750b22c 100644 --- a/App/ZiineApp.xcodeproj/project.pbxproj +++ b/App/ZiineApp.xcodeproj/project.pbxproj @@ -15,10 +15,10 @@ 1A9648FA2D47CFFB00268B29 /* ArtworkFeatureInterface.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 1A9648F32D47CFFB00268B29 /* ArtworkFeatureInterface.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 1A9648FB2D47CFFB00268B29 /* DesignSystem.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1A9648F42D47CFFB00268B29 /* DesignSystem.framework */; }; 1A9648FC2D47CFFB00268B29 /* DesignSystem.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 1A9648F42D47CFFB00268B29 /* DesignSystem.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 1A9648FD2D47CFFB00268B29 /* PostingFeature.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1A9648F52D47CFFB00268B29 /* PostingFeature.framework */; }; - 1A9648FE2D47CFFB00268B29 /* PostingFeature.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 1A9648F52D47CFFB00268B29 /* PostingFeature.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 1A9648FF2D47CFFB00268B29 /* PostingFeatureInterface.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1A9648F62D47CFFB00268B29 /* PostingFeatureInterface.framework */; }; - 1A9649002D47CFFB00268B29 /* PostingFeatureInterface.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 1A9648F62D47CFFB00268B29 /* PostingFeatureInterface.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 1A9649782D4A539A00268B29 /* PostingFeature.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1A9649762D4A539A00268B29 /* PostingFeature.framework */; }; + 1A9649792D4A539A00268B29 /* PostingFeature.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 1A9649762D4A539A00268B29 /* PostingFeature.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 1A96497A2D4A539A00268B29 /* PostingFeatureInterface.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1A9649772D4A539A00268B29 /* PostingFeatureInterface.framework */; }; + 1A96497B2D4A539A00268B29 /* PostingFeatureInterface.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 1A9649772D4A539A00268B29 /* PostingFeatureInterface.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -28,11 +28,11 @@ dstPath = ""; dstSubfolderSpec = 10; files = ( - 1A9649002D47CFFB00268B29 /* PostingFeatureInterface.framework in Embed Frameworks */, + 1A96497B2D4A539A00268B29 /* PostingFeatureInterface.framework in Embed Frameworks */, 1A9648F82D47CFFB00268B29 /* ArtworkFeature.framework in Embed Frameworks */, 1A9648FC2D47CFFB00268B29 /* DesignSystem.framework in Embed Frameworks */, 1A95D61C2D44CA00008B7DEA /* DesignSystem.framework in Embed Frameworks */, - 1A9648FE2D47CFFB00268B29 /* PostingFeature.framework in Embed Frameworks */, + 1A9649792D4A539A00268B29 /* PostingFeature.framework in Embed Frameworks */, 1A9648FA2D47CFFB00268B29 /* ArtworkFeatureInterface.framework in Embed Frameworks */, ); name = "Embed Frameworks"; @@ -50,6 +50,10 @@ 1A9648F42D47CFFB00268B29 /* DesignSystem.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = DesignSystem.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 1A9648F52D47CFFB00268B29 /* PostingFeature.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = PostingFeature.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 1A9648F62D47CFFB00268B29 /* PostingFeatureInterface.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = PostingFeatureInterface.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 1A9649622D4A52DA00268B29 /* PostingFeature.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = PostingFeature.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 1A9649652D4A530400268B29 /* PostingFeature.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = PostingFeature.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 1A9649762D4A539A00268B29 /* PostingFeature.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = PostingFeature.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 1A9649772D4A539A00268B29 /* PostingFeatureInterface.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = PostingFeatureInterface.framework; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */ @@ -78,11 +82,11 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 1A9648FF2D47CFFB00268B29 /* PostingFeatureInterface.framework in Frameworks */, + 1A96497A2D4A539A00268B29 /* PostingFeatureInterface.framework in Frameworks */, 1A9648F72D47CFFB00268B29 /* ArtworkFeature.framework in Frameworks */, 1A9648FB2D47CFFB00268B29 /* DesignSystem.framework in Frameworks */, 1A95D61B2D44CA00008B7DEA /* DesignSystem.framework in Frameworks */, - 1A9648FD2D47CFFB00268B29 /* PostingFeature.framework in Frameworks */, + 1A9649782D4A539A00268B29 /* PostingFeature.framework in Frameworks */, 1A9648F92D47CFFB00268B29 /* ArtworkFeatureInterface.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -110,6 +114,10 @@ 1A95D6192D44CA00008B7DEA /* Frameworks */ = { isa = PBXGroup; children = ( + 1A9649762D4A539A00268B29 /* PostingFeature.framework */, + 1A9649772D4A539A00268B29 /* PostingFeatureInterface.framework */, + 1A9649652D4A530400268B29 /* PostingFeature.framework */, + 1A9649622D4A52DA00268B29 /* PostingFeature.framework */, 1A9648F22D47CFFB00268B29 /* ArtworkFeature.framework */, 1A9648F32D47CFFB00268B29 /* ArtworkFeatureInterface.framework */, 1A9648F42D47CFFB00268B29 /* DesignSystem.framework */, diff --git a/App/ZiineApp/AppRoot/AppRootBuilder.swift b/App/ZiineApp/AppRoot/AppRootBuilder.swift index 4a0f2db..248ee3b 100644 --- a/App/ZiineApp/AppRoot/AppRootBuilder.swift +++ b/App/ZiineApp/AppRoot/AppRootBuilder.swift @@ -8,6 +8,8 @@ import UIKit import ArtworkFeature import ArtworkFeatureInterface +import PostingFeature +import PostingFeatureInterface protocol AppRootBuildable { func build() -> AppRootRouting diff --git a/Features/PostingFeature/PostingFeature.xcodeproj/project.pbxproj b/Features/PostingFeature/PostingFeature.xcodeproj/project.pbxproj index 469a6d7..a6f693b 100644 --- a/Features/PostingFeature/PostingFeature.xcodeproj/project.pbxproj +++ b/Features/PostingFeature/PostingFeature.xcodeproj/project.pbxproj @@ -6,43 +6,11 @@ objectVersion = 77; objects = { -/* Begin PBXBuildFile section */ - 1A9648E72D47CF7600268B29 /* PostingFeatureInterface.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1A0B4B442D478032002D10DE /* PostingFeatureInterface.framework */; }; - 1A9648E82D47CF7600268B29 /* PostingFeatureInterface.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 1A0B4B442D478032002D10DE /* PostingFeatureInterface.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 1A9648F02D47CFA600268B29 /* DesignSystem.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1A9648EF2D47CFA600268B29 /* DesignSystem.framework */; }; - 1A9648F12D47CFA600268B29 /* DesignSystem.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 1A9648EF2D47CFA600268B29 /* DesignSystem.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 1A9648E92D47CF7600268B29 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 1A0B4B2D2D478020002D10DE /* Project object */; - proxyType = 1; - remoteGlobalIDString = 1A0B4B432D478032002D10DE; - remoteInfo = PostingFeatureInterface; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXCopyFilesBuildPhase section */ - 1A9648EB2D47CF7600268B29 /* Embed Frameworks */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 10; - files = ( - 1A9648E82D47CF7600268B29 /* PostingFeatureInterface.framework in Embed Frameworks */, - 1A9648F12D47CFA600268B29 /* DesignSystem.framework in Embed Frameworks */, - ); - name = "Embed Frameworks"; - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXCopyFilesBuildPhase section */ - /* Begin PBXFileReference section */ 1A0B4B442D478032002D10DE /* PostingFeatureInterface.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = PostingFeatureInterface.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 1A9648182D47827300268B29 /* libArtworkFeature.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; path = libArtworkFeature.a; sourceTree = BUILT_PRODUCTS_DIR; }; - 1A96481F2D4783E600268B29 /* PostingFeature.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = PostingFeature.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 1A9648EF2D47CFA600268B29 /* DesignSystem.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = DesignSystem.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 1A96496E2D4A538600268B29 /* PostingFeature.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = PostingFeature.framework; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */ @@ -53,6 +21,13 @@ ); target = 1A0B4B432D478032002D10DE /* PostingFeatureInterface */; }; + 1A9649722D4A538600268B29 /* Exceptions for "PostingFeature" folder in "PostingFeature" target */ = { + isa = PBXFileSystemSynchronizedBuildFileExceptionSet; + publicHeaders = ( + PostingFeature.h, + ); + target = 1A96496D2D4A538600268B29 /* PostingFeature */; + }; /* End PBXFileSystemSynchronizedBuildFileExceptionSet section */ /* Begin PBXFileSystemSynchronizedRootGroup section */ @@ -64,8 +39,11 @@ path = PostingFeatureInterface; sourceTree = ""; }; - 1A9648592D4784A800268B29 /* PostingFeature */ = { + 1A96496F2D4A538600268B29 /* PostingFeature */ = { isa = PBXFileSystemSynchronizedRootGroup; + exceptions = ( + 1A9649722D4A538600268B29 /* Exceptions for "PostingFeature" folder in "PostingFeature" target */, + ); path = PostingFeature; sourceTree = ""; }; @@ -79,12 +57,10 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 1A96481C2D4783E600268B29 /* Frameworks */ = { + 1A96496B2D4A538600268B29 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 1A9648E72D47CF7600268B29 /* PostingFeatureInterface.framework in Frameworks */, - 1A9648F02D47CFA600268B29 /* DesignSystem.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -95,7 +71,7 @@ isa = PBXGroup; children = ( 1A0B4B452D478032002D10DE /* PostingFeatureInterface */, - 1A9648592D4784A800268B29 /* PostingFeature */, + 1A96496F2D4A538600268B29 /* PostingFeature */, 1A9648172D47827300268B29 /* Frameworks */, 1A0B4B362D478020002D10DE /* Products */, ); @@ -105,7 +81,7 @@ isa = PBXGroup; children = ( 1A0B4B442D478032002D10DE /* PostingFeatureInterface.framework */, - 1A96481F2D4783E600268B29 /* PostingFeature.framework */, + 1A96496E2D4A538600268B29 /* PostingFeature.framework */, ); name = Products; sourceTree = ""; @@ -129,7 +105,7 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 1A96481A2D4783E600268B29 /* Headers */ = { + 1A9649692D4A538600268B29 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( @@ -162,26 +138,27 @@ productReference = 1A0B4B442D478032002D10DE /* PostingFeatureInterface.framework */; productType = "com.apple.product-type.framework"; }; - 1A96481E2D4783E600268B29 /* PostingFeature */ = { + 1A96496D2D4A538600268B29 /* PostingFeature */ = { isa = PBXNativeTarget; - buildConfigurationList = 1A9648242D4783E600268B29 /* Build configuration list for PBXNativeTarget "PostingFeature" */; + buildConfigurationList = 1A9649732D4A538600268B29 /* Build configuration list for PBXNativeTarget "PostingFeature" */; buildPhases = ( - 1A96481A2D4783E600268B29 /* Headers */, - 1A96481B2D4783E600268B29 /* Sources */, - 1A96481C2D4783E600268B29 /* Frameworks */, - 1A96481D2D4783E600268B29 /* Resources */, - 1A9648EB2D47CF7600268B29 /* Embed Frameworks */, + 1A9649692D4A538600268B29 /* Headers */, + 1A96496A2D4A538600268B29 /* Sources */, + 1A96496B2D4A538600268B29 /* Frameworks */, + 1A96496C2D4A538600268B29 /* Resources */, ); buildRules = ( ); dependencies = ( - 1A9648EA2D47CF7600268B29 /* PBXTargetDependency */, + ); + fileSystemSynchronizedGroups = ( + 1A96496F2D4A538600268B29 /* PostingFeature */, ); name = PostingFeature; packageProductDependencies = ( ); productName = PostingFeature; - productReference = 1A96481F2D4783E600268B29 /* PostingFeature.framework */; + productReference = 1A96496E2D4A538600268B29 /* PostingFeature.framework */; productType = "com.apple.product-type.framework"; }; /* End PBXNativeTarget section */ @@ -198,7 +175,7 @@ CreatedOnToolsVersion = 16.0; LastSwiftMigration = 1600; }; - 1A96481E2D4783E600268B29 = { + 1A96496D2D4A538600268B29 = { CreatedOnToolsVersion = 16.0; }; }; @@ -218,7 +195,7 @@ projectRoot = ""; targets = ( 1A0B4B432D478032002D10DE /* PostingFeatureInterface */, - 1A96481E2D4783E600268B29 /* PostingFeature */, + 1A96496D2D4A538600268B29 /* PostingFeature */, ); }; /* End PBXProject section */ @@ -231,7 +208,7 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 1A96481D2D4783E600268B29 /* Resources */ = { + 1A96496C2D4A538600268B29 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( @@ -248,7 +225,7 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 1A96481B2D4783E600268B29 /* Sources */ = { + 1A96496A2D4A538600268B29 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( @@ -257,14 +234,6 @@ }; /* End PBXSourcesBuildPhase section */ -/* Begin PBXTargetDependency section */ - 1A9648EA2D47CF7600268B29 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 1A0B4B432D478032002D10DE /* PostingFeatureInterface */; - targetProxy = 1A9648E92D47CF7600268B29 /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - /* Begin XCBuildConfiguration section */ 1A0B4B3A2D478020002D10DE /* Debug */ = { isa = XCBuildConfiguration; @@ -466,7 +435,7 @@ }; name = Release; }; - 1A9648252D4783E600268B29 /* Debug */ = { + 1A9649742D4A538600268B29 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { BUILD_LIBRARY_FOR_DISTRIBUTION = YES; @@ -491,10 +460,6 @@ PRODUCT_BUNDLE_IDENTIFIER = kr.com.PostingFeature; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SKIP_INSTALL = YES; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - SUPPORTS_MACCATALYST = NO; - SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; - SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_INSTALL_OBJC_HEADER = NO; SWIFT_VERSION = 5.0; @@ -504,7 +469,7 @@ }; name = Debug; }; - 1A9648262D4783E600268B29 /* Release */ = { + 1A9649752D4A538600268B29 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { BUILD_LIBRARY_FOR_DISTRIBUTION = YES; @@ -529,10 +494,6 @@ PRODUCT_BUNDLE_IDENTIFIER = kr.com.PostingFeature; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SKIP_INSTALL = YES; - SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; - SUPPORTS_MACCATALYST = NO; - SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; - SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_INSTALL_OBJC_HEADER = NO; SWIFT_VERSION = 5.0; @@ -563,11 +524,11 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 1A9648242D4783E600268B29 /* Build configuration list for PBXNativeTarget "PostingFeature" */ = { + 1A9649732D4A538600268B29 /* Build configuration list for PBXNativeTarget "PostingFeature" */ = { isa = XCConfigurationList; buildConfigurations = ( - 1A9648252D4783E600268B29 /* Debug */, - 1A9648262D4783E600268B29 /* Release */, + 1A9649742D4A538600268B29 /* Debug */, + 1A9649752D4A538600268B29 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; diff --git a/Features/PostingFeature/PostingFeature/PostingFeature.h b/Features/PostingFeature/PostingFeature/PostingFeature.h new file mode 100644 index 0000000..21888f0 --- /dev/null +++ b/Features/PostingFeature/PostingFeature/PostingFeature.h @@ -0,0 +1,18 @@ +// +// PostingFeature.h +// PostingFeature +// +// Created by Geon Woo lee on 1/29/25. +// + +#import + +//! Project version number for PostingFeature. +FOUNDATION_EXPORT double PostingFeatureVersionNumber; + +//! Project version string for PostingFeature. +FOUNDATION_EXPORT const unsigned char PostingFeatureVersionString[]; + +// In this header, you should import all the public headers of your framework using statements like #import + + diff --git a/Features/PostingFeature/PostingFeature/PostingFeature2.swift b/Features/PostingFeature/PostingFeature/PostingFeature2.swift deleted file mode 100644 index d7991b0..0000000 --- a/Features/PostingFeature/PostingFeature/PostingFeature2.swift +++ /dev/null @@ -1,10 +0,0 @@ -// -// PostingFeature2.swift -// PostingFeature2 -// -// Created by Geon Woo lee on 1/27/25. -// - -class PostingFeature2 { - -} From d6f73680c52a1b7acae695f07bbe470d704bc3d8 Mon Sep 17 00:00:00 2001 From: GeonWoo Date: Thu, 30 Jan 2025 01:12:48 +0900 Subject: [PATCH 16/21] #2 Posting Feature --- .../Source/ArtworkInteractor.swift | 2 +- .../PostingFeature.xcodeproj/project.pbxproj | 12 ++++ .../PostingFeature/ArtworkInteractor.swift | 36 +++++++++++ .../PostingFeature/ArtworkRouter.swift | 29 +++++++++ .../PostingFeature/ArtworkViewBuilder.swift | 26 ++++++++ .../ArtworkViewController.swift | 62 +++++++++++++++++++ 6 files changed, 166 insertions(+), 1 deletion(-) create mode 100644 Features/PostingFeature/PostingFeature/ArtworkInteractor.swift create mode 100644 Features/PostingFeature/PostingFeature/ArtworkRouter.swift create mode 100644 Features/PostingFeature/PostingFeature/ArtworkViewBuilder.swift create mode 100644 Features/PostingFeature/PostingFeature/ArtworkViewController.swift diff --git a/Features/ArtworkFeature/ArtworkFeature/Source/ArtworkInteractor.swift b/Features/ArtworkFeature/ArtworkFeature/Source/ArtworkInteractor.swift index af2a755..8fd9c0a 100644 --- a/Features/ArtworkFeature/ArtworkFeature/Source/ArtworkInteractor.swift +++ b/Features/ArtworkFeature/ArtworkFeature/Source/ArtworkInteractor.swift @@ -1,5 +1,5 @@ // -// ArtworkInteractorable.swift +// ArtworkInteractor.swift // ArtworkFeature // // Created by Geon Woo lee on 1/28/25. diff --git a/Features/PostingFeature/PostingFeature.xcodeproj/project.pbxproj b/Features/PostingFeature/PostingFeature.xcodeproj/project.pbxproj index a6f693b..2c7316f 100644 --- a/Features/PostingFeature/PostingFeature.xcodeproj/project.pbxproj +++ b/Features/PostingFeature/PostingFeature.xcodeproj/project.pbxproj @@ -177,6 +177,7 @@ }; 1A96496D2D4A538600268B29 = { CreatedOnToolsVersion = 16.0; + LastSwiftMigration = 1600; }; }; }; @@ -439,6 +440,7 @@ isa = XCBuildConfiguration; buildSettings = { BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CLANG_ENABLE_MODULES = YES; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; DEFINES_MODULE = YES; @@ -460,8 +462,13 @@ PRODUCT_BUNDLE_IDENTIFIER = kr.com.PostingFeature; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SKIP_INSTALL = YES; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_INSTALL_OBJC_HEADER = NO; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; @@ -473,6 +480,7 @@ isa = XCBuildConfiguration; buildSettings = { BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CLANG_ENABLE_MODULES = YES; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; DEFINES_MODULE = YES; @@ -494,6 +502,10 @@ PRODUCT_BUNDLE_IDENTIFIER = kr.com.PostingFeature; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SKIP_INSTALL = YES; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_INSTALL_OBJC_HEADER = NO; SWIFT_VERSION = 5.0; diff --git a/Features/PostingFeature/PostingFeature/ArtworkInteractor.swift b/Features/PostingFeature/PostingFeature/ArtworkInteractor.swift new file mode 100644 index 0000000..9475d0b --- /dev/null +++ b/Features/PostingFeature/PostingFeature/ArtworkInteractor.swift @@ -0,0 +1,36 @@ +// +// PostingInteractor.swift +// PostingFeature +// +// Created by Geon Woo lee on 1/28/25. +// + +import UIKit +import PostingFeatureInterface + +protocol PostingViewPresentable: AnyObject { + var listener: PostingViewPresentableListener? { get set } +} + +protocol PostingInteractorable: AnyObject { + var router: PostingRouting? { get set } + var listener: PostingListener? { get set } +} + +protocol PostingInteractorDependency: AnyObject { } + +final class PostingInteractor: + PostingInteractorable, + PostingViewPresentableListener +{ + var router: PostingRouting? + var listener: PostingListener? + + init() {} + + func fetch() { } + + func itemSelected(indexPath: IndexPath) { + router?.pushToUpload() + } +} diff --git a/Features/PostingFeature/PostingFeature/ArtworkRouter.swift b/Features/PostingFeature/PostingFeature/ArtworkRouter.swift new file mode 100644 index 0000000..137e7e0 --- /dev/null +++ b/Features/PostingFeature/PostingFeature/ArtworkRouter.swift @@ -0,0 +1,29 @@ +// +// PostingRouter.swift +// PostingFeature +// +// Created by Geon Woo lee on 1/28/25. +// + +import UIKit +import PostingFeatureInterface + +final class PostingRouter: PostingRouting { + + var viewController: UIViewController + + init(viewController: UIViewController) { + self.viewController = viewController + } + + // MARK: - Upload + + func pushToUpload() { + let vc = UIViewController() + vc.view.backgroundColor = .systemBlue +// navigationController.pushViewController(viewController, animated: true) +// viewController.present(vc, animated: true) + viewController.navigationController?.pushViewController(vc, animated: true) + } + +} diff --git a/Features/PostingFeature/PostingFeature/ArtworkViewBuilder.swift b/Features/PostingFeature/PostingFeature/ArtworkViewBuilder.swift new file mode 100644 index 0000000..0b25c91 --- /dev/null +++ b/Features/PostingFeature/PostingFeature/ArtworkViewBuilder.swift @@ -0,0 +1,26 @@ +// +// PostingViewBuilder.swift +// PostingFeature +// +// Created by Geon Woo lee on 1/28/25. +// + +import UIKit +import PostingFeatureInterface + +public final class PostingViewBuilder: PostingViewBuildable { + + public init() {} + + public func build(with listener: PostingListener?) -> PostingRouting { + let viewController = PostingViewController() + let interactor = PostingInteractor() + let router = PostingRouter(viewController: viewController) + + viewController.listener = interactor + interactor.listener = listener + interactor.router = router + + return router + } +} diff --git a/Features/PostingFeature/PostingFeature/ArtworkViewController.swift b/Features/PostingFeature/PostingFeature/ArtworkViewController.swift new file mode 100644 index 0000000..fd12704 --- /dev/null +++ b/Features/PostingFeature/PostingFeature/ArtworkViewController.swift @@ -0,0 +1,62 @@ +// +// PostingViewController.swift +// PostingFeature +// +// Created by Geon Woo lee on 1/28/25. +// + +import UIKit +import PostingFeatureInterface + +protocol PostingViewPresentableListener: AnyObject { + func itemSelected(indexPath: IndexPath) +} + +final class PostingViewController: UIViewController, + PostingViewPresentable, + UICollectionViewDelegate +{ + var listener: PostingViewPresentableListener? + + init() { + super.init(nibName: nil, bundle: nil) + + configureUI() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + // MARK: - UIComponents + +// private let collectionView = UICollectionView() + + private func configureUI() { + // TODO: - 스냅킷 도입 예정 + + view.backgroundColor = .red + + let btn = UIButton() + btn.setTitle("Go to Detail", for: .normal) + btn.addTarget(self, action: #selector(onTapGoToDetail), for: .touchUpInside) + btn.translatesAutoresizingMaskIntoConstraints = false + view.addSubview(btn) + NSLayoutConstraint.activate([ + btn.centerXAnchor.constraint(equalTo: view.centerXAnchor), + btn.centerYAnchor.constraint(equalTo: view.centerYAnchor), + ]) + + } + + @objc func onTapGoToDetail() { + print("🍋",listener, self) + listener?.itemSelected(indexPath: .init(item: 0, section: 0)) + } + + // TODO: - 컬렉션 UI 도입해서 분리할 예정 + +// func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { +// listener?.itemSelected(indexPath: indexPath) +// } +} From cd5186e9a47207fcadaf2121e3d5842b412d9141 Mon Sep 17 00:00:00 2001 From: GeonWoo Date: Thu, 30 Jan 2025 01:13:44 +0900 Subject: [PATCH 17/21] =?UTF-8?q?#2=20=ED=8C=8C=EC=9D=BC=20=EB=84=A4?= =?UTF-8?q?=EC=9E=84=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{ArtworkInteractor.swift => Source/PostingInteractor.swift} | 0 .../{ArtworkRouter.swift => Source/PostingRouter.swift} | 0 .../{ArtworkViewBuilder.swift => Source/PostingViewBuilder.swift} | 0 .../PostingViewController.swift} | 0 4 files changed, 0 insertions(+), 0 deletions(-) rename Features/PostingFeature/PostingFeature/{ArtworkInteractor.swift => Source/PostingInteractor.swift} (100%) rename Features/PostingFeature/PostingFeature/{ArtworkRouter.swift => Source/PostingRouter.swift} (100%) rename Features/PostingFeature/PostingFeature/{ArtworkViewBuilder.swift => Source/PostingViewBuilder.swift} (100%) rename Features/PostingFeature/PostingFeature/{ArtworkViewController.swift => Source/PostingViewController.swift} (100%) diff --git a/Features/PostingFeature/PostingFeature/ArtworkInteractor.swift b/Features/PostingFeature/PostingFeature/Source/PostingInteractor.swift similarity index 100% rename from Features/PostingFeature/PostingFeature/ArtworkInteractor.swift rename to Features/PostingFeature/PostingFeature/Source/PostingInteractor.swift diff --git a/Features/PostingFeature/PostingFeature/ArtworkRouter.swift b/Features/PostingFeature/PostingFeature/Source/PostingRouter.swift similarity index 100% rename from Features/PostingFeature/PostingFeature/ArtworkRouter.swift rename to Features/PostingFeature/PostingFeature/Source/PostingRouter.swift diff --git a/Features/PostingFeature/PostingFeature/ArtworkViewBuilder.swift b/Features/PostingFeature/PostingFeature/Source/PostingViewBuilder.swift similarity index 100% rename from Features/PostingFeature/PostingFeature/ArtworkViewBuilder.swift rename to Features/PostingFeature/PostingFeature/Source/PostingViewBuilder.swift diff --git a/Features/PostingFeature/PostingFeature/ArtworkViewController.swift b/Features/PostingFeature/PostingFeature/Source/PostingViewController.swift similarity index 100% rename from Features/PostingFeature/PostingFeature/ArtworkViewController.swift rename to Features/PostingFeature/PostingFeature/Source/PostingViewController.swift From e4151485f3fe2eb593af47c0e8c80923f445228f Mon Sep 17 00:00:00 2001 From: GeonWoo Date: Thu, 30 Jan 2025 01:20:19 +0900 Subject: [PATCH 18/21] =?UTF-8?q?#2=20AppRoot=EC=97=90=20=ED=8F=AC?= =?UTF-8?q?=EC=8A=A4=ED=8C=85=20=ED=99=94=EB=A9=B4=20=ED=86=B5=ED=95=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- App/ZiineApp/AppRoot/AppRootBuilder.swift | 21 +++++++-- .../PostingFeature.xcodeproj/project.pbxproj | 46 +++++++++++++++++++ .../Source/PostingViewController.swift | 4 +- 3 files changed, 64 insertions(+), 7 deletions(-) diff --git a/App/ZiineApp/AppRoot/AppRootBuilder.swift b/App/ZiineApp/AppRoot/AppRootBuilder.swift index 248ee3b..646dd2c 100644 --- a/App/ZiineApp/AppRoot/AppRootBuilder.swift +++ b/App/ZiineApp/AppRoot/AppRootBuilder.swift @@ -21,10 +21,12 @@ final class AppRootBuilder: AppRootBuildable { let interactor = AppRootInteractor() let artworkBuilder = ArtworkViewBuilder() + let postingBuilder = PostingViewBuilder() let router = AppRootRouter( interactor: interactor, - artworkBuildable: artworkBuilder + artworkBuildable: artworkBuilder, + postingBuildable: postingBuilder ) return router @@ -32,7 +34,7 @@ final class AppRootBuilder: AppRootBuildable { } -protocol AppRootInteractable: ArtworkListener { } +protocol AppRootInteractable: ArtworkListener, PostingListener { } final class AppRootInteractor: AppRootInteractable {} @@ -47,21 +49,30 @@ final class AppRootRouter: AppRootRouting { private let artworkBuildable: ArtworkViewBuildable private var artworkRouting: ArtworkRouting? + private let postingBuildable: PostingViewBuildable + private var postingRouting: PostingRouting? + init( interactor :AppRootInteractable, - artworkBuildable: ArtworkViewBuildable + artworkBuildable: ArtworkViewBuildable, + postingBuildable: PostingViewBuildable ) { self.interactor = interactor self.artworkBuildable = artworkBuildable + self.postingBuildable = postingBuildable } func configureTabs() -> [UIViewController] { let artworkRouting = artworkBuildable.build(with: interactor) self.artworkRouting = artworkRouting + let postingRouting = postingBuildable.build(with: interactor) + self.postingRouting = postingRouting + let viewControllers = [ - artworkRouting.viewController + artworkRouting.viewController, + postingRouting.viewController ] return viewControllers @@ -69,8 +80,8 @@ final class AppRootRouter: AppRootRouting { } protocol AppRootTabBarControllable { - func build() -> UITabBarController func setViewControllers(_ viewControllers: [UIViewController]) + func build() -> UITabBarController } final class AppRootTabBarController: UITabBarController, AppRootTabBarControllable { diff --git a/Features/PostingFeature/PostingFeature.xcodeproj/project.pbxproj b/Features/PostingFeature/PostingFeature.xcodeproj/project.pbxproj index 2c7316f..661d6fb 100644 --- a/Features/PostingFeature/PostingFeature.xcodeproj/project.pbxproj +++ b/Features/PostingFeature/PostingFeature.xcodeproj/project.pbxproj @@ -6,11 +6,44 @@ objectVersion = 77; objects = { +/* Begin PBXBuildFile section */ + 1A9649862D4A8B4800268B29 /* PostingFeatureInterface.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1A0B4B442D478032002D10DE /* PostingFeatureInterface.framework */; }; + 1A9649872D4A8B4800268B29 /* PostingFeatureInterface.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 1A0B4B442D478032002D10DE /* PostingFeatureInterface.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 1A96498A2D4A8B4800268B29 /* DesignSystem.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1A9649852D4A8B4800268B29 /* DesignSystem.framework */; }; + 1A96498B2D4A8B4800268B29 /* DesignSystem.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 1A9649852D4A8B4800268B29 /* DesignSystem.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 1A9649882D4A8B4800268B29 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 1A0B4B2D2D478020002D10DE /* Project object */; + proxyType = 1; + remoteGlobalIDString = 1A0B4B432D478032002D10DE; + remoteInfo = PostingFeatureInterface; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 1A96498C2D4A8B4800268B29 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 1A9649872D4A8B4800268B29 /* PostingFeatureInterface.framework in Embed Frameworks */, + 1A96498B2D4A8B4800268B29 /* DesignSystem.framework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + /* Begin PBXFileReference section */ 1A0B4B442D478032002D10DE /* PostingFeatureInterface.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = PostingFeatureInterface.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 1A9648182D47827300268B29 /* libArtworkFeature.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; path = libArtworkFeature.a; sourceTree = BUILT_PRODUCTS_DIR; }; 1A9648EF2D47CFA600268B29 /* DesignSystem.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = DesignSystem.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 1A96496E2D4A538600268B29 /* PostingFeature.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = PostingFeature.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 1A9649852D4A8B4800268B29 /* DesignSystem.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = DesignSystem.framework; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */ @@ -61,6 +94,8 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 1A9649862D4A8B4800268B29 /* PostingFeatureInterface.framework in Frameworks */, + 1A96498A2D4A8B4800268B29 /* DesignSystem.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -89,6 +124,7 @@ 1A9648172D47827300268B29 /* Frameworks */ = { isa = PBXGroup; children = ( + 1A9649852D4A8B4800268B29 /* DesignSystem.framework */, 1A9648EF2D47CFA600268B29 /* DesignSystem.framework */, 1A9648182D47827300268B29 /* libArtworkFeature.a */, ); @@ -146,10 +182,12 @@ 1A96496A2D4A538600268B29 /* Sources */, 1A96496B2D4A538600268B29 /* Frameworks */, 1A96496C2D4A538600268B29 /* Resources */, + 1A96498C2D4A8B4800268B29 /* Embed Frameworks */, ); buildRules = ( ); dependencies = ( + 1A9649892D4A8B4800268B29 /* PBXTargetDependency */, ); fileSystemSynchronizedGroups = ( 1A96496F2D4A538600268B29 /* PostingFeature */, @@ -235,6 +273,14 @@ }; /* End PBXSourcesBuildPhase section */ +/* Begin PBXTargetDependency section */ + 1A9649892D4A8B4800268B29 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 1A0B4B432D478032002D10DE /* PostingFeatureInterface */; + targetProxy = 1A9649882D4A8B4800268B29 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + /* Begin XCBuildConfiguration section */ 1A0B4B3A2D478020002D10DE /* Debug */ = { isa = XCBuildConfiguration; diff --git a/Features/PostingFeature/PostingFeature/Source/PostingViewController.swift b/Features/PostingFeature/PostingFeature/Source/PostingViewController.swift index fd12704..8b90ae3 100644 --- a/Features/PostingFeature/PostingFeature/Source/PostingViewController.swift +++ b/Features/PostingFeature/PostingFeature/Source/PostingViewController.swift @@ -35,10 +35,10 @@ final class PostingViewController: UIViewController, private func configureUI() { // TODO: - 스냅킷 도입 예정 - view.backgroundColor = .red + view.backgroundColor = .green let btn = UIButton() - btn.setTitle("Go to Detail", for: .normal) + btn.setTitle("Posting Detail", for: .normal) btn.addTarget(self, action: #selector(onTapGoToDetail), for: .touchUpInside) btn.translatesAutoresizingMaskIntoConstraints = false view.addSubview(btn) From 05aed7a1503634d1f1c4cee97f6c8e90d656c779 Mon Sep 17 00:00:00 2001 From: GeonWoo Date: Thu, 30 Jan 2025 02:11:44 +0900 Subject: [PATCH 19/21] =?UTF-8?q?#2=20=EC=8D=A8=EB=93=9C=ED=8C=8C=ED=8B=B0?= =?UTF-8?q?=20=EB=8F=84=EC=9E=85=20(=EB=82=98=EC=A4=91=EC=97=90=20XCFramew?= =?UTF-8?q?ork=20=EB=A7=8C=EB=93=A4=EA=B1=B0=EB=9D=BC=EC=84=9C=20=EC=9D=B4?= =?UTF-8?q?=20=EC=A7=80=EC=A0=90=EC=97=90=EC=84=9C=20=EA=B3=A0=EB=A0=A4?= =?UTF-8?q?=ED=95=B4=EC=95=BC=20=ED=95=A8.)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DesignSystem.xcodeproj/project.pbxproj | 0 .../contents.xcworkspacedata | 0 .../xcschemes/DesignSystem.xcscheme | 0 .../{ => DesignSystem}/DesignSystem.h | 0 .../ThirdParty.xcodeproj/project.pbxproj | 400 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + Core/ThirdParty/ThirdParty/ThirdParty.h | 18 + .../ArtworkFeature.xcodeproj/project.pbxproj | 6 + .../xcschemes/ArtworkFeature.xcscheme | 4 +- .../Source/ArtworkViewController.swift | 24 +- .../PostingFeature.xcodeproj/project.pbxproj | 6 + .../Source/PostingViewController.swift | 34 +- .../contents.xcworkspacedata | 5 +- .../xcshareddata/swiftpm/Package.resolved | 51 +++ 14 files changed, 510 insertions(+), 45 deletions(-) rename Core/{ => DesignSystem}/DesignSystem.xcodeproj/project.pbxproj (100%) rename Core/{ => DesignSystem}/DesignSystem.xcodeproj/project.xcworkspace/contents.xcworkspacedata (100%) rename Core/{ => DesignSystem}/DesignSystem.xcodeproj/xcshareddata/xcschemes/DesignSystem.xcscheme (100%) rename Core/DesignSystem/{ => DesignSystem}/DesignSystem.h (100%) create mode 100644 Core/ThirdParty/ThirdParty.xcodeproj/project.pbxproj create mode 100644 Core/ThirdParty/ThirdParty.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Core/ThirdParty/ThirdParty/ThirdParty.h create mode 100644 ziine-app-ios.xcworkspace/xcshareddata/swiftpm/Package.resolved diff --git a/Core/DesignSystem.xcodeproj/project.pbxproj b/Core/DesignSystem/DesignSystem.xcodeproj/project.pbxproj similarity index 100% rename from Core/DesignSystem.xcodeproj/project.pbxproj rename to Core/DesignSystem/DesignSystem.xcodeproj/project.pbxproj diff --git a/Core/DesignSystem.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Core/DesignSystem/DesignSystem.xcodeproj/project.xcworkspace/contents.xcworkspacedata similarity index 100% rename from Core/DesignSystem.xcodeproj/project.xcworkspace/contents.xcworkspacedata rename to Core/DesignSystem/DesignSystem.xcodeproj/project.xcworkspace/contents.xcworkspacedata diff --git a/Core/DesignSystem.xcodeproj/xcshareddata/xcschemes/DesignSystem.xcscheme b/Core/DesignSystem/DesignSystem.xcodeproj/xcshareddata/xcschemes/DesignSystem.xcscheme similarity index 100% rename from Core/DesignSystem.xcodeproj/xcshareddata/xcschemes/DesignSystem.xcscheme rename to Core/DesignSystem/DesignSystem.xcodeproj/xcshareddata/xcschemes/DesignSystem.xcscheme diff --git a/Core/DesignSystem/DesignSystem.h b/Core/DesignSystem/DesignSystem/DesignSystem.h similarity index 100% rename from Core/DesignSystem/DesignSystem.h rename to Core/DesignSystem/DesignSystem/DesignSystem.h diff --git a/Core/ThirdParty/ThirdParty.xcodeproj/project.pbxproj b/Core/ThirdParty/ThirdParty.xcodeproj/project.pbxproj new file mode 100644 index 0000000..5b17bf8 --- /dev/null +++ b/Core/ThirdParty/ThirdParty.xcodeproj/project.pbxproj @@ -0,0 +1,400 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 77; + objects = { + +/* Begin PBXBuildFile section */ + 1A9649D72D4A931500268B29 /* SnapKit in Frameworks */ = {isa = PBXBuildFile; productRef = 1A9649D62D4A931500268B29 /* SnapKit */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 1A9649972D4A915900268B29 /* ThirdParty.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ThirdParty.framework; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */ + 1A96499C2D4A915900268B29 /* Exceptions for "ThirdParty" folder in "ThirdParty" target */ = { + isa = PBXFileSystemSynchronizedBuildFileExceptionSet; + publicHeaders = ( + ThirdParty.h, + ); + target = 1A9649962D4A915900268B29 /* ThirdParty */; + }; +/* End PBXFileSystemSynchronizedBuildFileExceptionSet section */ + +/* Begin PBXFileSystemSynchronizedRootGroup section */ + 1A9649992D4A915900268B29 /* ThirdParty */ = { + isa = PBXFileSystemSynchronizedRootGroup; + exceptions = ( + 1A96499C2D4A915900268B29 /* Exceptions for "ThirdParty" folder in "ThirdParty" target */, + ); + path = ThirdParty; + sourceTree = ""; + }; +/* End PBXFileSystemSynchronizedRootGroup section */ + +/* Begin PBXFrameworksBuildPhase section */ + 1A9649942D4A915900268B29 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 1A9649D72D4A931500268B29 /* SnapKit in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 1A96498D2D4A915900268B29 = { + isa = PBXGroup; + children = ( + 1A9649992D4A915900268B29 /* ThirdParty */, + 1A9649982D4A915900268B29 /* Products */, + ); + sourceTree = ""; + }; + 1A9649982D4A915900268B29 /* Products */ = { + isa = PBXGroup; + children = ( + 1A9649972D4A915900268B29 /* ThirdParty.framework */, + ); + name = Products; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 1A9649922D4A915900268B29 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 1A9649962D4A915900268B29 /* ThirdParty */ = { + isa = PBXNativeTarget; + buildConfigurationList = 1A96499D2D4A915900268B29 /* Build configuration list for PBXNativeTarget "ThirdParty" */; + buildPhases = ( + 1A9649922D4A915900268B29 /* Headers */, + 1A9649932D4A915900268B29 /* Sources */, + 1A9649942D4A915900268B29 /* Frameworks */, + 1A9649952D4A915900268B29 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + fileSystemSynchronizedGroups = ( + 1A9649992D4A915900268B29 /* ThirdParty */, + ); + name = ThirdParty; + packageProductDependencies = ( + 1A9649D62D4A931500268B29 /* SnapKit */, + ); + productName = ThirdParty; + productReference = 1A9649972D4A915900268B29 /* ThirdParty.framework */; + productType = "com.apple.product-type.framework"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 1A96498E2D4A915900268B29 /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = 1; + LastUpgradeCheck = 1600; + TargetAttributes = { + 1A9649962D4A915900268B29 = { + CreatedOnToolsVersion = 16.0; + }; + }; + }; + buildConfigurationList = 1A9649912D4A915900268B29 /* Build configuration list for PBXProject "ThirdParty" */; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 1A96498D2D4A915900268B29; + minimizedProjectReferenceProxies = 1; + packageReferences = ( + 1A9649D52D4A931500268B29 /* XCRemoteSwiftPackageReference "SnapKit" */, + ); + preferredProjectObjectVersion = 77; + productRefGroup = 1A9649982D4A915900268B29 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 1A9649962D4A915900268B29 /* ThirdParty */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 1A9649952D4A915900268B29 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 1A9649932D4A915900268B29 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 1A96499E2D4A915900268B29 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20"; + PRODUCT_BUNDLE_IDENTIFIER = kr.com.ThirdParty; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SKIP_INSTALL = YES; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_INSTALL_OBJC_HEADER = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 1A96499F2D4A915900268B29 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUILD_LIBRARY_FOR_DISTRIBUTION = YES; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_MODULE_VERIFIER = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++"; + MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20"; + PRODUCT_BUNDLE_IDENTIFIER = kr.com.ThirdParty; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SKIP_INSTALL = YES; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_INSTALL_OBJC_HEADER = NO; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; + 1A9649A02D4A915900268B29 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + 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; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 18.0; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 1A9649A12D4A915900268B29 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + 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; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 18.0; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 1A9649912D4A915900268B29 /* Build configuration list for PBXProject "ThirdParty" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1A9649A02D4A915900268B29 /* Debug */, + 1A9649A12D4A915900268B29 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 1A96499D2D4A915900268B29 /* Build configuration list for PBXNativeTarget "ThirdParty" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1A96499E2D4A915900268B29 /* Debug */, + 1A96499F2D4A915900268B29 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + +/* Begin XCRemoteSwiftPackageReference section */ + 1A9649D52D4A931500268B29 /* XCRemoteSwiftPackageReference "SnapKit" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/SnapKit/SnapKit"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 5.7.1; + }; + }; +/* End XCRemoteSwiftPackageReference section */ + +/* Begin XCSwiftPackageProductDependency section */ + 1A9649D62D4A931500268B29 /* SnapKit */ = { + isa = XCSwiftPackageProductDependency; + package = 1A9649D52D4A931500268B29 /* XCRemoteSwiftPackageReference "SnapKit" */; + productName = SnapKit; + }; +/* End XCSwiftPackageProductDependency section */ + }; + rootObject = 1A96498E2D4A915900268B29 /* Project object */; +} diff --git a/Core/ThirdParty/ThirdParty.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Core/ThirdParty/ThirdParty.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/Core/ThirdParty/ThirdParty.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Core/ThirdParty/ThirdParty/ThirdParty.h b/Core/ThirdParty/ThirdParty/ThirdParty.h new file mode 100644 index 0000000..8b1ce63 --- /dev/null +++ b/Core/ThirdParty/ThirdParty/ThirdParty.h @@ -0,0 +1,18 @@ +// +// ThirdParty.h +// ThirdParty +// +// Created by Geon Woo lee on 1/30/25. +// + +#import + +//! Project version number for ThirdParty. +FOUNDATION_EXPORT double ThirdPartyVersionNumber; + +//! Project version string for ThirdParty. +FOUNDATION_EXPORT const unsigned char ThirdPartyVersionString[]; + +// In this header, you should import all the public headers of your framework using statements like #import + + diff --git a/Features/ArtworkFeature/ArtworkFeature.xcodeproj/project.pbxproj b/Features/ArtworkFeature/ArtworkFeature.xcodeproj/project.pbxproj index 5e5ccab..d4117ec 100644 --- a/Features/ArtworkFeature/ArtworkFeature.xcodeproj/project.pbxproj +++ b/Features/ArtworkFeature/ArtworkFeature.xcodeproj/project.pbxproj @@ -11,6 +11,8 @@ 1A9648E32D47CF7100268B29 /* ArtworkFeatureInterface.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 1A0B4B242D477FFB002D10DE /* ArtworkFeatureInterface.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 1A9648ED2D47CF9C00268B29 /* DesignSystem.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1A9648EC2D47CF9C00268B29 /* DesignSystem.framework */; }; 1A9648EE2D47CF9C00268B29 /* DesignSystem.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 1A9648EC2D47CF9C00268B29 /* DesignSystem.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 1A9649DC2D4A936F00268B29 /* ThirdParty.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1A9649DB2D4A936F00268B29 /* ThirdParty.framework */; }; + 1A9649DD2D4A936F00268B29 /* ThirdParty.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 1A9649DB2D4A936F00268B29 /* ThirdParty.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -31,6 +33,7 @@ dstSubfolderSpec = 10; files = ( 1A9648E32D47CF7100268B29 /* ArtworkFeatureInterface.framework in Embed Frameworks */, + 1A9649DD2D4A936F00268B29 /* ThirdParty.framework in Embed Frameworks */, 1A9648EE2D47CF9C00268B29 /* DesignSystem.framework in Embed Frameworks */, ); name = "Embed Frameworks"; @@ -43,6 +46,7 @@ 1A9648D52D47CD7700268B29 /* ArtworkFeature.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ArtworkFeature.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 1A9648DE2D47CF1500268B29 /* PostingFeatureInterface.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = PostingFeatureInterface.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 1A9648EC2D47CF9C00268B29 /* DesignSystem.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = DesignSystem.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 1A9649DB2D4A936F00268B29 /* ThirdParty.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = ThirdParty.framework; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */ @@ -94,6 +98,7 @@ buildActionMask = 2147483647; files = ( 1A9648E22D47CF7100268B29 /* ArtworkFeatureInterface.framework in Frameworks */, + 1A9649DC2D4A936F00268B29 /* ThirdParty.framework in Frameworks */, 1A9648ED2D47CF9C00268B29 /* DesignSystem.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -123,6 +128,7 @@ 1A9648DD2D47CF1500268B29 /* Frameworks */ = { isa = PBXGroup; children = ( + 1A9649DB2D4A936F00268B29 /* ThirdParty.framework */, 1A9648EC2D47CF9C00268B29 /* DesignSystem.framework */, 1A9648DE2D47CF1500268B29 /* PostingFeatureInterface.framework */, ); diff --git a/Features/ArtworkFeature/ArtworkFeature.xcodeproj/xcshareddata/xcschemes/ArtworkFeature.xcscheme b/Features/ArtworkFeature/ArtworkFeature.xcodeproj/xcshareddata/xcschemes/ArtworkFeature.xcscheme index b21f9d2..4503dcd 100644 --- a/Features/ArtworkFeature/ArtworkFeature.xcodeproj/xcshareddata/xcschemes/ArtworkFeature.xcscheme +++ b/Features/ArtworkFeature/ArtworkFeature.xcodeproj/xcshareddata/xcschemes/ArtworkFeature.xcscheme @@ -15,7 +15,7 @@ buildForAnalyzing = "YES"> @@ -50,7 +50,7 @@ diff --git a/Features/ArtworkFeature/ArtworkFeature/Source/ArtworkViewController.swift b/Features/ArtworkFeature/ArtworkFeature/Source/ArtworkViewController.swift index 3926d6b..04693d9 100644 --- a/Features/ArtworkFeature/ArtworkFeature/Source/ArtworkViewController.swift +++ b/Features/ArtworkFeature/ArtworkFeature/Source/ArtworkViewController.swift @@ -33,25 +33,15 @@ final class ArtworkViewController: UIViewController, // private let collectionView = UICollectionView() private func configureUI() { - // TODO: - 스냅킷 도입 예정 - - view.backgroundColor = .red - - let btn = UIButton() - btn.setTitle("Go to Detail", for: .normal) - btn.addTarget(self, action: #selector(onTapGoToDetail), for: .touchUpInside) - btn.translatesAutoresizingMaskIntoConstraints = false - view.addSubview(btn) - NSLayoutConstraint.activate([ - btn.centerXAnchor.constraint(equalTo: view.centerXAnchor), - btn.centerYAnchor.constraint(equalTo: view.centerYAnchor), - ]) - + configureTabBar() } - @objc func onTapGoToDetail() { - print("🍋",listener, self) - listener?.itemSelected(indexPath: .init(item: 0, section: 0)) + private func configureTabBar() { + tabBarItem = UITabBarItem( + title: nil, + image: UIImage(systemName: "person"), + selectedImage: UIImage(systemName: "person.fill") + ) } // TODO: - 컬렉션 UI 도입해서 분리할 예정 diff --git a/Features/PostingFeature/PostingFeature.xcodeproj/project.pbxproj b/Features/PostingFeature/PostingFeature.xcodeproj/project.pbxproj index 661d6fb..6ff1bb9 100644 --- a/Features/PostingFeature/PostingFeature.xcodeproj/project.pbxproj +++ b/Features/PostingFeature/PostingFeature.xcodeproj/project.pbxproj @@ -11,6 +11,8 @@ 1A9649872D4A8B4800268B29 /* PostingFeatureInterface.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 1A0B4B442D478032002D10DE /* PostingFeatureInterface.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 1A96498A2D4A8B4800268B29 /* DesignSystem.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1A9649852D4A8B4800268B29 /* DesignSystem.framework */; }; 1A96498B2D4A8B4800268B29 /* DesignSystem.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 1A9649852D4A8B4800268B29 /* DesignSystem.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 1A9649D92D4A935900268B29 /* ThirdParty.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1A9649D82D4A935900268B29 /* ThirdParty.framework */; }; + 1A9649DA2D4A935900268B29 /* ThirdParty.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 1A9649D82D4A935900268B29 /* ThirdParty.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -31,6 +33,7 @@ dstSubfolderSpec = 10; files = ( 1A9649872D4A8B4800268B29 /* PostingFeatureInterface.framework in Embed Frameworks */, + 1A9649DA2D4A935900268B29 /* ThirdParty.framework in Embed Frameworks */, 1A96498B2D4A8B4800268B29 /* DesignSystem.framework in Embed Frameworks */, ); name = "Embed Frameworks"; @@ -44,6 +47,7 @@ 1A9648EF2D47CFA600268B29 /* DesignSystem.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = DesignSystem.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 1A96496E2D4A538600268B29 /* PostingFeature.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = PostingFeature.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 1A9649852D4A8B4800268B29 /* DesignSystem.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = DesignSystem.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 1A9649D82D4A935900268B29 /* ThirdParty.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = ThirdParty.framework; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */ @@ -95,6 +99,7 @@ buildActionMask = 2147483647; files = ( 1A9649862D4A8B4800268B29 /* PostingFeatureInterface.framework in Frameworks */, + 1A9649D92D4A935900268B29 /* ThirdParty.framework in Frameworks */, 1A96498A2D4A8B4800268B29 /* DesignSystem.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -124,6 +129,7 @@ 1A9648172D47827300268B29 /* Frameworks */ = { isa = PBXGroup; children = ( + 1A9649D82D4A935900268B29 /* ThirdParty.framework */, 1A9649852D4A8B4800268B29 /* DesignSystem.framework */, 1A9648EF2D47CFA600268B29 /* DesignSystem.framework */, 1A9648182D47827300268B29 /* libArtworkFeature.a */, diff --git a/Features/PostingFeature/PostingFeature/Source/PostingViewController.swift b/Features/PostingFeature/PostingFeature/Source/PostingViewController.swift index 8b90ae3..bc298a9 100644 --- a/Features/PostingFeature/PostingFeature/Source/PostingViewController.swift +++ b/Features/PostingFeature/PostingFeature/Source/PostingViewController.swift @@ -6,6 +6,8 @@ // import UIKit +import ThirdParty +internal import SnapKit import PostingFeatureInterface protocol PostingViewPresentableListener: AnyObject { @@ -30,33 +32,15 @@ final class PostingViewController: UIViewController, // MARK: - UIComponents -// private let collectionView = UICollectionView() - private func configureUI() { - // TODO: - 스냅킷 도입 예정 - - view.backgroundColor = .green - - let btn = UIButton() - btn.setTitle("Posting Detail", for: .normal) - btn.addTarget(self, action: #selector(onTapGoToDetail), for: .touchUpInside) - btn.translatesAutoresizingMaskIntoConstraints = false - view.addSubview(btn) - NSLayoutConstraint.activate([ - btn.centerXAnchor.constraint(equalTo: view.centerXAnchor), - btn.centerYAnchor.constraint(equalTo: view.centerYAnchor), - ]) - + configureTabBar() } - @objc func onTapGoToDetail() { - print("🍋",listener, self) - listener?.itemSelected(indexPath: .init(item: 0, section: 0)) + private func configureTabBar() { + tabBarItem = UITabBarItem( + title: nil, + image: UIImage(systemName: "person"), + selectedImage: UIImage(systemName: "person.fill") + ) } - - // TODO: - 컬렉션 UI 도입해서 분리할 예정 - -// func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { -// listener?.itemSelected(indexPath: indexPath) -// } } diff --git a/ziine-app-ios.xcworkspace/contents.xcworkspacedata b/ziine-app-ios.xcworkspace/contents.xcworkspacedata index 5acba72..1dff14d 100644 --- a/ziine-app-ios.xcworkspace/contents.xcworkspacedata +++ b/ziine-app-ios.xcworkspace/contents.xcworkspacedata @@ -5,7 +5,10 @@ location = "group:Core" name = "Core"> + location = "group:DesignSystem/DesignSystem.xcodeproj"> + + Date: Thu, 30 Jan 2025 02:17:08 +0900 Subject: [PATCH 20/21] =?UTF-8?q?#2=20=ED=8F=AC=EC=8A=A4=ED=8C=85=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=EC=97=90=20=ED=95=84=EC=9A=94=ED=95=9C=20?= =?UTF-8?q?=ED=95=A8=EC=88=98=EB=93=A4=20=EC=9D=B8=ED=84=B0=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=8A=A4=EC=97=90=20=EB=A8=BC=EC=A0=80=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PostingFeature/Source/PostingInteractor.swift | 6 ++---- .../PostingFeature/Source/PostingRouter.swift | 11 +++-------- .../PostingFeature/Source/PostingViewController.swift | 2 +- .../PostingFeatureInterface/Interface.swift | 2 +- 4 files changed, 7 insertions(+), 14 deletions(-) diff --git a/Features/PostingFeature/PostingFeature/Source/PostingInteractor.swift b/Features/PostingFeature/PostingFeature/Source/PostingInteractor.swift index 9475d0b..e908d99 100644 --- a/Features/PostingFeature/PostingFeature/Source/PostingInteractor.swift +++ b/Features/PostingFeature/PostingFeature/Source/PostingInteractor.swift @@ -28,9 +28,7 @@ final class PostingInteractor: init() {} - func fetch() { } - - func itemSelected(indexPath: IndexPath) { - router?.pushToUpload() + func uploadButtonTapped() { + router?.pushUploadView() } } diff --git a/Features/PostingFeature/PostingFeature/Source/PostingRouter.swift b/Features/PostingFeature/PostingFeature/Source/PostingRouter.swift index 137e7e0..e83afdf 100644 --- a/Features/PostingFeature/PostingFeature/Source/PostingRouter.swift +++ b/Features/PostingFeature/PostingFeature/Source/PostingRouter.swift @@ -16,14 +16,9 @@ final class PostingRouter: PostingRouting { self.viewController = viewController } - // MARK: - Upload - - func pushToUpload() { - let vc = UIViewController() - vc.view.backgroundColor = .systemBlue -// navigationController.pushViewController(viewController, animated: true) -// viewController.present(vc, animated: true) - viewController.navigationController?.pushViewController(vc, animated: true) + /// 업로드 화면 푸시 + func pushUploadView() { + } } diff --git a/Features/PostingFeature/PostingFeature/Source/PostingViewController.swift b/Features/PostingFeature/PostingFeature/Source/PostingViewController.swift index bc298a9..48cf439 100644 --- a/Features/PostingFeature/PostingFeature/Source/PostingViewController.swift +++ b/Features/PostingFeature/PostingFeature/Source/PostingViewController.swift @@ -11,7 +11,7 @@ internal import SnapKit import PostingFeatureInterface protocol PostingViewPresentableListener: AnyObject { - func itemSelected(indexPath: IndexPath) + func uploadButtonTapped() } final class PostingViewController: UIViewController, diff --git a/Features/PostingFeature/PostingFeatureInterface/Interface.swift b/Features/PostingFeature/PostingFeatureInterface/Interface.swift index c7ad5b2..1b4e32d 100644 --- a/Features/PostingFeature/PostingFeatureInterface/Interface.swift +++ b/Features/PostingFeature/PostingFeatureInterface/Interface.swift @@ -16,5 +16,5 @@ public protocol PostingViewBuildable { public protocol PostingRouting: AnyObject { var viewController: UIViewController { get } - func pushToUpload() + func pushUploadView() } From d90b12339e3ca22bb8e1b9e94ddf43157817901c Mon Sep 17 00:00:00 2001 From: GeonWoo Date: Thu, 30 Jan 2025 02:22:13 +0900 Subject: [PATCH 21/21] =?UTF-8?q?#2=20=EC=97=85=EB=A1=9C=EB=93=9C=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80=ED=95=98=EA=B8=B0=20?= =?UTF-8?q?=EC=A0=84=20=EA=B5=AC=EC=A1=B0=EB=8F=84=20=EA=B5=AC=EC=83=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Source/Upload/UploadViewController.swift | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 Features/PostingFeature/PostingFeature/Source/Upload/UploadViewController.swift diff --git a/Features/PostingFeature/PostingFeature/Source/Upload/UploadViewController.swift b/Features/PostingFeature/PostingFeature/Source/Upload/UploadViewController.swift new file mode 100644 index 0000000..7df2204 --- /dev/null +++ b/Features/PostingFeature/PostingFeature/Source/Upload/UploadViewController.swift @@ -0,0 +1,11 @@ +// +// UploadViewController.swift +// PostingFeature +// +// Created by Geon Woo lee on 1/30/25. +// + +import UIKit +import WebKit + +final class UploadViewController { }