├── .gitignore ├── LadderGame ├── LadderGame.xcodeproj │ ├── project.pbxproj │ └── project.xcworkspace │ │ └── contents.xcworkspacedata └── LadderGame │ └── main.swift └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | # Xcode 2 | # 3 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore 4 | 5 | ## Build generated 6 | build/ 7 | DerivedData/ 8 | 9 | ## Various settings 10 | *.pbxuser 11 | !default.pbxuser 12 | *.mode1v3 13 | !default.mode1v3 14 | *.mode2v3 15 | !default.mode2v3 16 | *.perspectivev3 17 | !default.perspectivev3 18 | xcuserdata/ 19 | 20 | ## Other 21 | *.moved-aside 22 | *.xccheckout 23 | *.xcscmblueprint 24 | 25 | ## Obj-C/Swift specific 26 | *.hmap 27 | *.ipa 28 | *.dSYM.zip 29 | *.dSYM 30 | 31 | ## Playgrounds 32 | timeline.xctimeline 33 | playground.xcworkspace 34 | 35 | # Swift Package Manager 36 | # 37 | # Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. 38 | # Packages/ 39 | # Package.pins 40 | .build/ 41 | 42 | # CocoaPods 43 | # 44 | # We recommend against adding the Pods directory to your .gitignore. However 45 | # you should judge for yourself, the pros and cons are mentioned at: 46 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control 47 | # 48 | # Pods/ 49 | 50 | # Carthage 51 | # 52 | # Add this line if you want to avoid checking in source code from Carthage dependencies. 53 | # Carthage/Checkouts 54 | 55 | Carthage/Build 56 | 57 | # fastlane 58 | # 59 | # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the 60 | # screenshots whenever they are needed. 61 | # For more information about the recommended setup visit: 62 | # https://docs.fastlane.tools/best-practices/source-control/#source-control 63 | 64 | fastlane/report.xml 65 | fastlane/Preview.html 66 | fastlane/screenshots 67 | fastlane/test_output 68 | -------------------------------------------------------------------------------- /LadderGame/LadderGame.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 48; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 8377CC321F8B4401007F7335 /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8377CC311F8B4401007F7335 /* main.swift */; }; 11 | /* End PBXBuildFile section */ 12 | 13 | /* Begin PBXCopyFilesBuildPhase section */ 14 | 8377CC2C1F8B4401007F7335 /* CopyFiles */ = { 15 | isa = PBXCopyFilesBuildPhase; 16 | buildActionMask = 2147483647; 17 | dstPath = /usr/share/man/man1/; 18 | dstSubfolderSpec = 0; 19 | files = ( 20 | ); 21 | runOnlyForDeploymentPostprocessing = 1; 22 | }; 23 | /* End PBXCopyFilesBuildPhase section */ 24 | 25 | /* Begin PBXFileReference section */ 26 | 8377CC2E1F8B4401007F7335 /* LadderGame */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = LadderGame; sourceTree = BUILT_PRODUCTS_DIR; }; 27 | 8377CC311F8B4401007F7335 /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = ""; }; 28 | /* End PBXFileReference section */ 29 | 30 | /* Begin PBXFrameworksBuildPhase section */ 31 | 8377CC2B1F8B4401007F7335 /* Frameworks */ = { 32 | isa = PBXFrameworksBuildPhase; 33 | buildActionMask = 2147483647; 34 | files = ( 35 | ); 36 | runOnlyForDeploymentPostprocessing = 0; 37 | }; 38 | /* End PBXFrameworksBuildPhase section */ 39 | 40 | /* Begin PBXGroup section */ 41 | 8377CC251F8B4400007F7335 = { 42 | isa = PBXGroup; 43 | children = ( 44 | 8377CC301F8B4401007F7335 /* LadderGame */, 45 | 8377CC2F1F8B4401007F7335 /* Products */, 46 | ); 47 | sourceTree = ""; 48 | }; 49 | 8377CC2F1F8B4401007F7335 /* Products */ = { 50 | isa = PBXGroup; 51 | children = ( 52 | 8377CC2E1F8B4401007F7335 /* LadderGame */, 53 | ); 54 | name = Products; 55 | sourceTree = ""; 56 | }; 57 | 8377CC301F8B4401007F7335 /* LadderGame */ = { 58 | isa = PBXGroup; 59 | children = ( 60 | 8377CC311F8B4401007F7335 /* main.swift */, 61 | ); 62 | path = LadderGame; 63 | sourceTree = ""; 64 | }; 65 | /* End PBXGroup section */ 66 | 67 | /* Begin PBXNativeTarget section */ 68 | 8377CC2D1F8B4401007F7335 /* LadderGame */ = { 69 | isa = PBXNativeTarget; 70 | buildConfigurationList = 8377CC351F8B4401007F7335 /* Build configuration list for PBXNativeTarget "LadderGame" */; 71 | buildPhases = ( 72 | 8377CC2A1F8B4401007F7335 /* Sources */, 73 | 8377CC2B1F8B4401007F7335 /* Frameworks */, 74 | 8377CC2C1F8B4401007F7335 /* CopyFiles */, 75 | ); 76 | buildRules = ( 77 | ); 78 | dependencies = ( 79 | ); 80 | name = LadderGame; 81 | productName = LadderGame; 82 | productReference = 8377CC2E1F8B4401007F7335 /* LadderGame */; 83 | productType = "com.apple.product-type.tool"; 84 | }; 85 | /* End PBXNativeTarget section */ 86 | 87 | /* Begin PBXProject section */ 88 | 8377CC261F8B4400007F7335 /* Project object */ = { 89 | isa = PBXProject; 90 | attributes = { 91 | LastSwiftUpdateCheck = 0900; 92 | LastUpgradeCheck = 0900; 93 | ORGANIZATIONNAME = "Codesquad Inc."; 94 | TargetAttributes = { 95 | 8377CC2D1F8B4401007F7335 = { 96 | CreatedOnToolsVersion = 9.0; 97 | ProvisioningStyle = Automatic; 98 | }; 99 | }; 100 | }; 101 | buildConfigurationList = 8377CC291F8B4400007F7335 /* Build configuration list for PBXProject "LadderGame" */; 102 | compatibilityVersion = "Xcode 8.0"; 103 | developmentRegion = en; 104 | hasScannedForEncodings = 0; 105 | knownRegions = ( 106 | en, 107 | ); 108 | mainGroup = 8377CC251F8B4400007F7335; 109 | productRefGroup = 8377CC2F1F8B4401007F7335 /* Products */; 110 | projectDirPath = ""; 111 | projectRoot = ""; 112 | targets = ( 113 | 8377CC2D1F8B4401007F7335 /* LadderGame */, 114 | ); 115 | }; 116 | /* End PBXProject section */ 117 | 118 | /* Begin PBXSourcesBuildPhase section */ 119 | 8377CC2A1F8B4401007F7335 /* Sources */ = { 120 | isa = PBXSourcesBuildPhase; 121 | buildActionMask = 2147483647; 122 | files = ( 123 | 8377CC321F8B4401007F7335 /* main.swift in Sources */, 124 | ); 125 | runOnlyForDeploymentPostprocessing = 0; 126 | }; 127 | /* End PBXSourcesBuildPhase section */ 128 | 129 | /* Begin XCBuildConfiguration section */ 130 | 8377CC331F8B4401007F7335 /* Debug */ = { 131 | isa = XCBuildConfiguration; 132 | buildSettings = { 133 | ALWAYS_SEARCH_USER_PATHS = NO; 134 | CLANG_ANALYZER_NONNULL = YES; 135 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 136 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 137 | CLANG_CXX_LIBRARY = "libc++"; 138 | CLANG_ENABLE_MODULES = YES; 139 | CLANG_ENABLE_OBJC_ARC = YES; 140 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 141 | CLANG_WARN_BOOL_CONVERSION = YES; 142 | CLANG_WARN_COMMA = YES; 143 | CLANG_WARN_CONSTANT_CONVERSION = YES; 144 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 145 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 146 | CLANG_WARN_EMPTY_BODY = YES; 147 | CLANG_WARN_ENUM_CONVERSION = YES; 148 | CLANG_WARN_INFINITE_RECURSION = YES; 149 | CLANG_WARN_INT_CONVERSION = YES; 150 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 151 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 152 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 153 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 154 | CLANG_WARN_STRICT_PROTOTYPES = YES; 155 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 156 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 157 | CLANG_WARN_UNREACHABLE_CODE = YES; 158 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 159 | CODE_SIGN_IDENTITY = "-"; 160 | COPY_PHASE_STRIP = NO; 161 | DEBUG_INFORMATION_FORMAT = dwarf; 162 | ENABLE_STRICT_OBJC_MSGSEND = YES; 163 | ENABLE_TESTABILITY = YES; 164 | GCC_C_LANGUAGE_STANDARD = gnu11; 165 | GCC_DYNAMIC_NO_PIC = NO; 166 | GCC_NO_COMMON_BLOCKS = YES; 167 | GCC_OPTIMIZATION_LEVEL = 0; 168 | GCC_PREPROCESSOR_DEFINITIONS = ( 169 | "DEBUG=1", 170 | "$(inherited)", 171 | ); 172 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 173 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 174 | GCC_WARN_UNDECLARED_SELECTOR = YES; 175 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 176 | GCC_WARN_UNUSED_FUNCTION = YES; 177 | GCC_WARN_UNUSED_VARIABLE = YES; 178 | MACOSX_DEPLOYMENT_TARGET = 10.13; 179 | MTL_ENABLE_DEBUG_INFO = YES; 180 | ONLY_ACTIVE_ARCH = YES; 181 | SDKROOT = macosx; 182 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 183 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 184 | }; 185 | name = Debug; 186 | }; 187 | 8377CC341F8B4401007F7335 /* Release */ = { 188 | isa = XCBuildConfiguration; 189 | buildSettings = { 190 | ALWAYS_SEARCH_USER_PATHS = NO; 191 | CLANG_ANALYZER_NONNULL = YES; 192 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 193 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 194 | CLANG_CXX_LIBRARY = "libc++"; 195 | CLANG_ENABLE_MODULES = YES; 196 | CLANG_ENABLE_OBJC_ARC = YES; 197 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 198 | CLANG_WARN_BOOL_CONVERSION = YES; 199 | CLANG_WARN_COMMA = YES; 200 | CLANG_WARN_CONSTANT_CONVERSION = YES; 201 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 202 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 203 | CLANG_WARN_EMPTY_BODY = YES; 204 | CLANG_WARN_ENUM_CONVERSION = YES; 205 | CLANG_WARN_INFINITE_RECURSION = YES; 206 | CLANG_WARN_INT_CONVERSION = YES; 207 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 208 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 209 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 210 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 211 | CLANG_WARN_STRICT_PROTOTYPES = YES; 212 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 213 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 214 | CLANG_WARN_UNREACHABLE_CODE = YES; 215 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 216 | CODE_SIGN_IDENTITY = "-"; 217 | COPY_PHASE_STRIP = NO; 218 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 219 | ENABLE_NS_ASSERTIONS = NO; 220 | ENABLE_STRICT_OBJC_MSGSEND = YES; 221 | GCC_C_LANGUAGE_STANDARD = gnu11; 222 | GCC_NO_COMMON_BLOCKS = YES; 223 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 224 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 225 | GCC_WARN_UNDECLARED_SELECTOR = YES; 226 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 227 | GCC_WARN_UNUSED_FUNCTION = YES; 228 | GCC_WARN_UNUSED_VARIABLE = YES; 229 | MACOSX_DEPLOYMENT_TARGET = 10.13; 230 | MTL_ENABLE_DEBUG_INFO = NO; 231 | SDKROOT = macosx; 232 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 233 | }; 234 | name = Release; 235 | }; 236 | 8377CC361F8B4401007F7335 /* Debug */ = { 237 | isa = XCBuildConfiguration; 238 | buildSettings = { 239 | CODE_SIGN_STYLE = Automatic; 240 | PRODUCT_NAME = "$(TARGET_NAME)"; 241 | SWIFT_VERSION = 4.0; 242 | }; 243 | name = Debug; 244 | }; 245 | 8377CC371F8B4401007F7335 /* Release */ = { 246 | isa = XCBuildConfiguration; 247 | buildSettings = { 248 | CODE_SIGN_STYLE = Automatic; 249 | PRODUCT_NAME = "$(TARGET_NAME)"; 250 | SWIFT_VERSION = 4.0; 251 | }; 252 | name = Release; 253 | }; 254 | /* End XCBuildConfiguration section */ 255 | 256 | /* Begin XCConfigurationList section */ 257 | 8377CC291F8B4400007F7335 /* Build configuration list for PBXProject "LadderGame" */ = { 258 | isa = XCConfigurationList; 259 | buildConfigurations = ( 260 | 8377CC331F8B4401007F7335 /* Debug */, 261 | 8377CC341F8B4401007F7335 /* Release */, 262 | ); 263 | defaultConfigurationIsVisible = 0; 264 | defaultConfigurationName = Release; 265 | }; 266 | 8377CC351F8B4401007F7335 /* Build configuration list for PBXNativeTarget "LadderGame" */ = { 267 | isa = XCConfigurationList; 268 | buildConfigurations = ( 269 | 8377CC361F8B4401007F7335 /* Debug */, 270 | 8377CC371F8B4401007F7335 /* Release */, 271 | ); 272 | defaultConfigurationIsVisible = 0; 273 | defaultConfigurationName = Release; 274 | }; 275 | /* End XCConfigurationList section */ 276 | }; 277 | rootObject = 8377CC261F8B4400007F7335 /* Project object */; 278 | } 279 | -------------------------------------------------------------------------------- /LadderGame/LadderGame.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /LadderGame/LadderGame/main.swift: -------------------------------------------------------------------------------- 1 | // 2 | // main.swift 3 | // LadderGame 4 | // 5 | // Created by JK on 09/10/2017. 6 | // Copyright © 2017 Codesquad Inc. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 진행 방법 2 | 3 | - 사다리 게임에 요구사항을 파악한다. 4 | - 요구사항에 대한 구현을 완료한 후 자신의 github 아이디에 해당하는 브랜치에 Pull Request(이하 PR)를 통해 코드 리뷰 요청을 한다. 5 | - 코드 리뷰 피드백에 대한 개선 작업을 하고 다시 PUSH한다. 6 | - 모든 피드백을 완료하면 다음 단계를 도전하고 앞의 과정을 반복한다. 7 | 8 | # 코드 리뷰 과정 9 | > 저장소 브랜치에 자신의 github 아이디에 해당하는 브랜치가 존재해야 한다. 10 | > 11 | > 자신의 github 아이디에 해당하는 브랜치가 있는지 확인한다. 12 | 13 | 1. 자신의 github 아이디에 해당하는 브랜치가 없는 경우 브랜치 생성 요청 채널을 통해 브랜치 생성을 요청한다. 14 | 프로젝트를 자신의 계정으로 fork한다. 저장소 우측 상단의 fork 버튼을 활용한다. 15 | 16 | 2. fork한 프로젝트를 자신의 컴퓨터로 clone한다. 17 | ``` 18 | git clone https://github.com/{본인_아이디}/{저장소 아이디} 19 | ex) https://github.com/godrm/swift-laddergame 20 | ``` 21 | 22 | 3. clone한 프로젝트 이동 23 | ``` 24 | cd {저장소 아이디} 25 | ex) cd swift-laddergame 26 | ``` 27 | 28 | 4. 본인 아이디로 브랜치를 만들기 위한 checkout 29 | ``` 30 | git checkout -t origin/본인_아이디 31 | ex) git checkout -t origin/godrm 32 | ``` 33 | 34 | 5. 기능 구현을 위한 브랜치 생성 (연속번호를 붙여나간다) 35 | ``` 36 | git checkout -b 브랜치이름 37 | ex) git checkout -b ladder-step1 38 | ``` 39 | 40 | 6. commit 41 | ``` 42 | git status //확인 43 | git rm 파일명 //삭제된 파일 44 | git add 파일명(or * 모두) // 추가/변경 파일 45 | git commit -m "메세지" // 커밋 46 | ``` 47 | 48 | 7. 본인 원격 저장소에 올리기 49 | ``` 50 | git push --set-upstream origin 브랜치이름 51 | ex) git push --set-upstream origin ladder-step1 52 | ``` 53 | 54 | 8. pull request 55 | - pull request는 github 서비스에서 진행할 수 있다. 56 | - pull request는 original 저장소의 브랜치(자신의 github 아이디)와 앞 단계에서 생성한 브랜치 이름을 기준으로 한다. 57 | 58 | ``` 59 | ex) code-squad/swift-laddergame godrm 브랜치 기준 => godrm/swift-laddergame ladder-step1 60 | ``` 61 | 62 | 9. code review 및 push 63 | - pull request를 통해 피드백을 받는다. 64 | - 코드 리뷰 피드백에 대한 개선 작업을 하고 다시 PUSH한다. 65 | 66 | 10. 기본(upstream) 브랜치 전환 및 base 저장소 추가하기(최초 시작하기 단계 한번만 하면 됨) 67 | 68 | ``` 69 | git checkout 본인_아이디 70 | git remote add upstream base_저장소_url 71 | 72 | ex) git checkout godrm 73 | ex) git remote add upstream https://github.com/code-squad/swift-laddergame.git 74 | ``` 75 | 76 | - 위와 같이 base 저장소 추가한 후 remote 브랜치 목록을 본다. 77 | 78 | ``` 79 | git remote -v 80 | ``` 81 | 82 | 11. 기본 base 저장소와 sync하기 (PR 보낸 내용을 자신의 기본 저장소와 합치기) 83 | 84 | ``` 85 | git fetch upstream 86 | git rebase upstream/본인_아이디 87 | ex) git rebase upstream/godrm 88 | ``` 89 | 90 | 12. 다음 미션을 해결할 경우 [5단계 브랜치 생성]부터 다시 진행 91 | 92 | ## 동영상을 통한 코드 리뷰() 를 통해 참고 가능 93 | 94 | - [fork하여 코드 리뷰하기](https://www.youtube.com/watch?v=ZSZoaG0PqLg) 95 | - [PR 보내고 다시 PR보낼 때 유의 사항](https://www.youtube.com/watch?v=CbLNbCUsh5c&feature=youtu.be) 96 | 97 | ## 실습 중 모든 질문은 슬랙 채널에서... --------------------------------------------------------------------------------