diff --git a/.gitignore b/.gitignore
deleted file mode 100644
index 1767a0c..0000000
--- a/.gitignore
+++ /dev/null
@@ -1,166 +0,0 @@
-# Created by https://www.toptal.com/developers/gitignore/api/macos,windows,xcode,swift,swiftpackagemanager
-# Edit at https://www.toptal.com/developers/gitignore?templates=macos,windows,xcode,swift,swiftpackagemanager
-
-### macOS ###
-# General
-.DS_Store
-.AppleDouble
-.LSOverride
-
-# Icon must end with two \r
-Icon
-
-
-# Thumbnails
-._*
-
-# Files that might appear in the root of a volume
-.DocumentRevisions-V100
-.fseventsd
-.Spotlight-V100
-.TemporaryItems
-.Trashes
-.VolumeIcon.icns
-.com.apple.timemachine.donotpresent
-
-# Directories potentially created on remote AFP share
-.AppleDB
-.AppleDesktop
-Network Trash Folder
-Temporary Items
-.apdisk
-
-### macOS Patch ###
-# iCloud generated files
-*.icloud
-
-### Swift ###
-# Xcode
-#
-# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore
-
-## User settings
-xcuserdata/
-
-## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9)
-*.xcscmblueprint
-*.xccheckout
-
-## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4)
-build/
-DerivedData/
-*.moved-aside
-*.pbxuser
-!default.pbxuser
-*.mode1v3
-!default.mode1v3
-*.mode2v3
-!default.mode2v3
-*.perspectivev3
-!default.perspectivev3
-
-## Obj-C/Swift specific
-*.hmap
-
-## App packaging
-*.ipa
-*.dSYM.zip
-*.dSYM
-
-## Playgrounds
-timeline.xctimeline
-playground.xcworkspace
-
-# Swift Package Manager
-# Add this line if you want to avoid checking in source code from Swift Package Manager dependencies.
-# Packages/
-# Package.pins
-# Package.resolved
-# *.xcodeproj
-# Xcode automatically generates this directory with a .xcworkspacedata file and xcuserdata
-# hence it is not needed unless you have added a package configuration file to your project
-# .swiftpm
-
-.build/
-
-# CocoaPods
-# We recommend against adding the Pods directory to your .gitignore. However
-# you should judge for yourself, the pros and cons are mentioned at:
-# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
-# Pods/
-# Add this line if you want to avoid checking in source code from the Xcode workspace
-# *.xcworkspace
-
-# Carthage
-# Add this line if you want to avoid checking in source code from Carthage dependencies.
-# Carthage/Checkouts
-
-Carthage/Build/
-
-# Accio dependency management
-Dependencies/
-.accio/
-
-# fastlane
-# It is recommended to not store the screenshots in the git repo.
-# Instead, use fastlane to re-generate the screenshots whenever they are needed.
-# For more information about the recommended setup visit:
-# https://docs.fastlane.tools/best-practices/source-control/#source-control
-
-fastlane/report.xml
-fastlane/Preview.html
-fastlane/screenshots/**/*.png
-fastlane/test_output
-
-# Code Injection
-# After new code Injection tools there's a generated folder /iOSInjectionProject
-# https://github.com/johnno1962/injectionforxcode
-
-iOSInjectionProject/
-
-### SwiftPackageManager ###
-Packages
-xcuserdata
-*.xcodeproj
-
-
-### Windows ###
-# Windows thumbnail cache files
-Thumbs.db
-Thumbs.db:encryptable
-ehthumbs.db
-ehthumbs_vista.db
-
-# Dump file
-*.stackdump
-
-# Folder config file
-[Dd]esktop.ini
-
-# Recycle Bin used on file shares
-$RECYCLE.BIN/
-
-# Windows Installer files
-*.cab
-*.msi
-*.msix
-*.msm
-*.msp
-
-# Windows shortcuts
-*.lnk
-
-### Xcode ###
-
-## Xcode 8 and earlier
-
-### Xcode Patch ###
-*.xcodeproj/*
-!*.xcodeproj/project.pbxproj
-!*.xcodeproj/xcshareddata/
-!*.xcodeproj/project.xcworkspace/
-!*.xcworkspace/contents.xcworkspacedata
-/*.gcno
-**/xcshareddata/WorkspaceSettings.xcsettings
-
-# End of https://www.toptal.com/developers/gitignore/api/macos,windows,xcode,swift,swiftpackagemanager
\ No newline at end of file
diff --git a/iOS/.githooks/pre-commit b/iOS/.githooks/pre-commit
old mode 100755
new mode 100644
index 2703e87..1a24852
--- a/iOS/.githooks/pre-commit
+++ b/iOS/.githooks/pre-commit
@@ -1,3 +1 @@
#!/bin/sh
-
-echo "iOS"
\ No newline at end of file
diff --git a/iOS/.gitignore b/iOS/.gitignore
index b934dfb..43cab86 100644
--- a/iOS/.gitignore
+++ b/iOS/.gitignore
@@ -76,7 +76,6 @@ playground.xcworkspace
# Packages/
# Package.pins
# Package.resolved
-# *.xcodeproj
# Xcode automatically generates this directory with a .xcworkspacedata file and xcuserdata
# hence it is not needed unless you have added a package configuration file to your project
# .swiftpm
@@ -121,7 +120,6 @@ iOSInjectionProject/
### SwiftPackageManager ###
Packages
xcuserdata
-*.xcodeproj
### Xcode ###
@@ -131,9 +129,6 @@ xcuserdata
### Xcode Patch ###
*.xcodeproj/*
!*.xcodeproj/project.pbxproj
-!*.xcodeproj/xcshareddata/
-!*.xcodeproj/project.xcworkspace/
-!*.xcworkspace/contents.xcworkspacedata
/*.gcno
**/xcshareddata/WorkspaceSettings.xcsettings
diff --git a/iOS/.swiftlint.yml b/iOS/.swiftlint.yml
new file mode 100644
index 0000000..4ec0578
--- /dev/null
+++ b/iOS/.swiftlint.yml
@@ -0,0 +1,27 @@
+# 한 라인 길이 제한
+line_length:
+ warning: 120 #default: 120
+ error: 200
+
+# 강제 형변환
+force_cast: error
+force_try: error
+
+# 의미없는 공백/줄 바꿈
+trailing_newline: warning
+trailing_whitespace:
+ severity: warning
+
+# 함수 길이 제한
+function_body_length:
+ warning: 50
+ error: 100
+
+# 타입 지정 시, 이름 조건
+type_name:
+ min_length:
+ warning: 3
+ error: 0
+ max_length:
+ warning: 40
+ error: 1000
diff --git a/iOS/MSCoreKit/.gitignore b/iOS/MSCoreKit/.gitignore
deleted file mode 100644
index 0023a53..0000000
--- a/iOS/MSCoreKit/.gitignore
+++ /dev/null
@@ -1,8 +0,0 @@
-.DS_Store
-/.build
-/Packages
-xcuserdata/
-DerivedData/
-.swiftpm/configuration/registries.json
-.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata
-.netrc
diff --git a/iOS/MSCoreKit/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata b/iOS/MSCoreKit/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata
new file mode 100644
index 0000000..919434a
--- /dev/null
+++ b/iOS/MSCoreKit/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/iOS/MSCoreKit/Package.swift b/iOS/MSCoreKit/Package.swift
index 833fe9a..eb15905 100644
--- a/iOS/MSCoreKit/Package.swift
+++ b/iOS/MSCoreKit/Package.swift
@@ -11,7 +11,7 @@ extension String {
static let networking = "MSNetworking"
static let fetcher = "MSFetcher"
static let cache = "MSCacheStorage"
-
+
var testTarget: String {
return self + "Tests"
}
@@ -44,7 +44,7 @@ let package = Package(
.target(name: .networking)
]),
.target(name: .cache),
-
+
// Tests
.testTarget(name: .persistentStorage.testTarget,
dependencies: [.target(name: .persistentStorage)]),
diff --git a/iOS/MSCoreKit/Tests/MSPersistentStorageTests/MSPersistentStorageTests.swift b/iOS/MSCoreKit/Tests/MSPersistentStorageTests/MSPersistentStorageTests.swift
index eaac037..559fad5 100644
--- a/iOS/MSCoreKit/Tests/MSPersistentStorageTests/MSPersistentStorageTests.swift
+++ b/iOS/MSCoreKit/Tests/MSPersistentStorageTests/MSPersistentStorageTests.swift
@@ -7,7 +7,4 @@
import XCTest
-final class MSPersistentStorageTests: XCTestCase {
-
-}
-
+final class MSPersistentStorageTests: XCTestCase { }
diff --git a/iOS/MSFoundation/.gitignore b/iOS/MSFoundation/.gitignore
deleted file mode 100644
index 0023a53..0000000
--- a/iOS/MSFoundation/.gitignore
+++ /dev/null
@@ -1,8 +0,0 @@
-.DS_Store
-/.build
-/Packages
-xcuserdata/
-DerivedData/
-.swiftpm/configuration/registries.json
-.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata
-.netrc
diff --git a/iOS/MSFoundation/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata b/iOS/MSFoundation/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata
new file mode 100644
index 0000000..919434a
--- /dev/null
+++ b/iOS/MSFoundation/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/iOS/MSFoundation/Package.swift b/iOS/MSFoundation/Package.swift
index 5a14aa8..49213ae 100644
--- a/iOS/MSFoundation/Package.swift
+++ b/iOS/MSFoundation/Package.swift
@@ -10,7 +10,7 @@ extension String {
static let foundationExt = "FoundationExt"
static let logger = "MSLogger"
static let userDefaults = "MSUserDefaults"
-
+
var testTarget: String {
return self + "Tests"
}
@@ -36,7 +36,7 @@ let package = Package(
.target(name: .foundationExt),
.target(name: .logger),
.target(name: .userDefaults),
-
+
// Tests
.testTarget(name: .logger.testTarget,
dependencies: [.target(name: .logger)]),
diff --git a/iOS/MSFoundation/Sources/MSUserDefaults/UserDefaultsStorage.swift b/iOS/MSFoundation/Sources/MSUserDefaults/UserDefaultsStorage.swift
index 791ef38..c66e41d 100644
--- a/iOS/MSFoundation/Sources/MSUserDefaults/UserDefaultsStorage.swift
+++ b/iOS/MSFoundation/Sources/MSUserDefaults/UserDefaultsStorage.swift
@@ -6,5 +6,3 @@
//
import Foundation
-
-
diff --git a/iOS/MSFoundation/Tests/MSLoggerTests/MSLoggerTests.swift b/iOS/MSFoundation/Tests/MSLoggerTests/MSLoggerTests.swift
index cd3f09c..ec58f24 100644
--- a/iOS/MSFoundation/Tests/MSLoggerTests/MSLoggerTests.swift
+++ b/iOS/MSFoundation/Tests/MSLoggerTests/MSLoggerTests.swift
@@ -9,5 +9,5 @@ import XCTest
import MSLogger
final class MSLoggerTests: XCTestCase {
-
+
}
diff --git a/iOS/MSUIKit/.gitignore b/iOS/MSUIKit/.gitignore
deleted file mode 100644
index 0023a53..0000000
--- a/iOS/MSUIKit/.gitignore
+++ /dev/null
@@ -1,8 +0,0 @@
-.DS_Store
-/.build
-/Packages
-xcuserdata/
-DerivedData/
-.swiftpm/configuration/registries.json
-.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata
-.netrc
diff --git a/iOS/MSUIKit/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata b/iOS/MSUIKit/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata
new file mode 100644
index 0000000..919434a
--- /dev/null
+++ b/iOS/MSUIKit/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/iOS/MSUIKit/Package.swift b/iOS/MSUIKit/Package.swift
index bfabf39..6286996 100644
--- a/iOS/MSUIKit/Package.swift
+++ b/iOS/MSUIKit/Package.swift
@@ -9,7 +9,7 @@ extension String {
static let package = "MSUIKit"
static let designSystem = "MSDesignSystem"
static let components = "MSUIComponents"
-
+
var testTarget: String {
return self + "Tests"
}
diff --git a/iOS/MusicSpot/.swift-version b/iOS/MusicSpot/.swift-version
new file mode 100644
index 0000000..95ee81a
--- /dev/null
+++ b/iOS/MusicSpot/.swift-version
@@ -0,0 +1 @@
+5.9
diff --git a/iOS/MusicSpot/.swiftformat b/iOS/MusicSpot/.swiftformat
new file mode 100644
index 0000000..d92e7aa
--- /dev/null
+++ b/iOS/MusicSpot/.swiftformat
@@ -0,0 +1,11 @@
+# 코드 들여쓰기
+--indent 4
+
+# 공백 문자 삭제
+--trimwhitespace always
+
+# 줄 바꿈 문자 관리
+--linebreaks lf #cr, lf, crlf
+
+# wrapMultilineStatementBraces 비활성화
+--disable wrapMultilineStatementBraces
diff --git a/iOS/MusicSpot/MusicSpot.xcodeproj/project.pbxproj b/iOS/MusicSpot/MusicSpot.xcodeproj/project.pbxproj
new file mode 100644
index 0000000..6ce3610
--- /dev/null
+++ b/iOS/MusicSpot/MusicSpot.xcodeproj/project.pbxproj
@@ -0,0 +1,378 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 56;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ DD73F8592B024C4900EE9BF2 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD73F8582B024C4900EE9BF2 /* AppDelegate.swift */; };
+ DD73F85B2B024C4900EE9BF2 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD73F85A2B024C4900EE9BF2 /* SceneDelegate.swift */; };
+ DD73F8622B024C4B00EE9BF2 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = DD73F8612B024C4B00EE9BF2 /* Assets.xcassets */; };
+ DD73F8652B024C4B00EE9BF2 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = DD73F8632B024C4B00EE9BF2 /* LaunchScreen.storyboard */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXFileReference section */
+ DD73F8552B024C4900EE9BF2 /* MusicSpot.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = MusicSpot.app; sourceTree = BUILT_PRODUCTS_DIR; };
+ DD73F8582B024C4900EE9BF2 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
+ DD73F85A2B024C4900EE9BF2 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; };
+ DD73F8612B024C4B00EE9BF2 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
+ DD73F8642B024C4B00EE9BF2 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; };
+ DD73F8662B024C4B00EE9BF2 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
+ DD73F86D2B024CA000EE9BF2 /* ko */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ko; path = ko.lproj/LaunchScreen.strings; sourceTree = ""; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ DD73F8522B024C4900EE9BF2 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ DD73F84C2B024C4900EE9BF2 = {
+ isa = PBXGroup;
+ children = (
+ DD73F8572B024C4900EE9BF2 /* MusicSpot */,
+ DD73F8562B024C4900EE9BF2 /* Products */,
+ DD73F8C72B027EBD00EE9BF2 /* Frameworks */,
+ );
+ sourceTree = "";
+ };
+ DD73F8562B024C4900EE9BF2 /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ DD73F8552B024C4900EE9BF2 /* MusicSpot.app */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+ DD73F8572B024C4900EE9BF2 /* MusicSpot */ = {
+ isa = PBXGroup;
+ children = (
+ DD73F8582B024C4900EE9BF2 /* AppDelegate.swift */,
+ DD73F85A2B024C4900EE9BF2 /* SceneDelegate.swift */,
+ DD73F8612B024C4B00EE9BF2 /* Assets.xcassets */,
+ DD73F8632B024C4B00EE9BF2 /* LaunchScreen.storyboard */,
+ DD73F8662B024C4B00EE9BF2 /* Info.plist */,
+ );
+ path = MusicSpot;
+ sourceTree = "";
+ };
+ DD73F8C72B027EBD00EE9BF2 /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ );
+ name = Frameworks;
+ sourceTree = "";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ DD73F8542B024C4900EE9BF2 /* MusicSpot */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = DD73F8692B024C4B00EE9BF2 /* Build configuration list for PBXNativeTarget "MusicSpot" */;
+ buildPhases = (
+ DD73F8512B024C4900EE9BF2 /* Sources */,
+ DD73F8522B024C4900EE9BF2 /* Frameworks */,
+ DD73F8532B024C4900EE9BF2 /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = MusicSpot;
+ packageProductDependencies = (
+ );
+ productName = MusicSpot;
+ productReference = DD73F8552B024C4900EE9BF2 /* MusicSpot.app */;
+ productType = "com.apple.product-type.application";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ DD73F84D2B024C4900EE9BF2 /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ BuildIndependentTargetsInParallel = 1;
+ LastSwiftUpdateCheck = 1500;
+ LastUpgradeCheck = 1500;
+ TargetAttributes = {
+ DD73F8542B024C4900EE9BF2 = {
+ CreatedOnToolsVersion = 15.0.1;
+ };
+ };
+ };
+ buildConfigurationList = DD73F8502B024C4900EE9BF2 /* Build configuration list for PBXProject "MusicSpot" */;
+ compatibilityVersion = "Xcode 14.0";
+ developmentRegion = ko;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ Base,
+ ko,
+ );
+ mainGroup = DD73F84C2B024C4900EE9BF2;
+ packageReferences = (
+ );
+ productRefGroup = DD73F8562B024C4900EE9BF2 /* Products */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ DD73F8542B024C4900EE9BF2 /* MusicSpot */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ DD73F8532B024C4900EE9BF2 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ DD73F8652B024C4B00EE9BF2 /* LaunchScreen.storyboard in Resources */,
+ DD73F8622B024C4B00EE9BF2 /* Assets.xcassets in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ DD73F8512B024C4900EE9BF2 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ DD73F8592B024C4900EE9BF2 /* AppDelegate.swift in Sources */,
+ DD73F85B2B024C4900EE9BF2 /* SceneDelegate.swift in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXVariantGroup section */
+ DD73F8632B024C4B00EE9BF2 /* LaunchScreen.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ DD73F8642B024C4B00EE9BF2 /* Base */,
+ DD73F86D2B024CA000EE9BF2 /* ko */,
+ );
+ name = LaunchScreen.storyboard;
+ sourceTree = "";
+ };
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+ DD73F8672B024C4B00EE9BF2 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
+ CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = 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 = 15.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;
+ };
+ DD73F8682B024C4B00EE9BF2 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
+ CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = 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 = 15.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;
+ };
+ DD73F86A2B024C4B00EE9BF2 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ DEVELOPMENT_TEAM = B3PWYBKFUK;
+ GENERATE_INFOPLIST_FILE = YES;
+ INFOPLIST_FILE = MusicSpot/Info.plist;
+ INFOPLIST_KEY_CFBundleDisplayName = MusicSpot;
+ INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.travel";
+ INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
+ INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen;
+ INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait;
+ INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown";
+ IPHONEOS_DEPLOYMENT_TARGET = 15.0;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = kr.codesquad.boostcamp8.MusicSpot;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
+ SUPPORTS_MACCATALYST = NO;
+ SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
+ SWIFT_EMIT_LOC_STRINGS = YES;
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = 1;
+ };
+ name = Debug;
+ };
+ DD73F86B2B024C4B00EE9BF2 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ DEVELOPMENT_TEAM = B3PWYBKFUK;
+ GENERATE_INFOPLIST_FILE = YES;
+ INFOPLIST_FILE = MusicSpot/Info.plist;
+ INFOPLIST_KEY_CFBundleDisplayName = MusicSpot;
+ INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.travel";
+ INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
+ INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen;
+ INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait;
+ INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown";
+ IPHONEOS_DEPLOYMENT_TARGET = 15.0;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = kr.codesquad.boostcamp8.MusicSpot;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
+ SUPPORTS_MACCATALYST = NO;
+ SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
+ SWIFT_EMIT_LOC_STRINGS = YES;
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = 1;
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ DD73F8502B024C4900EE9BF2 /* Build configuration list for PBXProject "MusicSpot" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ DD73F8672B024C4B00EE9BF2 /* Debug */,
+ DD73F8682B024C4B00EE9BF2 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ DD73F8692B024C4B00EE9BF2 /* Build configuration list for PBXNativeTarget "MusicSpot" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ DD73F86A2B024C4B00EE9BF2 /* Debug */,
+ DD73F86B2B024C4B00EE9BF2 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = DD73F84D2B024C4900EE9BF2 /* Project object */;
+}
diff --git a/iOS/MusicSpot/MusicSpot.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/iOS/MusicSpot/MusicSpot.xcodeproj/project.xcworkspace/contents.xcworkspacedata
new file mode 100644
index 0000000..919434a
--- /dev/null
+++ b/iOS/MusicSpot/MusicSpot.xcodeproj/project.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/iOS/MusicSpot/MusicSpot.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/iOS/MusicSpot/MusicSpot.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
new file mode 100644
index 0000000..18d9810
--- /dev/null
+++ b/iOS/MusicSpot/MusicSpot.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ IDEDidComputeMac32BitWarning
+
+
+
diff --git a/iOS/MusicSpot/MusicSpot/AppDelegate.swift b/iOS/MusicSpot/MusicSpot/AppDelegate.swift
index 0d0cd62..767e147 100644
--- a/iOS/MusicSpot/MusicSpot/AppDelegate.swift
+++ b/iOS/MusicSpot/MusicSpot/AppDelegate.swift
@@ -9,18 +9,16 @@ import UIKit
@main
class AppDelegate: UIResponder, UIApplicationDelegate {
-
- func application(_ application: UIApplication,
- didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
- return true
+ func application(_: UIApplication,
+ didFinishLaunchingWithOptions _: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
+ true
}
-
+
// MARK: UISceneSession Lifecycle
-
- func application(_ application: UIApplication,
+
+ func application(_: UIApplication,
configurationForConnecting connectingSceneSession: UISceneSession,
- options: UIScene.ConnectionOptions) -> UISceneConfiguration {
- return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
+ options _: UIScene.ConnectionOptions) -> UISceneConfiguration {
+ UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
}
-
}
diff --git a/iOS/MusicSpot/MusicSpot/SceneDelegate.swift b/iOS/MusicSpot/MusicSpot/SceneDelegate.swift
index 5e3820a..61bf718 100644
--- a/iOS/MusicSpot/MusicSpot/SceneDelegate.swift
+++ b/iOS/MusicSpot/MusicSpot/SceneDelegate.swift
@@ -6,18 +6,13 @@
//
import UIKit
-import MSLogger
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
-
var window: UIWindow?
-
+
func scene(_ scene: UIScene,
- willConnectTo session: UISceneSession,
- options connectionOptions: UIScene.ConnectionOptions) {
- guard let _ = (scene as? UIWindowScene) else { return }
-
- print(logger)
+ willConnectTo _: UISceneSession,
+ options _: UIScene.ConnectionOptions) {
+ guard (scene as? UIWindowScene) != nil else { return }
}
-
}
diff --git a/iOS/commit b/iOS/commit
new file mode 100755
index 0000000..aa105f5
--- /dev/null
+++ b/iOS/commit
@@ -0,0 +1,29 @@
+#!/bin/sh
+
+LINTPATH='.swiftlint.yml'
+declare -a PATHS=("MSCoreKit" "MSFoundation" "MSUIKit" "MusicSpot")
+failures=""
+
+for path in "${PATHS[@]}"; do
+ if [ -d "$path" ]; then
+ echo "👀 Running SwiftLint for $path"
+ result=$(swiftlint lint --strict --progress --config $LINTPATH $path)
+ if [ "$result" == '' ]; then
+ echo "✅ Lint succeed for $path\n"
+ else
+ echo "❌ Lint failed for $path\n"
+ failures+="\n\033[1m✔️ $path\033[0m\n$result\n"
+ fi
+ else
+ echo "❓ $path directory does not exist."
+ exit 1
+ fi
+done
+
+if [ ! -z "$failures" ]; then
+ echo "$failures"
+ exit 1
+else
+ echo "✨ All linting checks passed. Ready to commit."
+ gitmoji -c
+fi