diff --git a/.swiftlint.yml b/.swiftlint.yml index 37d7a40..067ce3b 100644 --- a/.swiftlint.yml +++ b/.swiftlint.yml @@ -1,15 +1,17 @@ disabled_rules: -- line_length -- trailing_whitespace -- leading_whitespace -- force_try -- function_body_length -included: + - trailing_whitespace + - leading_whitespace + - force_try + - function_body_length + - large_tuple + - type_body_length + excluded: -- Pods -- RespectU/Supporting Files/ERProgressHud.swift + - Pods + - RespectU/Resources/SwiftGen cyclomatic_complexity: 20 + identifier_name: excluded: - id @@ -24,9 +26,12 @@ identifier_name: - a - b - c + type_name: excluded: - CE - BS -trailing_space: - + +line_length: + warning: 99 + error: 120 diff --git a/Gemfile b/Gemfile deleted file mode 100644 index 7a118b4..0000000 --- a/Gemfile +++ /dev/null @@ -1,3 +0,0 @@ -source "https://rubygems.org" - -gem "fastlane" diff --git a/Podfile b/Podfile index 1626d56..b235750 100644 --- a/Podfile +++ b/Podfile @@ -4,13 +4,14 @@ target 'RespectU' do # Comment the next line if you're not using Swift and don't want to use dynamic frameworks use_frameworks! - pod 'RealmSwift' - pod 'MarqueeLabel/Swift' - pod 'GaugeKit' - pod 'XLPagerTabStrip', '~>8.0' pod 'DZNEmptyDataSet' + pod 'GaugeKit' + pod 'MarqueeLabel/Swift' + pod 'RealmSwift' + pod 'SVProgressHUD' pod 'SwiftKeychainWrapper' - pod 'SwiftLint' + pod 'Then' + pod 'XLPagerTabStrip' # Pods for RespectU end diff --git a/Podfile.lock b/Podfile.lock index f2b9ed2..98cf61d 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -7,8 +7,9 @@ PODS: - Realm/Headers (3.11.0) - RealmSwift (3.11.0): - Realm (= 3.11.0) + - SVProgressHUD (2.2.5) - SwiftKeychainWrapper (3.0.1) - - SwiftLint (0.27.0) + - Then (2.4.0) - XLPagerTabStrip (8.0.1) DEPENDENCIES: @@ -16,9 +17,10 @@ DEPENDENCIES: - GaugeKit - MarqueeLabel/Swift - RealmSwift + - SVProgressHUD - SwiftKeychainWrapper - - SwiftLint - - XLPagerTabStrip (~> 8.0) + - Then + - XLPagerTabStrip SPEC REPOS: https://github.com/cocoapods/specs.git: @@ -27,8 +29,9 @@ SPEC REPOS: - MarqueeLabel - Realm - RealmSwift + - SVProgressHUD - SwiftKeychainWrapper - - SwiftLint + - Then - XLPagerTabStrip SPEC CHECKSUMS: @@ -37,10 +40,11 @@ SPEC CHECKSUMS: MarqueeLabel: 440a502b91a9179bd98f9fff00ba1150650a1c0e Realm: 92f09a102692b96a9a10e9617f214f15c5ab85fc RealmSwift: 5f0481cd658bb751c509314b964a35eaa264d2cf + SVProgressHUD: 1428aafac632c1f86f62aa4243ec12008d7a51d6 SwiftKeychainWrapper: 38952a3636320ae61bad3513cadd870929de7a4a - SwiftLint: 3207c1faa2240bf8973b191820a116113cd11073 + Then: 71866660c7af35a7343831f7668e7cd2b62ee0f2 XLPagerTabStrip: c908b17cbf42fcd2598ee1adfc49bae25444d88a -PODFILE CHECKSUM: 967e17f81bf34e2b4bb2c7b9689c3016794bf520 +PODFILE CHECKSUM: cf7fbafd9f5d2062e4d97c576509dfe6e37a5e23 -COCOAPODS: 1.6.0.beta.1 +COCOAPODS: 1.6.0 diff --git a/README.md b/README.md index 1686d0a..4759305 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,10 @@ -# RespectU_iOS -![logo](./images/logo.png) +RespectU -![Language](https://img.shields.io/badge/swift-4.2-orange.svg) -![Platform](https://img.shields.io/badge/platform-ios-lightgrey.svg) +

SwiftPlatform

-### RespectU : Guide for DJMAX RESPECT (iOS) +# RespectU : Guide for DJMAX RESPECT -국산 리듬게임 **[디제이맥스 리스펙트](https://www.djmaxrespect.com/#)** 의 가이드 애플리케이션 +**국산 리듬게임 [디제이맥스 리스펙트](https://www.djmaxrespect.com/#) 의 가이드 애플리케이션** --- @@ -18,19 +16,21 @@ ### 사용한 라이브러리 -[RealmSwift](https://cocoapods.org/pods/RealmSwift) +[DZNEmptyDataSet](https://github.com/dzenbot/DZNEmptyDataSet) -[SwiftKeychainWrapper](https://cocoapods.org/pods/SwiftKeychainWrapper) +[GaugeKit](https://github.com/skywinder/GaugeKit) -[SwiftLint](https://cocoapods.org/pods/SwiftLint) +[MarqueeLabel/Swift](https://github.com/cbpowell/MarqueeLabel) -[XLPagerTabStrip](https://cocoapods.org/pods/XLPagerTabStrip) +[RealmSwift](https://github.com/realm/realm-cocoa) -[GaugeKit](https://cocoapods.org/pods/GaugeKit) +[SVProgressHUD](https://github.com/SVProgressHUD/SVProgressHUD) -[DZNEmptyDataSet](https://cocoapods.org/pods/DZNEmptyDataSet) +[SwiftKeychainWrapper](https://github.com/jrendel/SwiftKeychainWrapper) -[MarqueeLabel/Swift](https://cocoapods.org/pods/MarqueeLabel) +[Then](https://github.com/devxoul/Then) + +[XLPagerTabStrip](https://github.com/xmartlabs/XLPagerTabStrip) --- @@ -52,32 +52,7 @@ #### SwiftLint를 통한 코드 스타일 및 컨벤션 강제 - - 다양한 에러와 경고가 발생했고 빌드가 가능한 코드를 만드는 데만 해도 꽤 많은 시간이 걸렸다. - 수정 과정을 통해서 사람들이 많이 사용하는 코딩 컨벤션을 알 수 있었고, 더 나은 코드로 수정할 수 있었다. - - 그 중 몇 개를 정리한다. - - `for_where` - - `for-in` 구문으로 컬렉션을 순회하면서 `if` 문으로 조건을 주어 작업을 처리하고 `break` 하는 코드가 있었는데, 이렇게 하기보다는 `where` 구문을 사용하여 더 나은 코드와 결과를 얻을 수 있었다. - - `function_parameter_count` - - 함수의 매개변수 개수는 5개 이하를 권장한다. - - 그 이상이 될 때는 구조체같은 것을 만들어서 보내주자. - - 어디서 매개변수 5개 까지는 레지스터에 저장되고 그 이상은 메모리에 저장되어서 속도 차가 난다고 들었던 것 같다. 이것 때문도 있겠지만 구조체 같은 것에 묶어서 보내주는 것이 여러모로 좋다. - - `void_return` - - `Void` 를 리턴하는 함수라면 `-> ()` 대신 `-> Void` 라고 작성하자. - - `unused_closure_parameter` - - 사용하지 않는 클로저 파라미터는 `_` 로 처리해주자. - - `notification_center_detachment` - - `deinit` 에서 옵저버를 제거하는 코드를 작성하자. - - `nesting` - - 응답 모델을 정의하는 곳에서 발생하였다. 중첩 타입의 뎁스를 두 개 이상으로 하는 것을 지양하자. - - `weak_delegate` - - 델리게이트 변수는 참조 순환을 피하기 위해 `weak` 로 선언되어야 한다. - - `class_delegate_protocol` - - 델리게이트를 위한 프로토콜을 클래스만 채택할 수 있게 해야 한다. 그래야 약한 참조가 가능하다. - - `weak_delegate` 와 함께 실용적인 팁을 얻은 부분이다. - - `mark` - - 마크 주석 관련. `// MARK: ` 또는 `// MARK: -` 과 같은 형식을 사용한다. - - `multiple_closure_with_trailing_closure` - - 한 개 이상의 클로저를 파라미터로 넘길 때 후행 클로저 문법 사용을 지양하자. #### Memory Profiling @@ -157,6 +132,13 @@ ![8](./images/8.png) +**3.02** + +- DJMAX RESPECT 1.21에 대응 +- 전체 리팩토링 + - 네이밍 등 코딩 스타일 관점 + - 어떠한 기능의 올바른 위치 등 구조적 관점 + **3.01** - WKWebView를 SFSafariViewController로 교체 diff --git a/RespectU.xcodeproj/project.pbxproj b/RespectU.xcodeproj/project.pbxproj index ed51a47..542d7f9 100644 --- a/RespectU.xcodeproj/project.pbxproj +++ b/RespectU.xcodeproj/project.pbxproj @@ -7,211 +7,222 @@ objects = { /* Begin PBXBuildFile section */ - 19012FB62048344F0061EF21 /* Performance.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 19012FB52048344F0061EF21 /* Performance.storyboard */; }; - 19012FB82048345B0061EF21 /* Guide.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 19012FB72048345B0061EF21 /* Guide.storyboard */; }; - 19012FBC204837040061EF21 /* PerformanceViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19012FBB204837040061EF21 /* PerformanceViewController.swift */; }; - 19012FBE2048370C0061EF21 /* GuideViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19012FBD2048370C0061EF21 /* GuideViewController.swift */; }; - 191275EB211206790046AA3E /* NSObject+.swift in Sources */ = {isa = PBXBuildFile; fileRef = 191275EA211206790046AA3E /* NSObject+.swift */; }; - 191275ED21120B080046AA3E /* BaseViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 191275EC21120B080046AA3E /* BaseViewController.swift */; }; - 191275F2211210610046AA3E /* SongBaseTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 191275F1211210610046AA3E /* SongBaseTableViewController.swift */; }; - 191275F421121B9D0046AA3E /* UIViewController+.swift in Sources */ = {isa = PBXBuildFile; fileRef = 191275F321121B9D0046AA3E /* UIViewController+.swift */; }; - 191275F62112225E0046AA3E /* MissionBaseTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 191275F52112225E0046AA3E /* MissionBaseTableViewController.swift */; }; - 191275F8211232180046AA3E /* TrophyBaseTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 191275F7211232180046AA3E /* TrophyBaseTableViewController.swift */; }; - 1913B40F2175C08700D6C93F /* HistoryCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1913B40D2175C08700D6C93F /* HistoryCell.swift */; }; - 1913B4102175C08700D6C93F /* HistoryCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1913B40E2175C08700D6C93F /* HistoryCell.xib */; }; - 1913B4122175C15900D6C93F /* HistoryInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1913B4112175C15900D6C93F /* HistoryInfo.swift */; }; - 191A8B7C20E4FAAC0064F93E /* RecordBSTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 191A8B7B20E4FAAC0064F93E /* RecordBSTableViewController.swift */; }; - 191A8B7E20E4FC930064F93E /* UIAlertController+.swift in Sources */ = {isa = PBXBuildFile; fileRef = 191A8B7D20E4FC930064F93E /* UIAlertController+.swift */; }; - 191A8B8020E51ACF0064F93E /* MissionLinkDiskTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 191A8B7F20E51ACF0064F93E /* MissionLinkDiskTableViewController.swift */; }; - 191C36672170F9B100B2594B /* CAGradientLayer+.swift in Sources */ = {isa = PBXBuildFile; fileRef = 191C36662170F9B100B2594B /* CAGradientLayer+.swift */; }; - 1928D5FD211824DF00F7901F /* UITableViewCell+.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1928D5FC211824DF00F7901F /* UITableViewCell+.swift */; }; - 192AFE2320E48ACA0006397F /* SongBSTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 192AFE2220E48ACA0006397F /* SongBSTableViewController.swift */; }; - 192AFE2520E48AD50006397F /* MissionBSTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 192AFE2420E48AD50006397F /* MissionBSTableViewController.swift */; }; - 192AFE2720E48ADF0006397F /* TrophyBSTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 192AFE2620E48ADF0006397F /* TrophyBSTableViewController.swift */; }; - 192AFE2920E48AE70006397F /* TrophyLinkDiskTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 192AFE2820E48AE70006397F /* TrophyLinkDiskTableViewController.swift */; }; - 192CA337216F279600F37675 /* SongTechnika2TableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 192CA336216F279600F37675 /* SongTechnika2TableViewController.swift */; }; - 192CA339216F27A200F37675 /* MissionTechnika2TableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 192CA338216F27A200F37675 /* MissionTechnika2TableViewController.swift */; }; - 192CA33B216F27B000F37675 /* TrophyTechnika2TableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 192CA33A216F27B000F37675 /* TrophyTechnika2TableViewController.swift */; }; - 192DF89B2111D92B0016F386 /* Series.swift in Sources */ = {isa = PBXBuildFile; fileRef = 192DF89A2111D92B0016F386 /* Series.swift */; }; - 192DF89D2111DA640016F386 /* Buttons.swift in Sources */ = {isa = PBXBuildFile; fileRef = 192DF89C2111DA640016F386 /* Buttons.swift */; }; - 192DF89F2111DAC80016F386 /* TrophyGrade.swift in Sources */ = {isa = PBXBuildFile; fileRef = 192DF89E2111DAC80016F386 /* TrophyGrade.swift */; }; - 192DF8A12111DAED0016F386 /* MissionSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 192DF8A02111DAED0016F386 /* MissionSection.swift */; }; - 19320FBC204942390075BD86 /* AchievementMusicTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19320FBB204942390075BD86 /* AchievementMusicTableViewController.swift */; }; - 19320FBE204942440075BD86 /* AchievementGearTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19320FBD204942440075BD86 /* AchievementGearTableViewController.swift */; }; - 19320FC02049424D0075BD86 /* AchievementNoteTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19320FBF2049424D0075BD86 /* AchievementNoteTableViewController.swift */; }; - 19320FC2204942590075BD86 /* AchievementGalleryTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19320FC1204942590075BD86 /* AchievementGalleryTableViewController.swift */; }; - 19320FC4204942640075BD86 /* AchievementCommentTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19320FC3204942640075BD86 /* AchievementCommentTableViewController.swift */; }; - 19320FC6204955CC0075BD86 /* Trophy.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 19320FC5204955CC0075BD86 /* Trophy.storyboard */; }; - 19320FC8204955D50075BD86 /* Mission.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 19320FC7204955D50075BD86 /* Mission.storyboard */; }; - 19320FCA204955DC0075BD86 /* Song.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 19320FC9204955DC0075BD86 /* Song.storyboard */; }; - 19320FCC2049566A0075BD86 /* TrophyViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19320FCB2049566A0075BD86 /* TrophyViewController.swift */; }; - 19320FCE2049568B0075BD86 /* TrophyRespectTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19320FCD2049568B0075BD86 /* TrophyRespectTableViewController.swift */; }; - 19320FD0204956940075BD86 /* TrophyTrilogyTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19320FCF204956940075BD86 /* TrophyTrilogyTableViewController.swift */; }; - 19320FD22049569D0075BD86 /* TrophyCETableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19320FD12049569D0075BD86 /* TrophyCETableViewController.swift */; }; - 19320FD5204959BE0075BD86 /* TrophyCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19320FD3204959BE0075BD86 /* TrophyCell.swift */; }; - 19320FD6204959BE0075BD86 /* TrophyCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 19320FD4204959BE0075BD86 /* TrophyCell.xib */; }; - 1939C96E212BFD8500A6F8E3 /* RankingResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1939C96D212BFD8500A6F8E3 /* RankingResponse.swift */; }; - 1939C970212BFD9200A6F8E3 /* UserResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1939C96F212BFD9200A6F8E3 /* UserResponse.swift */; }; - 1939C973212BFF1900A6F8E3 /* Network.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1939C972212BFF1900A6F8E3 /* Network.swift */; }; - 1939C975212C004D00A6F8E3 /* API.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1939C974212C004D00A6F8E3 /* API.swift */; }; - 193C285421366C1B001EB7F3 /* SignIn.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 193C285321366C1B001EB7F3 /* SignIn.storyboard */; }; - 193C285621366C28001EB7F3 /* SignInViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 193C285521366C28001EB7F3 /* SignInViewController.swift */; }; - 193C2858213671D5001EB7F3 /* SignInTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 193C2857213671D4001EB7F3 /* SignInTextField.swift */; }; - 193C285C213674B1001EB7F3 /* SignUpViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 193C285B213674B1001EB7F3 /* SignUpViewController.swift */; }; - 193C28602136C8E7001EB7F3 /* Upload.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 193C285F2136C8E7001EB7F3 /* Upload.storyboard */; }; - 193C28622136C8F0001EB7F3 /* UploadViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 193C28612136C8F0001EB7F3 /* UploadViewController.swift */; }; - 193C28672136E522001EB7F3 /* Download.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 193C28662136E522001EB7F3 /* Download.storyboard */; }; - 193C28692136E52A001EB7F3 /* DownloadViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 193C28682136E52A001EB7F3 /* DownloadViewController.swift */; }; - 193DE8D8204920EF00A829BB /* AchievementAllTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 193DE8D7204920EF00A829BB /* AchievementAllTableViewController.swift */; }; - 193DE8DB204922B400A829BB /* AchievementCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 193DE8D9204922B400A829BB /* AchievementCell.swift */; }; - 193DE8DC204922B400A829BB /* AchievementCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 193DE8DA204922B400A829BB /* AchievementCell.xib */; }; - 193E3FF1204B9C240063A440 /* Record.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 193E3FF0204B9C240063A440 /* Record.storyboard */; }; - 193E3FF3204B9EB80063A440 /* RecordViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 193E3FF2204B9EB80063A440 /* RecordViewController.swift */; }; - 193E3FF5204BB0D80063A440 /* RecordView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 193E3FF4204BB0D80063A440 /* RecordView.xib */; }; - 193E3FF7204BB1060063A440 /* RecordView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 193E3FF6204BB1060063A440 /* RecordView.swift */; }; - 193E3FF9204BCFB20063A440 /* Difficulty.swift in Sources */ = {isa = PBXBuildFile; fileRef = 193E3FF8204BCFB20063A440 /* Difficulty.swift */; }; - 193E4008204BF37E0063A440 /* SummaryCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 193E4006204BF37E0063A440 /* SummaryCell.swift */; }; - 193E4009204BF37E0063A440 /* SummaryCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 193E4007204BF37E0063A440 /* SummaryCell.xib */; }; - 193E400C204BF5D60063A440 /* SkillLevelCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 193E400A204BF5D60063A440 /* SkillLevelCell.swift */; }; - 193E400D204BF5D60063A440 /* SkillLevelCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 193E400B204BF5D60063A440 /* SkillLevelCell.xib */; }; - 193E4013204C02A30063A440 /* Top50ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 193E4012204C02A30063A440 /* Top50ViewController.swift */; }; - 193E4017204C03C50063A440 /* UIView+.swift in Sources */ = {isa = PBXBuildFile; fileRef = 193E4016204C03C50063A440 /* UIView+.swift */; }; - 193E401A204C05A00063A440 /* Top50Cell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 193E4018204C05A00063A440 /* Top50Cell.swift */; }; - 193E401B204C05A00063A440 /* Top50Cell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 193E4019204C05A00063A440 /* Top50Cell.xib */; }; - 193E401F204C07F40063A440 /* Top50.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 193E401E204C07F40063A440 /* Top50.storyboard */; }; - 193E4021204C09DB0063A440 /* Top504BTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 193E4020204C09DB0063A440 /* Top504BTableViewController.swift */; }; - 193E4023204C09E70063A440 /* Top505BTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 193E4022204C09E70063A440 /* Top505BTableViewController.swift */; }; - 193E4025204C09F20063A440 /* Top506BTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 193E4024204C09F20063A440 /* Top506BTableViewController.swift */; }; - 193E4027204C09FA0063A440 /* Top508BTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 193E4026204C09FA0063A440 /* Top508BTableViewController.swift */; }; - 193E4029204C237B0063A440 /* RankingViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 193E4028204C237A0063A440 /* RankingViewController.swift */; }; - 193E402B204C23E90063A440 /* Ranking4BTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 193E402A204C23E90063A440 /* Ranking4BTableViewController.swift */; }; - 193E402D204C23F40063A440 /* Ranking5BTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 193E402C204C23F40063A440 /* Ranking5BTableViewController.swift */; }; - 193E402F204C23FD0063A440 /* Ranking6BTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 193E402E204C23FD0063A440 /* Ranking6BTableViewController.swift */; }; - 193E4031204C24060063A440 /* Ranking8BTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 193E4030204C24060063A440 /* Ranking8BTableViewController.swift */; }; - 193E4035204C24180063A440 /* Ranking.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 193E4034204C24180063A440 /* Ranking.storyboard */; }; - 193E4038204C27220063A440 /* RankingCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 193E4036204C27220063A440 /* RankingCell.swift */; }; - 193E403B204C2EB60063A440 /* RankingCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 193E403A204C2EB60063A440 /* RankingCell.xib */; }; - 194E52A6204A8F7B00B84AFA /* SongAllTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 194E52A5204A8F7B00B84AFA /* SongAllTableViewController.swift */; }; - 194E52A8204A8F9900B84AFA /* SongPortable1TableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 194E52A7204A8F9900B84AFA /* SongPortable1TableViewController.swift */; }; - 194E52AA204A900D00B84AFA /* SongPortable2TableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 194E52A9204A900D00B84AFA /* SongPortable2TableViewController.swift */; }; - 194E52AC204A901A00B84AFA /* SongRespectTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 194E52AB204A901A00B84AFA /* SongRespectTableViewController.swift */; }; - 194E52AE204A941E00B84AFA /* SongTrilogyTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 194E52AD204A941E00B84AFA /* SongTrilogyTableViewController.swift */; }; - 194E52B0204A948300B84AFA /* SongCETableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 194E52AF204A948300B84AFA /* SongCETableViewController.swift */; }; - 194E52B7204AC55900B84AFA /* SongCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 194E52B5204AC55900B84AFA /* SongCell.swift */; }; - 194E52B8204AC55900B84AFA /* SongCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 194E52B6204AC55900B84AFA /* SongCell.xib */; }; - 1950D885212D6F92004ED086 /* LanguageResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1950D884212D6F92004ED086 /* LanguageResponse.swift */; }; - 19535F0A204A8E74008C9A45 /* SongViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19535F09204A8E74008C9A45 /* SongViewController.swift */; }; - 19585868213B0E76000C78C4 /* Init.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 19585867213B0E76000C78C4 /* Init.storyboard */; }; - 1958586A213B0E81000C78C4 /* InitViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19585869213B0E81000C78C4 /* InitViewController.swift */; }; - 1958DAB62151312700D8AE41 /* .swiftlint.yml in Resources */ = {isa = PBXBuildFile; fileRef = 1958DAB52151312700D8AE41 /* .swiftlint.yml */; }; - 195A6A25216F17F90072D03A /* IndicatorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 195A6A23216F17F90072D03A /* IndicatorView.swift */; }; - 195A6A26216F17F90072D03A /* IndicatorView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 195A6A24216F17F90072D03A /* IndicatorView.xib */; }; - 1963FF04217C664900FF6FE1 /* Date+.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1963FF03217C664900FF6FE1 /* Date+.swift */; }; - 1968184F20490ADA0007F4D7 /* Tip.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 1968184E20490ADA0007F4D7 /* Tip.storyboard */; }; - 1968185120490C730007F4D7 /* TipViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1968185020490C730007F4D7 /* TipViewController.swift */; }; - 1968185320490D300007F4D7 /* UIColor+.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1968185220490D300007F4D7 /* UIColor+.swift */; }; - 1968F785213E7295003C026B /* NicknameResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1968F784213E7295003C026B /* NicknameResponse.swift */; }; - 196F82492074A788000DF337 /* RecordPortable1TableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 196F82482074A787000DF337 /* RecordPortable1TableViewController.swift */; }; - 196F824D2074A91B000DF337 /* RecordCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 196F824B2074A91B000DF337 /* RecordCell.xib */; }; - 196F824F2074AD49000DF337 /* RecordCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 196F824E2074AD49000DF337 /* RecordCell.swift */; }; - 197414C62062A77A00D72626 /* SongTechnika1TableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 197414C52062A77A00D72626 /* SongTechnika1TableViewController.swift */; }; - 197414C82062A94A00D72626 /* TrophyTechnika1TableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 197414C72062A94A00D72626 /* TrophyTechnika1TableViewController.swift */; }; - 197414CA2062A95400D72626 /* MissionTechnika1TableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 197414C92062A95400D72626 /* MissionTechnika1TableViewController.swift */; }; - 1976FD05211239E600B80C4C /* AchievementBaseTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1976FD04211239E600B80C4C /* AchievementBaseTableViewController.swift */; }; - 198391F01F7CE21F009C7B5D /* RealmSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 198391F11F7CE21F009C7B5D /* RealmSwift.framework */; }; - 198391F41F7CE227009C7B5D /* Realm.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 198391F51F7CE227009C7B5D /* Realm.framework */; }; - 1984269821B7EA0A001F491C /* RespectUUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1984269721B7EA0A001F491C /* RespectUUITests.swift */; }; - 198426A021B7EA3B001F491C /* SnapshotHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1984269F21B7EA3B001F491C /* SnapshotHelper.swift */; }; - 1986CA2D205F542100CA43EA /* SearchByRateView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1986CA2C205F542100CA43EA /* SearchByRateView.xib */; }; - 1986CA31205F543F00CA43EA /* SearchByNoteView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1986CA30205F543F00CA43EA /* SearchByNoteView.xib */; }; - 1986CA33205F544900CA43EA /* SearchByNoteView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1986CA32205F544900CA43EA /* SearchByNoteView.swift */; }; - 1986CA37205FC26600CA43EA /* SearchRecordDetailViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1986CA36205FC26600CA43EA /* SearchRecordDetailViewController.swift */; }; - 1986CA3A205FC85A00CA43EA /* SearchRecordDetailCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1986CA38205FC85A00CA43EA /* SearchRecordDetailCell.swift */; }; - 1986CA3B205FC85A00CA43EA /* SearchRecordDetailCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1986CA39205FC85A00CA43EA /* SearchRecordDetailCell.xib */; }; - 19892A8620662D0A009D01F8 /* SearchByLevelView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 19892A8520662D0A009D01F8 /* SearchByLevelView.xib */; }; - 19892A8820662F83009D01F8 /* SearchByLevelView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19892A8720662F83009D01F8 /* SearchByLevelView.swift */; }; - 198B6C4C211382BD0058DE49 /* Top50BaseTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 198B6C4B211382BC0058DE49 /* Top50BaseTableViewController.swift */; }; - 198B6C4E211382C70058DE49 /* RankingBaseTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 198B6C4D211382C70058DE49 /* RankingBaseTableViewController.swift */; }; - 198B6C502113913C0058DE49 /* Skill.swift in Sources */ = {isa = PBXBuildFile; fileRef = 198B6C4F2113913C0058DE49 /* Skill.swift */; }; - 198B6C52211392CA0058DE49 /* Note.swift in Sources */ = {isa = PBXBuildFile; fileRef = 198B6C51211392CA0058DE49 /* Note.swift */; }; - 198B6C562113E5A60058DE49 /* SkillLevel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 198B6C552113E5A60058DE49 /* SkillLevel.swift */; }; - 198B6C5C211443C70058DE49 /* Rank.swift in Sources */ = {isa = PBXBuildFile; fileRef = 198B6C5B211443C70058DE49 /* Rank.swift */; }; - 198FC961204D24BD0026BA1D /* SummaryCollectionCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 198FC95F204D24BD0026BA1D /* SummaryCollectionCell.swift */; }; - 198FC962204D24BD0026BA1D /* SummaryCollectionCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 198FC960204D24BD0026BA1D /* SummaryCollectionCell.xib */; }; - 198FC964204D2E9F0026BA1D /* SummaryDetailViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 198FC963204D2E9F0026BA1D /* SummaryDetailViewController.swift */; }; - 199233D0216F743600E040D7 /* RecordTechnika2TableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 199233CF216F743600E040D7 /* RecordTechnika2TableViewController.swift */; }; - 199233D2216F85CF00E040D7 /* CommonButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 199233D1216F85CF00E040D7 /* CommonButton.swift */; }; - 199233D9216F938D00E040D7 /* GuideFirstCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 199233D7216F938D00E040D7 /* GuideFirstCell.swift */; }; - 199233DA216F938D00E040D7 /* GuideFirstCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 199233D8216F938D00E040D7 /* GuideFirstCell.xib */; }; - 199233DD216F939A00E040D7 /* GuideSecondCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 199233DB216F939A00E040D7 /* GuideSecondCell.swift */; }; - 199233DE216F939A00E040D7 /* GuideSecondCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 199233DC216F939A00E040D7 /* GuideSecondCell.xib */; }; - 199233E1216F93A700E040D7 /* GuideThirdCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 199233DF216F93A700E040D7 /* GuideThirdCell.swift */; }; - 199233E2216F93A700E040D7 /* GuideThirdCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 199233E0216F93A700E040D7 /* GuideThirdCell.xib */; }; - 1999920E2049641A00C74697 /* MissionCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1999920C2049641A00C74697 /* MissionCell.swift */; }; - 1999920F2049641A00C74697 /* MissionCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1999920D2049641A00C74697 /* MissionCell.xib */; }; - 199992112049652700C74697 /* MissionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 199992102049652700C74697 /* MissionViewController.swift */; }; - 199992132049653900C74697 /* MissionRespectTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 199992122049653900C74697 /* MissionRespectTableViewController.swift */; }; - 199992152049654500C74697 /* MissionTrilogyTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 199992142049654500C74697 /* MissionTrilogyTableViewController.swift */; }; - 199992172049654E00C74697 /* MissionCETableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 199992162049654E00C74697 /* MissionCETableViewController.swift */; }; - 199EFFE62067D51B00A6068F /* SearchByRateView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 199EFFE52067D51B00A6068F /* SearchByRateView.swift */; }; - 19B09E2D212C555A005EE66D /* SongResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19B09E2C212C555A005EE66D /* SongResponse.swift */; }; - 19B09E2F212C555F005EE66D /* MissionResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19B09E2E212C555F005EE66D /* MissionResponse.swift */; }; - 19B09E31212C5565005EE66D /* TrophyResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19B09E30212C5565005EE66D /* TrophyResponse.swift */; }; - 19B09E33212C556F005EE66D /* AchievementResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19B09E32212C556F005EE66D /* AchievementResponse.swift */; }; - 19B09E35212C5576005EE66D /* TipResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19B09E34212C5576005EE66D /* TipResponse.swift */; }; - 19B660261F960E5800CCEFB5 /* String+.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19B660251F960E5800CCEFB5 /* String+.swift */; }; - 19B660291F960FA800CCEFB5 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 19B6602B1F960FA800CCEFB5 /* Localizable.strings */; }; - 19B6CFEC1F7953640097B86B /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19B6CFEB1F7953640097B86B /* AppDelegate.swift */; }; - 19B6CFF61F7953640097B86B /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 19B6CFF51F7953640097B86B /* Assets.xcassets */; }; - 19B6CFF91F7953640097B86B /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 19B6CFF71F7953640097B86B /* LaunchScreen.storyboard */; }; - 19C9216B1F810DE600774E3E /* MessageUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 19C9216A1F810DE600774E3E /* MessageUI.framework */; }; - 19CA98E1213D416D003371DB /* VersionResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19CA98E0213D416D003371DB /* VersionResponse.swift */; }; - 19D1EF422069E9D600F2BFD5 /* AchievementPlateTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19D1EF412069E9D600F2BFD5 /* AchievementPlateTableViewController.swift */; }; - 19D67EC620744EEB00FD9EC7 /* RecordAllTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19D67EC520744EEB00FD9EC7 /* RecordAllTableViewController.swift */; }; - 19D67EC820744F0700FD9EC7 /* RecordPortable2TableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19D67EC720744F0700FD9EC7 /* RecordPortable2TableViewController.swift */; }; - 19D67ECC20744F1700FD9EC7 /* RecordRespectTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19D67ECB20744F1700FD9EC7 /* RecordRespectTableViewController.swift */; }; - 19D67ECE20744F2000FD9EC7 /* RecordTrilogyTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19D67ECD20744F2000FD9EC7 /* RecordTrilogyTableViewController.swift */; }; - 19D67ED020744F3400FD9EC7 /* RecordCETableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19D67ECF20744F3300FD9EC7 /* RecordCETableViewController.swift */; }; - 19D67ED220744F3D00FD9EC7 /* RecordTechnika1TableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19D67ED120744F3D00FD9EC7 /* RecordTechnika1TableViewController.swift */; }; - 19E02ACA204919830070D72B /* Achievement.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 19E02AC9204919830070D72B /* Achievement.storyboard */; }; - 19E02ACC2049199C0070D72B /* AchievementViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19E02ACB2049199C0070D72B /* AchievementViewController.swift */; }; - 19E4DAF4213D896100837A95 /* SongButtonInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19E4DAE6213D896100837A95 /* SongButtonInfo.swift */; }; - 19E4DAF5213D896100837A95 /* MissionStageInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19E4DAE7213D896100837A95 /* MissionStageInfo.swift */; }; - 19E4DAF6213D896100837A95 /* NewRecordButtonInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19E4DAE8213D896100837A95 /* NewRecordButtonInfo.swift */; }; - 19E4DAF7213D896100837A95 /* MissionInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19E4DAE9213D896100837A95 /* MissionInfo.swift */; }; - 19E4DAF8213D896100837A95 /* RecordInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19E4DAEA213D896100837A95 /* RecordInfo.swift */; }; - 19E4DAF9213D896100837A95 /* TipInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19E4DAEB213D896100837A95 /* TipInfo.swift */; }; - 19E4DAFA213D896100837A95 /* LanguageInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19E4DAEC213D896100837A95 /* LanguageInfo.swift */; }; - 19E4DAFB213D896100837A95 /* VersionInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19E4DAED213D896100837A95 /* VersionInfo.swift */; }; - 19E4DAFC213D896100837A95 /* SongInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19E4DAEE213D896100837A95 /* SongInfo.swift */; }; - 19E4DAFD213D896100837A95 /* TrophyInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19E4DAEF213D896100837A95 /* TrophyInfo.swift */; }; - 19E4DAFE213D896100837A95 /* NewRecordInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19E4DAF0213D896100837A95 /* NewRecordInfo.swift */; }; - 19E4DB00213D896100837A95 /* NewRecordDifficultyInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19E4DAF2213D896100837A95 /* NewRecordDifficultyInfo.swift */; }; - 19E4DB01213D896100837A95 /* AchievementInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19E4DAF3213D896100837A95 /* AchievementInfo.swift */; }; - 19ECEE68205EBBA3000D742E /* SearchRecordViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19ECEE67205EBBA3000D742E /* SearchRecordViewController.swift */; }; - 19F13FBA2112ED87003E622E /* Results+.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19F13FB92112ED87003E622E /* Results+.swift */; }; - 19F13FBC2112F161003E622E /* RecordBaseTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19F13FBB2112F161003E622E /* RecordBaseTableViewController.swift */; }; - 19F2312F20156BBC00ADF825 /* Reachability.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19F2312E20156BBC00ADF825 /* Reachability.swift */; }; - 19F24BB42049A62D0034D624 /* MissionDetailViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19F24BB32049A62D0034D624 /* MissionDetailViewController.swift */; }; - 19F38C93204CC69A006BB72B /* SkillLevelDetailViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19F38C92204CC69A006BB72B /* SkillLevelDetailViewController.swift */; }; - 19F38C95204CC957006BB72B /* SkillLevelDetailView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 19F38C94204CC957006BB72B /* SkillLevelDetailView.xib */; }; - 19F38C97204CC962006BB72B /* SkillLevelDetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19F38C96204CC962006BB72B /* SkillLevelDetailView.swift */; }; - 19FD9CEE21355E110014A0D4 /* RecordResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19FD9CED21355E110014A0D4 /* RecordResponse.swift */; }; - 1C0E1D5872206B8A4DABA752 /* Pods_RespectU.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 35C82758ABE7A6568499A7F2 /* Pods_RespectU.framework */; }; + EE5801B1F86B92BE4282BB1D1EAECC52 /* .swiftlint.yml in Resources */ = {isa = PBXBuildFile; fileRef = DA5A4E6832F2B48BFFE29D6EE9E1BFEF /* .swiftlint.yml */; }; + B33FCC0BE699D423F86B0CA60B201E5D /* APIService+Achievement.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE6D08E337A7395C974382D3D49B50ED /* APIService+Achievement.swift */; }; + 0EEC0969D24C14614F3852EC64FF8EDE /* APIService+Base.swift in Sources */ = {isa = PBXBuildFile; fileRef = F14D88E672A1CA362BBF23009477E7C7 /* APIService+Base.swift */; }; + 03E7939635EDE9C2551CF5AD294F582D /* APIService+Mission.swift in Sources */ = {isa = PBXBuildFile; fileRef = 67F8ADF69CF51420637315B6B1CB9B3F /* APIService+Mission.swift */; }; + FB483D4534B0C1A9CB4E62CBBCB678DB /* APIService+Ranking.swift in Sources */ = {isa = PBXBuildFile; fileRef = A52641BDB047E88FFE60B9F1EB7F89D8 /* APIService+Ranking.swift */; }; + 42DD4D7660CB5C856E21164943943414 /* APIService+Record.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6594C9F6573B04AED144F6F3F3B9AA6 /* APIService+Record.swift */; }; + 2C72DE5923F7655BC252D19C1068F813 /* APIService+Song.swift in Sources */ = {isa = PBXBuildFile; fileRef = AF131ED7C45FABB6AD6B1A75998373F8 /* APIService+Song.swift */; }; + B614B0C989214B6E5E0AE3994B6DA84D /* APIService+Tip.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1EC376E253CB7630E7BAC771AB75FC10 /* APIService+Tip.swift */; }; + B49EF0D157083F66A516584A093A9775 /* APIService+Trophy.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0DFBF524855854CAC775CF09B6A5F92 /* APIService+Trophy.swift */; }; + 12AD6ED4E6B2F3FCB7E5FBD427D0BEAA /* APIService+User.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B53CFCFD9ABD97DDA14CD35ACDFB94D /* APIService+User.swift */; }; + 6D1619C4051B8073FDAE2D1EE0F28DF1 /* Achievement.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 282674A18512BC1AEFB6CE490A429E5C /* Achievement.storyboard */; }; + A368D670D9ECB37DBA7FDF40293DCC9F /* AchievementAllTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D208137CF7035F090957DD52BFD704BC /* AchievementAllTableViewController.swift */; }; + 9F424786F18F120DFA3B54AA97CFE58D /* AchievementBaseTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECF59229051F5AD6A883EFD1E5A2603E /* AchievementBaseTableViewController.swift */; }; + AD5AD544FF4F2D2C8F1B5317859CF690 /* AchievementCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 623DBE7ABE62C6ED2C6A96D8B561D1BC /* AchievementCell.swift */; }; + DCE96025AC799FDF2C9F73446B22DA1D /* AchievementCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = F957C9D0578879C4BFDF188CC7E9DB68 /* AchievementCell.xib */; }; + 77A3641A412E2281169BC43A482D1E91 /* AchievementCommentTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 07507A73DE0099DC9CFB4ABA9FB0DC0C /* AchievementCommentTableViewController.swift */; }; + 51224183DF5D5EE431F19419618869BD /* AchievementGalleryTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8CB2A66DC82F6391EEEF838491861F33 /* AchievementGalleryTableViewController.swift */; }; + 79411DF6AB24D237EE95FD55E977CAEA /* AchievementGearTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 81A0CEB91040D7176F26D4F0FDD21D28 /* AchievementGearTableViewController.swift */; }; + E1CBFF554215B6EE966299F65FC12C15 /* AchievementInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D72B837CDF13537B08A21962C780D70 /* AchievementInfo.swift */; }; + EDDF63E5EFFCFFE2BAEED87EF03CA87B /* AchievementMusicTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C728DBB0614587CD2759E53BD1A65882 /* AchievementMusicTableViewController.swift */; }; + B6352BF809F83287D010471DA3CE8ACC /* AchievementNoteTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18449AAA9B8578063135A1485D123683 /* AchievementNoteTableViewController.swift */; }; + 21210F283185F19A775BAC369EA72133 /* AchievementPlateTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08F04BA7E15EC807F3B9CAA3AEF98239 /* AchievementPlateTableViewController.swift */; }; + 4C17D5C69A95D3C1A2160AE91E036869 /* AchievementResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 181F3BF12F13DC015494221C8902B980 /* AchievementResponse.swift */; }; + B4CB2D7CBA623EA489565AB780044FE6 /* AchievementType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6E8609566688513F20D56F71E8C2A73E /* AchievementType.swift */; }; + A85CA7512FCCF5A4CD116BCDCD8795A1 /* AchievementViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEEACD594FBA67A330D104F816D4D968 /* AchievementViewController.swift */; }; + 9C5BD16964B01CE4E826C0714E7BFB7C /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 437358F63E7EFA7C3FA6E22357580622 /* AppDelegate.swift */; }; + BE9081C6FD851727989460A4D055C02E /* Assets.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74BBB665B16E2FF2F0BE095960FFA33E /* Assets.swift */; }; + 90AE9C19BBE72AFD47EC3E391B1EAA1A /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = E683F525A54716C4D6BE56A96EEDCB29 /* Assets.xcassets */; }; + C49BDBE7974F6333739B639CFBC5DB8A /* BaseViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 091109F5110F4F89963C64B091604CEE /* BaseViewController.swift */; }; + 16E72F47E46466C1D0F72348BC1734D2 /* Button.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7994394D253D83388739913632BF52F4 /* Button.swift */; }; + 94382F584F379628F8CCCEEF51AA8C23 /* CAGradientLayer+.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F8D863B4192345379FAA072605B014B /* CAGradientLayer+.swift */; }; + 36105E909ADA369CB7D0D1B675FED1F4 /* Difficulty.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3556AE9C2F4DBEEEF2277634864736F6 /* Difficulty.swift */; }; + 1B7BDC0518E8261BB7E114B238485E0D /* Double+.swift in Sources */ = {isa = PBXBuildFile; fileRef = 00C0A70ADF02A515C554A2A7F65D04D0 /* Double+.swift */; }; + 8E46243F171B5DE4C8636DE0C7C4BC09 /* Download.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = C18E5F5E8BB5540D91968DDECE31869A /* Download.storyboard */; }; + 53DC6066E155D2567781E494547956C9 /* DownloadViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7684A5E7EAE2568B15BCA4F2AEF65CA2 /* DownloadViewController.swift */; }; + 38C447D6D1AE123FA0B3D40D21AEE863 /* GradientDirection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9CB2C96445D032E82864C978003715B1 /* GradientDirection.swift */; }; + 3BB933CDB0A2F0ABF0AD9921098EB4E0 /* Guide.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 43CCCFC971513264AFA7256BA71653C4 /* Guide.storyboard */; }; + 78989219547DC155E6A2BFB50D1CE084 /* GuideFirstCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48EB4DE7C46CAC769FAD64B4062EA5AC /* GuideFirstCell.swift */; }; + D56DE493782E270E40CA51D4CDFBBD83 /* GuideFirstCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4145F1EB5D7436740025D90996B48C6B /* GuideFirstCell.xib */; }; + 773E3FDD1DEE5F4CB711CDB6039FC8E6 /* GuideSecondCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 88C214B5C6340C681D687A5837D49CB2 /* GuideSecondCell.swift */; }; + 7F9C5B8E757967B095FD6904890294BD /* GuideSecondCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = ACAACBB2302A38B15286B2F10D57B0D2 /* GuideSecondCell.xib */; }; + A6CF37762CAA065A967E3883E5957CB3 /* GuideThirdCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = C2C849886AF9CEC2084D57D6610826D0 /* GuideThirdCell.swift */; }; + 8EB9D7D19F3E905E268B6250460CEC96 /* GuideThirdCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 570419DC99D9A09F38A4AC7F521FCA9B /* GuideThirdCell.xib */; }; + CD55E0CB7597D32784C77016C147A6AD /* GuideViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 93A63669D5CF070426162547AE2374EB /* GuideViewController.swift */; }; + 6B55743E37BEBB24B1B5DA326BAC689B /* Init.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 8D37A25DCDC8B3EE48F56719264861F7 /* Init.storyboard */; }; + 7E0990E3AE966B278DF432343CED2319 /* InitViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 117BC6C5BE267F11B4EEF031AEA2892E /* InitViewController.swift */; }; + C663E15915C31A522FC58453C8860335 /* LanguageInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9846CC66092E2BF0D2992D65E7468CD /* LanguageInfo.swift */; }; + 9C9BB24EC5E6266278706EC8E1687942 /* LanguageResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9FEE52510CEADD20DE68A05F791D08EE /* LanguageResponse.swift */; }; + E0045A82AD56B280294AD01E55A8F38A /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 0FFF8FE8E83D48C24E4B183637AC73A8 /* LaunchScreen.storyboard */; }; + EC915038C96954FF4B4502B9245CF3D0 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = B30E23955E630DE10DDEE4E073034629 /* Localizable.strings */; }; + 3B9C2AF499E89D2A4B1386181D2E464C /* MessageUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 78D031E416EDBC4C34BC6B3FA0451966 /* MessageUI.framework */; }; + 6873CA61A5E3DCF9DCE5B8DD11436346 /* Mission.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 58EF41D2CE42F9C421375B5B3CE8D60E /* Mission.storyboard */; }; + 07E412854081E98BAA9EC7826338343C /* MissionBSTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D5735B28DC786C25122A478189A9D7A /* MissionBSTableViewController.swift */; }; + 9DCD5A88AE046BE67E43FDE46C8F33C3 /* MissionBaseTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A41D0D4CFC2F1ABFC1D38C42335BAB6C /* MissionBaseTableViewController.swift */; }; + 8007E7D37842446EFC1FDF6AFC2639EC /* MissionCETableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D30DD51658A0E07C8F795B59D8C5A930 /* MissionCETableViewController.swift */; }; + 297DFEEE2C220A5C1F47BAA6F2AC87B7 /* MissionCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E6BC6E8EAEFF1FB31DF48435303F350 /* MissionCell.swift */; }; + 2D1AD8A8A5662FEE12F6EED06FD06136 /* MissionCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 6F96CA2C329587E39822104CEF6C2C4D /* MissionCell.xib */; }; + 0179E468A4893A10BE09245347B49401 /* MissionDetailViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = FB1D1400F4F8A5579A4BD339D8661CC6 /* MissionDetailViewController.swift */; }; + C901A043E201D80F7AD41DCA311F210F /* MissionInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = E2056D7C4194815BBE52A3F13FAF7125 /* MissionInfo.swift */; }; + 99897C2ED7674E739230DED65BDC06D2 /* MissionLinkDiskTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EB4F2D81091EAC8D197F1D737EA41B9 /* MissionLinkDiskTableViewController.swift */; }; + 80F2294D348F4A43E2CB8F35028D0423 /* MissionRespectTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D1936880A3D30B8BC49B8587F6778EEA /* MissionRespectTableViewController.swift */; }; + 90AF44D559BE00DEB63346B84D141E10 /* MissionResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 356291260ADA8E8A175631818583AAC6 /* MissionResponse.swift */; }; + AC365183A54C207B12519696FFF64C67 /* MissionSection.BS+Gradient.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9BE0A154D3D7E018D76684B281CECD0 /* MissionSection.BS+Gradient.swift */; }; + 0380D257C2F539A6344259BF2EFED65A /* MissionSection.CE+Gradient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91CBAA567778CAD53CB93CE152F92D55 /* MissionSection.CE+Gradient.swift */; }; + BEC2CC592CAB4198746262C55D73DBA0 /* MissionSection.LinkDisk+Gradient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 60EAD4483197E0A753FDD10845C98D09 /* MissionSection.LinkDisk+Gradient.swift */; }; + 8DD62325C32CFDD11403EF407197E9A9 /* MissionSection.Respect+Gradient.swift in Sources */ = {isa = PBXBuildFile; fileRef = A09D0FEC3D95CCD8ECE16CBDA7084FFA /* MissionSection.Respect+Gradient.swift */; }; + 87EE66478A51CBA1A1A9F26347694685 /* MissionSection.Technika1+Gradient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 79D7A5F0799CF86A96D301D82B8B1090 /* MissionSection.Technika1+Gradient.swift */; }; + 72713E32C8FA38F681A9C4F075A7D08B /* MissionSection.Technika2+Gradient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 241BD9807E33EA3CBBF302A35813F5C2 /* MissionSection.Technika2+Gradient.swift */; }; + 5A54507509E4E4DC3181C3FCB74FBBC0 /* MissionSection.Technika3+Gradient.swift in Sources */ = {isa = PBXBuildFile; fileRef = FBF7FCA66B507564BF411BB82D824394 /* MissionSection.Technika3+Gradient.swift */; }; + 9F579ACF8BFC762F49A03A837BCCF7ED /* MissionSection.Trilogy+Gradient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6B59269E3AB75988A25F6D4EF5088A20 /* MissionSection.Trilogy+Gradient.swift */; }; + F551680129D8E83F451174BE5B4DBF5D /* MissionSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27FD193AE2FCE3A3F96143D41ADBCC7F /* MissionSection.swift */; }; + BEC7D1F3799FA6E0EEDB0980E345F689 /* MissionStageInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = D78571F88000DB2A377C1A859F5F2B0B /* MissionStageInfo.swift */; }; + D4F4FB7D6DFADE1F54AEEDDEEE9BF681 /* MissionTechnika1TableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3127AC853734E65CD8EDD6BD1D9AEB68 /* MissionTechnika1TableViewController.swift */; }; + 7C37CAC5FB61061C9FCB133E803A0423 /* MissionTechnika2TableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D21A9793161E13A8605689D97FBCC60 /* MissionTechnika2TableViewController.swift */; }; + 532E0449B68A85440B2A1E3F2BAF63B4 /* MissionTechnika3TableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7E1E98FB695B66D5FA11980E8C7618DA /* MissionTechnika3TableViewController.swift */; }; + D7D51512AABF833025D3FB78AB1C0C3F /* MissionTrilogyTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC1C93791BC6091924D5E9BEA314201C /* MissionTrilogyTableViewController.swift */; }; + ED9D59C06C9E0047119BE8AE0BBC1A97 /* MissionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6192054BD8E7E46E36A43659F1D2131A /* MissionViewController.swift */; }; + 7CAA744A443BAA4E21DFFF769BC9A3BF /* NSObject+.swift in Sources */ = {isa = PBXBuildFile; fileRef = 90B143CCDE9CB1920C76E56DFB8E619A /* NSObject+.swift */; }; + 2012B0E292AE68661A84F90C15CCB7E2 /* NetworkManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = F66F1F16E4879E82613F8C07E0062B2A /* NetworkManager.swift */; }; + 4FBF2977E66C057D1A9F1F3F19E48E8C /* NicknameResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B34AF7A247BBB042C734DD502A4021B /* NicknameResponse.swift */; }; + 1D5A93ADB7E0551D8265EC21D90E8114 /* Note.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9AF510989C994AF286BAC6EFC98F3D86 /* Note.swift */; }; + DC8239DAEF1700D671C8ADC1F04121DA /* OldRecordInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7B26CA6823B048ECBE5ED32FB0E8A9AD /* OldRecordInfo.swift */; }; + FCFE1C1D08C5F261AD3D0C70A4B69522 /* Performance.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 27A75068DE95C7555DB599931ED8AEDE /* Performance.storyboard */; }; + A355C78EC61F119CC6EBBA3E16B5AA0A /* PerformanceViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = AFC8A42FD9DBB28DB007F737E8557BB7 /* PerformanceViewController.swift */; }; + B3CE24BE8E899EE8D89D56F5921A42A9 /* Persistence.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42590FD8BDFA7FDB31E81239FE1C5C9D /* Persistence.swift */; }; + 54CB14A1152EBED5F62581A197D9DB51 /* Pods_RespectU.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 720D3E6C26142ACBA59C9F7822C204CC /* Pods_RespectU.framework */; }; + C295B902F2B60D1CF3FA2B1334479A65 /* RUButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = D9B229B6B9B7142C2A461D7DEB2A7113 /* RUButton.swift */; }; + 9F02A015FDD5629384099D02332F9AF8 /* Rank.swift in Sources */ = {isa = PBXBuildFile; fileRef = A4B1BD7EAB31E7E51B602AF90FC5C2AE /* Rank.swift */; }; + 5DD021C2FA893BE6587462DA9A2A44F0 /* Ranking.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = E12E3AA69AEC8526DA02450D9F486C31 /* Ranking.storyboard */; }; + 48175A5C8370F8ED872DDDAD970867BB /* Ranking4BTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E9EA4615ADDF5106D45E6C157F9935FE /* Ranking4BTableViewController.swift */; }; + 79D274160965FE8BA5A394E6C353BA65 /* Ranking5BTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A57D6592351D9AD16368506EE4633557 /* Ranking5BTableViewController.swift */; }; + EEA6DE9B2B98EA38E69EB963C636C520 /* Ranking6BTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA8059779D1985F721E78B753EC4D776 /* Ranking6BTableViewController.swift */; }; + 4A98A06417A0097FB957083613E33F09 /* Ranking8BTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A61C0A29FAF3BAFDEA230CF7D855312 /* Ranking8BTableViewController.swift */; }; + A315E94EE38B5C79959A6DEF81671063 /* RankingBaseTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C9306E0C24359552A85518112EFCC9D /* RankingBaseTableViewController.swift */; }; + DFA7343544B17FDE10800CFA2D95474E /* RankingCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = B6DC6B20F4435BC55F0363155B189EA9 /* RankingCell.swift */; }; + 9EEC50F04F496B836CC03F7F55E1E041 /* RankingCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1BD862D1F9C81B97810DC117707740FB /* RankingCell.xib */; }; + 3ACE06EAF10D0F00AB81B031AFFD4370 /* RankingResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0F1B980355224D49337F83B418D77DF9 /* RankingResponse.swift */; }; + 7858348DB87AE1F57E6EDE96DC86385B /* RankingViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 656538575F3D4D03C665378FB2C6E482 /* RankingViewController.swift */; }; + 409ABEBD1C0ACF153D2726D4203EB120 /* Reachability.swift in Sources */ = {isa = PBXBuildFile; fileRef = C7897FFE7C5D2CCD0252A92D83D3A242 /* Reachability.swift */; }; + B255C1B95D64372EBE20026F66E6F259 /* Realm.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ED7D4A7210DBE5C6BF5E8E60901CEC24 /* Realm.framework */; }; + 74DD787436F4A0E27647E2D3195DD901 /* RealmSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5AF72C1C7A71F43D43589C3E8792F7A9 /* RealmSwift.framework */; }; + 067CB8ADCA8BA53E3AF6B4A7C94E5AB7 /* Record.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D13809AF4354422A199374B3465D8656 /* Record.storyboard */; }; + 6AB28858EC6AF5E90E28E90FEB28EB45 /* RecordAllTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BBD21C11306FD9C54E163A20FF8FA24 /* RecordAllTableViewController.swift */; }; + 6A51A5566ED5C9A050238B3B86CDFF28 /* RecordBSTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 101CE93B365835BBA1D7A917C71B524B /* RecordBSTableViewController.swift */; }; + A7666C7BFF582CE3D2E5AEFB30A1973A /* RecordBaseTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A646CCC720C494D646FECAB5677C1E21 /* RecordBaseTableViewController.swift */; }; + 0AD398A653F247BBD797BF1C08117411 /* RecordButtonInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7D774173D345CCDC64F1E65BA46CC48A /* RecordButtonInfo.swift */; }; + B2C7292410B72D6239C9419EFD99F720 /* RecordCETableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 164C0B9C9329B63A84146A68B44211AF /* RecordCETableViewController.swift */; }; + A8F637AB2D98571955E28ED50F2EFE00 /* RecordCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2991773C4B90001F83182265FA5298FA /* RecordCell.swift */; }; + 3AF1AB6EF468C285F91398ABBA44F207 /* RecordCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = CA9B676C5D60B5CCB2663B17DFB0D19B /* RecordCell.xib */; }; + 02686C509DF00D9696587DEEA60DA1AD /* RecordDifficultyInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE923EF715087FF2BBEAA80043390A02 /* RecordDifficultyInfo.swift */; }; + C87227AE5F5C14201E4A9A2BFBA6F43C /* RecordInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = B238705DEEA8ACF0182DF0BB41B2CB0D /* RecordInfo.swift */; }; + 402BA1696265B27378F92C7D0EFE5D9A /* RecordPortable1TableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C7CF5FBE9FE442E18A869E8FFDBB6596 /* RecordPortable1TableViewController.swift */; }; + 26708994E8417D244AFABB1922A65642 /* RecordPortable2TableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5F75FFB849D9280269D8A4130772A059 /* RecordPortable2TableViewController.swift */; }; + 90435DAD8253B6ECD6DBBD877A50DF9F /* RecordRespectTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A7A724B52192252A0101E5F2B3DC658 /* RecordRespectTableViewController.swift */; }; + D60684D01227D743425A5926A21FD850 /* RecordResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8BE876B3189C89826136B421C811E381 /* RecordResponse.swift */; }; + 09E17333AB311C09221D5BDD854CAAF5 /* RecordTechnika1TableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C86C6C9262E8EB75FB7589033C1F2EC4 /* RecordTechnika1TableViewController.swift */; }; + 9B236D432A2A7BA98EDD93D1231A3AEF /* RecordTechnika2TableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4CAF7442CCE225037AD440CAED1A2F46 /* RecordTechnika2TableViewController.swift */; }; + B87568500EAB59BC53C4C46C7DBDF37C /* RecordTechnika3TableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 394457A6318FCBA35633C05384AA8D50 /* RecordTechnika3TableViewController.swift */; }; + 8FA7CCD9F150E47BC3E960749476A437 /* RecordTrilogyTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DB8FDB96924415810F26D8A3D5DCC643 /* RecordTrilogyTableViewController.swift */; }; + C8ADDE7416A86CE84CD4823CC47833DC /* RecordView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D899C6158365DC40A43EFA3FBD53860 /* RecordView.swift */; }; + 7A66BC667B82C33D8645F383FBB76040 /* RecordView.xib in Resources */ = {isa = PBXBuildFile; fileRef = A832024764FD1738185268E528614C3A /* RecordView.xib */; }; + 6390715145BD10663A5A4D6C352868DF /* RecordViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CDC8CD7AE0EAE20F102844365138098 /* RecordViewController.swift */; }; + 56B103D4D21450CC4D0BC3D98286A3AF /* SearchByLevelView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 16CA587AC64BBF7D9615B18AE922CCA5 /* SearchByLevelView.swift */; }; + FEDA948775D81128E2E2B3D648FF361D /* SearchByLevelView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 650873B493E00BDFE6552F230602E303 /* SearchByLevelView.xib */; }; + 3FC482296754D98BE86BD7B18E564694 /* SearchByNoteView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8DA77CE4436FD7F1B3A85A2993A6875 /* SearchByNoteView.swift */; }; + 5120FF3DED6B29ACE2B63AD182E35A7F /* SearchByNoteView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 65A74FCC87D5D9BBBEBAE0F47B7B68DA /* SearchByNoteView.xib */; }; + D26CDBFA3B71B4DAF56C820443B6C735 /* SearchByRatingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8205116CE68B6DBD1CE90AC4439DE832 /* SearchByRatingView.swift */; }; + 478698557F1DF8B2F9514DFC1DEBC2C4 /* SearchByRatingView.xib in Resources */ = {isa = PBXBuildFile; fileRef = B6DD826AB9C764BFEA1BFE277466B01C /* SearchByRatingView.xib */; }; + EA3A243DC605E1721F5A5FECA01218B2 /* SearchRecordDetail.swift in Sources */ = {isa = PBXBuildFile; fileRef = CA2ABF5BEC5BFF80DD120FEE7AC45F14 /* SearchRecordDetail.swift */; }; + E909A0D435DE1970F26D9E69E991ED41 /* SearchRecordDetailCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C7E6B6B900C98599DF992D190397ED8 /* SearchRecordDetailCell.swift */; }; + 3B4823649EB3A4B226BB8675B0D96D34 /* SearchRecordDetailCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = E6C14F35B2B1A8D25A221C146D1C063B /* SearchRecordDetailCell.xib */; }; + EB500C397294D1867BE4A5323F2B399E /* SearchRecordDetailViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B54A2548B3BB3E75F221CEAFB441651 /* SearchRecordDetailViewController.swift */; }; + 15D85A72D8E253A709907E22B1B919BA /* SearchRecordViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C194554A77881C517795E91A8F23124E /* SearchRecordViewController.swift */; }; + 16217B19735F571D4F00B4E714D445A1 /* Series+UI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9A9970140918A7A61332718A9C9D8322 /* Series+UI.swift */; }; + 2440D6183CA2FD2B1771BD07553F0EA3 /* Series.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9ADF8D0329CDE33DD67FC75E36D63E92 /* Series.swift */; }; + CF652EC9A502638F95140E9BBD58327D /* SignIn.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = A085D0FCAAED86B5EF798D2FF4C4EE5E /* SignIn.storyboard */; }; + 832BAB1A651DC131F7DD567512C8F754 /* SignInTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = C48AF305EFDF8EDEE8CE8D136BC9FEEB /* SignInTextField.swift */; }; + EE71722AABACD4B3CA0F4730F95231FF /* SignInViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 423FC743627303AF97314223CD2F8B7B /* SignInViewController.swift */; }; + 40A958056F42EC3D295722454F5129D2 /* SignUpViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D774FFC53CC59564C3B6E8255A6FDE76 /* SignUpViewController.swift */; }; + E63A464BD8F09B2C3DC2B77F582DCF15 /* SkillLevel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3FAFF4A05D2722646FFDB1A59C751CA5 /* SkillLevel.swift */; }; + 93A2A616DC091EC01FE19DF5A8228554 /* SkillLevelCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2AC69B55FC64D7C31A86A33852EAB0AC /* SkillLevelCell.swift */; }; + 2B4E785D2FF0512CDC3572A616A09DEA /* SkillLevelCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 0A0189022C6BE4C949EA9505B6B3CA1C /* SkillLevelCell.xib */; }; + 14A9C0F1784C4EFB020D45285772036C /* SkillLevelDetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F0CC6B551EBD0EC656F35FD74247ED8D /* SkillLevelDetailView.swift */; }; + 84547A3E02B63C2D70B34C9F6602FF6D /* SkillLevelDetailView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 62A4B18F7F37F18F820CB7408C91507F /* SkillLevelDetailView.xib */; }; + CD286290C91049CAB1AC71B914F91DE7 /* SkillLevelDetailViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 494ED1030BF0FF71A1E556B9468CD078 /* SkillLevelDetailViewController.swift */; }; + 1E64D8217B3A29B37418024823592E66 /* SkillPoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E664D69C5666D40413DD76EC3EEB905 /* SkillPoint.swift */; }; + 9E93FD8E5248FEAC12520317AE75E78F /* Song.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 9F70C67599FC388CA2F8CD0D50622CAF /* Song.storyboard */; }; + FA4BEBF3791C502B996D02DE973581D8 /* SongAllTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = EBDBA54D2C97FB9571C3176FE9BFB0F4 /* SongAllTableViewController.swift */; }; + 626DCED8FA52B65C0C03F7D940B556C5 /* SongBSTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A2D27FEA1E4484DB3A555B53E4AE9B1D /* SongBSTableViewController.swift */; }; + 799B139F9BBB3D3D23BDA509C60C29A8 /* SongBaseTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F23F5730F0C449DE84E323068105AB47 /* SongBaseTableViewController.swift */; }; + C67050AEEA3E9FEFEEF6609848CABF49 /* SongButtonInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDD93D99DBE3AD0EB3D9A0617867ED07 /* SongButtonInfo.swift */; }; + B8D616ADF20DEC51276762711CE93CFC /* SongCETableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9C089EAB1BA22820E5EE21E20936E08 /* SongCETableViewController.swift */; }; + 7F550ED856FEE434A4289AC243725DA2 /* SongCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59AC73FB70CC51A8AFAC0050C039CF14 /* SongCell.swift */; }; + 6C452B565623C505DA42D49FFBFA7FB0 /* SongCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = CDE48D134E382F52D49F7020BDAE3546 /* SongCell.xib */; }; + E49C4A33514DB94D1E07267D61B4AF25 /* SongInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 296CBA384CF912A9F2429A941DFB482D /* SongInfo.swift */; }; + 4153853DD9B533CEB5CB57E06BE93625 /* SongPortable1TableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 06634141A9D0AD50CB5CF1C56489B8AB /* SongPortable1TableViewController.swift */; }; + 792780314E46E5949E03C0F5CF357DCD /* SongPortable2TableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CFE0B54506B42D2B43A668825784A336 /* SongPortable2TableViewController.swift */; }; + 30370928E902A0A1ADEBB413AFFD9019 /* SongRespectTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D72A74447C5271E64A723356FA2C76C8 /* SongRespectTableViewController.swift */; }; + 8E2577604E640D270C80FBB4295515A7 /* SongResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7267843D0764A20BFC44647A8069076 /* SongResponse.swift */; }; + 05BF8B1DD9D1CFFE3909352A0062808D /* SongTechnika1TableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8ABC647AFC387EECD6791F100EBED31D /* SongTechnika1TableViewController.swift */; }; + A4341B45A52DE69D373AA8689A6598A8 /* SongTechnika2TableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = EED82018840FD1A5C9368EF3CB51DB1E /* SongTechnika2TableViewController.swift */; }; + E0837D50A45691DAD8C70F03A3CC15CE /* SongTechnika3TableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 59AA6BC0369E1C3C4B40AB8BE89DBF5A /* SongTechnika3TableViewController.swift */; }; + 95234C099163DBDCE9889D08D17289F5 /* SongTrilogyTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = ABF4E0839B1BC3BA0A3E14EA1484CB79 /* SongTrilogyTableViewController.swift */; }; + 4F6670BDD18418EB0BACC4C92FE1EA57 /* SongViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B7FF17875A680B2300216805CB27FC73 /* SongViewController.swift */; }; + 4DB514B43FA2A583C16006541624AD81 /* Storyboard.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A21F405F43A9AF49F10051F778F3FA4 /* Storyboard.swift */; }; + E2D8AEB2117CBC267BE26D6F4BFA9CB7 /* String+.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08640281899B112DEB6A0A0A56A169B7 /* String+.swift */; }; + 59A0935E9841AE2C2D2936507EBD985B /* Strings.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0B7E2EA07502142424EC51FE1C1D182 /* Strings.swift */; }; + 6882E18AB7ED3B44099C1EB2DF316B2C /* SummaryCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8D3AEF54E1F8CB4F0C230AE0F4A274D /* SummaryCell.swift */; }; + 469E026861D632B5A1E4788F3168F2EE /* SummaryCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = EDC63C6945BBA9A7159F95B906AC4F52 /* SummaryCell.xib */; }; + 36D90F14658E9A2386E71925147AD3B7 /* SummaryCollectionCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7141F43FD5DD9A34D35E2692CB721D4A /* SummaryCollectionCell.swift */; }; + A9B9CE0F13F59292327D3DDD96BB4C27 /* SummaryCollectionCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = DBBD5EC70A4CB6A25BE54391F562C59F /* SummaryCollectionCell.xib */; }; + FBA69F596B504E30711FBB8CA0653F81 /* SummaryDetailViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D5A1695D071CC7554C3FA877BC12B245 /* SummaryDetailViewController.swift */; }; + FA269EB89C42EEF82524955630812EA2 /* Tip.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 7E1371C9E28AB4CD6449FA7FD0074E25 /* Tip.storyboard */; }; + C2B828CD011EB99FA479BF670FEE7A4C /* TipInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = E5B397154AED8CE46A5D63ACC715A8F1 /* TipInfo.swift */; }; + FE16B2705772147DFC33EFE0129FDD53 /* TipResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 753FD1B3D1EB8456BE034D69FBCBB329 /* TipResponse.swift */; }; + 7DB048302AB433149E6A95BA48133447 /* TipViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91CCF1B33BD4D77BF5650BED697154D2 /* TipViewController.swift */; }; + F2510C6CE3EB733695848E79C13CA0ED /* Top50.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 721D3123DF4906650661109B36D4EFC2 /* Top50.storyboard */; }; + 0CEF469A149FF36E867CC3A161165AF9 /* Top504BTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB34EF52E48B6B9E32AE64FEDD76C088 /* Top504BTableViewController.swift */; }; + 6CC9FF520053253ACB3082AABE34CF0A /* Top505BTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1F70C1B0BF44B8904203164AE9B8E1B /* Top505BTableViewController.swift */; }; + 6C3977B8B2C1C1172FDBDE5D7054F4DA /* Top506BTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D6C6A7F46818C574348C01D5E9938C60 /* Top506BTableViewController.swift */; }; + E89955CBE8C1B9AD6AF1994793683092 /* Top508BTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 70FCD8F7C26C5E1F0B0EBF746748BBBF /* Top508BTableViewController.swift */; }; + C3551CA001C950C2BABA8E95D6EFAAD6 /* Top50BaseTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFF5B6DC44A390FCF7DBF622AADB5833 /* Top50BaseTableViewController.swift */; }; + 5F74C0FF12D461826448C86A14E4919D /* Top50Cell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4A4C312CB6DC58847B1ACBECB8F95A8F /* Top50Cell.swift */; }; + F1041F8EA1D2FF11AEB9C969E7201130 /* Top50Cell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 1907607DB6FA22EE22397D314C25E2C6 /* Top50Cell.xib */; }; + 3B7DE92472A1872F8D09E85383AE7E95 /* Top50ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 365A3C9BFD2062AA5D08B56E995F9474 /* Top50ViewController.swift */; }; + 956AB4AC68AAE08C8B1027E71234A7D6 /* Trophy.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 4D08ADAD88BBB07FBB95CF8CD62CB6ED /* Trophy.storyboard */; }; + 1C4D888E2BECAA7E7447EC6E493D700E /* TrophyBSTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0C2415AABC509E942301DF3589F55F8 /* TrophyBSTableViewController.swift */; }; + 554C372C44FEB3224C5EAE6E722D3D2B /* TrophyBaseTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C865E14A01D3C67FEEE5EAF375899C7D /* TrophyBaseTableViewController.swift */; }; + BAF7C4779D1D74F482A5C62832C9AF0C /* TrophyCETableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 67B09CACDD60C508B1CEBEF21A39E14C /* TrophyCETableViewController.swift */; }; + 456CFC7E84339AD858F72E14C0200EAD /* TrophyCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C8E87A2B03543FCDFA459E10DCEBCDF /* TrophyCell.swift */; }; + 63AA7EFC9C52C567308AC665EB07E0E4 /* TrophyCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = F3C75B35A37617F2B6A9DD8208FE2AD9 /* TrophyCell.xib */; }; + 3B5CCA1F7AE3B3E186DCDC5466618711 /* TrophyGrade.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4298E98CCC40A6C7EFDE5510CEDED521 /* TrophyGrade.swift */; }; + 986310414206F5E413A447766B2A36D0 /* TrophyInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9703F75E9D1960A0BAA7CFC8240AE541 /* TrophyInfo.swift */; }; + D235F2870A0811AB0EE18B92C23A5E8F /* TrophyLinkDiskTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA2852A77D854438A0267E99C8067691 /* TrophyLinkDiskTableViewController.swift */; }; + C7C80996F1B61B44536F73D8F5ECCD34 /* TrophyRespectTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF98B5B953A51AE19F56E640C40E2687 /* TrophyRespectTableViewController.swift */; }; + 9DB272CDB091ACF835E7C0D863D117F8 /* TrophyResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26A426486B63E886A1D72A62EC230A4D /* TrophyResponse.swift */; }; + B7B47C90D8A004232DF088D28B0EA53D /* TrophyTechnika1TableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C2B8192D8437447475180972270F1A2 /* TrophyTechnika1TableViewController.swift */; }; + 4AE97EBF1348A5516BE27E7EB403CE28 /* TrophyTechnika2TableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9DDBE69BDF91490724A4508E8150A75F /* TrophyTechnika2TableViewController.swift */; }; + 1722D64EEA474AA4DB6530A17DA20635 /* TrophyTechnika3TableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A875376A5EBE583D9D47E2CCA367EB4F /* TrophyTechnika3TableViewController.swift */; }; + C6A47F0F5710AAFCEACC3B7D1A30A484 /* TrophyTrilogyTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 40F9848262F8DA6D81D931CC8DE5FA0A /* TrophyTrilogyTableViewController.swift */; }; + 57A9D23286BDA314BEC501224189EFE7 /* TrophyViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54A0585B9094D54EA2EE91A30C6265FA /* TrophyViewController.swift */; }; + 8D428E252225AAE930BF8D945401F018 /* UIAlertController+.swift in Sources */ = {isa = PBXBuildFile; fileRef = 42BE04F264C300B56C92EE575A854683 /* UIAlertController+.swift */; }; + 86DEAB8A62F44038DA244F4B864FE1FF /* UIColor+.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2FC485CCFD9749EE1E561DFAE98EA11C /* UIColor+.swift */; }; + 5A7233F8CD55096485F6137E6278A377 /* UIView+.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4DB6EB0A090B3EC667134B3DD24AA2A8 /* UIView+.swift */; }; + 4CB993740AF398D71E90C9EC481F995D /* UIViewController+.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0933C1D68D4630ABCB0E824F3B06E6FA /* UIViewController+.swift */; }; + C86374E3E25A9D8B40E03568CB353DCE /* Upload.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 808F49E6EA3E0B9F118A59BCD1C399A9 /* Upload.storyboard */; }; + 3C2E4343DB314444E72BCA528356A02B /* UploadViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = D04A91E1391EB1A2505BB6E30EB1AD65 /* UploadViewController.swift */; }; + DF0ADF3EC056D01E0F7C2285EE9C8587 /* UserResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45291D32AD99A8C491E4A69A15AB4D44 /* UserResponse.swift */; }; + 7FADC0241104D5EF1D511F7CB55F58E5 /* Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBC86C6F0F8F435FA71C29C5A32617CF /* Utils.swift */; }; + DA56608DD5FB0DE29D1BF82728E52081 /* VersionInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = A49DC68ED49BE1C95E3D0C553CB3C0D0 /* VersionInfo.swift */; }; + 65B837BD248EF75153ED13562E7F5F5F /* VersionResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = F2731BD8B5A3E3953125EBC4F1ACA6B7 /* VersionResponse.swift */; }; + E8AC5E159FA0754BC70508BDEDA438B2 /* swiftgen.yml in Resources */ = {isa = PBXBuildFile; fileRef = D8DDC6393F8E75DB389B0B80A6930D30 /* swiftgen.yml */; }; /* End PBXBuildFile section */ -/* Begin PBXContainerItemProxy section */ - 1984269A21B7EA0A001F491C /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 19B6CFE01F7953640097B86B /* Project object */; - proxyType = 1; - remoteGlobalIDString = 19B6CFE71F7953640097B86B; - remoteInfo = RespectU; - }; -/* End PBXContainerItemProxy section */ - /* Begin PBXCopyFilesBuildPhase section */ - 19AC39071F7C806400F170E3 /* Embed Frameworks */ = { + 986F5D33F92011D3107756C335FC6CA9 /* Embed Frameworks */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = ""; @@ -224,897 +235,692 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 19012FB52048344F0061EF21 /* Performance.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = Performance.storyboard; sourceTree = ""; }; - 19012FB72048345B0061EF21 /* Guide.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = Guide.storyboard; sourceTree = ""; }; - 19012FBB204837040061EF21 /* PerformanceViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PerformanceViewController.swift; sourceTree = ""; }; - 19012FBD2048370C0061EF21 /* GuideViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GuideViewController.swift; sourceTree = ""; }; - 191275EA211206790046AA3E /* NSObject+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSObject+.swift"; sourceTree = ""; }; - 191275EC21120B080046AA3E /* BaseViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseViewController.swift; sourceTree = ""; }; - 191275F1211210610046AA3E /* SongBaseTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SongBaseTableViewController.swift; sourceTree = ""; }; - 191275F321121B9D0046AA3E /* UIViewController+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIViewController+.swift"; sourceTree = ""; }; - 191275F52112225E0046AA3E /* MissionBaseTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MissionBaseTableViewController.swift; sourceTree = ""; }; - 191275F7211232180046AA3E /* TrophyBaseTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TrophyBaseTableViewController.swift; sourceTree = ""; }; - 1913B40D2175C08700D6C93F /* HistoryCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HistoryCell.swift; sourceTree = ""; }; - 1913B40E2175C08700D6C93F /* HistoryCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = HistoryCell.xib; sourceTree = ""; }; - 1913B4112175C15900D6C93F /* HistoryInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HistoryInfo.swift; sourceTree = ""; }; - 191A8B7B20E4FAAC0064F93E /* RecordBSTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordBSTableViewController.swift; sourceTree = ""; }; - 191A8B7D20E4FC930064F93E /* UIAlertController+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIAlertController+.swift"; sourceTree = ""; }; - 191A8B7F20E51ACF0064F93E /* MissionLinkDiskTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MissionLinkDiskTableViewController.swift; sourceTree = ""; }; - 191C36662170F9B100B2594B /* CAGradientLayer+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CAGradientLayer+.swift"; sourceTree = ""; }; - 1928D5FC211824DF00F7901F /* UITableViewCell+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UITableViewCell+.swift"; sourceTree = ""; }; - 192AFE2220E48ACA0006397F /* SongBSTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SongBSTableViewController.swift; sourceTree = ""; }; - 192AFE2420E48AD50006397F /* MissionBSTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MissionBSTableViewController.swift; sourceTree = ""; }; - 192AFE2620E48ADF0006397F /* TrophyBSTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TrophyBSTableViewController.swift; sourceTree = ""; }; - 192AFE2820E48AE70006397F /* TrophyLinkDiskTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TrophyLinkDiskTableViewController.swift; sourceTree = ""; }; - 192CA336216F279600F37675 /* SongTechnika2TableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SongTechnika2TableViewController.swift; sourceTree = ""; }; - 192CA338216F27A200F37675 /* MissionTechnika2TableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MissionTechnika2TableViewController.swift; sourceTree = ""; }; - 192CA33A216F27B000F37675 /* TrophyTechnika2TableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TrophyTechnika2TableViewController.swift; sourceTree = ""; }; - 192DF89A2111D92B0016F386 /* Series.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Series.swift; sourceTree = ""; }; - 192DF89C2111DA640016F386 /* Buttons.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Buttons.swift; sourceTree = ""; }; - 192DF89E2111DAC80016F386 /* TrophyGrade.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TrophyGrade.swift; sourceTree = ""; }; - 192DF8A02111DAED0016F386 /* MissionSection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MissionSection.swift; sourceTree = ""; }; - 19320FBB204942390075BD86 /* AchievementMusicTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AchievementMusicTableViewController.swift; sourceTree = ""; }; - 19320FBD204942440075BD86 /* AchievementGearTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AchievementGearTableViewController.swift; sourceTree = ""; }; - 19320FBF2049424D0075BD86 /* AchievementNoteTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AchievementNoteTableViewController.swift; sourceTree = ""; }; - 19320FC1204942590075BD86 /* AchievementGalleryTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AchievementGalleryTableViewController.swift; sourceTree = ""; }; - 19320FC3204942640075BD86 /* AchievementCommentTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AchievementCommentTableViewController.swift; sourceTree = ""; }; - 19320FC5204955CC0075BD86 /* Trophy.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = Trophy.storyboard; sourceTree = ""; }; - 19320FC7204955D50075BD86 /* Mission.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = Mission.storyboard; sourceTree = ""; }; - 19320FC9204955DC0075BD86 /* Song.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = Song.storyboard; sourceTree = ""; }; - 19320FCB2049566A0075BD86 /* TrophyViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TrophyViewController.swift; sourceTree = ""; }; - 19320FCD2049568B0075BD86 /* TrophyRespectTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TrophyRespectTableViewController.swift; sourceTree = ""; }; - 19320FCF204956940075BD86 /* TrophyTrilogyTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TrophyTrilogyTableViewController.swift; sourceTree = ""; }; - 19320FD12049569D0075BD86 /* TrophyCETableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TrophyCETableViewController.swift; sourceTree = ""; }; - 19320FD3204959BE0075BD86 /* TrophyCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TrophyCell.swift; sourceTree = ""; }; - 19320FD4204959BE0075BD86 /* TrophyCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = TrophyCell.xib; sourceTree = ""; }; - 1939C96D212BFD8500A6F8E3 /* RankingResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RankingResponse.swift; sourceTree = ""; }; - 1939C96F212BFD9200A6F8E3 /* UserResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserResponse.swift; sourceTree = ""; }; - 1939C972212BFF1900A6F8E3 /* Network.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Network.swift; sourceTree = ""; }; - 1939C974212C004D00A6F8E3 /* API.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = API.swift; sourceTree = ""; }; - 193C285321366C1B001EB7F3 /* SignIn.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = SignIn.storyboard; sourceTree = ""; }; - 193C285521366C28001EB7F3 /* SignInViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignInViewController.swift; sourceTree = ""; }; - 193C2857213671D4001EB7F3 /* SignInTextField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignInTextField.swift; sourceTree = ""; }; - 193C285B213674B1001EB7F3 /* SignUpViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignUpViewController.swift; sourceTree = ""; }; - 193C285F2136C8E7001EB7F3 /* Upload.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = Upload.storyboard; sourceTree = ""; }; - 193C28612136C8F0001EB7F3 /* UploadViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UploadViewController.swift; sourceTree = ""; }; - 193C28662136E522001EB7F3 /* Download.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = Download.storyboard; sourceTree = ""; }; - 193C28682136E52A001EB7F3 /* DownloadViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DownloadViewController.swift; sourceTree = ""; }; - 193DE8D7204920EF00A829BB /* AchievementAllTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AchievementAllTableViewController.swift; sourceTree = ""; }; - 193DE8D9204922B400A829BB /* AchievementCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AchievementCell.swift; sourceTree = ""; }; - 193DE8DA204922B400A829BB /* AchievementCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = AchievementCell.xib; sourceTree = ""; }; - 193E3FF0204B9C240063A440 /* Record.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = Record.storyboard; sourceTree = ""; }; - 193E3FF2204B9EB80063A440 /* RecordViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordViewController.swift; sourceTree = ""; }; - 193E3FF4204BB0D80063A440 /* RecordView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = RecordView.xib; sourceTree = ""; }; - 193E3FF6204BB1060063A440 /* RecordView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordView.swift; sourceTree = ""; }; - 193E3FF8204BCFB20063A440 /* Difficulty.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Difficulty.swift; sourceTree = ""; }; - 193E4006204BF37E0063A440 /* SummaryCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SummaryCell.swift; sourceTree = ""; }; - 193E4007204BF37E0063A440 /* SummaryCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = SummaryCell.xib; sourceTree = ""; }; - 193E400A204BF5D60063A440 /* SkillLevelCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SkillLevelCell.swift; sourceTree = ""; }; - 193E400B204BF5D60063A440 /* SkillLevelCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = SkillLevelCell.xib; sourceTree = ""; }; - 193E4012204C02A30063A440 /* Top50ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Top50ViewController.swift; sourceTree = ""; }; - 193E4016204C03C50063A440 /* UIView+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIView+.swift"; sourceTree = ""; }; - 193E4018204C05A00063A440 /* Top50Cell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Top50Cell.swift; sourceTree = ""; }; - 193E4019204C05A00063A440 /* Top50Cell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = Top50Cell.xib; sourceTree = ""; }; - 193E401E204C07F40063A440 /* Top50.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = Top50.storyboard; sourceTree = ""; }; - 193E4020204C09DB0063A440 /* Top504BTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Top504BTableViewController.swift; sourceTree = ""; }; - 193E4022204C09E70063A440 /* Top505BTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Top505BTableViewController.swift; sourceTree = ""; }; - 193E4024204C09F20063A440 /* Top506BTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Top506BTableViewController.swift; sourceTree = ""; }; - 193E4026204C09FA0063A440 /* Top508BTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Top508BTableViewController.swift; sourceTree = ""; }; - 193E4028204C237A0063A440 /* RankingViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RankingViewController.swift; sourceTree = ""; }; - 193E402A204C23E90063A440 /* Ranking4BTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Ranking4BTableViewController.swift; sourceTree = ""; }; - 193E402C204C23F40063A440 /* Ranking5BTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Ranking5BTableViewController.swift; sourceTree = ""; }; - 193E402E204C23FD0063A440 /* Ranking6BTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Ranking6BTableViewController.swift; sourceTree = ""; }; - 193E4030204C24060063A440 /* Ranking8BTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Ranking8BTableViewController.swift; sourceTree = ""; }; - 193E4034204C24180063A440 /* Ranking.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = Ranking.storyboard; sourceTree = ""; }; - 193E4036204C27220063A440 /* RankingCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RankingCell.swift; sourceTree = ""; }; - 193E403A204C2EB60063A440 /* RankingCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = RankingCell.xib; sourceTree = ""; }; - 194E52A5204A8F7B00B84AFA /* SongAllTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SongAllTableViewController.swift; sourceTree = ""; }; - 194E52A7204A8F9900B84AFA /* SongPortable1TableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SongPortable1TableViewController.swift; sourceTree = ""; }; - 194E52A9204A900D00B84AFA /* SongPortable2TableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SongPortable2TableViewController.swift; sourceTree = ""; }; - 194E52AB204A901A00B84AFA /* SongRespectTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SongRespectTableViewController.swift; sourceTree = ""; }; - 194E52AD204A941E00B84AFA /* SongTrilogyTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SongTrilogyTableViewController.swift; sourceTree = ""; }; - 194E52AF204A948300B84AFA /* SongCETableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SongCETableViewController.swift; sourceTree = ""; }; - 194E52B5204AC55900B84AFA /* SongCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SongCell.swift; sourceTree = ""; }; - 194E52B6204AC55900B84AFA /* SongCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = SongCell.xib; sourceTree = ""; }; - 1950D884212D6F92004ED086 /* LanguageResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LanguageResponse.swift; sourceTree = ""; }; - 19535F09204A8E74008C9A45 /* SongViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SongViewController.swift; sourceTree = ""; }; - 19585867213B0E76000C78C4 /* Init.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = Init.storyboard; sourceTree = ""; }; - 19585869213B0E81000C78C4 /* InitViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InitViewController.swift; sourceTree = ""; }; - 1958DAB52151312700D8AE41 /* .swiftlint.yml */ = {isa = PBXFileReference; lastKnownFileType = text; path = .swiftlint.yml; sourceTree = ""; }; - 195A6A23216F17F90072D03A /* IndicatorView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = IndicatorView.swift; sourceTree = ""; }; - 195A6A24216F17F90072D03A /* IndicatorView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = IndicatorView.xib; sourceTree = ""; }; - 1963FF03217C664900FF6FE1 /* Date+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Date+.swift"; sourceTree = ""; }; - 1968184E20490ADA0007F4D7 /* Tip.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = Tip.storyboard; sourceTree = ""; }; - 1968185020490C730007F4D7 /* TipViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TipViewController.swift; sourceTree = ""; }; - 1968185220490D300007F4D7 /* UIColor+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIColor+.swift"; sourceTree = ""; }; - 1968F784213E7295003C026B /* NicknameResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NicknameResponse.swift; sourceTree = ""; }; - 196F82482074A787000DF337 /* RecordPortable1TableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RecordPortable1TableViewController.swift; sourceTree = ""; }; - 196F824B2074A91B000DF337 /* RecordCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = RecordCell.xib; sourceTree = ""; }; - 196F824E2074AD49000DF337 /* RecordCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordCell.swift; sourceTree = ""; }; - 197414C52062A77A00D72626 /* SongTechnika1TableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SongTechnika1TableViewController.swift; sourceTree = ""; }; - 197414C72062A94A00D72626 /* TrophyTechnika1TableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TrophyTechnika1TableViewController.swift; sourceTree = ""; }; - 197414C92062A95400D72626 /* MissionTechnika1TableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MissionTechnika1TableViewController.swift; sourceTree = ""; }; - 1976FD04211239E600B80C4C /* AchievementBaseTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AchievementBaseTableViewController.swift; sourceTree = ""; }; - 198391F11F7CE21F009C7B5D /* RealmSwift.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = RealmSwift.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 198391F51F7CE227009C7B5D /* Realm.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Realm.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 1984269521B7EA0A001F491C /* RespectUUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RespectUUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 1984269721B7EA0A001F491C /* RespectUUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RespectUUITests.swift; sourceTree = ""; }; - 1984269921B7EA0A001F491C /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 1984269F21B7EA3B001F491C /* SnapshotHelper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SnapshotHelper.swift; path = fastlane/SnapshotHelper.swift; sourceTree = SOURCE_ROOT; }; - 1986CA2C205F542100CA43EA /* SearchByRateView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = SearchByRateView.xib; sourceTree = ""; }; - 1986CA30205F543F00CA43EA /* SearchByNoteView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = SearchByNoteView.xib; sourceTree = ""; }; - 1986CA32205F544900CA43EA /* SearchByNoteView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchByNoteView.swift; sourceTree = ""; }; - 1986CA36205FC26600CA43EA /* SearchRecordDetailViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchRecordDetailViewController.swift; sourceTree = ""; }; - 1986CA38205FC85A00CA43EA /* SearchRecordDetailCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchRecordDetailCell.swift; sourceTree = ""; }; - 1986CA39205FC85A00CA43EA /* SearchRecordDetailCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = SearchRecordDetailCell.xib; sourceTree = ""; }; - 19892A8520662D0A009D01F8 /* SearchByLevelView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = SearchByLevelView.xib; sourceTree = ""; }; - 19892A8720662F83009D01F8 /* SearchByLevelView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchByLevelView.swift; sourceTree = ""; }; - 198B6C4B211382BC0058DE49 /* Top50BaseTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Top50BaseTableViewController.swift; sourceTree = ""; }; - 198B6C4D211382C70058DE49 /* RankingBaseTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RankingBaseTableViewController.swift; sourceTree = ""; }; - 198B6C4F2113913C0058DE49 /* Skill.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Skill.swift; sourceTree = ""; }; - 198B6C51211392CA0058DE49 /* Note.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Note.swift; sourceTree = ""; }; - 198B6C552113E5A60058DE49 /* SkillLevel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SkillLevel.swift; sourceTree = ""; }; - 198B6C5B211443C70058DE49 /* Rank.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Rank.swift; sourceTree = ""; }; - 198FC95F204D24BD0026BA1D /* SummaryCollectionCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SummaryCollectionCell.swift; sourceTree = ""; }; - 198FC960204D24BD0026BA1D /* SummaryCollectionCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = SummaryCollectionCell.xib; sourceTree = ""; }; - 198FC963204D2E9F0026BA1D /* SummaryDetailViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SummaryDetailViewController.swift; sourceTree = ""; }; - 199233CF216F743600E040D7 /* RecordTechnika2TableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordTechnika2TableViewController.swift; sourceTree = ""; }; - 199233D1216F85CF00E040D7 /* CommonButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CommonButton.swift; sourceTree = ""; }; - 199233D7216F938D00E040D7 /* GuideFirstCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GuideFirstCell.swift; sourceTree = ""; }; - 199233D8216F938D00E040D7 /* GuideFirstCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = GuideFirstCell.xib; sourceTree = ""; }; - 199233DB216F939A00E040D7 /* GuideSecondCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GuideSecondCell.swift; sourceTree = ""; }; - 199233DC216F939A00E040D7 /* GuideSecondCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = GuideSecondCell.xib; sourceTree = ""; }; - 199233DF216F93A700E040D7 /* GuideThirdCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GuideThirdCell.swift; sourceTree = ""; }; - 199233E0216F93A700E040D7 /* GuideThirdCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = GuideThirdCell.xib; sourceTree = ""; }; - 1999920C2049641A00C74697 /* MissionCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MissionCell.swift; sourceTree = ""; }; - 1999920D2049641A00C74697 /* MissionCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MissionCell.xib; sourceTree = ""; }; - 199992102049652700C74697 /* MissionViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MissionViewController.swift; sourceTree = ""; }; - 199992122049653900C74697 /* MissionRespectTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MissionRespectTableViewController.swift; sourceTree = ""; }; - 199992142049654500C74697 /* MissionTrilogyTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MissionTrilogyTableViewController.swift; sourceTree = ""; }; - 199992162049654E00C74697 /* MissionCETableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MissionCETableViewController.swift; sourceTree = ""; }; - 199EFFE52067D51B00A6068F /* SearchByRateView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SearchByRateView.swift; sourceTree = ""; }; - 19A4FAD11FDE7749003FFFE6 /* RespectU-Bridging-Header.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "RespectU-Bridging-Header.h"; sourceTree = ""; }; - 19B09E2C212C555A005EE66D /* SongResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SongResponse.swift; sourceTree = ""; }; - 19B09E2E212C555F005EE66D /* MissionResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MissionResponse.swift; sourceTree = ""; }; - 19B09E30212C5565005EE66D /* TrophyResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TrophyResponse.swift; sourceTree = ""; }; - 19B09E32212C556F005EE66D /* AchievementResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AchievementResponse.swift; sourceTree = ""; }; - 19B09E34212C5576005EE66D /* TipResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TipResponse.swift; sourceTree = ""; }; - 19B660111F96040A00CCEFB5 /* ko */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ko; path = ko.lproj/LaunchScreen.strings; sourceTree = ""; }; - 19B660251F960E5800CCEFB5 /* String+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+.swift"; sourceTree = ""; }; - 19B6602A1F960FA800CCEFB5 /* ko */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ko; path = ko.lproj/Localizable.strings; sourceTree = ""; }; - 19B6CFE81F7953640097B86B /* RespectU.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = RespectU.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 19B6CFEB1F7953640097B86B /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 19B6CFF51F7953640097B86B /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - 19B6CFF81F7953640097B86B /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; - 19B6CFFA1F7953640097B86B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 19C9216A1F810DE600774E3E /* MessageUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MessageUI.framework; path = System/Library/Frameworks/MessageUI.framework; sourceTree = SDKROOT; }; - 19CA98E0213D416D003371DB /* VersionResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VersionResponse.swift; sourceTree = ""; }; - 19D1EF412069E9D600F2BFD5 /* AchievementPlateTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AchievementPlateTableViewController.swift; sourceTree = ""; }; - 19D67EC520744EEB00FD9EC7 /* RecordAllTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordAllTableViewController.swift; sourceTree = ""; }; - 19D67EC720744F0700FD9EC7 /* RecordPortable2TableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordPortable2TableViewController.swift; sourceTree = ""; }; - 19D67ECB20744F1700FD9EC7 /* RecordRespectTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordRespectTableViewController.swift; sourceTree = ""; }; - 19D67ECD20744F2000FD9EC7 /* RecordTrilogyTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordTrilogyTableViewController.swift; sourceTree = ""; }; - 19D67ECF20744F3300FD9EC7 /* RecordCETableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordCETableViewController.swift; sourceTree = ""; }; - 19D67ED120744F3D00FD9EC7 /* RecordTechnika1TableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordTechnika1TableViewController.swift; sourceTree = ""; }; - 19E02AC9204919830070D72B /* Achievement.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = Achievement.storyboard; sourceTree = ""; }; - 19E02ACB2049199C0070D72B /* AchievementViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AchievementViewController.swift; sourceTree = ""; }; - 19E4DAE6213D896100837A95 /* SongButtonInfo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SongButtonInfo.swift; sourceTree = ""; }; - 19E4DAE7213D896100837A95 /* MissionStageInfo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MissionStageInfo.swift; sourceTree = ""; }; - 19E4DAE8213D896100837A95 /* NewRecordButtonInfo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NewRecordButtonInfo.swift; sourceTree = ""; }; - 19E4DAE9213D896100837A95 /* MissionInfo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MissionInfo.swift; sourceTree = ""; }; - 19E4DAEA213D896100837A95 /* RecordInfo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RecordInfo.swift; sourceTree = ""; }; - 19E4DAEB213D896100837A95 /* TipInfo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TipInfo.swift; sourceTree = ""; }; - 19E4DAEC213D896100837A95 /* LanguageInfo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LanguageInfo.swift; sourceTree = ""; }; - 19E4DAED213D896100837A95 /* VersionInfo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VersionInfo.swift; sourceTree = ""; }; - 19E4DAEE213D896100837A95 /* SongInfo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SongInfo.swift; sourceTree = ""; }; - 19E4DAEF213D896100837A95 /* TrophyInfo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TrophyInfo.swift; sourceTree = ""; }; - 19E4DAF0213D896100837A95 /* NewRecordInfo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NewRecordInfo.swift; sourceTree = ""; }; - 19E4DAF2213D896100837A95 /* NewRecordDifficultyInfo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NewRecordDifficultyInfo.swift; sourceTree = ""; }; - 19E4DAF3213D896100837A95 /* AchievementInfo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AchievementInfo.swift; sourceTree = ""; }; - 19ECEE67205EBBA3000D742E /* SearchRecordViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchRecordViewController.swift; sourceTree = ""; }; - 19F13FB92112ED87003E622E /* Results+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Results+.swift"; sourceTree = ""; }; - 19F13FBB2112F161003E622E /* RecordBaseTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordBaseTableViewController.swift; sourceTree = ""; }; - 19F2312E20156BBC00ADF825 /* Reachability.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Reachability.swift; sourceTree = ""; }; - 19F24BB32049A62D0034D624 /* MissionDetailViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MissionDetailViewController.swift; sourceTree = ""; }; - 19F38C92204CC69A006BB72B /* SkillLevelDetailViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SkillLevelDetailViewController.swift; sourceTree = ""; }; - 19F38C94204CC957006BB72B /* SkillLevelDetailView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = SkillLevelDetailView.xib; sourceTree = ""; }; - 19F38C96204CC962006BB72B /* SkillLevelDetailView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SkillLevelDetailView.swift; sourceTree = ""; }; - 19FD9CED21355E110014A0D4 /* RecordResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordResponse.swift; sourceTree = ""; }; - 35C82758ABE7A6568499A7F2 /* Pods_RespectU.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RespectU.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - A314C0291FA5F61AAC482F05 /* Pods-RespectU.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RespectU.release.xcconfig"; path = "Pods/Target Support Files/Pods-RespectU/Pods-RespectU.release.xcconfig"; sourceTree = ""; }; - DB6B1689F63785D34949E1A9 /* Pods-RespectU.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RespectU.debug.xcconfig"; path = "Pods/Target Support Files/Pods-RespectU/Pods-RespectU.debug.xcconfig"; sourceTree = ""; }; + DA5A4E6832F2B48BFFE29D6EE9E1BFEF /* .swiftlint.yml */ = {isa = PBXFileReference; lastKnownFileType = text; path = .swiftlint.yml; sourceTree = ""; }; + EE6D08E337A7395C974382D3D49B50ED /* APIService+Achievement.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "APIService+Achievement.swift"; sourceTree = ""; }; + F14D88E672A1CA362BBF23009477E7C7 /* APIService+Base.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "APIService+Base.swift"; sourceTree = ""; }; + 67F8ADF69CF51420637315B6B1CB9B3F /* APIService+Mission.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "APIService+Mission.swift"; sourceTree = ""; }; + A52641BDB047E88FFE60B9F1EB7F89D8 /* APIService+Ranking.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "APIService+Ranking.swift"; sourceTree = ""; }; + B6594C9F6573B04AED144F6F3F3B9AA6 /* APIService+Record.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "APIService+Record.swift"; sourceTree = ""; }; + AF131ED7C45FABB6AD6B1A75998373F8 /* APIService+Song.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "APIService+Song.swift"; sourceTree = ""; }; + 1EC376E253CB7630E7BAC771AB75FC10 /* APIService+Tip.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "APIService+Tip.swift"; sourceTree = ""; }; + C0DFBF524855854CAC775CF09B6A5F92 /* APIService+Trophy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "APIService+Trophy.swift"; sourceTree = ""; }; + 5B53CFCFD9ABD97DDA14CD35ACDFB94D /* APIService+User.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "APIService+User.swift"; sourceTree = ""; }; + 282674A18512BC1AEFB6CE490A429E5C /* Achievement.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = Achievement.storyboard; sourceTree = ""; }; + D208137CF7035F090957DD52BFD704BC /* AchievementAllTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AchievementAllTableViewController.swift; sourceTree = ""; }; + ECF59229051F5AD6A883EFD1E5A2603E /* AchievementBaseTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AchievementBaseTableViewController.swift; sourceTree = ""; }; + 623DBE7ABE62C6ED2C6A96D8B561D1BC /* AchievementCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AchievementCell.swift; sourceTree = ""; }; + F957C9D0578879C4BFDF188CC7E9DB68 /* AchievementCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = AchievementCell.xib; sourceTree = ""; }; + 07507A73DE0099DC9CFB4ABA9FB0DC0C /* AchievementCommentTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AchievementCommentTableViewController.swift; sourceTree = ""; }; + 8CB2A66DC82F6391EEEF838491861F33 /* AchievementGalleryTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AchievementGalleryTableViewController.swift; sourceTree = ""; }; + 81A0CEB91040D7176F26D4F0FDD21D28 /* AchievementGearTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AchievementGearTableViewController.swift; sourceTree = ""; }; + 6D72B837CDF13537B08A21962C780D70 /* AchievementInfo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AchievementInfo.swift; sourceTree = ""; }; + C728DBB0614587CD2759E53BD1A65882 /* AchievementMusicTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AchievementMusicTableViewController.swift; sourceTree = ""; }; + 18449AAA9B8578063135A1485D123683 /* AchievementNoteTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AchievementNoteTableViewController.swift; sourceTree = ""; }; + 08F04BA7E15EC807F3B9CAA3AEF98239 /* AchievementPlateTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AchievementPlateTableViewController.swift; sourceTree = ""; }; + 181F3BF12F13DC015494221C8902B980 /* AchievementResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AchievementResponse.swift; sourceTree = ""; }; + 6E8609566688513F20D56F71E8C2A73E /* AchievementType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AchievementType.swift; sourceTree = ""; }; + AEEACD594FBA67A330D104F816D4D968 /* AchievementViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AchievementViewController.swift; sourceTree = ""; }; + 437358F63E7EFA7C3FA6E22357580622 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 74BBB665B16E2FF2F0BE095960FFA33E /* Assets.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Assets.swift; sourceTree = ""; }; + E683F525A54716C4D6BE56A96EEDCB29 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 92BBB8BD0C86813D3C7E2DF1A3C1A920 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 091109F5110F4F89963C64B091604CEE /* BaseViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseViewController.swift; sourceTree = ""; }; + 7994394D253D83388739913632BF52F4 /* Button.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Button.swift; sourceTree = ""; }; + 6F8D863B4192345379FAA072605B014B /* CAGradientLayer+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CAGradientLayer+.swift"; sourceTree = ""; }; + 3556AE9C2F4DBEEEF2277634864736F6 /* Difficulty.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Difficulty.swift; sourceTree = ""; }; + 00C0A70ADF02A515C554A2A7F65D04D0 /* Double+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Double+.swift"; sourceTree = ""; }; + C18E5F5E8BB5540D91968DDECE31869A /* Download.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = Download.storyboard; sourceTree = ""; }; + 7684A5E7EAE2568B15BCA4F2AEF65CA2 /* DownloadViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DownloadViewController.swift; sourceTree = ""; }; + 9CB2C96445D032E82864C978003715B1 /* GradientDirection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GradientDirection.swift; sourceTree = ""; }; + 43CCCFC971513264AFA7256BA71653C4 /* Guide.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = Guide.storyboard; sourceTree = ""; }; + 48EB4DE7C46CAC769FAD64B4062EA5AC /* GuideFirstCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GuideFirstCell.swift; sourceTree = ""; }; + 4145F1EB5D7436740025D90996B48C6B /* GuideFirstCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = GuideFirstCell.xib; sourceTree = ""; }; + 88C214B5C6340C681D687A5837D49CB2 /* GuideSecondCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GuideSecondCell.swift; sourceTree = ""; }; + ACAACBB2302A38B15286B2F10D57B0D2 /* GuideSecondCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = GuideSecondCell.xib; sourceTree = ""; }; + C2C849886AF9CEC2084D57D6610826D0 /* GuideThirdCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GuideThirdCell.swift; sourceTree = ""; }; + 570419DC99D9A09F38A4AC7F521FCA9B /* GuideThirdCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = GuideThirdCell.xib; sourceTree = ""; }; + 93A63669D5CF070426162547AE2374EB /* GuideViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GuideViewController.swift; sourceTree = ""; }; + 4D284F23A18D9152EF2B5160B985146D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 8D37A25DCDC8B3EE48F56719264861F7 /* Init.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = Init.storyboard; sourceTree = ""; }; + 117BC6C5BE267F11B4EEF031AEA2892E /* InitViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InitViewController.swift; sourceTree = ""; }; + C9846CC66092E2BF0D2992D65E7468CD /* LanguageInfo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LanguageInfo.swift; sourceTree = ""; }; + 9FEE52510CEADD20DE68A05F791D08EE /* LanguageResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LanguageResponse.swift; sourceTree = ""; }; + 78D031E416EDBC4C34BC6B3FA0451966 /* MessageUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MessageUI.framework; path = System/Library/Frameworks/MessageUI.framework; sourceTree = SDKROOT; }; + 58EF41D2CE42F9C421375B5B3CE8D60E /* Mission.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = Mission.storyboard; sourceTree = ""; }; + 2D5735B28DC786C25122A478189A9D7A /* MissionBSTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MissionBSTableViewController.swift; sourceTree = ""; }; + A41D0D4CFC2F1ABFC1D38C42335BAB6C /* MissionBaseTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MissionBaseTableViewController.swift; sourceTree = ""; }; + D30DD51658A0E07C8F795B59D8C5A930 /* MissionCETableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MissionCETableViewController.swift; sourceTree = ""; }; + 5E6BC6E8EAEFF1FB31DF48435303F350 /* MissionCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MissionCell.swift; sourceTree = ""; }; + 6F96CA2C329587E39822104CEF6C2C4D /* MissionCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MissionCell.xib; sourceTree = ""; }; + FB1D1400F4F8A5579A4BD339D8661CC6 /* MissionDetailViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MissionDetailViewController.swift; sourceTree = ""; }; + E2056D7C4194815BBE52A3F13FAF7125 /* MissionInfo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MissionInfo.swift; sourceTree = ""; }; + 5EB4F2D81091EAC8D197F1D737EA41B9 /* MissionLinkDiskTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MissionLinkDiskTableViewController.swift; sourceTree = ""; }; + D1936880A3D30B8BC49B8587F6778EEA /* MissionRespectTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MissionRespectTableViewController.swift; sourceTree = ""; }; + 356291260ADA8E8A175631818583AAC6 /* MissionResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MissionResponse.swift; sourceTree = ""; }; + A9BE0A154D3D7E018D76684B281CECD0 /* MissionSection.BS+Gradient.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "MissionSection.BS+Gradient.swift"; sourceTree = ""; }; + 91CBAA567778CAD53CB93CE152F92D55 /* MissionSection.CE+Gradient.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "MissionSection.CE+Gradient.swift"; sourceTree = ""; }; + 60EAD4483197E0A753FDD10845C98D09 /* MissionSection.LinkDisk+Gradient.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "MissionSection.LinkDisk+Gradient.swift"; sourceTree = ""; }; + A09D0FEC3D95CCD8ECE16CBDA7084FFA /* MissionSection.Respect+Gradient.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "MissionSection.Respect+Gradient.swift"; sourceTree = ""; }; + 79D7A5F0799CF86A96D301D82B8B1090 /* MissionSection.Technika1+Gradient.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "MissionSection.Technika1+Gradient.swift"; sourceTree = ""; }; + 241BD9807E33EA3CBBF302A35813F5C2 /* MissionSection.Technika2+Gradient.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "MissionSection.Technika2+Gradient.swift"; sourceTree = ""; }; + FBF7FCA66B507564BF411BB82D824394 /* MissionSection.Technika3+Gradient.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "MissionSection.Technika3+Gradient.swift"; sourceTree = ""; }; + 6B59269E3AB75988A25F6D4EF5088A20 /* MissionSection.Trilogy+Gradient.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "MissionSection.Trilogy+Gradient.swift"; sourceTree = ""; }; + 27FD193AE2FCE3A3F96143D41ADBCC7F /* MissionSection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MissionSection.swift; sourceTree = ""; }; + D78571F88000DB2A377C1A859F5F2B0B /* MissionStageInfo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MissionStageInfo.swift; sourceTree = ""; }; + 3127AC853734E65CD8EDD6BD1D9AEB68 /* MissionTechnika1TableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MissionTechnika1TableViewController.swift; sourceTree = ""; }; + 9D21A9793161E13A8605689D97FBCC60 /* MissionTechnika2TableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MissionTechnika2TableViewController.swift; sourceTree = ""; }; + 7E1E98FB695B66D5FA11980E8C7618DA /* MissionTechnika3TableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MissionTechnika3TableViewController.swift; sourceTree = ""; }; + DC1C93791BC6091924D5E9BEA314201C /* MissionTrilogyTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MissionTrilogyTableViewController.swift; sourceTree = ""; }; + 6192054BD8E7E46E36A43659F1D2131A /* MissionViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MissionViewController.swift; sourceTree = ""; }; + 90B143CCDE9CB1920C76E56DFB8E619A /* NSObject+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSObject+.swift"; sourceTree = ""; }; + F66F1F16E4879E82613F8C07E0062B2A /* NetworkManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkManager.swift; sourceTree = ""; }; + 5B34AF7A247BBB042C734DD502A4021B /* NicknameResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NicknameResponse.swift; sourceTree = ""; }; + 9AF510989C994AF286BAC6EFC98F3D86 /* Note.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Note.swift; sourceTree = ""; }; + 7B26CA6823B048ECBE5ED32FB0E8A9AD /* OldRecordInfo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OldRecordInfo.swift; sourceTree = ""; }; + 27A75068DE95C7555DB599931ED8AEDE /* Performance.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = Performance.storyboard; sourceTree = ""; }; + AFC8A42FD9DBB28DB007F737E8557BB7 /* PerformanceViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PerformanceViewController.swift; sourceTree = ""; }; + 42590FD8BDFA7FDB31E81239FE1C5C9D /* Persistence.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Persistence.swift; sourceTree = ""; }; + 1FD55BA517A60A14D8EC54ACB1C7B9D4 /* Pods-RespectU.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RespectU.debug.xcconfig"; path = "Pods/Target Support Files/Pods-RespectU/Pods-RespectU.debug.xcconfig"; sourceTree = ""; }; + 56193FB5ED1B44771800EF26128FEE44 /* Pods-RespectU.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RespectU.release.xcconfig"; path = "Pods/Target Support Files/Pods-RespectU/Pods-RespectU.release.xcconfig"; sourceTree = ""; }; + 720D3E6C26142ACBA59C9F7822C204CC /* Pods_RespectU.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RespectU.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D9B229B6B9B7142C2A461D7DEB2A7113 /* RUButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RUButton.swift; sourceTree = ""; }; + A4B1BD7EAB31E7E51B602AF90FC5C2AE /* Rank.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Rank.swift; sourceTree = ""; }; + E12E3AA69AEC8526DA02450D9F486C31 /* Ranking.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = Ranking.storyboard; sourceTree = ""; }; + E9EA4615ADDF5106D45E6C157F9935FE /* Ranking4BTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Ranking4BTableViewController.swift; sourceTree = ""; }; + A57D6592351D9AD16368506EE4633557 /* Ranking5BTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Ranking5BTableViewController.swift; sourceTree = ""; }; + DA8059779D1985F721E78B753EC4D776 /* Ranking6BTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Ranking6BTableViewController.swift; sourceTree = ""; }; + 2A61C0A29FAF3BAFDEA230CF7D855312 /* Ranking8BTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Ranking8BTableViewController.swift; sourceTree = ""; }; + 3C9306E0C24359552A85518112EFCC9D /* RankingBaseTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RankingBaseTableViewController.swift; sourceTree = ""; }; + B6DC6B20F4435BC55F0363155B189EA9 /* RankingCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RankingCell.swift; sourceTree = ""; }; + 1BD862D1F9C81B97810DC117707740FB /* RankingCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = RankingCell.xib; sourceTree = ""; }; + 0F1B980355224D49337F83B418D77DF9 /* RankingResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RankingResponse.swift; sourceTree = ""; }; + 656538575F3D4D03C665378FB2C6E482 /* RankingViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RankingViewController.swift; sourceTree = ""; }; + C7897FFE7C5D2CCD0252A92D83D3A242 /* Reachability.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Reachability.swift; sourceTree = ""; }; + ED7D4A7210DBE5C6BF5E8E60901CEC24 /* Realm.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Realm.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 5AF72C1C7A71F43D43589C3E8792F7A9 /* RealmSwift.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = RealmSwift.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D13809AF4354422A199374B3465D8656 /* Record.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = Record.storyboard; sourceTree = ""; }; + 4BBD21C11306FD9C54E163A20FF8FA24 /* RecordAllTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordAllTableViewController.swift; sourceTree = ""; }; + 101CE93B365835BBA1D7A917C71B524B /* RecordBSTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordBSTableViewController.swift; sourceTree = ""; }; + A646CCC720C494D646FECAB5677C1E21 /* RecordBaseTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordBaseTableViewController.swift; sourceTree = ""; }; + 7D774173D345CCDC64F1E65BA46CC48A /* RecordButtonInfo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RecordButtonInfo.swift; sourceTree = ""; }; + 164C0B9C9329B63A84146A68B44211AF /* RecordCETableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordCETableViewController.swift; sourceTree = ""; }; + 2991773C4B90001F83182265FA5298FA /* RecordCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordCell.swift; sourceTree = ""; }; + CA9B676C5D60B5CCB2663B17DFB0D19B /* RecordCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = RecordCell.xib; sourceTree = ""; }; + FE923EF715087FF2BBEAA80043390A02 /* RecordDifficultyInfo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RecordDifficultyInfo.swift; sourceTree = ""; }; + B238705DEEA8ACF0182DF0BB41B2CB0D /* RecordInfo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RecordInfo.swift; sourceTree = ""; }; + C7CF5FBE9FE442E18A869E8FFDBB6596 /* RecordPortable1TableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RecordPortable1TableViewController.swift; sourceTree = ""; }; + 5F75FFB849D9280269D8A4130772A059 /* RecordPortable2TableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordPortable2TableViewController.swift; sourceTree = ""; }; + 0A7A724B52192252A0101E5F2B3DC658 /* RecordRespectTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordRespectTableViewController.swift; sourceTree = ""; }; + 8BE876B3189C89826136B421C811E381 /* RecordResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordResponse.swift; sourceTree = ""; }; + C86C6C9262E8EB75FB7589033C1F2EC4 /* RecordTechnika1TableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordTechnika1TableViewController.swift; sourceTree = ""; }; + 4CAF7442CCE225037AD440CAED1A2F46 /* RecordTechnika2TableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordTechnika2TableViewController.swift; sourceTree = ""; }; + 394457A6318FCBA35633C05384AA8D50 /* RecordTechnika3TableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordTechnika3TableViewController.swift; sourceTree = ""; }; + DB8FDB96924415810F26D8A3D5DCC643 /* RecordTrilogyTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordTrilogyTableViewController.swift; sourceTree = ""; }; + 6D899C6158365DC40A43EFA3FBD53860 /* RecordView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordView.swift; sourceTree = ""; }; + A832024764FD1738185268E528614C3A /* RecordView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = RecordView.xib; sourceTree = ""; }; + 6CDC8CD7AE0EAE20F102844365138098 /* RecordViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordViewController.swift; sourceTree = ""; }; + 493FFC326138371B1937E2E2D26236EA /* RespectU.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = RespectU.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 16CA587AC64BBF7D9615B18AE922CCA5 /* SearchByLevelView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchByLevelView.swift; sourceTree = ""; }; + 650873B493E00BDFE6552F230602E303 /* SearchByLevelView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = SearchByLevelView.xib; sourceTree = ""; }; + D8DA77CE4436FD7F1B3A85A2993A6875 /* SearchByNoteView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchByNoteView.swift; sourceTree = ""; }; + 65A74FCC87D5D9BBBEBAE0F47B7B68DA /* SearchByNoteView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = SearchByNoteView.xib; sourceTree = ""; }; + 8205116CE68B6DBD1CE90AC4439DE832 /* SearchByRatingView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SearchByRatingView.swift; sourceTree = ""; }; + B6DD826AB9C764BFEA1BFE277466B01C /* SearchByRatingView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = SearchByRatingView.xib; sourceTree = ""; }; + CA2ABF5BEC5BFF80DD120FEE7AC45F14 /* SearchRecordDetail.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchRecordDetail.swift; sourceTree = ""; }; + 5C7E6B6B900C98599DF992D190397ED8 /* SearchRecordDetailCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchRecordDetailCell.swift; sourceTree = ""; }; + E6C14F35B2B1A8D25A221C146D1C063B /* SearchRecordDetailCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = SearchRecordDetailCell.xib; sourceTree = ""; }; + 4B54A2548B3BB3E75F221CEAFB441651 /* SearchRecordDetailViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchRecordDetailViewController.swift; sourceTree = ""; }; + C194554A77881C517795E91A8F23124E /* SearchRecordViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchRecordViewController.swift; sourceTree = ""; }; + 9A9970140918A7A61332718A9C9D8322 /* Series+UI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Series+UI.swift"; sourceTree = ""; }; + 9ADF8D0329CDE33DD67FC75E36D63E92 /* Series.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Series.swift; sourceTree = ""; }; + A085D0FCAAED86B5EF798D2FF4C4EE5E /* SignIn.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = SignIn.storyboard; sourceTree = ""; }; + C48AF305EFDF8EDEE8CE8D136BC9FEEB /* SignInTextField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignInTextField.swift; sourceTree = ""; }; + 423FC743627303AF97314223CD2F8B7B /* SignInViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignInViewController.swift; sourceTree = ""; }; + D774FFC53CC59564C3B6E8255A6FDE76 /* SignUpViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignUpViewController.swift; sourceTree = ""; }; + 3FAFF4A05D2722646FFDB1A59C751CA5 /* SkillLevel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SkillLevel.swift; sourceTree = ""; }; + 2AC69B55FC64D7C31A86A33852EAB0AC /* SkillLevelCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SkillLevelCell.swift; sourceTree = ""; }; + 0A0189022C6BE4C949EA9505B6B3CA1C /* SkillLevelCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = SkillLevelCell.xib; sourceTree = ""; }; + F0CC6B551EBD0EC656F35FD74247ED8D /* SkillLevelDetailView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SkillLevelDetailView.swift; sourceTree = ""; }; + 62A4B18F7F37F18F820CB7408C91507F /* SkillLevelDetailView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = SkillLevelDetailView.xib; sourceTree = ""; }; + 494ED1030BF0FF71A1E556B9468CD078 /* SkillLevelDetailViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SkillLevelDetailViewController.swift; sourceTree = ""; }; + 0E664D69C5666D40413DD76EC3EEB905 /* SkillPoint.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SkillPoint.swift; sourceTree = ""; }; + 9F70C67599FC388CA2F8CD0D50622CAF /* Song.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = Song.storyboard; sourceTree = ""; }; + EBDBA54D2C97FB9571C3176FE9BFB0F4 /* SongAllTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SongAllTableViewController.swift; sourceTree = ""; }; + A2D27FEA1E4484DB3A555B53E4AE9B1D /* SongBSTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SongBSTableViewController.swift; sourceTree = ""; }; + F23F5730F0C449DE84E323068105AB47 /* SongBaseTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SongBaseTableViewController.swift; sourceTree = ""; }; + CDD93D99DBE3AD0EB3D9A0617867ED07 /* SongButtonInfo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SongButtonInfo.swift; sourceTree = ""; }; + B9C089EAB1BA22820E5EE21E20936E08 /* SongCETableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SongCETableViewController.swift; sourceTree = ""; }; + 59AC73FB70CC51A8AFAC0050C039CF14 /* SongCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SongCell.swift; sourceTree = ""; }; + CDE48D134E382F52D49F7020BDAE3546 /* SongCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = SongCell.xib; sourceTree = ""; }; + 296CBA384CF912A9F2429A941DFB482D /* SongInfo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SongInfo.swift; sourceTree = ""; }; + 06634141A9D0AD50CB5CF1C56489B8AB /* SongPortable1TableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SongPortable1TableViewController.swift; sourceTree = ""; }; + CFE0B54506B42D2B43A668825784A336 /* SongPortable2TableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SongPortable2TableViewController.swift; sourceTree = ""; }; + D72A74447C5271E64A723356FA2C76C8 /* SongRespectTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SongRespectTableViewController.swift; sourceTree = ""; }; + A7267843D0764A20BFC44647A8069076 /* SongResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SongResponse.swift; sourceTree = ""; }; + 8ABC647AFC387EECD6791F100EBED31D /* SongTechnika1TableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SongTechnika1TableViewController.swift; sourceTree = ""; }; + EED82018840FD1A5C9368EF3CB51DB1E /* SongTechnika2TableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SongTechnika2TableViewController.swift; sourceTree = ""; }; + 59AA6BC0369E1C3C4B40AB8BE89DBF5A /* SongTechnika3TableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SongTechnika3TableViewController.swift; sourceTree = ""; }; + ABF4E0839B1BC3BA0A3E14EA1484CB79 /* SongTrilogyTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SongTrilogyTableViewController.swift; sourceTree = ""; }; + B7FF17875A680B2300216805CB27FC73 /* SongViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SongViewController.swift; sourceTree = ""; }; + 0A21F405F43A9AF49F10051F778F3FA4 /* Storyboard.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Storyboard.swift; sourceTree = ""; }; + 08640281899B112DEB6A0A0A56A169B7 /* String+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+.swift"; sourceTree = ""; }; + D0B7E2EA07502142424EC51FE1C1D182 /* Strings.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Strings.swift; sourceTree = ""; }; + D8D3AEF54E1F8CB4F0C230AE0F4A274D /* SummaryCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SummaryCell.swift; sourceTree = ""; }; + EDC63C6945BBA9A7159F95B906AC4F52 /* SummaryCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = SummaryCell.xib; sourceTree = ""; }; + 7141F43FD5DD9A34D35E2692CB721D4A /* SummaryCollectionCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SummaryCollectionCell.swift; sourceTree = ""; }; + DBBD5EC70A4CB6A25BE54391F562C59F /* SummaryCollectionCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = SummaryCollectionCell.xib; sourceTree = ""; }; + D5A1695D071CC7554C3FA877BC12B245 /* SummaryDetailViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SummaryDetailViewController.swift; sourceTree = ""; }; + 7E1371C9E28AB4CD6449FA7FD0074E25 /* Tip.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = Tip.storyboard; sourceTree = ""; }; + E5B397154AED8CE46A5D63ACC715A8F1 /* TipInfo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TipInfo.swift; sourceTree = ""; }; + 753FD1B3D1EB8456BE034D69FBCBB329 /* TipResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TipResponse.swift; sourceTree = ""; }; + 91CCF1B33BD4D77BF5650BED697154D2 /* TipViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TipViewController.swift; sourceTree = ""; }; + 721D3123DF4906650661109B36D4EFC2 /* Top50.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = Top50.storyboard; sourceTree = ""; }; + BB34EF52E48B6B9E32AE64FEDD76C088 /* Top504BTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Top504BTableViewController.swift; sourceTree = ""; }; + C1F70C1B0BF44B8904203164AE9B8E1B /* Top505BTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Top505BTableViewController.swift; sourceTree = ""; }; + D6C6A7F46818C574348C01D5E9938C60 /* Top506BTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Top506BTableViewController.swift; sourceTree = ""; }; + 70FCD8F7C26C5E1F0B0EBF746748BBBF /* Top508BTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Top508BTableViewController.swift; sourceTree = ""; }; + BFF5B6DC44A390FCF7DBF622AADB5833 /* Top50BaseTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Top50BaseTableViewController.swift; sourceTree = ""; }; + 4A4C312CB6DC58847B1ACBECB8F95A8F /* Top50Cell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Top50Cell.swift; sourceTree = ""; }; + 1907607DB6FA22EE22397D314C25E2C6 /* Top50Cell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = Top50Cell.xib; sourceTree = ""; }; + 365A3C9BFD2062AA5D08B56E995F9474 /* Top50ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Top50ViewController.swift; sourceTree = ""; }; + 4D08ADAD88BBB07FBB95CF8CD62CB6ED /* Trophy.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = Trophy.storyboard; sourceTree = ""; }; + D0C2415AABC509E942301DF3589F55F8 /* TrophyBSTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TrophyBSTableViewController.swift; sourceTree = ""; }; + C865E14A01D3C67FEEE5EAF375899C7D /* TrophyBaseTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TrophyBaseTableViewController.swift; sourceTree = ""; }; + 67B09CACDD60C508B1CEBEF21A39E14C /* TrophyCETableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TrophyCETableViewController.swift; sourceTree = ""; }; + 7C8E87A2B03543FCDFA459E10DCEBCDF /* TrophyCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TrophyCell.swift; sourceTree = ""; }; + F3C75B35A37617F2B6A9DD8208FE2AD9 /* TrophyCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = TrophyCell.xib; sourceTree = ""; }; + 4298E98CCC40A6C7EFDE5510CEDED521 /* TrophyGrade.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TrophyGrade.swift; sourceTree = ""; }; + 9703F75E9D1960A0BAA7CFC8240AE541 /* TrophyInfo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TrophyInfo.swift; sourceTree = ""; }; + FA2852A77D854438A0267E99C8067691 /* TrophyLinkDiskTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TrophyLinkDiskTableViewController.swift; sourceTree = ""; }; + FF98B5B953A51AE19F56E640C40E2687 /* TrophyRespectTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TrophyRespectTableViewController.swift; sourceTree = ""; }; + 26A426486B63E886A1D72A62EC230A4D /* TrophyResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TrophyResponse.swift; sourceTree = ""; }; + 7C2B8192D8437447475180972270F1A2 /* TrophyTechnika1TableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TrophyTechnika1TableViewController.swift; sourceTree = ""; }; + 9DDBE69BDF91490724A4508E8150A75F /* TrophyTechnika2TableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TrophyTechnika2TableViewController.swift; sourceTree = ""; }; + A875376A5EBE583D9D47E2CCA367EB4F /* TrophyTechnika3TableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TrophyTechnika3TableViewController.swift; sourceTree = ""; }; + 40F9848262F8DA6D81D931CC8DE5FA0A /* TrophyTrilogyTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TrophyTrilogyTableViewController.swift; sourceTree = ""; }; + 54A0585B9094D54EA2EE91A30C6265FA /* TrophyViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TrophyViewController.swift; sourceTree = ""; }; + 42BE04F264C300B56C92EE575A854683 /* UIAlertController+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIAlertController+.swift"; sourceTree = ""; }; + 2FC485CCFD9749EE1E561DFAE98EA11C /* UIColor+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIColor+.swift"; sourceTree = ""; }; + 4DB6EB0A090B3EC667134B3DD24AA2A8 /* UIView+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIView+.swift"; sourceTree = ""; }; + 0933C1D68D4630ABCB0E824F3B06E6FA /* UIViewController+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIViewController+.swift"; sourceTree = ""; }; + 808F49E6EA3E0B9F118A59BCD1C399A9 /* Upload.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = Upload.storyboard; sourceTree = ""; }; + D04A91E1391EB1A2505BB6E30EB1AD65 /* UploadViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UploadViewController.swift; sourceTree = ""; }; + 45291D32AD99A8C491E4A69A15AB4D44 /* UserResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserResponse.swift; sourceTree = ""; }; + BBC86C6F0F8F435FA71C29C5A32617CF /* Utils.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Utils.swift; sourceTree = ""; }; + A49DC68ED49BE1C95E3D0C553CB3C0D0 /* VersionInfo.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VersionInfo.swift; sourceTree = ""; }; + F2731BD8B5A3E3953125EBC4F1ACA6B7 /* VersionResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VersionResponse.swift; sourceTree = ""; }; + 1B070570A49E0EE97FB9D7A7BEE9915B /* ko */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ko; path = ko.lproj/Localizable.strings; sourceTree = ""; }; + 9143E2A18693E399D37E0F432BB4A9A7 /* ko */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ko; path = ko.lproj/LaunchScreen.strings; sourceTree = ""; }; + D8DDC6393F8E75DB389B0B80A6930D30 /* swiftgen.yml */ = {isa = PBXFileReference; lastKnownFileType = text; path = swiftgen.yml; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 1984269221B7EA0A001F491C /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 19B6CFE51F7953640097B86B /* Frameworks */ = { + 839AEC169A324E09CA1B0D14A3648128 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 19C9216B1F810DE600774E3E /* MessageUI.framework in Frameworks */, - 198391F41F7CE227009C7B5D /* Realm.framework in Frameworks */, - 198391F01F7CE21F009C7B5D /* RealmSwift.framework in Frameworks */, - 1C0E1D5872206B8A4DABA752 /* Pods_RespectU.framework in Frameworks */, + 3B9C2AF499E89D2A4B1386181D2E464C /* MessageUI.framework in Frameworks */, + 54CB14A1152EBED5F62581A197D9DB51 /* Pods_RespectU.framework in Frameworks */, + B255C1B95D64372EBE20026F66E6F259 /* Realm.framework in Frameworks */, + 74DD787436F4A0E27647E2D3195DD901 /* RealmSwift.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 157E9212944C668B7A2097B4 /* Pods */ = { - isa = PBXGroup; - children = ( - DB6B1689F63785D34949E1A9 /* Pods-RespectU.debug.xcconfig */, - A314C0291FA5F61AAC482F05 /* Pods-RespectU.release.xcconfig */, - ); - name = Pods; - sourceTree = ""; - }; - 19012FAE204808120061EF21 /* Supporting Files */ = { - isa = PBXGroup; - children = ( - 195A6A22216F17F90072D03A /* Activity Indicator */, - 19B6CFF51F7953640097B86B /* Assets.xcassets */, - 19A4FAD11FDE7749003FFFE6 /* RespectU-Bridging-Header.h */, - 19B6CFFA1F7953640097B86B /* Info.plist */, - 19B6CFEB1F7953640097B86B /* AppDelegate.swift */, - 19F2312E20156BBC00ADF825 /* Reachability.swift */, - 19B6602B1F960FA800CCEFB5 /* Localizable.strings */, - 199233D1216F85CF00E040D7 /* CommonButton.swift */, - ); - path = "Supporting Files"; - sourceTree = ""; - }; - 19012FB2204808AE0061EF21 /* Extension */ = { - isa = PBXGroup; - children = ( - 19B660251F960E5800CCEFB5 /* String+.swift */, - 191275F321121B9D0046AA3E /* UIViewController+.swift */, - 1968185220490D300007F4D7 /* UIColor+.swift */, - 193E4016204C03C50063A440 /* UIView+.swift */, - 191A8B7D20E4FC930064F93E /* UIAlertController+.swift */, - 1928D5FC211824DF00F7901F /* UITableViewCell+.swift */, - 191275EA211206790046AA3E /* NSObject+.swift */, - 19F13FB92112ED87003E622E /* Results+.swift */, - 191C36662170F9B100B2594B /* CAGradientLayer+.swift */, - 1963FF03217C664900FF6FE1 /* Date+.swift */, - ); - path = Extension; - sourceTree = ""; - }; - 191275DE2111F7150046AA3E /* Constants */ = { - isa = PBXGroup; - children = ( - 192DF89A2111D92B0016F386 /* Series.swift */, - 192DF8A02111DAED0016F386 /* MissionSection.swift */, - 193E3FF8204BCFB20063A440 /* Difficulty.swift */, - 192DF89E2111DAC80016F386 /* TrophyGrade.swift */, - 192DF89C2111DA640016F386 /* Buttons.swift */, - 198B6C5B211443C70058DE49 /* Rank.swift */, - 198B6C51211392CA0058DE49 /* Note.swift */, - 198B6C552113E5A60058DE49 /* SkillLevel.swift */, - ); - path = Constants; - sourceTree = ""; - }; - 191275EE21120B380046AA3E /* Base */ = { - isa = PBXGroup; - children = ( - 191275EC21120B080046AA3E /* BaseViewController.swift */, - ); - path = Base; - sourceTree = ""; - }; - 1913B40C2175C06000D6C93F /* History */ = { - isa = PBXGroup; - children = ( - 1913B40E2175C08700D6C93F /* HistoryCell.xib */, - 1913B40D2175C08700D6C93F /* HistoryCell.swift */, - ); - path = History; - sourceTree = ""; - }; - 1939C971212BFF1000A6F8E3 /* Network */ = { - isa = PBXGroup; - children = ( - 1939C972212BFF1900A6F8E3 /* Network.swift */, - 1939C974212C004D00A6F8E3 /* API.swift */, - ); - path = Network; - sourceTree = ""; - }; - 193C285D213674F7001EB7F3 /* View */ = { - isa = PBXGroup; - children = ( - 193C2857213671D4001EB7F3 /* SignInTextField.swift */, - ); - path = View; - sourceTree = ""; - }; - 193C285E2136C8C4001EB7F3 /* Upload */ = { - isa = PBXGroup; - children = ( - 193C285F2136C8E7001EB7F3 /* Upload.storyboard */, - 193C28612136C8F0001EB7F3 /* UploadViewController.swift */, - ); - path = Upload; - sourceTree = ""; - }; - 193C28652136E516001EB7F3 /* Download */ = { + 0AF22290FFB9BA0E2E99ED1E48E897FD /* Supports */ = { isa = PBXGroup; children = ( - 193C28662136E522001EB7F3 /* Download.storyboard */, - 193C28682136E52A001EB7F3 /* DownloadViewController.swift */, + 4D284F23A18D9152EF2B5160B985146D /* Info.plist */, + C7897FFE7C5D2CCD0252A92D83D3A242 /* Reachability.swift */, ); - path = Download; + path = Supports; sourceTree = ""; }; - 195A6A22216F17F90072D03A /* Activity Indicator */ = { + 18065202F58A802DC160A40289791915 /* SwiftGen */ = { isa = PBXGroup; children = ( - 195A6A24216F17F90072D03A /* IndicatorView.xib */, - 195A6A23216F17F90072D03A /* IndicatorView.swift */, + 74BBB665B16E2FF2F0BE095960FFA33E /* Assets.swift */, + 0A21F405F43A9AF49F10051F778F3FA4 /* Storyboard.swift */, + D0B7E2EA07502142424EC51FE1C1D182 /* Strings.swift */, ); - path = "Activity Indicator"; + path = SwiftGen; sourceTree = ""; }; - 198391EF1F7CE21F009C7B5D /* Frameworks */ = { + 18D12715C996780EBFCBC812E7E8F9A5 /* Frameworks */ = { isa = PBXGroup; children = ( - 19C9216A1F810DE600774E3E /* MessageUI.framework */, - 198391F51F7CE227009C7B5D /* Realm.framework */, - 198391F11F7CE21F009C7B5D /* RealmSwift.framework */, - 35C82758ABE7A6568499A7F2 /* Pods_RespectU.framework */, + 78D031E416EDBC4C34BC6B3FA0451966 /* MessageUI.framework */, + 720D3E6C26142ACBA59C9F7822C204CC /* Pods_RespectU.framework */, + ED7D4A7210DBE5C6BF5E8E60901CEC24 /* Realm.framework */, + 5AF72C1C7A71F43D43589C3E8792F7A9 /* RealmSwift.framework */, ); name = Frameworks; sourceTree = ""; }; - 1984269621B7EA0A001F491C /* RespectUUITests */ = { + 20CD4E18015C56EA046398F6514DA8D4 /* Top50 */ = { isa = PBXGroup; children = ( - 1984269721B7EA0A001F491C /* RespectUUITests.swift */, - 1984269F21B7EA3B001F491C /* SnapshotHelper.swift */, - 1984269921B7EA0A001F491C /* Info.plist */, + BB34EF52E48B6B9E32AE64FEDD76C088 /* Top504BTableViewController.swift */, + C1F70C1B0BF44B8904203164AE9B8E1B /* Top505BTableViewController.swift */, + D6C6A7F46818C574348C01D5E9938C60 /* Top506BTableViewController.swift */, + 70FCD8F7C26C5E1F0B0EBF746748BBBF /* Top508BTableViewController.swift */, + BFF5B6DC44A390FCF7DBF622AADB5833 /* Top50BaseTableViewController.swift */, + 365A3C9BFD2062AA5D08B56E995F9474 /* Top50ViewController.swift */, ); - path = RespectUUITests; - sourceTree = ""; - }; - 199233D3216F934000E040D7 /* View */ = { - isa = PBXGroup; - children = ( - 199233D8216F938D00E040D7 /* GuideFirstCell.xib */, - 199233D7216F938D00E040D7 /* GuideFirstCell.swift */, - 199233DC216F939A00E040D7 /* GuideSecondCell.xib */, - 199233DB216F939A00E040D7 /* GuideSecondCell.swift */, - 199233E0216F93A700E040D7 /* GuideThirdCell.xib */, - 199233DF216F93A700E040D7 /* GuideThirdCell.swift */, - ); - path = View; + path = Top50; sourceTree = ""; }; - 19A258182133FAD700C3A3AC /* Response */ = { + 2AA94CA525D5326C0F9292D848B27357 /* Response */ = { isa = PBXGroup; children = ( - 1950D884212D6F92004ED086 /* LanguageResponse.swift */, - 19B09E2C212C555A005EE66D /* SongResponse.swift */, - 19B09E2E212C555F005EE66D /* MissionResponse.swift */, - 19B09E30212C5565005EE66D /* TrophyResponse.swift */, - 19B09E32212C556F005EE66D /* AchievementResponse.swift */, - 19B09E34212C5576005EE66D /* TipResponse.swift */, - 1939C96F212BFD9200A6F8E3 /* UserResponse.swift */, - 19FD9CED21355E110014A0D4 /* RecordResponse.swift */, - 1939C96D212BFD8500A6F8E3 /* RankingResponse.swift */, - 19CA98E0213D416D003371DB /* VersionResponse.swift */, - 1968F784213E7295003C026B /* NicknameResponse.swift */, + 181F3BF12F13DC015494221C8902B980 /* AchievementResponse.swift */, + 9FEE52510CEADD20DE68A05F791D08EE /* LanguageResponse.swift */, + 356291260ADA8E8A175631818583AAC6 /* MissionResponse.swift */, + 5B34AF7A247BBB042C734DD502A4021B /* NicknameResponse.swift */, + 0F1B980355224D49337F83B418D77DF9 /* RankingResponse.swift */, + 8BE876B3189C89826136B421C811E381 /* RecordResponse.swift */, + A7267843D0764A20BFC44647A8069076 /* SongResponse.swift */, + 753FD1B3D1EB8456BE034D69FBCBB329 /* TipResponse.swift */, + 26A426486B63E886A1D72A62EC230A4D /* TrophyResponse.swift */, + 45291D32AD99A8C491E4A69A15AB4D44 /* UserResponse.swift */, + F2731BD8B5A3E3953125EBC4F1ACA6B7 /* VersionResponse.swift */, ); path = Response; sourceTree = ""; }; - 19A3D858213B3F7E000D9A89 /* Init */ = { - isa = PBXGroup; - children = ( - 19585867213B0E76000C78C4 /* Init.storyboard */, - 19585869213B0E81000C78C4 /* InitViewController.swift */, - ); - path = Init; - sourceTree = ""; - }; - 19B6CFDF1F7953640097B86B = { - isa = PBXGroup; - children = ( - 1958DAB52151312700D8AE41 /* .swiftlint.yml */, - 19B6CFEA1F7953640097B86B /* RespectU */, - 1984269621B7EA0A001F491C /* RespectUUITests */, - 19B6CFE91F7953640097B86B /* Products */, - 198391EF1F7CE21F009C7B5D /* Frameworks */, - 157E9212944C668B7A2097B4 /* Pods */, - ); - sourceTree = ""; - }; - 19B6CFE91F7953640097B86B /* Products */ = { - isa = PBXGroup; - children = ( - 19B6CFE81F7953640097B86B /* RespectU.app */, - 1984269521B7EA0A001F491C /* RespectUUITests.xctest */, - ); - name = Products; - sourceTree = ""; - }; - 19B6CFEA1F7953640097B86B /* RespectU */ = { + 3098D44DFD511F131146813BE30FD512 = { isa = PBXGroup; children = ( - 19E4DAE5213D896100837A95 /* Model */, - 19CA98E2213D4A74003371DB /* Utility */, - 1939C971212BFF1000A6F8E3 /* Network */, - 19A258182133FAD700C3A3AC /* Response */, - 191275DE2111F7150046AA3E /* Constants */, - 191275EE21120B380046AA3E /* Base */, - 19E767CC20EE51A5008C9F9D /* Start */, - 19A3D858213B3F7E000D9A89 /* Init */, - 19E767B420EE49B4008C9F9D /* Performance */, - 19E767B520EE49BC008C9F9D /* Guide */, - 19E767C620EE4B8F008C9F9D /* Record */, - 19012FB2204808AE0061EF21 /* Extension */, - 19012FAE204808120061EF21 /* Supporting Files */, + 18D12715C996780EBFCBC812E7E8F9A5 /* Frameworks */, + 8C39E2F22ACC076DC42FDB206D09998B /* Pods */, + 49A4A62F46B05C7357E7399A48C50D4D /* Products */, + DC130C869CC4C032B6E7EDA0329E7A64 /* RespectU */, + DA5A4E6832F2B48BFFE29D6EE9E1BFEF /* .swiftlint.yml */, + D8DDC6393F8E75DB389B0B80A6930D30 /* swiftgen.yml */, ); - path = RespectU; - sourceTree = ""; - }; - 19CA98E2213D4A74003371DB /* Utility */ = { - isa = PBXGroup; - children = ( - 198B6C4F2113913C0058DE49 /* Skill.swift */, - ); - path = Utility; - sourceTree = ""; - }; - 19E4DAE5213D896100837A95 /* Model */ = { - isa = PBXGroup; - children = ( - 19E4DAEC213D896100837A95 /* LanguageInfo.swift */, - 19E4DAE6213D896100837A95 /* SongButtonInfo.swift */, - 19E4DAEE213D896100837A95 /* SongInfo.swift */, - 19E4DAE7213D896100837A95 /* MissionStageInfo.swift */, - 19E4DAE9213D896100837A95 /* MissionInfo.swift */, - 19E4DAEF213D896100837A95 /* TrophyInfo.swift */, - 19E4DAF3213D896100837A95 /* AchievementInfo.swift */, - 19E4DAEB213D896100837A95 /* TipInfo.swift */, - 19E4DAF2213D896100837A95 /* NewRecordDifficultyInfo.swift */, - 19E4DAE8213D896100837A95 /* NewRecordButtonInfo.swift */, - 19E4DAF0213D896100837A95 /* NewRecordInfo.swift */, - 19E4DAED213D896100837A95 /* VersionInfo.swift */, - 19E4DAEA213D896100837A95 /* RecordInfo.swift */, - 1913B4112175C15900D6C93F /* HistoryInfo.swift */, - ); - path = Model; - sourceTree = ""; - }; - 19E767B420EE49B4008C9F9D /* Performance */ = { - isa = PBXGroup; - children = ( - 19E767CD20EE528D008C9F9D /* Main */, - 19E767DA20EE5714008C9F9D /* SkillLevel */, - 19E767D620EE560D008C9F9D /* Summary */, - 1913B40C2175C06000D6C93F /* History */, - ); - path = Performance; sourceTree = ""; }; - 19E767B520EE49BC008C9F9D /* Guide */ = { + 3C37ECC78732D6E4E089B5B5F40D5C39 /* Realm */ = { isa = PBXGroup; children = ( - 19E767C720EE4BB1008C9F9D /* Main */, - 19E767B620EE49C4008C9F9D /* Song */, - 19E767B720EE49C7008C9F9D /* Mission */, - 19E767B820EE49CA008C9F9D /* Trophy */, - 19E767B920EE49CE008C9F9D /* Achievement */, - 19E767C820EE4CFE008C9F9D /* Tip */, - 193C285E2136C8C4001EB7F3 /* Upload */, - 193C28652136E516001EB7F3 /* Download */, - ); - path = Guide; + 6D72B837CDF13537B08A21962C780D70 /* AchievementInfo.swift */, + C9846CC66092E2BF0D2992D65E7468CD /* LanguageInfo.swift */, + E2056D7C4194815BBE52A3F13FAF7125 /* MissionInfo.swift */, + D78571F88000DB2A377C1A859F5F2B0B /* MissionStageInfo.swift */, + 7B26CA6823B048ECBE5ED32FB0E8A9AD /* OldRecordInfo.swift */, + 7D774173D345CCDC64F1E65BA46CC48A /* RecordButtonInfo.swift */, + FE923EF715087FF2BBEAA80043390A02 /* RecordDifficultyInfo.swift */, + B238705DEEA8ACF0182DF0BB41B2CB0D /* RecordInfo.swift */, + CDD93D99DBE3AD0EB3D9A0617867ED07 /* SongButtonInfo.swift */, + 296CBA384CF912A9F2429A941DFB482D /* SongInfo.swift */, + E5B397154AED8CE46A5D63ACC715A8F1 /* TipInfo.swift */, + 9703F75E9D1960A0BAA7CFC8240AE541 /* TrophyInfo.swift */, + A49DC68ED49BE1C95E3D0C553CB3C0D0 /* VersionInfo.swift */, + ); + path = Realm; sourceTree = ""; }; - 19E767B620EE49C4008C9F9D /* Song */ = { + 3E12508306EBDEC69462D36DFA6BEFEA /* Services */ = { isa = PBXGroup; children = ( - 19320FC9204955DC0075BD86 /* Song.storyboard */, - 19E767BD20EE4A22008C9F9D /* View */, - 19E767BC20EE4A19008C9F9D /* Controller */, - ); - path = Song; + EE6D08E337A7395C974382D3D49B50ED /* APIService+Achievement.swift */, + F14D88E672A1CA362BBF23009477E7C7 /* APIService+Base.swift */, + 67F8ADF69CF51420637315B6B1CB9B3F /* APIService+Mission.swift */, + A52641BDB047E88FFE60B9F1EB7F89D8 /* APIService+Ranking.swift */, + B6594C9F6573B04AED144F6F3F3B9AA6 /* APIService+Record.swift */, + AF131ED7C45FABB6AD6B1A75998373F8 /* APIService+Song.swift */, + 1EC376E253CB7630E7BAC771AB75FC10 /* APIService+Tip.swift */, + C0DFBF524855854CAC775CF09B6A5F92 /* APIService+Trophy.swift */, + 5B53CFCFD9ABD97DDA14CD35ACDFB94D /* APIService+User.swift */, + F66F1F16E4879E82613F8C07E0062B2A /* NetworkManager.swift */, + ); + path = Services; sourceTree = ""; }; - 19E767B720EE49C7008C9F9D /* Mission */ = { + 445B0360A0454D1B76771D8E3B21822B /* Mission */ = { isa = PBXGroup; children = ( - 19320FC7204955D50075BD86 /* Mission.storyboard */, - 19E767BE20EE4A51008C9F9D /* View */, - 19E767BF20EE4A55008C9F9D /* Controller */, + 2D5735B28DC786C25122A478189A9D7A /* MissionBSTableViewController.swift */, + A41D0D4CFC2F1ABFC1D38C42335BAB6C /* MissionBaseTableViewController.swift */, + D30DD51658A0E07C8F795B59D8C5A930 /* MissionCETableViewController.swift */, + FB1D1400F4F8A5579A4BD339D8661CC6 /* MissionDetailViewController.swift */, + 5EB4F2D81091EAC8D197F1D737EA41B9 /* MissionLinkDiskTableViewController.swift */, + D1936880A3D30B8BC49B8587F6778EEA /* MissionRespectTableViewController.swift */, + 3127AC853734E65CD8EDD6BD1D9AEB68 /* MissionTechnika1TableViewController.swift */, + 9D21A9793161E13A8605689D97FBCC60 /* MissionTechnika2TableViewController.swift */, + 7E1E98FB695B66D5FA11980E8C7618DA /* MissionTechnika3TableViewController.swift */, + DC1C93791BC6091924D5E9BEA314201C /* MissionTrilogyTableViewController.swift */, + 6192054BD8E7E46E36A43659F1D2131A /* MissionViewController.swift */, ); path = Mission; sourceTree = ""; }; - 19E767B820EE49CA008C9F9D /* Trophy */ = { - isa = PBXGroup; - children = ( - 19320FC5204955CC0075BD86 /* Trophy.storyboard */, - 19E767C120EE4A68008C9F9D /* View */, - 19E767C020EE4A62008C9F9D /* Controller */, - ); - path = Trophy; - sourceTree = ""; - }; - 19E767B920EE49CE008C9F9D /* Achievement */ = { - isa = PBXGroup; - children = ( - 19E02AC9204919830070D72B /* Achievement.storyboard */, - 19E767C320EE4A7F008C9F9D /* View */, - 19E767C220EE4A7A008C9F9D /* Controller */, - ); - path = Achievement; - sourceTree = ""; - }; - 19E767BC20EE4A19008C9F9D /* Controller */ = { - isa = PBXGroup; - children = ( - 19535F09204A8E74008C9A45 /* SongViewController.swift */, - 191275F1211210610046AA3E /* SongBaseTableViewController.swift */, - 194E52A5204A8F7B00B84AFA /* SongAllTableViewController.swift */, - 194E52A7204A8F9900B84AFA /* SongPortable1TableViewController.swift */, - 194E52A9204A900D00B84AFA /* SongPortable2TableViewController.swift */, - 194E52AB204A901A00B84AFA /* SongRespectTableViewController.swift */, - 194E52AD204A941E00B84AFA /* SongTrilogyTableViewController.swift */, - 194E52AF204A948300B84AFA /* SongCETableViewController.swift */, - 197414C52062A77A00D72626 /* SongTechnika1TableViewController.swift */, - 192AFE2220E48ACA0006397F /* SongBSTableViewController.swift */, - 192CA336216F279600F37675 /* SongTechnika2TableViewController.swift */, - ); - path = Controller; - sourceTree = ""; - }; - 19E767BD20EE4A22008C9F9D /* View */ = { - isa = PBXGroup; - children = ( - 194E52B6204AC55900B84AFA /* SongCell.xib */, - 194E52B5204AC55900B84AFA /* SongCell.swift */, - ); - path = View; - sourceTree = ""; - }; - 19E767BE20EE4A51008C9F9D /* View */ = { - isa = PBXGroup; - children = ( - 1999920D2049641A00C74697 /* MissionCell.xib */, - 1999920C2049641A00C74697 /* MissionCell.swift */, - ); - path = View; - sourceTree = ""; - }; - 19E767BF20EE4A55008C9F9D /* Controller */ = { - isa = PBXGroup; - children = ( - 199992102049652700C74697 /* MissionViewController.swift */, - 191275F52112225E0046AA3E /* MissionBaseTableViewController.swift */, - 199992122049653900C74697 /* MissionRespectTableViewController.swift */, - 199992142049654500C74697 /* MissionTrilogyTableViewController.swift */, - 199992162049654E00C74697 /* MissionCETableViewController.swift */, - 197414C92062A95400D72626 /* MissionTechnika1TableViewController.swift */, - 192AFE2420E48AD50006397F /* MissionBSTableViewController.swift */, - 192CA338216F27A200F37675 /* MissionTechnika2TableViewController.swift */, - 191A8B7F20E51ACF0064F93E /* MissionLinkDiskTableViewController.swift */, - 19F24BB32049A62D0034D624 /* MissionDetailViewController.swift */, - ); - path = Controller; - sourceTree = ""; - }; - 19E767C020EE4A62008C9F9D /* Controller */ = { + 49A4A62F46B05C7357E7399A48C50D4D /* Products */ = { isa = PBXGroup; children = ( - 19320FCB2049566A0075BD86 /* TrophyViewController.swift */, - 191275F7211232180046AA3E /* TrophyBaseTableViewController.swift */, - 19320FCD2049568B0075BD86 /* TrophyRespectTableViewController.swift */, - 19320FCF204956940075BD86 /* TrophyTrilogyTableViewController.swift */, - 19320FD12049569D0075BD86 /* TrophyCETableViewController.swift */, - 197414C72062A94A00D72626 /* TrophyTechnika1TableViewController.swift */, - 192AFE2620E48ADF0006397F /* TrophyBSTableViewController.swift */, - 192AFE2820E48AE70006397F /* TrophyLinkDiskTableViewController.swift */, - 192CA33A216F27B000F37675 /* TrophyTechnika2TableViewController.swift */, + 493FFC326138371B1937E2E2D26236EA /* RespectU.app */, ); - path = Controller; + name = Products; sourceTree = ""; }; - 19E767C120EE4A68008C9F9D /* View */ = { + 539479A4BEF977EA27AC2FB7CA91479A /* Storyboards */ = { isa = PBXGroup; children = ( - 19320FD4204959BE0075BD86 /* TrophyCell.xib */, - 19320FD3204959BE0075BD86 /* TrophyCell.swift */, - ); - path = View; + 282674A18512BC1AEFB6CE490A429E5C /* Achievement.storyboard */, + C18E5F5E8BB5540D91968DDECE31869A /* Download.storyboard */, + 43CCCFC971513264AFA7256BA71653C4 /* Guide.storyboard */, + 8D37A25DCDC8B3EE48F56719264861F7 /* Init.storyboard */, + 58EF41D2CE42F9C421375B5B3CE8D60E /* Mission.storyboard */, + 27A75068DE95C7555DB599931ED8AEDE /* Performance.storyboard */, + E12E3AA69AEC8526DA02450D9F486C31 /* Ranking.storyboard */, + D13809AF4354422A199374B3465D8656 /* Record.storyboard */, + A085D0FCAAED86B5EF798D2FF4C4EE5E /* SignIn.storyboard */, + 9F70C67599FC388CA2F8CD0D50622CAF /* Song.storyboard */, + 7E1371C9E28AB4CD6449FA7FD0074E25 /* Tip.storyboard */, + 721D3123DF4906650661109B36D4EFC2 /* Top50.storyboard */, + 4D08ADAD88BBB07FBB95CF8CD62CB6ED /* Trophy.storyboard */, + 808F49E6EA3E0B9F118A59BCD1C399A9 /* Upload.storyboard */, + ); + path = Storyboards; sourceTree = ""; }; - 19E767C220EE4A7A008C9F9D /* Controller */ = { + 5D4F9048A9B3DBDEA814C19E7768DCB8 /* Extension */ = { isa = PBXGroup; children = ( - 19E02ACB2049199C0070D72B /* AchievementViewController.swift */, - 1976FD04211239E600B80C4C /* AchievementBaseTableViewController.swift */, - 193DE8D7204920EF00A829BB /* AchievementAllTableViewController.swift */, - 19320FBB204942390075BD86 /* AchievementMusicTableViewController.swift */, - 19320FBD204942440075BD86 /* AchievementGearTableViewController.swift */, - 19320FBF2049424D0075BD86 /* AchievementNoteTableViewController.swift */, - 19D1EF412069E9D600F2BFD5 /* AchievementPlateTableViewController.swift */, - 19320FC1204942590075BD86 /* AchievementGalleryTableViewController.swift */, - 19320FC3204942640075BD86 /* AchievementCommentTableViewController.swift */, + 6F8D863B4192345379FAA072605B014B /* CAGradientLayer+.swift */, + 00C0A70ADF02A515C554A2A7F65D04D0 /* Double+.swift */, + A9BE0A154D3D7E018D76684B281CECD0 /* MissionSection.BS+Gradient.swift */, + 91CBAA567778CAD53CB93CE152F92D55 /* MissionSection.CE+Gradient.swift */, + 60EAD4483197E0A753FDD10845C98D09 /* MissionSection.LinkDisk+Gradient.swift */, + A09D0FEC3D95CCD8ECE16CBDA7084FFA /* MissionSection.Respect+Gradient.swift */, + 79D7A5F0799CF86A96D301D82B8B1090 /* MissionSection.Technika1+Gradient.swift */, + 241BD9807E33EA3CBBF302A35813F5C2 /* MissionSection.Technika2+Gradient.swift */, + FBF7FCA66B507564BF411BB82D824394 /* MissionSection.Technika3+Gradient.swift */, + 6B59269E3AB75988A25F6D4EF5088A20 /* MissionSection.Trilogy+Gradient.swift */, + 90B143CCDE9CB1920C76E56DFB8E619A /* NSObject+.swift */, + 9A9970140918A7A61332718A9C9D8322 /* Series+UI.swift */, + 08640281899B112DEB6A0A0A56A169B7 /* String+.swift */, + 42BE04F264C300B56C92EE575A854683 /* UIAlertController+.swift */, + 2FC485CCFD9749EE1E561DFAE98EA11C /* UIColor+.swift */, + 4DB6EB0A090B3EC667134B3DD24AA2A8 /* UIView+.swift */, + 0933C1D68D4630ABCB0E824F3B06E6FA /* UIViewController+.swift */, ); - path = Controller; + path = Extension; sourceTree = ""; }; - 19E767C320EE4A7F008C9F9D /* View */ = { + 8C39E2F22ACC076DC42FDB206D09998B /* Pods */ = { isa = PBXGroup; children = ( - 193DE8DA204922B400A829BB /* AchievementCell.xib */, - 193DE8D9204922B400A829BB /* AchievementCell.swift */, + 1FD55BA517A60A14D8EC54ACB1C7B9D4 /* Pods-RespectU.debug.xcconfig */, + 56193FB5ED1B44771800EF26128FEE44 /* Pods-RespectU.release.xcconfig */, ); - path = View; + name = Pods; sourceTree = ""; }; - 19E767C620EE4B8F008C9F9D /* Record */ = { + 8D8DE4462AD18D5C9FBDAE4C752104CB /* Record */ = { isa = PBXGroup; children = ( - 193E3FF0204B9C240063A440 /* Record.storyboard */, - 19E767CF20EE529D008C9F9D /* View */, - 19E767CE20EE529A008C9F9D /* Controller */, + 4BBD21C11306FD9C54E163A20FF8FA24 /* RecordAllTableViewController.swift */, + 101CE93B365835BBA1D7A917C71B524B /* RecordBSTableViewController.swift */, + A646CCC720C494D646FECAB5677C1E21 /* RecordBaseTableViewController.swift */, + 164C0B9C9329B63A84146A68B44211AF /* RecordCETableViewController.swift */, + C7CF5FBE9FE442E18A869E8FFDBB6596 /* RecordPortable1TableViewController.swift */, + 5F75FFB849D9280269D8A4130772A059 /* RecordPortable2TableViewController.swift */, + 0A7A724B52192252A0101E5F2B3DC658 /* RecordRespectTableViewController.swift */, + C86C6C9262E8EB75FB7589033C1F2EC4 /* RecordTechnika1TableViewController.swift */, + 4CAF7442CCE225037AD440CAED1A2F46 /* RecordTechnika2TableViewController.swift */, + 394457A6318FCBA35633C05384AA8D50 /* RecordTechnika3TableViewController.swift */, + DB8FDB96924415810F26D8A3D5DCC643 /* RecordTrilogyTableViewController.swift */, + 6CDC8CD7AE0EAE20F102844365138098 /* RecordViewController.swift */, ); path = Record; sourceTree = ""; }; - 19E767C720EE4BB1008C9F9D /* Main */ = { + 8DF3A774BF43B4036BD34DF2BD579861 /* Models */ = { isa = PBXGroup; children = ( - 19012FB72048345B0061EF21 /* Guide.storyboard */, - 19012FBD2048370C0061EF21 /* GuideViewController.swift */, - 199233D3216F934000E040D7 /* View */, + 3C37ECC78732D6E4E089B5B5F40D5C39 /* Realm */, + 2AA94CA525D5326C0F9292D848B27357 /* Response */, + 42590FD8BDFA7FDB31E81239FE1C5C9D /* Persistence.swift */, ); - path = Main; + path = Models; sourceTree = ""; }; - 19E767C820EE4CFE008C9F9D /* Tip */ = { + 972A99E7912E2E62EFC5A428100DB74D /* Sources */ = { isa = PBXGroup; children = ( - 1968184E20490ADA0007F4D7 /* Tip.storyboard */, - 1968185020490C730007F4D7 /* TipViewController.swift */, - ); - path = Tip; + F55F42DFD5564A7201A35AED4C0C7711 /* Common */, + 5D4F9048A9B3DBDEA814C19E7768DCB8 /* Extension */, + 8DF3A774BF43B4036BD34DF2BD579861 /* Models */, + 3E12508306EBDEC69462D36DFA6BEFEA /* Services */, + 539479A4BEF977EA27AC2FB7CA91479A /* Storyboards */, + F52F1EEA1BCB911FDF2367C055D146A3 /* Utils */, + B034FAFADF95A3BFA01844EFE7759F71 /* ViewControllers */, + DF613463216FC79F328D85241366F912 /* Views */, + 437358F63E7EFA7C3FA6E22357580622 /* AppDelegate.swift */, + ); + path = Sources; sourceTree = ""; }; - 19E767CC20EE51A5008C9F9D /* Start */ = { + A46844350BC9B268B02AB78EE74B6B3F /* Constants */ = { isa = PBXGroup; children = ( - 19B6CFF71F7953640097B86B /* LaunchScreen.storyboard */, - 193C285D213674F7001EB7F3 /* View */, - 193C285321366C1B001EB7F3 /* SignIn.storyboard */, - 193C285521366C28001EB7F3 /* SignInViewController.swift */, - 193C285B213674B1001EB7F3 /* SignUpViewController.swift */, + 3FAFF4A05D2722646FFDB1A59C751CA5 /* SkillLevel.swift */, + 0E664D69C5666D40413DD76EC3EEB905 /* SkillPoint.swift */, ); - path = Start; + path = Constants; sourceTree = ""; }; - 19E767CD20EE528D008C9F9D /* Main */ = { + B034FAFADF95A3BFA01844EFE7759F71 /* ViewControllers */ = { isa = PBXGroup; children = ( - 19E767DD20EE59A7008C9F9D /* SkillLevelDetail */, - 19012FB52048344F0061EF21 /* Performance.storyboard */, - 19012FBB204837040061EF21 /* PerformanceViewController.swift */, - ); - path = Main; + BCC1824A0F6A2E4EA0FF69D486DEF75B /* Achievement */, + 445B0360A0454D1B76771D8E3B21822B /* Mission */, + C6235F3AD59BE4F244409868A56D0272 /* Ranking */, + 8D8DE4462AD18D5C9FBDAE4C752104CB /* Record */, + FA350755E73EE6F25B8E1BC09F37C9AE /* Song */, + 20CD4E18015C56EA046398F6514DA8D4 /* Top50 */, + B970CDD544097EA756329B724C3F86E1 /* Trophy */, + 091109F5110F4F89963C64B091604CEE /* BaseViewController.swift */, + 7684A5E7EAE2568B15BCA4F2AEF65CA2 /* DownloadViewController.swift */, + 93A63669D5CF070426162547AE2374EB /* GuideViewController.swift */, + 117BC6C5BE267F11B4EEF031AEA2892E /* InitViewController.swift */, + AFC8A42FD9DBB28DB007F737E8557BB7 /* PerformanceViewController.swift */, + 4B54A2548B3BB3E75F221CEAFB441651 /* SearchRecordDetailViewController.swift */, + C194554A77881C517795E91A8F23124E /* SearchRecordViewController.swift */, + 423FC743627303AF97314223CD2F8B7B /* SignInViewController.swift */, + D774FFC53CC59564C3B6E8255A6FDE76 /* SignUpViewController.swift */, + 494ED1030BF0FF71A1E556B9468CD078 /* SkillLevelDetailViewController.swift */, + D5A1695D071CC7554C3FA877BC12B245 /* SummaryDetailViewController.swift */, + 91CCF1B33BD4D77BF5650BED697154D2 /* TipViewController.swift */, + D04A91E1391EB1A2505BB6E30EB1AD65 /* UploadViewController.swift */, + ); + path = ViewControllers; sourceTree = ""; }; - 19E767CE20EE529A008C9F9D /* Controller */ = { + B970CDD544097EA756329B724C3F86E1 /* Trophy */ = { isa = PBXGroup; children = ( - 193E3FF2204B9EB80063A440 /* RecordViewController.swift */, - 19F13FBB2112F161003E622E /* RecordBaseTableViewController.swift */, - 19D67EC520744EEB00FD9EC7 /* RecordAllTableViewController.swift */, - 196F82482074A787000DF337 /* RecordPortable1TableViewController.swift */, - 19D67EC720744F0700FD9EC7 /* RecordPortable2TableViewController.swift */, - 19D67ECB20744F1700FD9EC7 /* RecordRespectTableViewController.swift */, - 19D67ECD20744F2000FD9EC7 /* RecordTrilogyTableViewController.swift */, - 19D67ECF20744F3300FD9EC7 /* RecordCETableViewController.swift */, - 19D67ED120744F3D00FD9EC7 /* RecordTechnika1TableViewController.swift */, - 191A8B7B20E4FAAC0064F93E /* RecordBSTableViewController.swift */, - 199233CF216F743600E040D7 /* RecordTechnika2TableViewController.swift */, + D0C2415AABC509E942301DF3589F55F8 /* TrophyBSTableViewController.swift */, + C865E14A01D3C67FEEE5EAF375899C7D /* TrophyBaseTableViewController.swift */, + 67B09CACDD60C508B1CEBEF21A39E14C /* TrophyCETableViewController.swift */, + FA2852A77D854438A0267E99C8067691 /* TrophyLinkDiskTableViewController.swift */, + FF98B5B953A51AE19F56E640C40E2687 /* TrophyRespectTableViewController.swift */, + 7C2B8192D8437447475180972270F1A2 /* TrophyTechnika1TableViewController.swift */, + 9DDBE69BDF91490724A4508E8150A75F /* TrophyTechnika2TableViewController.swift */, + A875376A5EBE583D9D47E2CCA367EB4F /* TrophyTechnika3TableViewController.swift */, + 40F9848262F8DA6D81D931CC8DE5FA0A /* TrophyTrilogyTableViewController.swift */, + 54A0585B9094D54EA2EE91A30C6265FA /* TrophyViewController.swift */, ); - path = Controller; + path = Trophy; sourceTree = ""; }; - 19E767CF20EE529D008C9F9D /* View */ = { + BABB834570920E337F6C42A3A35C4EFB /* Resources */ = { isa = PBXGroup; children = ( - 193E3FF4204BB0D80063A440 /* RecordView.xib */, - 193E3FF6204BB1060063A440 /* RecordView.swift */, - 196F824B2074A91B000DF337 /* RecordCell.xib */, - 196F824E2074AD49000DF337 /* RecordCell.swift */, + 18065202F58A802DC160A40289791915 /* SwiftGen */, + E683F525A54716C4D6BE56A96EEDCB29 /* Assets.xcassets */, + 0FFF8FE8E83D48C24E4B183637AC73A8 /* LaunchScreen.storyboard */, + B30E23955E630DE10DDEE4E073034629 /* Localizable.strings */, ); - path = View; + path = Resources; sourceTree = ""; }; - 19E767D020EE53DB008C9F9D /* Top50 */ = { + BCC1824A0F6A2E4EA0FF69D486DEF75B /* Achievement */ = { isa = PBXGroup; children = ( - 193E401E204C07F40063A440 /* Top50.storyboard */, - 19E767D320EE5501008C9F9D /* View */, - 19E767D220EE5485008C9F9D /* Controller */, + D208137CF7035F090957DD52BFD704BC /* AchievementAllTableViewController.swift */, + ECF59229051F5AD6A883EFD1E5A2603E /* AchievementBaseTableViewController.swift */, + 07507A73DE0099DC9CFB4ABA9FB0DC0C /* AchievementCommentTableViewController.swift */, + 8CB2A66DC82F6391EEEF838491861F33 /* AchievementGalleryTableViewController.swift */, + 81A0CEB91040D7176F26D4F0FDD21D28 /* AchievementGearTableViewController.swift */, + C728DBB0614587CD2759E53BD1A65882 /* AchievementMusicTableViewController.swift */, + 18449AAA9B8578063135A1485D123683 /* AchievementNoteTableViewController.swift */, + 08F04BA7E15EC807F3B9CAA3AEF98239 /* AchievementPlateTableViewController.swift */, + AEEACD594FBA67A330D104F816D4D968 /* AchievementViewController.swift */, ); - path = Top50; + path = Achievement; sourceTree = ""; }; - 19E767D120EE53E0008C9F9D /* Ranking */ = { + C6235F3AD59BE4F244409868A56D0272 /* Ranking */ = { isa = PBXGroup; children = ( - 193E4034204C24180063A440 /* Ranking.storyboard */, - 19E767D520EE55EA008C9F9D /* View */, - 19E767D420EE55E4008C9F9D /* Controller */, + E9EA4615ADDF5106D45E6C157F9935FE /* Ranking4BTableViewController.swift */, + A57D6592351D9AD16368506EE4633557 /* Ranking5BTableViewController.swift */, + DA8059779D1985F721E78B753EC4D776 /* Ranking6BTableViewController.swift */, + 2A61C0A29FAF3BAFDEA230CF7D855312 /* Ranking8BTableViewController.swift */, + 3C9306E0C24359552A85518112EFCC9D /* RankingBaseTableViewController.swift */, + 656538575F3D4D03C665378FB2C6E482 /* RankingViewController.swift */, ); path = Ranking; sourceTree = ""; }; - 19E767D220EE5485008C9F9D /* Controller */ = { - isa = PBXGroup; - children = ( - 193E4012204C02A30063A440 /* Top50ViewController.swift */, - 198B6C4B211382BC0058DE49 /* Top50BaseTableViewController.swift */, - 193E4020204C09DB0063A440 /* Top504BTableViewController.swift */, - 193E4022204C09E70063A440 /* Top505BTableViewController.swift */, - 193E4024204C09F20063A440 /* Top506BTableViewController.swift */, - 193E4026204C09FA0063A440 /* Top508BTableViewController.swift */, - ); - path = Controller; - sourceTree = ""; - }; - 19E767D320EE5501008C9F9D /* View */ = { + CA5641B4D07921D199A3C326E7E11880 /* XIBs */ = { isa = PBXGroup; children = ( - 193E4019204C05A00063A440 /* Top50Cell.xib */, - 193E4018204C05A00063A440 /* Top50Cell.swift */, - ); - path = View; + F957C9D0578879C4BFDF188CC7E9DB68 /* AchievementCell.xib */, + 4145F1EB5D7436740025D90996B48C6B /* GuideFirstCell.xib */, + ACAACBB2302A38B15286B2F10D57B0D2 /* GuideSecondCell.xib */, + 570419DC99D9A09F38A4AC7F521FCA9B /* GuideThirdCell.xib */, + 6F96CA2C329587E39822104CEF6C2C4D /* MissionCell.xib */, + 1BD862D1F9C81B97810DC117707740FB /* RankingCell.xib */, + CA9B676C5D60B5CCB2663B17DFB0D19B /* RecordCell.xib */, + A832024764FD1738185268E528614C3A /* RecordView.xib */, + 650873B493E00BDFE6552F230602E303 /* SearchByLevelView.xib */, + 65A74FCC87D5D9BBBEBAE0F47B7B68DA /* SearchByNoteView.xib */, + B6DD826AB9C764BFEA1BFE277466B01C /* SearchByRatingView.xib */, + E6C14F35B2B1A8D25A221C146D1C063B /* SearchRecordDetailCell.xib */, + 0A0189022C6BE4C949EA9505B6B3CA1C /* SkillLevelCell.xib */, + 62A4B18F7F37F18F820CB7408C91507F /* SkillLevelDetailView.xib */, + CDE48D134E382F52D49F7020BDAE3546 /* SongCell.xib */, + EDC63C6945BBA9A7159F95B906AC4F52 /* SummaryCell.xib */, + DBBD5EC70A4CB6A25BE54391F562C59F /* SummaryCollectionCell.xib */, + 1907607DB6FA22EE22397D314C25E2C6 /* Top50Cell.xib */, + F3C75B35A37617F2B6A9DD8208FE2AD9 /* TrophyCell.xib */, + ); + path = XIBs; sourceTree = ""; }; - 19E767D420EE55E4008C9F9D /* Controller */ = { + DC130C869CC4C032B6E7EDA0329E7A64 /* RespectU */ = { isa = PBXGroup; children = ( - 193E4028204C237A0063A440 /* RankingViewController.swift */, - 198B6C4D211382C70058DE49 /* RankingBaseTableViewController.swift */, - 193E402A204C23E90063A440 /* Ranking4BTableViewController.swift */, - 193E402C204C23F40063A440 /* Ranking5BTableViewController.swift */, - 193E402E204C23FD0063A440 /* Ranking6BTableViewController.swift */, - 193E4030204C24060063A440 /* Ranking8BTableViewController.swift */, + BABB834570920E337F6C42A3A35C4EFB /* Resources */, + 972A99E7912E2E62EFC5A428100DB74D /* Sources */, + 0AF22290FFB9BA0E2E99ED1E48E897FD /* Supports */, ); - path = Controller; - sourceTree = ""; - }; - 19E767D520EE55EA008C9F9D /* View */ = { - isa = PBXGroup; - children = ( - 193E403A204C2EB60063A440 /* RankingCell.xib */, - 193E4036204C27220063A440 /* RankingCell.swift */, - ); - path = View; - sourceTree = ""; - }; - 19E767D620EE560D008C9F9D /* Summary */ = { - isa = PBXGroup; - children = ( - 19E767D920EE5650008C9F9D /* SearchRecord */, - 19E767D720EE5626008C9F9D /* View */, - ); - path = Summary; - sourceTree = ""; - }; - 19E767D720EE5626008C9F9D /* View */ = { - isa = PBXGroup; - children = ( - 193E4007204BF37E0063A440 /* SummaryCell.xib */, - 193E4006204BF37E0063A440 /* SummaryCell.swift */, - 198FC960204D24BD0026BA1D /* SummaryCollectionCell.xib */, - 198FC95F204D24BD0026BA1D /* SummaryCollectionCell.swift */, - ); - path = View; - sourceTree = ""; - }; - 19E767D920EE5650008C9F9D /* SearchRecord */ = { - isa = PBXGroup; - children = ( - 19E767DB20EE58CE008C9F9D /* View */, - 19E767DC20EE58D3008C9F9D /* Controller */, - ); - path = SearchRecord; + path = RespectU; sourceTree = ""; }; - 19E767DA20EE5714008C9F9D /* SkillLevel */ = { + DF613463216FC79F328D85241366F912 /* Views */ = { isa = PBXGroup; children = ( - 193E400B204BF5D60063A440 /* SkillLevelCell.xib */, - 193E400A204BF5D60063A440 /* SkillLevelCell.swift */, - 19E767D020EE53DB008C9F9D /* Top50 */, - 19E767D120EE53E0008C9F9D /* Ranking */, - ); - path = SkillLevel; + CA5641B4D07921D199A3C326E7E11880 /* XIBs */, + 623DBE7ABE62C6ED2C6A96D8B561D1BC /* AchievementCell.swift */, + 48EB4DE7C46CAC769FAD64B4062EA5AC /* GuideFirstCell.swift */, + 88C214B5C6340C681D687A5837D49CB2 /* GuideSecondCell.swift */, + C2C849886AF9CEC2084D57D6610826D0 /* GuideThirdCell.swift */, + 5E6BC6E8EAEFF1FB31DF48435303F350 /* MissionCell.swift */, + B6DC6B20F4435BC55F0363155B189EA9 /* RankingCell.swift */, + 2991773C4B90001F83182265FA5298FA /* RecordCell.swift */, + 6D899C6158365DC40A43EFA3FBD53860 /* RecordView.swift */, + 16CA587AC64BBF7D9615B18AE922CCA5 /* SearchByLevelView.swift */, + D8DA77CE4436FD7F1B3A85A2993A6875 /* SearchByNoteView.swift */, + 8205116CE68B6DBD1CE90AC4439DE832 /* SearchByRatingView.swift */, + 5C7E6B6B900C98599DF992D190397ED8 /* SearchRecordDetailCell.swift */, + C48AF305EFDF8EDEE8CE8D136BC9FEEB /* SignInTextField.swift */, + 2AC69B55FC64D7C31A86A33852EAB0AC /* SkillLevelCell.swift */, + F0CC6B551EBD0EC656F35FD74247ED8D /* SkillLevelDetailView.swift */, + 59AC73FB70CC51A8AFAC0050C039CF14 /* SongCell.swift */, + D8D3AEF54E1F8CB4F0C230AE0F4A274D /* SummaryCell.swift */, + 7141F43FD5DD9A34D35E2692CB721D4A /* SummaryCollectionCell.swift */, + 4A4C312CB6DC58847B1ACBECB8F95A8F /* Top50Cell.swift */, + 7C8E87A2B03543FCDFA459E10DCEBCDF /* TrophyCell.swift */, + ); + path = Views; sourceTree = ""; }; - 19E767DB20EE58CE008C9F9D /* View */ = { + F52F1EEA1BCB911FDF2367C055D146A3 /* Utils */ = { isa = PBXGroup; children = ( - 19892A8520662D0A009D01F8 /* SearchByLevelView.xib */, - 19892A8720662F83009D01F8 /* SearchByLevelView.swift */, - 1986CA2C205F542100CA43EA /* SearchByRateView.xib */, - 199EFFE52067D51B00A6068F /* SearchByRateView.swift */, - 1986CA30205F543F00CA43EA /* SearchByNoteView.xib */, - 1986CA32205F544900CA43EA /* SearchByNoteView.swift */, - 1986CA39205FC85A00CA43EA /* SearchRecordDetailCell.xib */, - 1986CA38205FC85A00CA43EA /* SearchRecordDetailCell.swift */, + BBC86C6F0F8F435FA71C29C5A32617CF /* Utils.swift */, ); - path = View; + path = Utils; sourceTree = ""; }; - 19E767DC20EE58D3008C9F9D /* Controller */ = { + F55F42DFD5564A7201A35AED4C0C7711 /* Common */ = { isa = PBXGroup; children = ( - 19ECEE67205EBBA3000D742E /* SearchRecordViewController.swift */, - 1986CA36205FC26600CA43EA /* SearchRecordDetailViewController.swift */, - 198FC963204D2E9F0026BA1D /* SummaryDetailViewController.swift */, - ); - path = Controller; + A46844350BC9B268B02AB78EE74B6B3F /* Constants */, + 6E8609566688513F20D56F71E8C2A73E /* AchievementType.swift */, + 7994394D253D83388739913632BF52F4 /* Button.swift */, + 3556AE9C2F4DBEEEF2277634864736F6 /* Difficulty.swift */, + 9CB2C96445D032E82864C978003715B1 /* GradientDirection.swift */, + 27FD193AE2FCE3A3F96143D41ADBCC7F /* MissionSection.swift */, + 9AF510989C994AF286BAC6EFC98F3D86 /* Note.swift */, + D9B229B6B9B7142C2A461D7DEB2A7113 /* RUButton.swift */, + A4B1BD7EAB31E7E51B602AF90FC5C2AE /* Rank.swift */, + CA2ABF5BEC5BFF80DD120FEE7AC45F14 /* SearchRecordDetail.swift */, + 9ADF8D0329CDE33DD67FC75E36D63E92 /* Series.swift */, + 4298E98CCC40A6C7EFDE5510CEDED521 /* TrophyGrade.swift */, + ); + path = Common; sourceTree = ""; }; - 19E767DD20EE59A7008C9F9D /* SkillLevelDetail */ = { + FA350755E73EE6F25B8E1BC09F37C9AE /* Song */ = { isa = PBXGroup; children = ( - 19F38C92204CC69A006BB72B /* SkillLevelDetailViewController.swift */, - 19F38C94204CC957006BB72B /* SkillLevelDetailView.xib */, - 19F38C96204CC962006BB72B /* SkillLevelDetailView.swift */, + EBDBA54D2C97FB9571C3176FE9BFB0F4 /* SongAllTableViewController.swift */, + A2D27FEA1E4484DB3A555B53E4AE9B1D /* SongBSTableViewController.swift */, + F23F5730F0C449DE84E323068105AB47 /* SongBaseTableViewController.swift */, + B9C089EAB1BA22820E5EE21E20936E08 /* SongCETableViewController.swift */, + 06634141A9D0AD50CB5CF1C56489B8AB /* SongPortable1TableViewController.swift */, + CFE0B54506B42D2B43A668825784A336 /* SongPortable2TableViewController.swift */, + D72A74447C5271E64A723356FA2C76C8 /* SongRespectTableViewController.swift */, + 8ABC647AFC387EECD6791F100EBED31D /* SongTechnika1TableViewController.swift */, + EED82018840FD1A5C9368EF3CB51DB1E /* SongTechnika2TableViewController.swift */, + 59AA6BC0369E1C3C4B40AB8BE89DBF5A /* SongTechnika3TableViewController.swift */, + ABF4E0839B1BC3BA0A3E14EA1484CB79 /* SongTrilogyTableViewController.swift */, + B7FF17875A680B2300216805CB27FC73 /* SongViewController.swift */, ); - path = SkillLevelDetail; + path = Song; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ - 1984269421B7EA0A001F491C /* RespectUUITests */ = { + 53800806E58C491F36E83AB35BB564AC /* RespectU */ = { isa = PBXNativeTarget; - buildConfigurationList = 1984269E21B7EA0A001F491C /* Build configuration list for PBXNativeTarget "RespectUUITests" */; + buildConfigurationList = B38D91F6525B0B0DE2ED6599F2AACFAA /* Build configuration list for PBXNativeTarget "RespectU" */; buildPhases = ( - 1984269121B7EA0A001F491C /* Sources */, - 1984269221B7EA0A001F491C /* Frameworks */, - 1984269321B7EA0A001F491C /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 1984269B21B7EA0A001F491C /* PBXTargetDependency */, - ); - name = RespectUUITests; - productName = RespectUUITests; - productReference = 1984269521B7EA0A001F491C /* RespectUUITests.xctest */; - productType = "com.apple.product-type.bundle.ui-testing"; - }; - 19B6CFE71F7953640097B86B /* RespectU */ = { - isa = PBXNativeTarget; - buildConfigurationList = 19B6CFFD1F7953640097B86B /* Build configuration list for PBXNativeTarget "RespectU" */; - buildPhases = ( - ACCC095D57656A367F5A176A /* [CP] Check Pods Manifest.lock */, - 19B6CFE41F7953640097B86B /* Sources */, - 19B6CFE51F7953640097B86B /* Frameworks */, - 19B6CFE61F7953640097B86B /* Resources */, - 19AC39071F7C806400F170E3 /* Embed Frameworks */, - C9B922FB66CA15EEEF5CB728 /* [CP] Embed Pods Frameworks */, - 1958DAB42151310A00D8AE41 /* ShellScript */, + 1CFF7C5E1F0C3443B93124A6A0883789 /* [CP] Check Pods Manifest.lock */, + FD200D377BD1038D5A4C9C58714E142F /* Sources */, + 839AEC169A324E09CA1B0D14A3648128 /* Frameworks */, + 72DDAEA643E90A1BCF6BA439AB5357F9 /* Resources */, + 986F5D33F92011D3107756C335FC6CA9 /* Embed Frameworks */, + 23A4E8BE0FBA23FA9F618FA39F6A823E /* [CP] Embed Pods Frameworks */, + 6B9838C945CC6522168EBB1BDADB286A /* ShellScript */, ); buildRules = ( ); @@ -1122,13 +928,13 @@ ); name = RespectU; productName = RespectU; - productReference = 19B6CFE81F7953640097B86B /* RespectU.app */; + productReference = 493FFC326138371B1937E2E2D26236EA /* RespectU.app */; productType = "com.apple.product-type.application"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ - 19B6CFE01F7953640097B86B /* Project object */ = { + F8D8F66833AEC30332B8A3A3D9FE6E49 /* Project object */ = { isa = PBXProject; attributes = { DefaultBuildSystemTypeForWorkspace = Original; @@ -1136,19 +942,14 @@ LastUpgradeCheck = 0940; ORGANIZATIONNAME = Presto; TargetAttributes = { - 1984269421B7EA0A001F491C = { - CreatedOnToolsVersion = 10.1; - ProvisioningStyle = Automatic; - TestTargetID = 19B6CFE71F7953640097B86B; - }; - 19B6CFE71F7953640097B86B = { + 53800806E58C491F36E83AB35BB564AC = { CreatedOnToolsVersion = 9.0; - LastSwiftMigration = 0920; + LastSwiftMigration = 1010; ProvisioningStyle = Automatic; }; }; }; - buildConfigurationList = 19B6CFE31F7953640097B86B /* Build configuration list for PBXProject "RespectU" */; + buildConfigurationList = 0E9E9ABFE98FE5F0D25FC9624352329B /* Build configuration list for PBXProject "RespectU" */; compatibilityVersion = "Xcode 8.0"; developmentRegion = en; hasScannedForEncodings = 0; @@ -1156,92 +957,66 @@ en, Base, ); - mainGroup = 19B6CFDF1F7953640097B86B; - productRefGroup = 19B6CFE91F7953640097B86B /* Products */; + mainGroup = 3098D44DFD511F131146813BE30FD512; + productRefGroup = 49A4A62F46B05C7357E7399A48C50D4D /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( - 19B6CFE71F7953640097B86B /* RespectU */, - 1984269421B7EA0A001F491C /* RespectUUITests */, + 53800806E58C491F36E83AB35BB564AC /* RespectU */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ - 1984269321B7EA0A001F491C /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 19B6CFE61F7953640097B86B /* Resources */ = { + 72DDAEA643E90A1BCF6BA439AB5357F9 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 1958DAB62151312700D8AE41 /* .swiftlint.yml in Resources */, - 195A6A26216F17F90072D03A /* IndicatorView.xib in Resources */, - 199233DE216F939A00E040D7 /* GuideSecondCell.xib in Resources */, - 193E4009204BF37E0063A440 /* SummaryCell.xib in Resources */, - 19892A8620662D0A009D01F8 /* SearchByLevelView.xib in Resources */, - 1986CA3B205FC85A00CA43EA /* SearchRecordDetailCell.xib in Resources */, - 193E401B204C05A00063A440 /* Top50Cell.xib in Resources */, - 193C285421366C1B001EB7F3 /* SignIn.storyboard in Resources */, - 1986CA31205F543F00CA43EA /* SearchByNoteView.xib in Resources */, - 19F38C95204CC957006BB72B /* SkillLevelDetailView.xib in Resources */, - 193E3FF5204BB0D80063A440 /* RecordView.xib in Resources */, - 194E52B8204AC55900B84AFA /* SongCell.xib in Resources */, - 19012FB62048344F0061EF21 /* Performance.storyboard in Resources */, - 196F824D2074A91B000DF337 /* RecordCell.xib in Resources */, - 19320FD6204959BE0075BD86 /* TrophyCell.xib in Resources */, - 19E02ACA204919830070D72B /* Achievement.storyboard in Resources */, - 199233DA216F938D00E040D7 /* GuideFirstCell.xib in Resources */, - 193E3FF1204B9C240063A440 /* Record.storyboard in Resources */, - 19320FCA204955DC0075BD86 /* Song.storyboard in Resources */, - 1913B4102175C08700D6C93F /* HistoryCell.xib in Resources */, - 19B6CFF91F7953640097B86B /* LaunchScreen.storyboard in Resources */, - 193DE8DC204922B400A829BB /* AchievementCell.xib in Resources */, - 193E4035204C24180063A440 /* Ranking.storyboard in Resources */, - 19B660291F960FA800CCEFB5 /* Localizable.strings in Resources */, - 193E400D204BF5D60063A440 /* SkillLevelCell.xib in Resources */, - 1986CA2D205F542100CA43EA /* SearchByRateView.xib in Resources */, - 198FC962204D24BD0026BA1D /* SummaryCollectionCell.xib in Resources */, - 193C28672136E522001EB7F3 /* Download.storyboard in Resources */, - 1999920F2049641A00C74697 /* MissionCell.xib in Resources */, - 19585868213B0E76000C78C4 /* Init.storyboard in Resources */, - 19B6CFF61F7953640097B86B /* Assets.xcassets in Resources */, - 193E403B204C2EB60063A440 /* RankingCell.xib in Resources */, - 1968184F20490ADA0007F4D7 /* Tip.storyboard in Resources */, - 193C28602136C8E7001EB7F3 /* Upload.storyboard in Resources */, - 19320FC8204955D50075BD86 /* Mission.storyboard in Resources */, - 199233E2216F93A700E040D7 /* GuideThirdCell.xib in Resources */, - 19012FB82048345B0061EF21 /* Guide.storyboard in Resources */, - 19320FC6204955CC0075BD86 /* Trophy.storyboard in Resources */, - 193E401F204C07F40063A440 /* Top50.storyboard in Resources */, + EE5801B1F86B92BE4282BB1D1EAECC52 /* .swiftlint.yml in Resources */, + 6D1619C4051B8073FDAE2D1EE0F28DF1 /* Achievement.storyboard in Resources */, + DCE96025AC799FDF2C9F73446B22DA1D /* AchievementCell.xib in Resources */, + 90AE9C19BBE72AFD47EC3E391B1EAA1A /* Assets.xcassets in Resources */, + 8E46243F171B5DE4C8636DE0C7C4BC09 /* Download.storyboard in Resources */, + 3BB933CDB0A2F0ABF0AD9921098EB4E0 /* Guide.storyboard in Resources */, + D56DE493782E270E40CA51D4CDFBBD83 /* GuideFirstCell.xib in Resources */, + 7F9C5B8E757967B095FD6904890294BD /* GuideSecondCell.xib in Resources */, + 8EB9D7D19F3E905E268B6250460CEC96 /* GuideThirdCell.xib in Resources */, + 6B55743E37BEBB24B1B5DA326BAC689B /* Init.storyboard in Resources */, + E0045A82AD56B280294AD01E55A8F38A /* LaunchScreen.storyboard in Resources */, + EC915038C96954FF4B4502B9245CF3D0 /* Localizable.strings in Resources */, + 6873CA61A5E3DCF9DCE5B8DD11436346 /* Mission.storyboard in Resources */, + 2D1AD8A8A5662FEE12F6EED06FD06136 /* MissionCell.xib in Resources */, + FCFE1C1D08C5F261AD3D0C70A4B69522 /* Performance.storyboard in Resources */, + 5DD021C2FA893BE6587462DA9A2A44F0 /* Ranking.storyboard in Resources */, + 9EEC50F04F496B836CC03F7F55E1E041 /* RankingCell.xib in Resources */, + 067CB8ADCA8BA53E3AF6B4A7C94E5AB7 /* Record.storyboard in Resources */, + 3AF1AB6EF468C285F91398ABBA44F207 /* RecordCell.xib in Resources */, + 7A66BC667B82C33D8645F383FBB76040 /* RecordView.xib in Resources */, + FEDA948775D81128E2E2B3D648FF361D /* SearchByLevelView.xib in Resources */, + 5120FF3DED6B29ACE2B63AD182E35A7F /* SearchByNoteView.xib in Resources */, + 478698557F1DF8B2F9514DFC1DEBC2C4 /* SearchByRatingView.xib in Resources */, + 3B4823649EB3A4B226BB8675B0D96D34 /* SearchRecordDetailCell.xib in Resources */, + CF652EC9A502638F95140E9BBD58327D /* SignIn.storyboard in Resources */, + 2B4E785D2FF0512CDC3572A616A09DEA /* SkillLevelCell.xib in Resources */, + 84547A3E02B63C2D70B34C9F6602FF6D /* SkillLevelDetailView.xib in Resources */, + 9E93FD8E5248FEAC12520317AE75E78F /* Song.storyboard in Resources */, + 6C452B565623C505DA42D49FFBFA7FB0 /* SongCell.xib in Resources */, + 469E026861D632B5A1E4788F3168F2EE /* SummaryCell.xib in Resources */, + A9B9CE0F13F59292327D3DDD96BB4C27 /* SummaryCollectionCell.xib in Resources */, + FA269EB89C42EEF82524955630812EA2 /* Tip.storyboard in Resources */, + F2510C6CE3EB733695848E79C13CA0ED /* Top50.storyboard in Resources */, + F1041F8EA1D2FF11AEB9C969E7201130 /* Top50Cell.xib in Resources */, + 956AB4AC68AAE08C8B1027E71234A7D6 /* Trophy.storyboard in Resources */, + 63AA7EFC9C52C567308AC665EB07E0E4 /* TrophyCell.xib in Resources */, + C86374E3E25A9D8B40E03568CB353DCE /* Upload.storyboard in Resources */, + E8AC5E159FA0754BC70508BDEDA438B2 /* swiftgen.yml in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 1958DAB42151310A00D8AE41 /* ShellScript */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - ); - outputFileListPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "# Type a script or drag a script file from your workspace to insert its path.\n${PODS_ROOT}/SwiftLint/swiftlint\n"; - }; - ACCC095D57656A367F5A176A /* [CP] Check Pods Manifest.lock */ = { + 1CFF7C5E1F0C3443B93124A6A0883789 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -1259,7 +1034,7 @@ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - C9B922FB66CA15EEEF5CB728 /* [CP] Embed Pods Frameworks */ = { + 23A4E8BE0FBA23FA9F618FA39F6A823E /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -1271,7 +1046,9 @@ "${BUILT_PRODUCTS_DIR}/MarqueeLabel/MarqueeLabel.framework", "${BUILT_PRODUCTS_DIR}/Realm/Realm.framework", "${BUILT_PRODUCTS_DIR}/RealmSwift/RealmSwift.framework", + "${BUILT_PRODUCTS_DIR}/SVProgressHUD/SVProgressHUD.framework", "${BUILT_PRODUCTS_DIR}/SwiftKeychainWrapper/SwiftKeychainWrapper.framework", + "${BUILT_PRODUCTS_DIR}/Then/Then.framework", "${BUILT_PRODUCTS_DIR}/XLPagerTabStrip/XLPagerTabStrip.framework", ); name = "[CP] Embed Pods Frameworks"; @@ -1281,7 +1058,9 @@ "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MarqueeLabel.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Realm.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RealmSwift.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SVProgressHUD.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SwiftKeychainWrapper.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Then.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/XLPagerTabStrip.framework", ); runOnlyForDeploymentPostprocessing = 0; @@ -1289,240 +1068,272 @@ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-RespectU/Pods-RespectU-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 1984269121B7EA0A001F491C /* Sources */ = { - isa = PBXSourcesBuildPhase; + 6B9838C945CC6522168EBB1BDADB286A /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( - 1984269821B7EA0A001F491C /* RespectUUITests.swift in Sources */, - 198426A021B7EA3B001F491C /* SnapshotHelper.swift in Sources */, + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + outputFileListPaths = ( + ); + outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "if which swiftlint >/dev/null; then\nswiftlint\nelse\necho \"warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint\"\nfi\n"; }; - 19B6CFE41F7953640097B86B /* Sources */ = { +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + FD200D377BD1038D5A4C9C58714E142F /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 19E4DAF8213D896100837A95 /* RecordInfo.swift in Sources */, - 198B6C52211392CA0058DE49 /* Note.swift in Sources */, - 194E52B0204A948300B84AFA /* SongCETableViewController.swift in Sources */, - 199EFFE62067D51B00A6068F /* SearchByRateView.swift in Sources */, - 191A8B7E20E4FC930064F93E /* UIAlertController+.swift in Sources */, - 198FC964204D2E9F0026BA1D /* SummaryDetailViewController.swift in Sources */, - 194E52A6204A8F7B00B84AFA /* SongAllTableViewController.swift in Sources */, - 193E4029204C237B0063A440 /* RankingViewController.swift in Sources */, - 197414C82062A94A00D72626 /* TrophyTechnika1TableViewController.swift in Sources */, - 191275ED21120B080046AA3E /* BaseViewController.swift in Sources */, - 19E4DAF7213D896100837A95 /* MissionInfo.swift in Sources */, - 19D67ED020744F3400FD9EC7 /* RecordCETableViewController.swift in Sources */, - 19D1EF422069E9D600F2BFD5 /* AchievementPlateTableViewController.swift in Sources */, - 191A8B8020E51ACF0064F93E /* MissionLinkDiskTableViewController.swift in Sources */, - 192DF89B2111D92B0016F386 /* Series.swift in Sources */, - 199233D2216F85CF00E040D7 /* CommonButton.swift in Sources */, - 193E401A204C05A00063A440 /* Top50Cell.swift in Sources */, - 19320FCE2049568B0075BD86 /* TrophyRespectTableViewController.swift in Sources */, - 19E4DB00213D896100837A95 /* NewRecordDifficultyInfo.swift in Sources */, - 192CA337216F279600F37675 /* SongTechnika2TableViewController.swift in Sources */, - 1950D885212D6F92004ED086 /* LanguageResponse.swift in Sources */, - 193E3FF7204BB1060063A440 /* RecordView.swift in Sources */, - 199992172049654E00C74697 /* MissionCETableViewController.swift in Sources */, - 19320FC02049424D0075BD86 /* AchievementNoteTableViewController.swift in Sources */, - 198FC961204D24BD0026BA1D /* SummaryCollectionCell.swift in Sources */, - 19E4DAFC213D896100837A95 /* SongInfo.swift in Sources */, - 19320FC4204942640075BD86 /* AchievementCommentTableViewController.swift in Sources */, - 1963FF04217C664900FF6FE1 /* Date+.swift in Sources */, - 193E3FF3204B9EB80063A440 /* RecordViewController.swift in Sources */, - 193C285621366C28001EB7F3 /* SignInViewController.swift in Sources */, - 1913B4122175C15900D6C93F /* HistoryInfo.swift in Sources */, - 19B09E35212C5576005EE66D /* TipResponse.swift in Sources */, - 19D67EC820744F0700FD9EC7 /* RecordPortable2TableViewController.swift in Sources */, - 193E4031204C24060063A440 /* Ranking8BTableViewController.swift in Sources */, - 19D67EC620744EEB00FD9EC7 /* RecordAllTableViewController.swift in Sources */, - 19F38C93204CC69A006BB72B /* SkillLevelDetailViewController.swift in Sources */, - 191A8B7C20E4FAAC0064F93E /* RecordBSTableViewController.swift in Sources */, - 19892A8820662F83009D01F8 /* SearchByLevelView.swift in Sources */, - 19320FBC204942390075BD86 /* AchievementMusicTableViewController.swift in Sources */, - 194E52AA204A900D00B84AFA /* SongPortable2TableViewController.swift in Sources */, - 19ECEE68205EBBA3000D742E /* SearchRecordViewController.swift in Sources */, - 19F13FBA2112ED87003E622E /* Results+.swift in Sources */, - 1986CA33205F544900CA43EA /* SearchByNoteView.swift in Sources */, - 199992112049652700C74697 /* MissionViewController.swift in Sources */, - 1968185320490D300007F4D7 /* UIColor+.swift in Sources */, - 19E4DAF4213D896100837A95 /* SongButtonInfo.swift in Sources */, - 192DF89F2111DAC80016F386 /* TrophyGrade.swift in Sources */, - 191275F62112225E0046AA3E /* MissionBaseTableViewController.swift in Sources */, - 193E4008204BF37E0063A440 /* SummaryCell.swift in Sources */, - 19B660261F960E5800CCEFB5 /* String+.swift in Sources */, - 19320FD22049569D0075BD86 /* TrophyCETableViewController.swift in Sources */, - 19F24BB42049A62D0034D624 /* MissionDetailViewController.swift in Sources */, - 192CA339216F27A200F37675 /* MissionTechnika2TableViewController.swift in Sources */, - 194E52B7204AC55900B84AFA /* SongCell.swift in Sources */, - 19E4DB01213D896100837A95 /* AchievementInfo.swift in Sources */, - 192DF89D2111DA640016F386 /* Buttons.swift in Sources */, - 1913B40F2175C08700D6C93F /* HistoryCell.swift in Sources */, - 19012FBC204837040061EF21 /* PerformanceViewController.swift in Sources */, - 193E4023204C09E70063A440 /* Top505BTableViewController.swift in Sources */, - 198B6C4E211382C70058DE49 /* RankingBaseTableViewController.swift in Sources */, - 19CA98E1213D416D003371DB /* VersionResponse.swift in Sources */, - 196F82492074A788000DF337 /* RecordPortable1TableViewController.swift in Sources */, - 19E4DAFA213D896100837A95 /* LanguageInfo.swift in Sources */, - 198B6C502113913C0058DE49 /* Skill.swift in Sources */, - 19E4DAF6213D896100837A95 /* NewRecordButtonInfo.swift in Sources */, - 19320FD0204956940075BD86 /* TrophyTrilogyTableViewController.swift in Sources */, - 19E4DAF9213D896100837A95 /* TipInfo.swift in Sources */, - 198B6C562113E5A60058DE49 /* SkillLevel.swift in Sources */, - 196F824F2074AD49000DF337 /* RecordCell.swift in Sources */, - 19F2312F20156BBC00ADF825 /* Reachability.swift in Sources */, - 191275F8211232180046AA3E /* TrophyBaseTableViewController.swift in Sources */, - 19D67ECE20744F2000FD9EC7 /* RecordTrilogyTableViewController.swift in Sources */, - 193E402D204C23F40063A440 /* Ranking5BTableViewController.swift in Sources */, - 192CA33B216F27B000F37675 /* TrophyTechnika2TableViewController.swift in Sources */, - 197414CA2062A95400D72626 /* MissionTechnika1TableViewController.swift in Sources */, - 1939C973212BFF1900A6F8E3 /* Network.swift in Sources */, - 1958586A213B0E81000C78C4 /* InitViewController.swift in Sources */, - 193DE8D8204920EF00A829BB /* AchievementAllTableViewController.swift in Sources */, - 199992132049653900C74697 /* MissionRespectTableViewController.swift in Sources */, - 19D67ECC20744F1700FD9EC7 /* RecordRespectTableViewController.swift in Sources */, - 1986CA37205FC26600CA43EA /* SearchRecordDetailViewController.swift in Sources */, - 193E402B204C23E90063A440 /* Ranking4BTableViewController.swift in Sources */, - 195A6A25216F17F90072D03A /* IndicatorView.swift in Sources */, - 199233D9216F938D00E040D7 /* GuideFirstCell.swift in Sources */, - 1939C975212C004D00A6F8E3 /* API.swift in Sources */, - 1928D5FD211824DF00F7901F /* UITableViewCell+.swift in Sources */, - 19320FD5204959BE0075BD86 /* TrophyCell.swift in Sources */, - 199233E1216F93A700E040D7 /* GuideThirdCell.swift in Sources */, - 193E4027204C09FA0063A440 /* Top508BTableViewController.swift in Sources */, - 1939C970212BFD9200A6F8E3 /* UserResponse.swift in Sources */, - 19B09E33212C556F005EE66D /* AchievementResponse.swift in Sources */, - 1939C96E212BFD8500A6F8E3 /* RankingResponse.swift in Sources */, - 198B6C5C211443C70058DE49 /* Rank.swift in Sources */, - 19B09E2D212C555A005EE66D /* SongResponse.swift in Sources */, - 193C2858213671D5001EB7F3 /* SignInTextField.swift in Sources */, - 191275F421121B9D0046AA3E /* UIViewController+.swift in Sources */, - 193C285C213674B1001EB7F3 /* SignUpViewController.swift in Sources */, - 193DE8DB204922B400A829BB /* AchievementCell.swift in Sources */, - 192AFE2520E48AD50006397F /* MissionBSTableViewController.swift in Sources */, - 19E4DAFB213D896100837A95 /* VersionInfo.swift in Sources */, - 193E4017204C03C50063A440 /* UIView+.swift in Sources */, - 192AFE2920E48AE70006397F /* TrophyLinkDiskTableViewController.swift in Sources */, - 193E4025204C09F20063A440 /* Top506BTableViewController.swift in Sources */, - 193E3FF9204BCFB20063A440 /* Difficulty.swift in Sources */, - 199233D0216F743600E040D7 /* RecordTechnika2TableViewController.swift in Sources */, - 1999920E2049641A00C74697 /* MissionCell.swift in Sources */, - 1968F785213E7295003C026B /* NicknameResponse.swift in Sources */, - 1976FD05211239E600B80C4C /* AchievementBaseTableViewController.swift in Sources */, - 19012FBE2048370C0061EF21 /* GuideViewController.swift in Sources */, - 19B09E31212C5565005EE66D /* TrophyResponse.swift in Sources */, - 19F38C97204CC962006BB72B /* SkillLevelDetailView.swift in Sources */, - 193C28692136E52A001EB7F3 /* DownloadViewController.swift in Sources */, - 19F13FBC2112F161003E622E /* RecordBaseTableViewController.swift in Sources */, - 19535F0A204A8E74008C9A45 /* SongViewController.swift in Sources */, - 19320FCC2049566A0075BD86 /* TrophyViewController.swift in Sources */, - 19E4DAF5213D896100837A95 /* MissionStageInfo.swift in Sources */, - 199233DD216F939A00E040D7 /* GuideSecondCell.swift in Sources */, - 192DF8A12111DAED0016F386 /* MissionSection.swift in Sources */, - 19320FBE204942440075BD86 /* AchievementGearTableViewController.swift in Sources */, - 193E4021204C09DB0063A440 /* Top504BTableViewController.swift in Sources */, - 19E02ACC2049199C0070D72B /* AchievementViewController.swift in Sources */, - 19320FC2204942590075BD86 /* AchievementGalleryTableViewController.swift in Sources */, - 19B6CFEC1F7953640097B86B /* AppDelegate.swift in Sources */, - 19E4DAFE213D896100837A95 /* NewRecordInfo.swift in Sources */, - 19B09E2F212C555F005EE66D /* MissionResponse.swift in Sources */, - 191275EB211206790046AA3E /* NSObject+.swift in Sources */, - 193E4038204C27220063A440 /* RankingCell.swift in Sources */, - 19D67ED220744F3D00FD9EC7 /* RecordTechnika1TableViewController.swift in Sources */, - 19FD9CEE21355E110014A0D4 /* RecordResponse.swift in Sources */, - 193E402F204C23FD0063A440 /* Ranking6BTableViewController.swift in Sources */, - 194E52AC204A901A00B84AFA /* SongRespectTableViewController.swift in Sources */, - 1968185120490C730007F4D7 /* TipViewController.swift in Sources */, - 19E4DAFD213D896100837A95 /* TrophyInfo.swift in Sources */, - 194E52AE204A941E00B84AFA /* SongTrilogyTableViewController.swift in Sources */, - 193E400C204BF5D60063A440 /* SkillLevelCell.swift in Sources */, - 197414C62062A77A00D72626 /* SongTechnika1TableViewController.swift in Sources */, - 192AFE2720E48ADF0006397F /* TrophyBSTableViewController.swift in Sources */, - 198B6C4C211382BD0058DE49 /* Top50BaseTableViewController.swift in Sources */, - 191C36672170F9B100B2594B /* CAGradientLayer+.swift in Sources */, - 199992152049654500C74697 /* MissionTrilogyTableViewController.swift in Sources */, - 193E4013204C02A30063A440 /* Top50ViewController.swift in Sources */, - 191275F2211210610046AA3E /* SongBaseTableViewController.swift in Sources */, - 192AFE2320E48ACA0006397F /* SongBSTableViewController.swift in Sources */, - 193C28622136C8F0001EB7F3 /* UploadViewController.swift in Sources */, - 194E52A8204A8F9900B84AFA /* SongPortable1TableViewController.swift in Sources */, - 1986CA3A205FC85A00CA43EA /* SearchRecordDetailCell.swift in Sources */, + B33FCC0BE699D423F86B0CA60B201E5D /* APIService+Achievement.swift in Sources */, + 0EEC0969D24C14614F3852EC64FF8EDE /* APIService+Base.swift in Sources */, + 03E7939635EDE9C2551CF5AD294F582D /* APIService+Mission.swift in Sources */, + FB483D4534B0C1A9CB4E62CBBCB678DB /* APIService+Ranking.swift in Sources */, + 42DD4D7660CB5C856E21164943943414 /* APIService+Record.swift in Sources */, + 2C72DE5923F7655BC252D19C1068F813 /* APIService+Song.swift in Sources */, + B614B0C989214B6E5E0AE3994B6DA84D /* APIService+Tip.swift in Sources */, + B49EF0D157083F66A516584A093A9775 /* APIService+Trophy.swift in Sources */, + 12AD6ED4E6B2F3FCB7E5FBD427D0BEAA /* APIService+User.swift in Sources */, + A368D670D9ECB37DBA7FDF40293DCC9F /* AchievementAllTableViewController.swift in Sources */, + 9F424786F18F120DFA3B54AA97CFE58D /* AchievementBaseTableViewController.swift in Sources */, + AD5AD544FF4F2D2C8F1B5317859CF690 /* AchievementCell.swift in Sources */, + 77A3641A412E2281169BC43A482D1E91 /* AchievementCommentTableViewController.swift in Sources */, + 51224183DF5D5EE431F19419618869BD /* AchievementGalleryTableViewController.swift in Sources */, + 79411DF6AB24D237EE95FD55E977CAEA /* AchievementGearTableViewController.swift in Sources */, + E1CBFF554215B6EE966299F65FC12C15 /* AchievementInfo.swift in Sources */, + EDDF63E5EFFCFFE2BAEED87EF03CA87B /* AchievementMusicTableViewController.swift in Sources */, + B6352BF809F83287D010471DA3CE8ACC /* AchievementNoteTableViewController.swift in Sources */, + 21210F283185F19A775BAC369EA72133 /* AchievementPlateTableViewController.swift in Sources */, + 4C17D5C69A95D3C1A2160AE91E036869 /* AchievementResponse.swift in Sources */, + B4CB2D7CBA623EA489565AB780044FE6 /* AchievementType.swift in Sources */, + A85CA7512FCCF5A4CD116BCDCD8795A1 /* AchievementViewController.swift in Sources */, + 9C5BD16964B01CE4E826C0714E7BFB7C /* AppDelegate.swift in Sources */, + BE9081C6FD851727989460A4D055C02E /* Assets.swift in Sources */, + C49BDBE7974F6333739B639CFBC5DB8A /* BaseViewController.swift in Sources */, + 16E72F47E46466C1D0F72348BC1734D2 /* Button.swift in Sources */, + 94382F584F379628F8CCCEEF51AA8C23 /* CAGradientLayer+.swift in Sources */, + 36105E909ADA369CB7D0D1B675FED1F4 /* Difficulty.swift in Sources */, + 1B7BDC0518E8261BB7E114B238485E0D /* Double+.swift in Sources */, + 53DC6066E155D2567781E494547956C9 /* DownloadViewController.swift in Sources */, + 38C447D6D1AE123FA0B3D40D21AEE863 /* GradientDirection.swift in Sources */, + 78989219547DC155E6A2BFB50D1CE084 /* GuideFirstCell.swift in Sources */, + 773E3FDD1DEE5F4CB711CDB6039FC8E6 /* GuideSecondCell.swift in Sources */, + A6CF37762CAA065A967E3883E5957CB3 /* GuideThirdCell.swift in Sources */, + CD55E0CB7597D32784C77016C147A6AD /* GuideViewController.swift in Sources */, + 7E0990E3AE966B278DF432343CED2319 /* InitViewController.swift in Sources */, + C663E15915C31A522FC58453C8860335 /* LanguageInfo.swift in Sources */, + 9C9BB24EC5E6266278706EC8E1687942 /* LanguageResponse.swift in Sources */, + 07E412854081E98BAA9EC7826338343C /* MissionBSTableViewController.swift in Sources */, + 9DCD5A88AE046BE67E43FDE46C8F33C3 /* MissionBaseTableViewController.swift in Sources */, + 8007E7D37842446EFC1FDF6AFC2639EC /* MissionCETableViewController.swift in Sources */, + 297DFEEE2C220A5C1F47BAA6F2AC87B7 /* MissionCell.swift in Sources */, + 0179E468A4893A10BE09245347B49401 /* MissionDetailViewController.swift in Sources */, + C901A043E201D80F7AD41DCA311F210F /* MissionInfo.swift in Sources */, + 99897C2ED7674E739230DED65BDC06D2 /* MissionLinkDiskTableViewController.swift in Sources */, + 80F2294D348F4A43E2CB8F35028D0423 /* MissionRespectTableViewController.swift in Sources */, + 90AF44D559BE00DEB63346B84D141E10 /* MissionResponse.swift in Sources */, + AC365183A54C207B12519696FFF64C67 /* MissionSection.BS+Gradient.swift in Sources */, + 0380D257C2F539A6344259BF2EFED65A /* MissionSection.CE+Gradient.swift in Sources */, + BEC2CC592CAB4198746262C55D73DBA0 /* MissionSection.LinkDisk+Gradient.swift in Sources */, + 8DD62325C32CFDD11403EF407197E9A9 /* MissionSection.Respect+Gradient.swift in Sources */, + 87EE66478A51CBA1A1A9F26347694685 /* MissionSection.Technika1+Gradient.swift in Sources */, + 72713E32C8FA38F681A9C4F075A7D08B /* MissionSection.Technika2+Gradient.swift in Sources */, + 5A54507509E4E4DC3181C3FCB74FBBC0 /* MissionSection.Technika3+Gradient.swift in Sources */, + 9F579ACF8BFC762F49A03A837BCCF7ED /* MissionSection.Trilogy+Gradient.swift in Sources */, + F551680129D8E83F451174BE5B4DBF5D /* MissionSection.swift in Sources */, + BEC7D1F3799FA6E0EEDB0980E345F689 /* MissionStageInfo.swift in Sources */, + D4F4FB7D6DFADE1F54AEEDDEEE9BF681 /* MissionTechnika1TableViewController.swift in Sources */, + 7C37CAC5FB61061C9FCB133E803A0423 /* MissionTechnika2TableViewController.swift in Sources */, + 532E0449B68A85440B2A1E3F2BAF63B4 /* MissionTechnika3TableViewController.swift in Sources */, + D7D51512AABF833025D3FB78AB1C0C3F /* MissionTrilogyTableViewController.swift in Sources */, + ED9D59C06C9E0047119BE8AE0BBC1A97 /* MissionViewController.swift in Sources */, + 7CAA744A443BAA4E21DFFF769BC9A3BF /* NSObject+.swift in Sources */, + 2012B0E292AE68661A84F90C15CCB7E2 /* NetworkManager.swift in Sources */, + 4FBF2977E66C057D1A9F1F3F19E48E8C /* NicknameResponse.swift in Sources */, + 1D5A93ADB7E0551D8265EC21D90E8114 /* Note.swift in Sources */, + DC8239DAEF1700D671C8ADC1F04121DA /* OldRecordInfo.swift in Sources */, + A355C78EC61F119CC6EBBA3E16B5AA0A /* PerformanceViewController.swift in Sources */, + B3CE24BE8E899EE8D89D56F5921A42A9 /* Persistence.swift in Sources */, + C295B902F2B60D1CF3FA2B1334479A65 /* RUButton.swift in Sources */, + 9F02A015FDD5629384099D02332F9AF8 /* Rank.swift in Sources */, + 48175A5C8370F8ED872DDDAD970867BB /* Ranking4BTableViewController.swift in Sources */, + 79D274160965FE8BA5A394E6C353BA65 /* Ranking5BTableViewController.swift in Sources */, + EEA6DE9B2B98EA38E69EB963C636C520 /* Ranking6BTableViewController.swift in Sources */, + 4A98A06417A0097FB957083613E33F09 /* Ranking8BTableViewController.swift in Sources */, + A315E94EE38B5C79959A6DEF81671063 /* RankingBaseTableViewController.swift in Sources */, + DFA7343544B17FDE10800CFA2D95474E /* RankingCell.swift in Sources */, + 3ACE06EAF10D0F00AB81B031AFFD4370 /* RankingResponse.swift in Sources */, + 7858348DB87AE1F57E6EDE96DC86385B /* RankingViewController.swift in Sources */, + 409ABEBD1C0ACF153D2726D4203EB120 /* Reachability.swift in Sources */, + 6AB28858EC6AF5E90E28E90FEB28EB45 /* RecordAllTableViewController.swift in Sources */, + 6A51A5566ED5C9A050238B3B86CDFF28 /* RecordBSTableViewController.swift in Sources */, + A7666C7BFF582CE3D2E5AEFB30A1973A /* RecordBaseTableViewController.swift in Sources */, + 0AD398A653F247BBD797BF1C08117411 /* RecordButtonInfo.swift in Sources */, + B2C7292410B72D6239C9419EFD99F720 /* RecordCETableViewController.swift in Sources */, + A8F637AB2D98571955E28ED50F2EFE00 /* RecordCell.swift in Sources */, + 02686C509DF00D9696587DEEA60DA1AD /* RecordDifficultyInfo.swift in Sources */, + C87227AE5F5C14201E4A9A2BFBA6F43C /* RecordInfo.swift in Sources */, + 402BA1696265B27378F92C7D0EFE5D9A /* RecordPortable1TableViewController.swift in Sources */, + 26708994E8417D244AFABB1922A65642 /* RecordPortable2TableViewController.swift in Sources */, + 90435DAD8253B6ECD6DBBD877A50DF9F /* RecordRespectTableViewController.swift in Sources */, + D60684D01227D743425A5926A21FD850 /* RecordResponse.swift in Sources */, + 09E17333AB311C09221D5BDD854CAAF5 /* RecordTechnika1TableViewController.swift in Sources */, + 9B236D432A2A7BA98EDD93D1231A3AEF /* RecordTechnika2TableViewController.swift in Sources */, + B87568500EAB59BC53C4C46C7DBDF37C /* RecordTechnika3TableViewController.swift in Sources */, + 8FA7CCD9F150E47BC3E960749476A437 /* RecordTrilogyTableViewController.swift in Sources */, + C8ADDE7416A86CE84CD4823CC47833DC /* RecordView.swift in Sources */, + 6390715145BD10663A5A4D6C352868DF /* RecordViewController.swift in Sources */, + 56B103D4D21450CC4D0BC3D98286A3AF /* SearchByLevelView.swift in Sources */, + 3FC482296754D98BE86BD7B18E564694 /* SearchByNoteView.swift in Sources */, + D26CDBFA3B71B4DAF56C820443B6C735 /* SearchByRatingView.swift in Sources */, + EA3A243DC605E1721F5A5FECA01218B2 /* SearchRecordDetail.swift in Sources */, + E909A0D435DE1970F26D9E69E991ED41 /* SearchRecordDetailCell.swift in Sources */, + EB500C397294D1867BE4A5323F2B399E /* SearchRecordDetailViewController.swift in Sources */, + 15D85A72D8E253A709907E22B1B919BA /* SearchRecordViewController.swift in Sources */, + 16217B19735F571D4F00B4E714D445A1 /* Series+UI.swift in Sources */, + 2440D6183CA2FD2B1771BD07553F0EA3 /* Series.swift in Sources */, + 832BAB1A651DC131F7DD567512C8F754 /* SignInTextField.swift in Sources */, + EE71722AABACD4B3CA0F4730F95231FF /* SignInViewController.swift in Sources */, + 40A958056F42EC3D295722454F5129D2 /* SignUpViewController.swift in Sources */, + E63A464BD8F09B2C3DC2B77F582DCF15 /* SkillLevel.swift in Sources */, + 93A2A616DC091EC01FE19DF5A8228554 /* SkillLevelCell.swift in Sources */, + 14A9C0F1784C4EFB020D45285772036C /* SkillLevelDetailView.swift in Sources */, + CD286290C91049CAB1AC71B914F91DE7 /* SkillLevelDetailViewController.swift in Sources */, + 1E64D8217B3A29B37418024823592E66 /* SkillPoint.swift in Sources */, + FA4BEBF3791C502B996D02DE973581D8 /* SongAllTableViewController.swift in Sources */, + 626DCED8FA52B65C0C03F7D940B556C5 /* SongBSTableViewController.swift in Sources */, + 799B139F9BBB3D3D23BDA509C60C29A8 /* SongBaseTableViewController.swift in Sources */, + C67050AEEA3E9FEFEEF6609848CABF49 /* SongButtonInfo.swift in Sources */, + B8D616ADF20DEC51276762711CE93CFC /* SongCETableViewController.swift in Sources */, + 7F550ED856FEE434A4289AC243725DA2 /* SongCell.swift in Sources */, + E49C4A33514DB94D1E07267D61B4AF25 /* SongInfo.swift in Sources */, + 4153853DD9B533CEB5CB57E06BE93625 /* SongPortable1TableViewController.swift in Sources */, + 792780314E46E5949E03C0F5CF357DCD /* SongPortable2TableViewController.swift in Sources */, + 30370928E902A0A1ADEBB413AFFD9019 /* SongRespectTableViewController.swift in Sources */, + 8E2577604E640D270C80FBB4295515A7 /* SongResponse.swift in Sources */, + 05BF8B1DD9D1CFFE3909352A0062808D /* SongTechnika1TableViewController.swift in Sources */, + A4341B45A52DE69D373AA8689A6598A8 /* SongTechnika2TableViewController.swift in Sources */, + E0837D50A45691DAD8C70F03A3CC15CE /* SongTechnika3TableViewController.swift in Sources */, + 95234C099163DBDCE9889D08D17289F5 /* SongTrilogyTableViewController.swift in Sources */, + 4F6670BDD18418EB0BACC4C92FE1EA57 /* SongViewController.swift in Sources */, + 4DB514B43FA2A583C16006541624AD81 /* Storyboard.swift in Sources */, + E2D8AEB2117CBC267BE26D6F4BFA9CB7 /* String+.swift in Sources */, + 59A0935E9841AE2C2D2936507EBD985B /* Strings.swift in Sources */, + 6882E18AB7ED3B44099C1EB2DF316B2C /* SummaryCell.swift in Sources */, + 36D90F14658E9A2386E71925147AD3B7 /* SummaryCollectionCell.swift in Sources */, + FBA69F596B504E30711FBB8CA0653F81 /* SummaryDetailViewController.swift in Sources */, + C2B828CD011EB99FA479BF670FEE7A4C /* TipInfo.swift in Sources */, + FE16B2705772147DFC33EFE0129FDD53 /* TipResponse.swift in Sources */, + 7DB048302AB433149E6A95BA48133447 /* TipViewController.swift in Sources */, + 0CEF469A149FF36E867CC3A161165AF9 /* Top504BTableViewController.swift in Sources */, + 6CC9FF520053253ACB3082AABE34CF0A /* Top505BTableViewController.swift in Sources */, + 6C3977B8B2C1C1172FDBDE5D7054F4DA /* Top506BTableViewController.swift in Sources */, + E89955CBE8C1B9AD6AF1994793683092 /* Top508BTableViewController.swift in Sources */, + C3551CA001C950C2BABA8E95D6EFAAD6 /* Top50BaseTableViewController.swift in Sources */, + 5F74C0FF12D461826448C86A14E4919D /* Top50Cell.swift in Sources */, + 3B7DE92472A1872F8D09E85383AE7E95 /* Top50ViewController.swift in Sources */, + 1C4D888E2BECAA7E7447EC6E493D700E /* TrophyBSTableViewController.swift in Sources */, + 554C372C44FEB3224C5EAE6E722D3D2B /* TrophyBaseTableViewController.swift in Sources */, + BAF7C4779D1D74F482A5C62832C9AF0C /* TrophyCETableViewController.swift in Sources */, + 456CFC7E84339AD858F72E14C0200EAD /* TrophyCell.swift in Sources */, + 3B5CCA1F7AE3B3E186DCDC5466618711 /* TrophyGrade.swift in Sources */, + 986310414206F5E413A447766B2A36D0 /* TrophyInfo.swift in Sources */, + D235F2870A0811AB0EE18B92C23A5E8F /* TrophyLinkDiskTableViewController.swift in Sources */, + C7C80996F1B61B44536F73D8F5ECCD34 /* TrophyRespectTableViewController.swift in Sources */, + 9DB272CDB091ACF835E7C0D863D117F8 /* TrophyResponse.swift in Sources */, + B7B47C90D8A004232DF088D28B0EA53D /* TrophyTechnika1TableViewController.swift in Sources */, + 4AE97EBF1348A5516BE27E7EB403CE28 /* TrophyTechnika2TableViewController.swift in Sources */, + 1722D64EEA474AA4DB6530A17DA20635 /* TrophyTechnika3TableViewController.swift in Sources */, + C6A47F0F5710AAFCEACC3B7D1A30A484 /* TrophyTrilogyTableViewController.swift in Sources */, + 57A9D23286BDA314BEC501224189EFE7 /* TrophyViewController.swift in Sources */, + 8D428E252225AAE930BF8D945401F018 /* UIAlertController+.swift in Sources */, + 86DEAB8A62F44038DA244F4B864FE1FF /* UIColor+.swift in Sources */, + 5A7233F8CD55096485F6137E6278A377 /* UIView+.swift in Sources */, + 4CB993740AF398D71E90C9EC481F995D /* UIViewController+.swift in Sources */, + 3C2E4343DB314444E72BCA528356A02B /* UploadViewController.swift in Sources */, + DF0ADF3EC056D01E0F7C2285EE9C8587 /* UserResponse.swift in Sources */, + 7FADC0241104D5EF1D511F7CB55F58E5 /* Utils.swift in Sources */, + DA56608DD5FB0DE29D1BF82728E52081 /* VersionInfo.swift in Sources */, + 65B837BD248EF75153ED13562E7F5F5F /* VersionResponse.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ -/* Begin PBXTargetDependency section */ - 1984269B21B7EA0A001F491C /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 19B6CFE71F7953640097B86B /* RespectU */; - targetProxy = 1984269A21B7EA0A001F491C /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - /* Begin PBXVariantGroup section */ - 19B6602B1F960FA800CCEFB5 /* Localizable.strings */ = { + 0FFF8FE8E83D48C24E4B183637AC73A8 /* LaunchScreen.storyboard */ = { isa = PBXVariantGroup; children = ( - 19B6602A1F960FA800CCEFB5 /* ko */, + 92BBB8BD0C86813D3C7E2DF1A3C1A920 /* Base */, + 9143E2A18693E399D37E0F432BB4A9A7 /* ko */, ); - name = Localizable.strings; + name = LaunchScreen.storyboard; sourceTree = ""; }; - 19B6CFF71F7953640097B86B /* LaunchScreen.storyboard */ = { + B30E23955E630DE10DDEE4E073034629 /* Localizable.strings */ = { isa = PBXVariantGroup; children = ( - 19B6CFF81F7953640097B86B /* Base */, - 19B660111F96040A00CCEFB5 /* ko */, + 1B070570A49E0EE97FB9D7A7BEE9915B /* ko */, ); - name = LaunchScreen.storyboard; + name = Localizable.strings; sourceTree = ""; }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ - 1984269C21B7EA0A001F491C /* Debug */ = { + 089E445891290C6933193078E5082E0F /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 1FD55BA517A60A14D8EC54ACB1C7B9D4 /* Pods-RespectU.debug.xcconfig */; buildSettings = { - CLANG_ENABLE_OBJC_WEAK = YES; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; DEVELOPMENT_TEAM = H79MF628K3; - INFOPLIST_FILE = RespectUUITests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 12.1; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; - MTL_FAST_MATH = YES; - PRODUCT_BUNDLE_IDENTIFIER = presto.RespectUUITests; + INFOPLIST_FILE = "$(SRCROOT)/RespectU/Supports/Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = presto.RespectU; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_OBJC_BRIDGING_HEADER = ""; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_PRECOMPILE_BRIDGING_HEADER = NO; SWIFT_VERSION = 4.2; TARGETED_DEVICE_FAMILY = "1,2"; - TEST_TARGET_NAME = RespectU; }; name = Debug; }; - 1984269D21B7EA0A001F491C /* Release */ = { + AFF48BDA5913283131185BA2BC4DBB47 /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 56193FB5ED1B44771800EF26128FEE44 /* Pods-RespectU.release.xcconfig */; buildSettings = { - CLANG_ENABLE_OBJC_WEAK = YES; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; DEVELOPMENT_TEAM = H79MF628K3; - INFOPLIST_FILE = RespectUUITests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 12.1; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MTL_FAST_MATH = YES; - PRODUCT_BUNDLE_IDENTIFIER = presto.RespectUUITests; + INFOPLIST_FILE = "$(SRCROOT)/RespectU/Supports/Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = presto.RespectU; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_OBJC_BRIDGING_HEADER = ""; + SWIFT_PRECOMPILE_BRIDGING_HEADER = NO; SWIFT_VERSION = 4.2; TARGETED_DEVICE_FAMILY = "1,2"; - TEST_TARGET_NAME = RespectU; }; name = Release; }; - 19B6CFFB1F7953640097B86B /* Debug */ = { + CC41C1C43992ADCDA1631AD975C2F3DB /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; @@ -1556,17 +1367,11 @@ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "iPhone Developer"; COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = dwarf; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; @@ -1574,15 +1379,14 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 11.0; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; + MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + VALIDATE_PRODUCT = YES; }; - name = Debug; + name = Release; }; - 19B6CFFC1F7953640097B86B /* Release */ = { + F7741424A61C114CF4DE288CBAF48355 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; @@ -1616,11 +1420,17 @@ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "iPhone Developer"; COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; + DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; @@ -1628,89 +1438,36 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; IPHONEOS_DEPLOYMENT_TARGET = 11.0; - MTL_ENABLE_DEBUG_INFO = NO; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 19B6CFFE1F7953640097B86B /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = DB6B1689F63785D34949E1A9 /* Pods-RespectU.debug.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_MODULES = YES; - CODE_SIGN_IDENTITY = "iPhone Developer"; - CODE_SIGN_STYLE = Automatic; - DEVELOPMENT_TEAM = H79MF628K3; - INFOPLIST_FILE = "$(SRCROOT)/RespectU/Supporting Files/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = presto.RespectU; - PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE_SPECIFIER = ""; - SWIFT_OBJC_BRIDGING_HEADER = "/Users/presto/XCode/RespectU/RespectU/Supporting Files/RespectU-Bridging-Header.h"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_SWIFT3_OBJC_INFERENCE = Default; - SWIFT_VERSION = 4.0; - TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; }; - 19B6CFFF1F7953640097B86B /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = A314C0291FA5F61AAC482F05 /* Pods-RespectU.release.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_MODULES = YES; - CODE_SIGN_IDENTITY = "iPhone Developer"; - CODE_SIGN_STYLE = Automatic; - DEVELOPMENT_TEAM = H79MF628K3; - INFOPLIST_FILE = "$(SRCROOT)/RespectU/Supporting Files/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = presto.RespectU; - PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE_SPECIFIER = ""; - SWIFT_OBJC_BRIDGING_HEADER = "/Users/presto/XCode/RespectU/RespectU/Supporting Files/RespectU-Bridging-Header.h"; - SWIFT_SWIFT3_OBJC_INFERENCE = Default; - SWIFT_VERSION = 4.0; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Release; - }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - 1984269E21B7EA0A001F491C /* Build configuration list for PBXNativeTarget "RespectUUITests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1984269C21B7EA0A001F491C /* Debug */, - 1984269D21B7EA0A001F491C /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 19B6CFE31F7953640097B86B /* Build configuration list for PBXProject "RespectU" */ = { + 0E9E9ABFE98FE5F0D25FC9624352329B /* Build configuration list for PBXProject "RespectU" */ = { isa = XCConfigurationList; buildConfigurations = ( - 19B6CFFB1F7953640097B86B /* Debug */, - 19B6CFFC1F7953640097B86B /* Release */, + F7741424A61C114CF4DE288CBAF48355 /* Debug */, + CC41C1C43992ADCDA1631AD975C2F3DB /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 19B6CFFD1F7953640097B86B /* Build configuration list for PBXNativeTarget "RespectU" */ = { + B38D91F6525B0B0DE2ED6599F2AACFAA /* Build configuration list for PBXNativeTarget "RespectU" */ = { isa = XCConfigurationList; buildConfigurations = ( - 19B6CFFE1F7953640097B86B /* Debug */, - 19B6CFFF1F7953640097B86B /* Release */, + 089E445891290C6933193078E5082E0F /* Debug */, + AFF48BDA5913283131185BA2BC4DBB47 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; - rootObject = 19B6CFE01F7953640097B86B /* Project object */; + rootObject = F8D8F66833AEC30332B8A3A3D9FE6E49 /* Project object */; } diff --git a/RespectU.xcodeproj/xcuserdata/presto.xcuserdatad/xcschemes/RespectU.xcscheme b/RespectU.xcodeproj/xcuserdata/presto.xcuserdatad/xcschemes/RespectU.xcscheme index a63c84b..7efd948 100644 --- a/RespectU.xcodeproj/xcuserdata/presto.xcuserdatad/xcschemes/RespectU.xcscheme +++ b/RespectU.xcodeproj/xcuserdata/presto.xcuserdatad/xcschemes/RespectU.xcscheme @@ -1,6 +1,6 @@ @@ -42,7 +42,7 @@ @@ -65,7 +65,7 @@ runnableDebuggingMode = "0"> @@ -91,7 +91,7 @@ runnableDebuggingMode = "0"> diff --git a/RespectU/Base/BaseViewController.swift b/RespectU/Base/BaseViewController.swift deleted file mode 100644 index 2e58621..0000000 --- a/RespectU/Base/BaseViewController.swift +++ /dev/null @@ -1,28 +0,0 @@ -// -// SongBaseViewController.swift -// RespectU -// -// Created by Presto on 2018. 8. 2.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import UIKit -import XLPagerTabStrip - -class BaseViewController: ButtonBarPagerTabStripViewController { - - override func viewDidLoad() { - setUpButtonBarPagerTabStrip() - super.viewDidLoad() - } - - private func setUpButtonBarPagerTabStrip() { - settings.style.selectedBarHeight = 1 - settings.style.selectedBarBackgroundColor = .black - settings.style.buttonBarBackgroundColor = .white - settings.style.buttonBarItemBackgroundColor = .white - settings.style.buttonBarItemTitleColor = .black - settings.style.buttonBarItemsShouldFillAvailiableWidth = true - settings.style.buttonBarItemFont = UIFont.systemFont(ofSize: 14, weight: .medium) - } -} diff --git a/RespectU/Base/GuideRecordBaseViewController.swift b/RespectU/Base/GuideRecordBaseViewController.swift deleted file mode 100644 index a79457c..0000000 --- a/RespectU/Base/GuideRecordBaseViewController.swift +++ /dev/null @@ -1,27 +0,0 @@ -// -// SongBaseViewController.swift -// RespectU -// -// Created by Presto on 2018. 8. 2.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import UIKit -import XLPagerTabStrip - -class BaseViewController: ButtonBarPagerTabStripViewController { - - override func viewDidLoad() { - super.viewDidLoad() - setUpButtonBarPagerTabStrip() - } - - private func setUpButtonBarPagerTabStrip() { - settings.style.buttonBarBackgroundColor = .subColor - settings.style.buttonBarItemBackgroundColor = .subColor - settings.style.selectedBarBackgroundColor = .mainColor - settings.style.buttonBarItemTitleColor = .black - settings.style.buttonBarItemsShouldFillAvailiableWidth = true - settings.style.buttonBarItemFont = UIFont.systemFont(ofSize: 14, weight: .medium) - } -} diff --git a/RespectU/Constants/Buttons.swift b/RespectU/Constants/Buttons.swift deleted file mode 100644 index 269271a..0000000 --- a/RespectU/Constants/Buttons.swift +++ /dev/null @@ -1,16 +0,0 @@ -// -// Buttons.swift -// RespectU -// -// Created by Presto on 2018. 8. 1.. -// Copyright © 2018년 Presto. All rights reserved. -// - -enum Buttons { - static let button4 = "4b" - static let button5 = "5b" - static let button6 = "6b" - static let button8 = "8b" - static let xb = "xb" - static let tb = "tb" -} diff --git a/RespectU/Constants/Difficulty.swift b/RespectU/Constants/Difficulty.swift deleted file mode 100644 index dc6e580..0000000 --- a/RespectU/Constants/Difficulty.swift +++ /dev/null @@ -1,16 +0,0 @@ -// -// Difficulty.swift -// RespectU -// -// Created by Presto on 2018. 3. 4.. -// Copyright © 2018년 Presto. All rights reserved. -// - -enum Difficulty { - static let normal = "normal" - static let hard = "hard" - static let maximum = "maximum" - static let fx = "fx" - static let special = "special" - static let redesign = "redesign" -} diff --git a/RespectU/Constants/MissionSection.swift b/RespectU/Constants/MissionSection.swift deleted file mode 100644 index 2867857..0000000 --- a/RespectU/Constants/MissionSection.swift +++ /dev/null @@ -1,46 +0,0 @@ -// -// Mission.swift -// RespectU -// -// Created by Presto on 2018. 8. 1.. -// Copyright © 2018년 Presto. All rights reserved. -// - -enum MissionSection { - enum Respect { - static let departure = "Departure" - static let clubRoad645 = "CLUB Road645" - static let maxTheater = "MAX Theater" - static let anotherWorld = "Another WORLD" - static let backStage = "Back STAGE" - static let chaosTheory = "Chaos theory" - static let soundLab = "Sound Lab" - static let visualizer = "Visualizer" - static let developers = "D-VELOPERS" - static let destination = "Destination" - } - enum Trilogy { - static let tSide = "T-SIDE" - static let rSide = "R-SIDE" - } - enum CE { - static let electronicCity = "Electronic City" - static let metropolis = "Metropolis" - } - enum Technika1 { - static let platinumMixing = "Platinum Mixing" - static let technicalMixing = "Technical Mixing" - } - enum BS { - static let stylishPerformance = "Stylish Performance" - static let absoluteSound = "Absolute Sound" - } - enum LinkDisk { - static let whiteDisk = "WHITE DISK" - static let blackDisk = "BLACK DISK" - } - enum Technika2 { - static let starMixing = "STAR MIXING" - static let clubMixing = "CLUB MIXING" - } -} diff --git a/RespectU/Constants/Note.swift b/RespectU/Constants/Note.swift deleted file mode 100644 index 57a263b..0000000 --- a/RespectU/Constants/Note.swift +++ /dev/null @@ -1,13 +0,0 @@ -// -// Result.swift -// RespectU -// -// Created by Presto on 2018. 8. 3.. -// Copyright © 2018년 Presto. All rights reserved. -// - -enum Note { - static let maxCombo = "MC" - static let perfectPlay = "PP" - static let none = "" -} diff --git a/RespectU/Constants/Rank.swift b/RespectU/Constants/Rank.swift deleted file mode 100644 index f87bcec..0000000 --- a/RespectU/Constants/Rank.swift +++ /dev/null @@ -1,16 +0,0 @@ -// -// Rank.swift -// RespectU -// -// Created by Presto on 2018. 8. 3.. -// Copyright © 2018년 Presto. All rights reserved. -// - -///랭크 열거형 -enum Rank { - static let s = "S" - static let a = "A" - static let b = "B" - static let c = "C" - static let none = "" -} diff --git a/RespectU/Constants/Series.swift b/RespectU/Constants/Series.swift deleted file mode 100644 index 53b01b6..0000000 --- a/RespectU/Constants/Series.swift +++ /dev/null @@ -1,19 +0,0 @@ -// -// Series.swift -// RespectU -// -// Created by Presto on 2018. 8. 1.. -// Copyright © 2018년 Presto. All rights reserved. -// - -enum Series { - static let respect = "respect" - static let portable1 = "portable1" - static let portable2 = "portable2" - static let trilogy = "trilogy" - static let ce = "ce" - static let technika1 = "technika1" - static let bs = "bs" - static let linkDisk = "linkdisk" - static let technika2 = "technika2" -} diff --git a/RespectU/Constants/SkillLevel.swift b/RespectU/Constants/SkillLevel.swift deleted file mode 100644 index d0f54db..0000000 --- a/RespectU/Constants/SkillLevel.swift +++ /dev/null @@ -1,51 +0,0 @@ -// -// SkillLevel.swift -// RespectU -// -// Created by Presto on 2018. 8. 3.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import Foundation - -enum SkillLevel { - static let beginner = "BEGINNER" - static let amateur4 = "AMATEUR 4" - static let amateur3 = "AMATEUR 3" - static let amateur2 = "AMATEUR 2" - static let amateur1 = "AMATEUR 1" - static let subDj4 = "SUB DJ 4" - static let subDj3 = "SUB DJ 3" - static let subDj2 = "SUB DJ 2" - static let subDj1 = "SUB DJ 1" - static let mainDj4 = "MAIN DJ 4" - static let mainDj3 = "MAIN DJ 3" - static let mainDj2 = "MAIN DJ 2" - static let mainDj1 = "MAIN DJ 1" - static let popDj4 = "POP DJ 4" - static let popDj3 = "POP DJ 3" - static let popDj2 = "POP DJ 2" - static let popDj1 = "POP DJ 1" - static let professional4 = "PROFESSIONAL 4" - static let professional3 = "PROFESSIONAL 3" - static let professional2 = "PROFESSIONAL 2" - static let professional1 = "PROFESSIONAL 1" - static let mixMaster3 = "MIX MASTER 3" - static let mixMaster2 = "MIX MASTER 2" - static let mixMaster1 = "MIX MASTER 1" - static let superstar3 = "SUPERSTAR 3" - static let superstar2 = "SUPERSTAR 2" - static let superstar1 = "SUPERSTAR 1" - static let djmaxGrandMaster = "DJMAX GRAND MASTER" - static let theDjmax = "THE DJMAX" - static var button4SkillLevels: [String] { - return [beginner, amateur4, amateur3, amateur2, amateur1, subDj4, subDj3, subDj2, subDj1, mainDj4, mainDj3, mainDj2, mainDj1, popDj4, popDj3, popDj2, popDj1, professional3, professional2, professional1, mixMaster3, mixMaster2, mixMaster1, superstar3, superstar2, superstar1, djmaxGrandMaster, theDjmax] - } - static var button5SkillLevels: [String] { - return [beginner, amateur4, amateur3, amateur2, amateur1, subDj4, subDj3, subDj2, subDj1, mainDj4, mainDj3, mainDj2, mainDj1, popDj4, popDj3, popDj2, popDj1, professional3, professional2, professional1, mixMaster3, mixMaster2, mixMaster1, superstar3, superstar2, superstar1, djmaxGrandMaster, theDjmax] - } - static var button6And8SkillLevels: [String] { - return [beginner, amateur4, amateur3, amateur2, amateur1, subDj4, subDj3, subDj2, subDj1, mainDj4, mainDj3, mainDj2, mainDj1, popDj4, popDj3, popDj2, popDj1, professional4, professional3, professional2, professional1, mixMaster3, mixMaster2, mixMaster1, superstar3, superstar2, superstar1, djmaxGrandMaster, theDjmax] - } - -} diff --git a/RespectU/Constants/TrophyGrade.swift b/RespectU/Constants/TrophyGrade.swift deleted file mode 100644 index c591f18..0000000 --- a/RespectU/Constants/TrophyGrade.swift +++ /dev/null @@ -1,14 +0,0 @@ -// -// TrophyGrade.swift -// RespectU -// -// Created by Presto on 2018. 8. 1.. -// Copyright © 2018년 Presto. All rights reserved. -// - -enum TrophyGrade { - static let platinum = "platinum" - static let gold = "gold" - static let silver = "silver" - static let bronze = "bronze" -} diff --git a/RespectU/Extension/CAGradientLayer+.swift b/RespectU/Extension/CAGradientLayer+.swift deleted file mode 100644 index 2116557..0000000 --- a/RespectU/Extension/CAGradientLayer+.swift +++ /dev/null @@ -1,20 +0,0 @@ -// -// CAGradientLayer+.swift -// RespectU -// -// Created by Presto on 13/10/2018. -// Copyright © 2018 Presto. All rights reserved. -// - -import UIKit - -extension CAGradientLayer { - static func makeGradient(startPoint: CGPoint, endPoint: CGPoint, colors: [CGColor], locations: [NSNumber]) -> CAGradientLayer { - let gradient = CAGradientLayer() - gradient.startPoint = startPoint - gradient.endPoint = endPoint - gradient.colors = colors - gradient.locations = locations - return gradient - } -} diff --git a/RespectU/Extension/Date+.swift b/RespectU/Extension/Date+.swift deleted file mode 100644 index 367e0ca..0000000 --- a/RespectU/Extension/Date+.swift +++ /dev/null @@ -1,28 +0,0 @@ -// -// Date+.swift -// RespectU -// -// Created by Presto on 21/10/2018. -// Copyright © 2018 Presto. All rights reserved. -// - -import Foundation - -extension Date { - static func day(beforeDays: Int) -> Date { - return Calendar.current.date(byAdding: .day, value: -beforeDays, to: Date()) ?? Date() - } - - static func day(afterDays: Int) -> Date { - return Calendar.current.date(byAdding: .day, value: afterDays, to: Date()) ?? Date() - } - - static func start(of day: Date) -> Date { - return Calendar.current.startOfDay(for: day) - } - - static func end(of day: Date) -> Date { - let components = DateComponents(day: 1, second: -1) - return Calendar.current.date(byAdding: components, to: day) ?? Date() - } -} diff --git a/RespectU/Extension/NSObject+.swift b/RespectU/Extension/NSObject+.swift deleted file mode 100644 index ea7f0b0..0000000 --- a/RespectU/Extension/NSObject+.swift +++ /dev/null @@ -1,27 +0,0 @@ -// -// NSObject+.swift -// RespectU -// -// Created by Presto on 2018. 8. 2.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import Foundation - -extension NSObject { - var classNameToString: String { - return NSStringFromClass(type(of: self)) - } - - static var classNameToString: String { - return NSStringFromClass(self).components(separatedBy: ".").last ?? "" - } - - var regionCode: String { - return Locale.current.regionCode ?? "" - } - - var version: String { - return Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as? String ?? "" - } -} diff --git a/RespectU/Extension/Results+.swift b/RespectU/Extension/Results+.swift deleted file mode 100644 index e363ba8..0000000 --- a/RespectU/Extension/Results+.swift +++ /dev/null @@ -1,16 +0,0 @@ -// -// Results+.swift -// RespectU -// -// Created by Presto on 2018. 8. 2.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import RealmSwift - -extension Results { - @discardableResult - func filter(key: String, value: String, method: String) -> Results { - return self.filter("\(key) \(method) '\(value)'") - } -} diff --git a/RespectU/Extension/String+.swift b/RespectU/Extension/String+.swift deleted file mode 100644 index 2c56572..0000000 --- a/RespectU/Extension/String+.swift +++ /dev/null @@ -1,217 +0,0 @@ -// -// StringExtension.swift -// RespectU -// -// Created by Presto on 2017. 10. 17.. -// Copyright © 2017년 Presto. All rights reserved. -// - -import Foundation -import UIKit - -enum GradientDirection { - case horizontal - case vertical -} - -extension String { - var localized: String { - return NSLocalizedString(self, tableName: nil, bundle: Bundle.main, value: "", comment: "") - } - - func seriesGradient(_ direction: GradientDirection) -> CAGradientLayer? { - let startPoint = direction == .horizontal ? CGPoint(x: 0, y: 0.5) : CGPoint(x: 0.5, y: 0) - let endPoint = direction == .horizontal ? CGPoint(x: 1, y: 0.5) : CGPoint(x: 0.5, y: 1) - switch self { - case Series.portable1: - return CAGradientLayer.makeGradient(startPoint: startPoint, endPoint: endPoint, colors: [#colorLiteral(red: 0.1215686275, green: 0.7098039216, blue: 0.8784313725, alpha: 1), #colorLiteral(red: 0.7254901961, green: 0.2823529412, blue: 0.9764705882, alpha: 1)], locations: [0, 0.5, 1]) - case Series.portable2: - return CAGradientLayer.makeGradient(startPoint: startPoint, endPoint: endPoint, colors: [#colorLiteral(red: 0.9882352941, green: 0.1254901961, blue: 0.2784313725, alpha: 1), #colorLiteral(red: 0.9882352941, green: 0.2156862745, blue: 0.6705882353, alpha: 1)], locations: [0, 0.5, 1]) - case Series.respect: - return CAGradientLayer.makeGradient(startPoint: startPoint, endPoint: endPoint, colors: [#colorLiteral(red: 0.9607843137, green: 0.6745098039, blue: 0.1647058824, alpha: 1), #colorLiteral(red: 0.9803921569, green: 0.3921568627, blue: 0.4941176471, alpha: 1)], locations: [0, 0.5, 1]) - case Series.trilogy: - return CAGradientLayer.makeGradient(startPoint: startPoint, endPoint: endPoint, colors: [#colorLiteral(red: 0.3176470588, green: 0.4784313725, blue: 0.9725490196, alpha: 1), #colorLiteral(red: 0.3803921569, green: 0.9019607843, blue: 0.9725490196, alpha: 1)], locations: [0, 0.5, 1]) - case Series.ce: - return CAGradientLayer.makeGradient(startPoint: startPoint, endPoint: endPoint, colors: [#colorLiteral(red: 1, green: 1, blue: 1, alpha: 1), #colorLiteral(red: 0.9568627451, green: 0.831372549, blue: 0.3254901961, alpha: 1), #colorLiteral(red: 0.6039215686, green: 0.4941176471, blue: 0.1333333333, alpha: 1), #colorLiteral(red: 0.7764705882, green: 0.5921568627, blue: 0.2509803922, alpha: 1)], locations: [0, 0.7, 0.8, 0.9, 1]) - case Series.technika1: - return CAGradientLayer.makeGradient(startPoint: startPoint, endPoint: endPoint, colors: [#colorLiteral(red: 0.5019607843, green: 0.4, blue: 0.8666666667, alpha: 1), #colorLiteral(red: 0.9333333333, green: 0.1058823529, blue: 0.5921568627, alpha: 1)], locations: [0, 0.5, 1]) - case Series.bs: - return CAGradientLayer.makeGradient(startPoint: startPoint, endPoint: endPoint, colors: [#colorLiteral(red: 0.8941176471, green: 0.06274509804, blue: 0.2901960784, alpha: 1), #colorLiteral(red: 0.4823529412, green: 0.09803921569, blue: 0.168627451, alpha: 1)], locations: [0, 0.5, 1]) - case Series.technika2: - return CAGradientLayer.makeGradient(startPoint: startPoint, endPoint: endPoint, colors: [#colorLiteral(red: 0.9647058824, green: 0.1411764706, blue: 0.8784313725, alpha: 1), #colorLiteral(red: 0.9882352941, green: 0.4235294118, blue: 0.1333333333, alpha: 1), #colorLiteral(red: 0.9960784314, green: 0.768627451, blue: 0.1764705882, alpha: 1), #colorLiteral(red: 0.337254902, green: 0.8156862745, blue: 0.5058823529, alpha: 1), #colorLiteral(red: 0.1411764706, green: 0.8274509804, blue: 0.9921568627, alpha: 1)], locations: [0, 0.2, 0.4, 0.6, 0.8, 1]) - default: - return nil - } - } - - func missionGradient(_ direction: GradientDirection) -> CAGradientLayer? { - let startPoint = direction == .horizontal ? CGPoint(x: 0, y: 0.5) : CGPoint(x: 0.5, y: 0) - let endPoint = direction == .horizontal ? CGPoint(x: 1, y: 0.5) : CGPoint(x: 0.5, y: 1) - switch self { - case MissionSection.Respect.departure: - return CAGradientLayer.makeGradient(startPoint: startPoint, endPoint: endPoint, colors: [#colorLiteral(red: 0.137254902, green: 0.6549019608, blue: 0.3921568627, alpha: 1), #colorLiteral(red: 0.2431372549, green: 0.8235294118, blue: 0.8274509804, alpha: 1)], locations: [0, 0.5, 1]) - case MissionSection.Respect.clubRoad645: - return CAGradientLayer.makeGradient(startPoint: startPoint, endPoint: endPoint, colors: [#colorLiteral(red: 0.1568627451, green: 0.6431372549, blue: 0.7725490196, alpha: 1), #colorLiteral(red: 0.2352941176, green: 0.8235294118, blue: 0.8, alpha: 1)], locations: [0, 0.5, 1]) - case MissionSection.Respect.maxTheater: - return CAGradientLayer.makeGradient(startPoint: startPoint, endPoint: endPoint, colors: [#colorLiteral(red: 0.5176470588, green: 0.737254902, blue: 0.5019607843, alpha: 1), #colorLiteral(red: 0.2941176471, green: 0.7137254902, blue: 0.9176470588, alpha: 1)], locations: [0, 0.5, 1]) - case MissionSection.Respect.anotherWorld: - return CAGradientLayer.makeGradient(startPoint: startPoint, endPoint: endPoint, colors: [#colorLiteral(red: 0.2156862745, green: 0.6392156863, blue: 0.7098039216, alpha: 1), #colorLiteral(red: 0.3215686275, green: 0.537254902, blue: 0.9333333333, alpha: 1)], locations: [0, 0.5, 1]) - case MissionSection.Respect.backStage: - return CAGradientLayer.makeGradient(startPoint: startPoint, endPoint: endPoint, colors: [#colorLiteral(red: 0.631372549, green: 0.4117647059, blue: 0.9254901961, alpha: 1), #colorLiteral(red: 0.3450980392, green: 0.431372549, blue: 0.937254902, alpha: 1)], locations: [0, 0.5, 1]) - case MissionSection.Respect.chaosTheory: - return CAGradientLayer.makeGradient(startPoint: startPoint, endPoint: endPoint, colors: [#colorLiteral(red: 0.6705882353, green: 0.3254901961, blue: 0.7725490196, alpha: 1), #colorLiteral(red: 0.5294117647, green: 0.3647058824, blue: 0.9764705882, alpha: 1)], locations: [0, 0.5, 1]) - case MissionSection.Respect.soundLab: - return CAGradientLayer.makeGradient(startPoint: startPoint, endPoint: endPoint, colors: [#colorLiteral(red: 0.7098039216, green: 0.3294117647, blue: 0.8941176471, alpha: 1), #colorLiteral(red: 0.7568627451, green: 0.5529411765, blue: 0.3725490196, alpha: 1)], locations: [0, 0.5, 1]) - case MissionSection.Respect.visualizer: - return CAGradientLayer.makeGradient(startPoint: startPoint, endPoint: endPoint, colors: [#colorLiteral(red: 0.7294117647, green: 0.3137254902, blue: 0.9254901961, alpha: 1), #colorLiteral(red: 0.9843137255, green: 0.4078431373, blue: 0.8156862745, alpha: 1)], locations: [0, 0.5, 1]) - case MissionSection.Respect.developers: - return CAGradientLayer.makeGradient(startPoint: startPoint, endPoint: endPoint, colors: [#colorLiteral(red: 0.6392156863, green: 0.2784313725, blue: 0.6901960784, alpha: 1), #colorLiteral(red: 0.9803921569, green: 0.4470588235, blue: 0.4392156863, alpha: 1)], locations: [0, 0.5, 1]) - case MissionSection.Respect.destination: - return CAGradientLayer.makeGradient(startPoint: startPoint, endPoint: endPoint, colors: [#colorLiteral(red: 0.5921568627, green: 0.2588235294, blue: 0.2588235294, alpha: 1), #colorLiteral(red: 0.6470588235, green: 0.06274509804, blue: 0.1803921569, alpha: 1)], locations: [0, 0.5, 1]) - case MissionSection.Trilogy.tSide: - return CAGradientLayer.makeGradient(startPoint: startPoint, endPoint: endPoint, colors: [#colorLiteral(red: 0.2980392157, green: 0.337254902, blue: 0.9843137255, alpha: 1), #colorLiteral(red: 0.4, green: 0.6980392157, blue: 0.9764705882, alpha: 1)], locations: [0, 0.5, 1]) - case MissionSection.Trilogy.rSide: - return CAGradientLayer.makeGradient(startPoint: startPoint, endPoint: endPoint, colors: [#colorLiteral(red: 0.2941176471, green: 0.337254902, blue: 0.9843137255, alpha: 1), #colorLiteral(red: 0.5882352941, green: 0.4352941176, blue: 0.9568627451, alpha: 1)], locations: [0, 0.5, 1]) - case MissionSection.CE.electronicCity: - return CAGradientLayer.makeGradient(startPoint: startPoint, endPoint: endPoint, colors: [#colorLiteral(red: 0.2509803922, green: 0.2352941176, blue: 0.1960784314, alpha: 1), #colorLiteral(red: 0.8352941176, green: 0.7254901961, blue: 0.2235294118, alpha: 1)], locations: [0, 0.5, 1]) - case MissionSection.CE.metropolis: - return CAGradientLayer.makeGradient(startPoint: startPoint, endPoint: endPoint, colors: [#colorLiteral(red: 0.9254901961, green: 0.6980392157, blue: 0.2509803922, alpha: 1), #colorLiteral(red: 0.6274509804, green: 0.4784313725, blue: 0.7450980392, alpha: 1)], locations: [0, 0.5, 1]) - case MissionSection.Technika1.platinumMixing: - return CAGradientLayer.makeGradient(startPoint: startPoint, endPoint: endPoint, colors: [#colorLiteral(red: 0.09803921569, green: 0.1882352941, blue: 0.2980392157, alpha: 1), #colorLiteral(red: 0.5490196078, green: 0.6862745098, blue: 0.7921568627, alpha: 1)], locations: [0, 0.5, 1]) - case MissionSection.Technika1.technicalMixing: - return CAGradientLayer.makeGradient(startPoint: startPoint, endPoint: endPoint, colors: [#colorLiteral(red: 0.4, green: 0.07450980392, blue: 0.3803921569, alpha: 1), #colorLiteral(red: 0.8705882353, green: 0.2039215686, blue: 0.6392156863, alpha: 1)], locations: [0, 0.5, 1]) - case MissionSection.BS.stylishPerformance: - return CAGradientLayer.makeGradient(startPoint: startPoint, endPoint: endPoint, colors: [#colorLiteral(red: 0.3411764706, green: 0.6274509804, blue: 0.9215686275, alpha: 1), #colorLiteral(red: 0.09803921569, green: 0.262745098, blue: 0.6784313725, alpha: 1)], locations: [0, 0.5, 1]) - case MissionSection.BS.absoluteSound: - return CAGradientLayer.makeGradient(startPoint: startPoint, endPoint: endPoint, colors: [#colorLiteral(red: 0.8588235294, green: 0.2078431373, blue: 0.5960784314, alpha: 1), #colorLiteral(red: 0.3960784314, green: 0.05490196078, blue: 0.1960784314, alpha: 1)], locations: [0, 0.5, 1]) - case MissionSection.LinkDisk.whiteDisk: - return CAGradientLayer.makeGradient(startPoint: startPoint, endPoint: endPoint, colors: [#colorLiteral(red: 0.6549019608, green: 0.03529411765, blue: 0.06274509804, alpha: 1), #colorLiteral(red: 0.9333333333, green: 0.7960784314, blue: 0.8117647059, alpha: 1)], locations: [0, 0.5, 1]) - case MissionSection.LinkDisk.blackDisk: - return CAGradientLayer.makeGradient(startPoint: startPoint, endPoint: endPoint, colors: [#colorLiteral(red: 0.1333333333, green: 0.1176470588, blue: 0.1098039216, alpha: 1), #colorLiteral(red: 0.5921568627, green: 0.5411764706, blue: 0.3843137255, alpha: 1)], locations: [0, 0.5, 1]) - case MissionSection.Technika2.starMixing: - return CAGradientLayer.makeGradient(startPoint: startPoint, endPoint: endPoint, colors: [#colorLiteral(red: 0.537254902, green: 0.07058823529, blue: 0.5058823529, alpha: 1), #colorLiteral(red: 0.1058823529, green: 0.3882352941, blue: 0.6392156863, alpha: 1), #colorLiteral(red: 0.2470588235, green: 0.6588235294, blue: 0.1921568627, alpha: 1), #colorLiteral(red: 0.9333333333, green: 0.7333333333, blue: 0.1843137255, alpha: 1)], locations: [0, 0.25, 0.5, 0.75, 1]) - case MissionSection.Technika2.clubMixing: - return CAGradientLayer.makeGradient(startPoint: startPoint, endPoint: endPoint, colors: [#colorLiteral(red: 0.07843137255, green: 0.2470588235, blue: 0.6705882353, alpha: 1), #colorLiteral(red: 0.9843137255, green: 0.7960784314, blue: 0.1882352941, alpha: 1)], locations: [0, 0.5, 1]) - default: - return nil - } - } - - var seriesColor: UIColor? { - switch self { - case Series.portable1: - return .portable1 - case Series.portable2: - return .portable2 - case Series.respect: - return .respect - case Series.trilogy: - return .trilogy - case Series.ce: - return .ce - case Series.technika1: - return .technika1 - case Series.bs: - return .bs - case Series.technika2: - return .technika2 - default: - return nil - } - } - -// var missionColor: UIColor? { -// switch self { -// case MissionSection.Respect.departure: -// return #colorLiteral(red: 0.3058823529, green: 0.9058823529, blue: 0.7450980392, alpha: 1) -// case MissionSection.Respect.clubRoad645: -// return #colorLiteral(red: 0.337254902, green: 0.8470588235, blue: 0.9568627451, alpha: 1) -// case MissionSection.Respect.maxTheater: -// return #colorLiteral(red: 0.3098039216, green: 0.6980392157, blue: 0.9098039216, alpha: 1) -// case MissionSection.Respect.anotherWorld: -// return #colorLiteral(red: 0.4431372549, green: 0.5882352941, blue: 0.8705882353, alpha: 1) -// case MissionSection.Respect.backStage: -// return #colorLiteral(red: 0.7058823529, green: 0.6274509804, blue: 0.9215686275, alpha: 1) -// case MissionSection.Respect.chaosTheory: -// return #colorLiteral(red: 0.7019607843, green: 0.5490196078, blue: 0.8980392157, alpha: 1) -// case MissionSection.Respect.soundLab: -// return #colorLiteral(red: 0.831372549, green: 0.4705882353, blue: 0.937254902, alpha: 1) -// case MissionSection.Respect.visualizer: -// return #colorLiteral(red: 0.8941176471, green: 0.4745098039, blue: 0.9019607843, alpha: 1) -// case MissionSection.Respect.developers: -// return #colorLiteral(red: 0.9607843137, green: 0.3333333333, blue: 0.6549019608, alpha: 1) -// case MissionSection.Respect.destination: -// return #colorLiteral(red: 0.7960784314, green: 0.2862745098, blue: 0.3882352941, alpha: 1) -// case MissionSection.Trilogy.tSide: -// return #colorLiteral(red: 0.5607843137, green: 0.6784313725, blue: 0.831372549, alpha: 1) -// case MissionSection.Trilogy.rSide: -// return #colorLiteral(red: 0.662745098, green: 0.5803921569, blue: 0.8705882353, alpha: 1) -// case MissionSection.CE.electronicCity: -// return #colorLiteral(red: 0.8862745098, green: 0.8745098039, blue: 0.4431372549, alpha: 1) -// case MissionSection.CE.metropolis: -// return #colorLiteral(red: 0.7137254902, green: 0.631372549, blue: 0.8039215686, alpha: 1) -// case MissionSection.Technika1.platinumMixing: -// return #colorLiteral(red: 0.7137254902, green: 0.8196078431, blue: 0.8980392157, alpha: 1) -// case MissionSection.Technika1.technicalMixing: -// return #colorLiteral(red: 0.8901960784, green: 0.6, blue: 0.7803921569, alpha: 1) -// case MissionSection.BS.stylishPerformance: -// return #colorLiteral(red: 0.4980392157, green: 0.6274509804, blue: 0.8156862745, alpha: 1) -// case MissionSection.BS.absoluteSound: -// return #colorLiteral(red: 0.8039215686, green: 0.5019607843, blue: 0.6196078431, alpha: 1) -// case MissionSection.LinkDisk.whiteDisk: -// return #colorLiteral(red: 0.7058823529, green: 0.431372549, blue: 0.4745098039, alpha: 1) -// case MissionSection.LinkDisk.blackDisk: -// return #colorLiteral(red: 0.6392156863, green: 0.6, blue: 0.4196078431, alpha: 1) -// case MissionSection.Technika2.starMixing: -// return #colorLiteral(red: 0.7803921569, green: 0.6980392157, blue: 0.3647058824, alpha: 1) -// case MissionSection.Technika2.clubMixing: -// return #colorLiteral(red: 0.7803921569, green: 0.6980392157, blue: 0.3647058824, alpha: 1) -// default: -// return nil -// } -// } - - var noteExpansion: String? { - if self == Note.none { - return Note.none - } else if self == Note.maxCombo { - return "MAX COMBO" - } else if self == Note.perfectPlay { - return "PERFECT PLAY" - } else { - return nil - } - } - - var noteAbbreviation: String { - if self == "PERFECT PLAY" { - return Note.perfectPlay - } else if self == "MAX COMBO" { - return Note.maxCombo - } else { - return "" - } - } - - var buttonExpansion: String? { - switch self { - case Buttons.button4: - return "button4" - case Buttons.button5: - return "button5" - case Buttons.button6: - return "button6" - case Buttons.button8: - return "button8" - default: - return nil - } - } - - var rateConvertToDouble: Double { - if let value = self.split(separator: "%").first?.description { - return Double(value) ?? 0 - } - return 0 - } -} diff --git a/RespectU/Extension/UIAlertController+.swift b/RespectU/Extension/UIAlertController+.swift deleted file mode 100644 index 95f91dd..0000000 --- a/RespectU/Extension/UIAlertController+.swift +++ /dev/null @@ -1,47 +0,0 @@ -// -// UIAlertController+.swift -// RespectU -// -// Created by Presto on 2018. 6. 28.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import UIKit - -extension UIAlertController { - //alert - static func alert(title: String?, message: String?) -> UIAlertController { - let alert = UIAlertController(title: title, message: message, preferredStyle: .alert) - return alert - } - - //action - @discardableResult - func action(_ style: UIAlertActionStyle = .default, title: String?, handler: ((UIAlertAction) -> Void)? = nil) -> UIAlertController { - let action = UIAlertAction(title: title, style: style) { (action) in - handler?(action) - } - self.addAction(action) - return self - } - - @discardableResult - func textField(handler: @escaping ((UITextField) -> Void)) -> UIAlertController { - self.addTextField { (textField) in - handler(textField) - } - return self - } - - //present - func present(to viewController: UIViewController?, handler: (() -> Void)? = nil) { - viewController?.present(self, animated: true, completion: handler) - } - - static func presentErrorAlert(to viewController: UIViewController?, error: String, handler: (() -> Void)? = nil) { - UIAlertController - .alert(title: "", message: error) - .action(title: "OK".localized) - .present(to: viewController, handler: handler) - } -} diff --git a/RespectU/Extension/UIColor+.swift b/RespectU/Extension/UIColor+.swift deleted file mode 100644 index ba214c9..0000000 --- a/RespectU/Extension/UIColor+.swift +++ /dev/null @@ -1,30 +0,0 @@ -// -// UIColor+.swift -// RespectU -// -// Created by Presto on 2018. 3. 2.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import UIKit - -extension UIColor { - //App Colors - static let main = #colorLiteral(red: 0.9098039216, green: 0.6352941176, blue: 0.2078431373, alpha: 1) - static let sub = #colorLiteral(red: 1, green: 0.8392156863, blue: 0.6196078431, alpha: 1) - static let black = #colorLiteral(red: 0.1960784314, green: 0.1960784314, blue: 0.1960784314, alpha: 1) - //Series Colors - static let respect = #colorLiteral(red: 0.9411764706, green: 0.7019607843, blue: 0.1725490196, alpha: 1) - static let portable1 = #colorLiteral(red: 0.1137254902, green: 0.7058823529, blue: 0.8235294118, alpha: 1) - static let portable2 = #colorLiteral(red: 0.9882352941, green: 0.1333333333, blue: 0.168627451, alpha: 1) - static let trilogy = #colorLiteral(red: 0.4509803922, green: 0.5450980392, blue: 0.9882352941, alpha: 1) - static let ce = #colorLiteral(red: 1, green: 0.9725490196, blue: 0.8666666667, alpha: 1) - static let technika1 = #colorLiteral(red: 0.9333333333, green: 0.1725490196, blue: 0.7411764706, alpha: 1) - static let bs = #colorLiteral(red: 0.7882352941, green: 0.07450980392, blue: 0.1098039216, alpha: 1) - static let technika2 = #colorLiteral(red: 0.6784313725, green: 0.3450980392, blue: 0.1294117647, alpha: 1) - //Trophy Colors - static let platinum = #colorLiteral(red: 0.8980392157, green: 0.8941176471, blue: 0.8862745098, alpha: 1) - static let gold = #colorLiteral(red: 0.831372549, green: 0.6862745098, blue: 0.2156862745, alpha: 1) - static let silver = #colorLiteral(red: 0.7529411765, green: 0.7529411765, blue: 0.7529411765, alpha: 1) - static let bronze = #colorLiteral(red: 0.8039215686, green: 0.4980392157, blue: 0.1960784314, alpha: 1) -} diff --git a/RespectU/Extension/UITableViewCell+.swift b/RespectU/Extension/UITableViewCell+.swift deleted file mode 100644 index 471c8ff..0000000 --- a/RespectU/Extension/UITableViewCell+.swift +++ /dev/null @@ -1,111 +0,0 @@ -// -// UITableViewCell+.swift -// RespectU -// -// Created by Presto on 2018. 8. 6.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import UIKit - -extension UITableViewCell { - func setColorsInSong(_ series: String, labels: [UILabel]) { - DispatchQueue.main.async { [weak self] in - switch series { - case Series.portable1: - self?.contentView.backgroundColor = .portable1 - self?.setColors(of: labels, to: .white) - case Series.portable2: - self?.contentView.backgroundColor = .portable2 - self?.setColors(of: labels, to: .white) - case Series.respect: - self?.contentView.backgroundColor = .respect - self?.setColors(of: labels, to: .white) - case Series.trilogy: - self?.contentView.backgroundColor = .trilogy - self?.setColors(of: labels, to: .white) - case Series.ce: - self?.contentView.backgroundColor = .ce - self?.setColors(of: labels, to: .black) - case Series.technika1: - self?.contentView.backgroundColor = .technika1 - self?.setColors(of: labels, to: .white) - case Series.bs: - self?.contentView.backgroundColor = .bs - self?.setColors(of: labels, to: .white) - case Series.technika2: - self?.contentView.backgroundColor = .technika2 - self?.setColors(of: labels, to: .black) - default: - break - } - } - } - - func setColorsInMission(_ series: String, labels: [UILabel]) { - DispatchQueue.main.async { [unowned self] in - switch series { - case MissionSection.Respect.departure: - self.contentView.backgroundColor = #colorLiteral(red: 0.3058823529, green: 0.9058823529, blue: 0.7450980392, alpha: 1) - case MissionSection.Respect.clubRoad645: - self.contentView.backgroundColor = #colorLiteral(red: 0.337254902, green: 0.8470588235, blue: 0.9568627451, alpha: 1) - case MissionSection.Respect.maxTheater: - self.contentView.backgroundColor = #colorLiteral(red: 0.3098039216, green: 0.6980392157, blue: 0.9098039216, alpha: 1) - case MissionSection.Respect.anotherWorld: - self.contentView.backgroundColor = #colorLiteral(red: 0.4431372549, green: 0.5882352941, blue: 0.8705882353, alpha: 1) - case MissionSection.Respect.backStage: - self.contentView.backgroundColor = #colorLiteral(red: 0.7058823529, green: 0.6274509804, blue: 0.9215686275, alpha: 1) - case MissionSection.Respect.chaosTheory: - self.contentView.backgroundColor = #colorLiteral(red: 0.7019607843, green: 0.5490196078, blue: 0.8980392157, alpha: 1) - case MissionSection.Respect.soundLab: - self.contentView.backgroundColor = #colorLiteral(red: 0.831372549, green: 0.4705882353, blue: 0.937254902, alpha: 1) - case MissionSection.Respect.visualizer: - self.contentView.backgroundColor = #colorLiteral(red: 0.8941176471, green: 0.4745098039, blue: 0.9019607843, alpha: 1) - case MissionSection.Respect.developers: - self.contentView.backgroundColor = #colorLiteral(red: 0.9607843137, green: 0.3333333333, blue: 0.6549019608, alpha: 1) - case MissionSection.Respect.destination: - self.contentView.backgroundColor = #colorLiteral(red: 0.7960784314, green: 0.2862745098, blue: 0.3882352941, alpha: 1) - case MissionSection.Trilogy.tSide: - self.contentView.backgroundColor = #colorLiteral(red: 0.5607843137, green: 0.6784313725, blue: 0.831372549, alpha: 1) - case MissionSection.Trilogy.rSide: - self.contentView.backgroundColor = #colorLiteral(red: 0.662745098, green: 0.5803921569, blue: 0.8705882353, alpha: 1) - case MissionSection.CE.electronicCity: - self.contentView.backgroundColor = #colorLiteral(red: 0.8862745098, green: 0.8745098039, blue: 0.4431372549, alpha: 1) - case MissionSection.CE.metropolis: - self.contentView.backgroundColor = #colorLiteral(red: 0.7137254902, green: 0.631372549, blue: 0.8039215686, alpha: 1) - case MissionSection.Technika1.platinumMixing: - self.contentView.backgroundColor = #colorLiteral(red: 0.7137254902, green: 0.8196078431, blue: 0.8980392157, alpha: 1) - case MissionSection.Technika1.technicalMixing: - self.contentView.backgroundColor = #colorLiteral(red: 0.8901960784, green: 0.6, blue: 0.7803921569, alpha: 1) - case MissionSection.BS.stylishPerformance: - self.contentView.backgroundColor = #colorLiteral(red: 0.4980392157, green: 0.6274509804, blue: 0.8156862745, alpha: 1) - case MissionSection.BS.absoluteSound: - self.contentView.backgroundColor = #colorLiteral(red: 0.8039215686, green: 0.5019607843, blue: 0.6196078431, alpha: 1) - case MissionSection.LinkDisk.whiteDisk: - self.contentView.backgroundColor = #colorLiteral(red: 0.7058823529, green: 0.431372549, blue: 0.4745098039, alpha: 1) - case MissionSection.LinkDisk.blackDisk: - self.contentView.backgroundColor = #colorLiteral(red: 0.6392156863, green: 0.6, blue: 0.4196078431, alpha: 1) - case MissionSection.Technika2.starMixing: - self.contentView.backgroundColor = #colorLiteral(red: 0.7803921569, green: 0.6980392157, blue: 0.3647058824, alpha: 1) - case MissionSection.Technika2.clubMixing: - self.contentView.backgroundColor = #colorLiteral(red: 0.7803921569, green: 0.6980392157, blue: 0.3647058824, alpha: 1) - default: - self.contentView.backgroundColor = .clear - } - self.setColors(of: labels, to: .white) - } - } - - func unsetColors(labels: [UILabel]) { - DispatchQueue.main.async { [weak self] in - self?.contentView.backgroundColor = .white - self?.setColors(of: labels, to: .black) - } - } - - private func setColors(of labels: [UILabel], to color: UIColor) { - for label in labels { - label.textColor = color - } - } -} diff --git a/RespectU/Extension/UIView+.swift b/RespectU/Extension/UIView+.swift deleted file mode 100644 index b196867..0000000 --- a/RespectU/Extension/UIView+.swift +++ /dev/null @@ -1,16 +0,0 @@ -// -// UIView+.swift -// RespectU -// -// Created by Presto on 2018. 3. 4.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import UIKit - -extension UIView { - static func instantiateFromXib(xibName: String) -> UIView { - guard let view = UINib(nibName: xibName, bundle: nil).instantiate(withOwner: nil, options: nil).first as? UIView else { return UIView() } - return view - } -} diff --git a/RespectU/Extension/UIViewController+.swift b/RespectU/Extension/UIViewController+.swift deleted file mode 100644 index 1644ff1..0000000 --- a/RespectU/Extension/UIViewController+.swift +++ /dev/null @@ -1,77 +0,0 @@ -// -// UIViewController+.swift -// RespectU -// -// Created by Presto on 2018. 8. 2.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import UIKit - -extension UIViewController { - static func instantiate(storyboard: String, identifier: String) -> UIViewController? { - let viewController = UIStoryboard(name: storyboard, bundle: nil).instantiateViewController(withIdentifier: identifier) - return viewController - } - - func recommendedSpeed(by speed: Double) -> String { - switch speed { - case ..<0.50: - return "0.50" - case 0.50..<0.75: - return "0.50 ~ 0.75" - case 0.75..<1.00: - return "0.75 ~ 1.00" - case 1.00..<1.25: - return "1.00 ~ 1.25" - case 1.25..<1.50: - return "1.25 ~ 1.50" - case 1.50..<1.75: - return "1.50 ~ 1.75" - case 1.75..<2.00: - return "1.75 ~ 2.00" - case 2.00..<2.25: - return "2.00 ~ 2.25" - case 2.25..<2.50: - return "2.25 ~ 2.50" - case 2.50..<2.75: - return "2.50 ~ 2.75" - case 2.75..<3.00: - return "2.75 ~ 3.00" - case 3.00..<3.25: - return "3.00 ~ 3.25" - case 3.25..<3.50: - return "3.25 ~ 3.50" - case 3.50..<3.75: - return "3.50 ~ 3.75" - case 3.75..<4.00: - return "3.75 ~ 4.00" - case 4.00..<4.25: - return "4.00 ~ 4.25" - case 4.25..<4.50: - return "4.25 ~ 4.50" - case 4.50..<4.75: - return "4.50 ~ 4.75" - case 4.75..<5.00: - return "4.75 ~ 5.00" - case 5.00...: - return "5.00" - default: - return "" - } - } - - func showIndicator() { - DispatchQueue.main.async { - IndicatorView.shared.showIndicator() - UIApplication.shared.isNetworkActivityIndicatorVisible = true - } - } - - func hideIndicator() { - DispatchQueue.main.async { - IndicatorView.shared.hideIndicator() - UIApplication.shared.isNetworkActivityIndicatorVisible = false - } - } -} diff --git a/RespectU/Guide/Achievement/Controller/AchievementAllTableViewController.swift b/RespectU/Guide/Achievement/Controller/AchievementAllTableViewController.swift deleted file mode 100644 index 1814f34..0000000 --- a/RespectU/Guide/Achievement/Controller/AchievementAllTableViewController.swift +++ /dev/null @@ -1,31 +0,0 @@ -// -// AchievementAllTableViewController.swift -// RespectU -// -// Created by Presto on 2018. 3. 2.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import UIKit -import XLPagerTabStrip - -class AchievementAllTableViewController: AchievementBaseTableViewController { - - override func viewDidLoad() { - super.viewDidLoad() - results = AchievementInfo.fetch() - generateStageCounts() - } -} - -extension AchievementAllTableViewController { - override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { - return achievementCell(at: indexPath, isAll: true) - } -} - -extension AchievementAllTableViewController: IndicatorInfoProvider { - func indicatorInfo(for pagerTabStripController: PagerTabStripViewController) -> IndicatorInfo { - return IndicatorInfo(title: "ALL") - } -} diff --git a/RespectU/Guide/Achievement/Controller/AchievementBaseTableViewController.swift b/RespectU/Guide/Achievement/Controller/AchievementBaseTableViewController.swift deleted file mode 100644 index 823d42e..0000000 --- a/RespectU/Guide/Achievement/Controller/AchievementBaseTableViewController.swift +++ /dev/null @@ -1,102 +0,0 @@ -// -// AchievementBaseTableViewController.swift -// RespectU -// -// Created by Presto on 2018. 8. 2.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import UIKit -import RealmSwift - -class AchievementBaseTableViewController: UITableViewController { - - var results: Results? - var stages = [Int]() - let cellIdentifier = "achievementCell" - - override func viewDidLoad() { - super.viewDidLoad() - tableView = UITableView(frame: tableView.bounds, style: .grouped) - tableView.rowHeight = 40 - tableView.showsVerticalScrollIndicator = false - tableView.separatorStyle = .none - tableView.register(UINib(nibName: "AchievementCell", bundle: nil), forCellReuseIdentifier: cellIdentifier) - } -} - -extension AchievementBaseTableViewController { - func generateStageCounts() { - guard let results = self.results else { return } - self.stages.removeAll() - var count = 0 - var tempTitle = "" - var isFirst = true - for result in results { - if tempTitle != result.localizedSection { - tempTitle = result.localizedSection - if isFirst { - isFirst = false - } else { - stages.append(count) - count = 0 - } - } - count += 1 - } - stages.append(count) - } - - func achievementCell(at indexPath: IndexPath, isAll: Bool = false) -> UITableViewCell { - guard let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier) as? AchievementCell else { return UITableViewCell() } - var rowIndex = 0 - if indexPath.section > 0 { - for index in 1...indexPath.section { - rowIndex += stages[index - 1] - } - } - rowIndex += indexPath.row - let count = self.results?.count ?? 0 - if rowIndex < count { - let object = self.results?[rowIndex] - cell.setProperties(object, isAll: isAll) - } - return cell - } -} - -extension AchievementBaseTableViewController { - override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { - return achievementCell(at: indexPath) - } - - override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - return self.stages[section] - } - - override func numberOfSections(in tableView: UITableView) -> Int { - return self.stages.count - } - - override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { - if section < self.stages.count { - var index = 0 - for sectionIndex in 0...section { - index += stages[sectionIndex] - } - return self.results?[index - 1].localizedSection - } - return nil - } - - override func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) { - guard let header = view as? UITableViewHeaderFooterView else { return } - header.textLabel?.textColor = .black - header.textLabel?.font = UIFont.systemFont(ofSize: 20, weight: .bold) - header.backgroundView?.backgroundColor = .white - } - - override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { - tableView.deselectRow(at: indexPath, animated: true) - } -} diff --git a/RespectU/Guide/Achievement/Controller/AchievementCommentTableViewController.swift b/RespectU/Guide/Achievement/Controller/AchievementCommentTableViewController.swift deleted file mode 100644 index ffc5fbd..0000000 --- a/RespectU/Guide/Achievement/Controller/AchievementCommentTableViewController.swift +++ /dev/null @@ -1,25 +0,0 @@ -// -// AchievementCommentTableViewController.swift -// RespectU -// -// Created by Presto on 2018. 3. 2.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import UIKit -import XLPagerTabStrip - -class AchievementCommentTableViewController: AchievementBaseTableViewController { - - override func viewDidLoad() { - super.viewDidLoad() - results = AchievementInfo.fetch(of: "comment") - generateStageCounts() - } -} - -extension AchievementCommentTableViewController: IndicatorInfoProvider { - func indicatorInfo(for pagerTabStripController: PagerTabStripViewController) -> IndicatorInfo { - return IndicatorInfo(title: "COMMENT") - } -} diff --git a/RespectU/Guide/Achievement/Controller/AchievementGalleryTableViewController.swift b/RespectU/Guide/Achievement/Controller/AchievementGalleryTableViewController.swift deleted file mode 100644 index 43d316d..0000000 --- a/RespectU/Guide/Achievement/Controller/AchievementGalleryTableViewController.swift +++ /dev/null @@ -1,25 +0,0 @@ -// -// AchievementGalleryTableViewController.swift -// RespectU -// -// Created by Presto on 2018. 3. 2.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import UIKit -import XLPagerTabStrip - -class AchievementGalleryTableViewController: AchievementBaseTableViewController { - - override func viewDidLoad() { - super.viewDidLoad() - results = AchievementInfo.fetch(of: "gallery") - generateStageCounts() - } -} - -extension AchievementGalleryTableViewController: IndicatorInfoProvider { - func indicatorInfo(for pagerTabStripController: PagerTabStripViewController) -> IndicatorInfo { - return IndicatorInfo(title: "GALLERY") - } -} diff --git a/RespectU/Guide/Achievement/Controller/AchievementGearTableViewController.swift b/RespectU/Guide/Achievement/Controller/AchievementGearTableViewController.swift deleted file mode 100644 index 0cb1eb6..0000000 --- a/RespectU/Guide/Achievement/Controller/AchievementGearTableViewController.swift +++ /dev/null @@ -1,25 +0,0 @@ -// -// AchievementGearTableViewController.swift -// RespectU -// -// Created by Presto on 2018. 3. 2.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import UIKit -import XLPagerTabStrip - -class AchievementGearTableViewController: AchievementBaseTableViewController { - - override func viewDidLoad() { - super.viewDidLoad() - results = AchievementInfo.fetch(of: "gear") - generateStageCounts() - } -} - -extension AchievementGearTableViewController: IndicatorInfoProvider { - func indicatorInfo(for pagerTabStripController: PagerTabStripViewController) -> IndicatorInfo { - return IndicatorInfo(title: "GEAR SKIN") - } -} diff --git a/RespectU/Guide/Achievement/Controller/AchievementMusicTableViewController.swift b/RespectU/Guide/Achievement/Controller/AchievementMusicTableViewController.swift deleted file mode 100644 index 181e110..0000000 --- a/RespectU/Guide/Achievement/Controller/AchievementMusicTableViewController.swift +++ /dev/null @@ -1,25 +0,0 @@ -// -// AchievementMusicTableViewController.swift -// RespectU -// -// Created by Presto on 2018. 3. 2.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import UIKit -import XLPagerTabStrip - -class AchievementMusicTableViewController: AchievementBaseTableViewController { - - override func viewDidLoad() { - super.viewDidLoad() - results = AchievementInfo.fetch(of: "music") - generateStageCounts() - } -} - -extension AchievementMusicTableViewController: IndicatorInfoProvider { - func indicatorInfo(for pagerTabStripController: PagerTabStripViewController) -> IndicatorInfo { - return IndicatorInfo(title: "MUSIC") - } -} diff --git a/RespectU/Guide/Achievement/Controller/AchievementNoteTableViewController.swift b/RespectU/Guide/Achievement/Controller/AchievementNoteTableViewController.swift deleted file mode 100644 index 64ea918..0000000 --- a/RespectU/Guide/Achievement/Controller/AchievementNoteTableViewController.swift +++ /dev/null @@ -1,25 +0,0 @@ -// -// AchievementNoteTableViewController.swift -// RespectU -// -// Created by Presto on 2018. 3. 2.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import UIKit -import XLPagerTabStrip - -class AchievementNoteTableViewController: AchievementBaseTableViewController { - - override func viewDidLoad() { - super.viewDidLoad() - results = AchievementInfo.fetch(of: "note") - generateStageCounts() - } -} - -extension AchievementNoteTableViewController: IndicatorInfoProvider { - func indicatorInfo(for pagerTabStripController: PagerTabStripViewController) -> IndicatorInfo { - return IndicatorInfo(title: "NOTE SKIN") - } -} diff --git a/RespectU/Guide/Achievement/Controller/AchievementPlateTableViewController.swift b/RespectU/Guide/Achievement/Controller/AchievementPlateTableViewController.swift deleted file mode 100644 index 982d317..0000000 --- a/RespectU/Guide/Achievement/Controller/AchievementPlateTableViewController.swift +++ /dev/null @@ -1,25 +0,0 @@ -// -// AchievementPlateTableViewController.swift -// RespectU -// -// Created by Presto on 2018. 3. 27.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import UIKit -import XLPagerTabStrip - -class AchievementPlateTableViewController: AchievementBaseTableViewController { - - override func viewDidLoad() { - super.viewDidLoad() - results = AchievementInfo.fetch(of: "plate") - generateStageCounts() - } -} - -extension AchievementPlateTableViewController: IndicatorInfoProvider { - func indicatorInfo(for pagerTabStripController: PagerTabStripViewController) -> IndicatorInfo { - return IndicatorInfo(title: "PLATE") - } -} diff --git a/RespectU/Guide/Achievement/Controller/AchievementViewController.swift b/RespectU/Guide/Achievement/Controller/AchievementViewController.swift deleted file mode 100644 index 88cd746..0000000 --- a/RespectU/Guide/Achievement/Controller/AchievementViewController.swift +++ /dev/null @@ -1,36 +0,0 @@ -// -// AchievementViewController.swift -// RespectU -// -// Created by Presto on 2018. 3. 2.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import UIKit -import XLPagerTabStrip - -class AchievementViewController: BaseViewController { - - private lazy var allTableViewController = AchievementAllTableViewController() - private lazy var musicTableViewController = AchievementMusicTableViewController() - private lazy var gearTableViewController = AchievementGearTableViewController() - private lazy var noteTableViewController = AchievementNoteTableViewController() - private lazy var plateTableViewController = AchievementPlateTableViewController() - private lazy var galleryTableViewController = AchievementGalleryTableViewController() - private lazy var commentTableViewController = AchievementCommentTableViewController() - lazy var achievementViewControllers: [AchievementBaseTableViewController] = { - return [allTableViewController, musicTableViewController, gearTableViewController, noteTableViewController, plateTableViewController, galleryTableViewController, commentTableViewController] - }() - - override func viewDidLoad() { - super.viewDidLoad() - } - - override func viewControllers(for pagerTabStripController: PagerTabStripViewController) -> [UIViewController] { - return achievementViewControllers - } - - @IBAction func touchUpCancelButton(_ sender: UIButton) { - self.dismiss(animated: true, completion: nil) - } -} diff --git a/RespectU/Guide/Achievement/View/AchievementCell.swift b/RespectU/Guide/Achievement/View/AchievementCell.swift deleted file mode 100644 index 112ddc2..0000000 --- a/RespectU/Guide/Achievement/View/AchievementCell.swift +++ /dev/null @@ -1,26 +0,0 @@ -// -// AchievementCell.swift -// RespectU -// -// Created by Presto on 2018. 3. 2.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import UIKit - -class AchievementCell: UITableViewCell { - - @IBOutlet weak var stageLabel: UILabel! - @IBOutlet weak var itemLabel: UILabel! - @IBOutlet weak var typeLabel: UILabel! - - override func awakeFromNib() { - super.awakeFromNib() - } - - func setProperties(_ object: AchievementInfo?, isAll: Bool = false) { - stageLabel.text = "\(object?.level ?? 0)" - itemLabel.text = object?.localizedItem - typeLabel.text = isAll ? object?.type.uppercased() : nil - } -} diff --git a/RespectU/Guide/Download/DownloadViewController.swift b/RespectU/Guide/Download/DownloadViewController.swift deleted file mode 100644 index a51ca27..0000000 --- a/RespectU/Guide/Download/DownloadViewController.swift +++ /dev/null @@ -1,353 +0,0 @@ -// -// DownloadViewController.swift -// RespectU -// -// Created by Presto on 2018. 8. 29.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import UIKit -import SwiftKeychainWrapper - -class DownloadViewController: UIViewController { - - @IBOutlet weak var downloadDataLabel: UILabel! - @IBOutlet weak var downloadDataButton: UIButton! - @IBOutlet weak var downloadRecordLabel: UILabel! - @IBOutlet weak var downloadRecordButton: UIButton! - var isValidVersion: Bool = false { - didSet { - if isValidVersion { - showIndicator() - API.requestSongs(completion: didReceiveSongs) - API.requestMissions(completion: didReceiveMissions) - API.requestTrophies(completion: didReceiveTrophies) - API.requestAchievements(completion: didReceiveAchievements) - API.requestTips(completion: didReceiveTips) - API.requestVersions(completion: didReceiveVersions) - } - } - } - var finishesSong: Bool = false - var finishesMission: Bool = false - var finishesTrophy: Bool = false - var finishesAchievement: Bool = false - var finishesTip: Bool = false - var finishesVersion: Bool = false - var finishesRecord: Bool = false - var dataCount = 0 { - didSet { - if dataCount == 6 { - hideIndicator() - if finishesDataAll { - presentSuccessAlert() - } else { - presentFailureAlert() - } - dataCount = 0 - } - } - } - var recordCount = 0 { - didSet { - if recordCount == 1 { - hideIndicator() - if finishesRecord { - presentSuccessAlert() - } else { - presentFailureAlert() - } - recordCount = 0 - } - } - } - var finishesDataAll: Bool { - if finishesSong, finishesMission, finishesTrophy, finishesAchievement, finishesTip, finishesVersion { - return true - } - return false - } - - override func viewDidLoad() { - super.viewDidLoad() - setup() - } - - func setup() { - downloadDataLabel.text = "Update with latest data.".localized - downloadRecordLabel.text = "Get exported performance record data.".localized - downloadDataButton.setTitle("Download".localized, for: []) - downloadRecordButton.setTitle("Download".localized, for: []) - downloadDataButton.addTarget(self, action: #selector(didTouchUpDownloadDataButton(_:)), for: .touchUpInside) - downloadRecordButton.addTarget(self, action: #selector(didTouchUpDownloadRecordButton(_:)), for: .touchUpInside) - } - - @objc func didTouchUpDownloadDataButton(_ sender: UIButton) { - API.requestVersions(completion: didReceiveVersion) - } - - @objc func didTouchUpDownloadRecordButton(_ sender: UIButton) { - let id = KeychainWrapper.standard.string(forKey: "id") ?? "" - if id.isEmpty { - UIAlertController - .alert(title: "", message: "First Log In.".localized) - .action(title: "OK".localized) - .present(to: self) - } else { - UIAlertController - .alert(title: "Warning".localized, message: "If there is no data on the server, the recorded performance information can be initialized.".localized) - .action(.destructive, title: "OK".localized, handler: { [weak self] _ in - guard let `self` = self else { return } - DispatchQueue.main.async { - self.showIndicator() - } - API.requestRecords(id, completion: self.didReceiveRecords) - }) - .action(.cancel, title: "Cancel".localized) - .present(to: self) - } - } - - @IBAction func didTouchUpCancelButton(_ sender: UIButton) { - self.dismiss(animated: true, completion: nil) - } -} - -private extension DownloadViewController { - func didReceiveSongs(response: SongResponse?, error: Error?) { - if let error = error { - plusDataCount() - UIAlertController.presentErrorAlert(to: self, error: error.localizedDescription) - return - } - guard let response = response else { return } - let downloadedSongs = response.songs - let results = SongInfo.fetch() - for downloadedSong in downloadedSongs { - let predicate = NSPredicate(format: "%K == %@", #keyPath(SongInfo.title.english), downloadedSong.title.english) - if let result = results.filter(predicate).first { - SongInfo.update(downloadedSong, to: result) - } else { - SongInfo.add(downloadedSong) - let recordInfo = NewRecordInfo() - let titleInfo = LanguageInfo() - titleInfo.english = downloadedSong.title.english - titleInfo.korean = downloadedSong.title.korean - recordInfo.title = titleInfo - recordInfo.series = downloadedSong.series - let button4Record = NewRecordButtonInfo() - let button5Record = NewRecordButtonInfo() - let button6Record = NewRecordButtonInfo() - let button8Record = NewRecordButtonInfo() - let button4NormalRecord = NewRecordDifficultyInfo() - let button4HardRecord = NewRecordDifficultyInfo() - let button4MaximumRecord = NewRecordDifficultyInfo() - let button5NormalRecord = NewRecordDifficultyInfo() - let button5HardRecord = NewRecordDifficultyInfo() - let button5MaximumRecord = NewRecordDifficultyInfo() - let button6NormalRecord = NewRecordDifficultyInfo() - let button6HardRecord = NewRecordDifficultyInfo() - let button6MaximumRecord = NewRecordDifficultyInfo() - let button8NormalRecord = NewRecordDifficultyInfo() - let button8HardRecord = NewRecordDifficultyInfo() - let button8MaximumRecord = NewRecordDifficultyInfo() - button4Record.normal = button4NormalRecord - button4Record.hard = button4HardRecord - button4Record.maximum = button4MaximumRecord - button5Record.normal = button5NormalRecord - button5Record.hard = button5HardRecord - button5Record.maximum = button5MaximumRecord - button6Record.normal = button6NormalRecord - button6Record.hard = button6HardRecord - button6Record.maximum = button6MaximumRecord - button8Record.normal = button8NormalRecord - button8Record.hard = button8HardRecord - button8Record.maximum = button8MaximumRecord - recordInfo.button4 = button4Record - recordInfo.button5 = button5Record - recordInfo.button6 = button6Record - recordInfo.button8 = button8Record - NewRecordInfo.add(recordInfo) - } - } - Skill.refresh() - finishesSong = true - plusDataCount() - } - - func didReceiveMissions(response: MissionResponse?, error: Error?) { - if let error = error { - plusDataCount() - UIAlertController.presentErrorAlert(to: self, error: error.localizedDescription) - return - } - guard let response = response else { return } - let downloadedMissions = response.missions - let results = MissionInfo.fetch() - for downloadedMission in downloadedMissions { - let predicate = NSPredicate(format: "%K == %@", #keyPath(MissionInfo.title), downloadedMission.title) - if let result = results.filter(predicate).first { - MissionInfo.update(downloadedMission, to: result) - } else { - MissionInfo.add(downloadedMission) - } - } - finishesMission = true - plusDataCount() - } - - func didReceiveTrophies(response: TrophyResponse?, error: Error?) { - if let error = error { - plusDataCount() - UIAlertController.presentErrorAlert(to: self, error: error.localizedDescription) - return - } - guard let response = response else { return } - let downloadedTrophies = response.trophies - let results = TrophyInfo.fetch() - for downloadedTrophy in downloadedTrophies { - let predicate = NSPredicate(format: "%K == %@", #keyPath(TrophyInfo.image), downloadedTrophy.image) - if let result = results.filter(predicate).first { - TrophyInfo.update(downloadedTrophy, to: result) - } else { - TrophyInfo.add(downloadedTrophy) - } - } - finishesTrophy = true - plusDataCount() - } - - func didReceiveAchievements(response: AchievementResponse?, error: Error?) { - if let error = error { - plusDataCount() - UIAlertController.presentErrorAlert(to: self, error: error.localizedDescription) - return - } - guard let response = response else { return } - let downloadedAchievements = response.achievements - let results = AchievementInfo.fetch() - for downloadedAchievement in downloadedAchievements { - let predicate = NSPredicate(format: "%K == %@ AND %K == %@", #keyPath(AchievementInfo.item.english), downloadedAchievement.item.english, #keyPath(AchievementInfo.type), downloadedAchievement.type) - if let result = results.filter(predicate).first { - AchievementInfo.update(downloadedAchievement, to: result) - } else { - AchievementInfo.add(downloadedAchievement) - } - } - finishesAchievement = true - plusDataCount() - } - - func didReceiveTips(response: TipResponse?, error: Error?) { - if let error = error { - plusDataCount() - UIAlertController.presentErrorAlert(to: self, error: error.localizedDescription) - return - } - guard let response = response else { return } - let downloadedTips = response.tips - let results = TipInfo.fetch() - for downloadedTip in downloadedTips { - let predicate = NSPredicate(format: "%K == %@", #keyPath(TipInfo.title.english), downloadedTip.title.english) - if let result = results.filter(predicate).first { - TipInfo.update(downloadedTip, to: result) - } else { - TipInfo.add(downloadedTip) - } - } - finishesTip = true - plusDataCount() - } - - func didReceiveVersions(response: VersionResponse?, error: Error?) { - if let error = error { - plusDataCount() - UIAlertController.presentErrorAlert(to: self, error: error.localizedDescription) - return - } - guard let response = response else { return } - if let result = VersionInfo.fetch().first { - VersionInfo.update(response, to: result) - } else { - VersionInfo.add(response) - } - finishesVersion = true - plusDataCount() - } - - func didReceiveRecords(response: RecordResponse?, error: Error?) { - if let error = error { - plusRecordCount() - UIAlertController.presentErrorAlert(to: self, error: error.localizedDescription) - return - } - guard let response = response else { return } - let results = NewRecordInfo.fetch() - let records = response.records - for record in records { - let predicate = NSPredicate(format: "%K == %@", #keyPath(NewRecordInfo.title.english), record.title.english) - guard let result = results.filter(predicate).first else { continue } - NewRecordInfo.update(record, to: result) - } - finishesRecord = true - plusRecordCount() - } - - func didReceiveVersion(response: VersionResponse?, error: Error?) { - if let error = error { - UIAlertController.presentErrorAlert(to: self, error: error.localizedDescription) - return - } - guard let response = response else { return } - if response.clientVersion != version { - DispatchQueue.main.async { - UIAlertController - .alert(title: "", message: "New version released!\nPlease use it after updating.".localized) - .action(title: "Update".localized, handler: { _ in - guard let url = URL(string: "itms-apps://itunes.apple.com/app/id1291664067") else { return } - guard #available(iOS 10, *) else { - UIApplication.shared.openURL(url) - return - } - UIApplication.shared.open(url, options: [:]) - }) - .action(.cancel, title: "Cancel".localized) - .present(to: self) - } - } else { - isValidVersion = true - } - } -} - -private extension DownloadViewController { - func presentSuccessAlert() { - UIAlertController - .alert(title: "", message: "Your data has been successfully downloaded.".localized) - .action(title: "OK".localized) { [weak self] _ in - self?.parent?.dismiss(animated: true, completion: nil) - } - .present(to: self) - } - - func presentFailureAlert() { - UIAlertController - .alert(title: "", message: "Network Error".localized) - .action(title: "OK".localized) { [weak self] _ in - self?.dataCount = 0 - } - .present(to: self) - } - - func plusDataCount() { - DispatchQueue.main.sync { [weak self] in - self?.dataCount += 1 - } - } - - func plusRecordCount() { - DispatchQueue.main.sync { [weak self] in - self?.recordCount += 1 - } - } -} diff --git a/RespectU/Guide/Main/GuideViewController.swift b/RespectU/Guide/Main/GuideViewController.swift deleted file mode 100644 index c65240b..0000000 --- a/RespectU/Guide/Main/GuideViewController.swift +++ /dev/null @@ -1,273 +0,0 @@ -// -// GuideViewController.swift -// RespectU -// -// Created by Presto on 2018. 3. 1.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import UIKit -import SwiftKeychainWrapper -import MessageUI -import SafariServices - -class GuideViewController: UIViewController { - - private let imageNames = [["song", "mission", "trophy", "achievement", "tip", "manual"], ["log", "bpmDefault", "favorite"], ["download", "upload", "email", "radio", "credit", "rate"]] - private let sectionHeaderTitles = ["GUIDE FOR DJMAX RESPECT", "PERSONAL SETTING", "MORE"] - private let cellTitles = [["Music", "Mission", "Trophy", "Achievement", "TIP", "Manual"], ["Login / Logout", "BPM Default Setting", "My Favorite Button"], ["Download From Server", "Upload To Server", "Send Email to Developer", "DJMAX Radio Station", "Credit", "Rate This App"]] - @IBOutlet weak var tableView: UITableView! - @IBOutlet private weak var recordButton: UIButton! - - override func viewDidLoad() { - super.viewDidLoad() - tableView.register(UINib(nibName: "GuideFirstCell", bundle: nil), forCellReuseIdentifier: "guideFirstCell") - tableView.register(UINib(nibName: "GuideSecondCell", bundle: nil), forCellReuseIdentifier: "guideSecondCell") - tableView.register(UINib(nibName: "GuideThirdCell", bundle: nil), forCellReuseIdentifier: "guideThirdCell") - tableView.separatorStyle = .none - recordButton.setTitle("Performance Record".localized, for: .normal) - recordButton.layer.cornerRadius = recordButton.bounds.height / 2 - recordButton.layer.borderWidth = 1 - recordButton.layer.borderColor = UIColor.main.cgColor - } - - @IBAction func didTouchUpPreviousButton(_ sender: UIButton) { - self.navigationController?.popViewController(animated: true) - } - - @IBAction func didTouchUpRecordButton(_ sender: UIButton) { - guard let controller = UIViewController.instantiate(storyboard: "Record", identifier: RecordViewController.classNameToString) as? RecordViewController else { return } - self.present(controller, animated: true) - } -} - -extension GuideViewController: GuideFirstCellDelegate { - func didTapSongStackView() { - guard let controller = UIViewController.instantiate(storyboard: "Song", identifier: SongViewController.classNameToString) as? SongViewController else { return } - self.present(controller, animated: true) - } - - func didTapMissionStackView() { - guard let controller = UIViewController.instantiate(storyboard: "Mission", identifier: MissionViewController.classNameToString) as? MissionViewController else { return } - self.present(controller, animated: true) - } - - func didTapTrophyStackView() { - guard let controller = UIViewController.instantiate(storyboard: "Trophy", identifier: TrophyViewController.classNameToString) as? TrophyViewController else { return } - self.present(controller, animated: true) - } - - func didTapAchievementStackView() { - guard let controller = UIViewController.instantiate(storyboard: "Achievement", identifier: AchievementViewController.classNameToString) as? AchievementViewController else { return } - self.present(controller, animated: true) - } - - func didTapTipStackView() { - guard let controller = UIViewController.instantiate(storyboard: "Tip", identifier: TipViewController.classNameToString) as? TipViewController else { return } - self.present(controller, animated: true) - } - - func didTapManualStackView() { - if !Reachability.isConnectedToNetwork() { - presentNetworkAlert() - } else { - guard let url = URL(string: "http://djmaxrespect.com/manual.html") else { return } - let config = SFSafariViewController.Configuration() - config.barCollapsingEnabled = true - let controller = SFSafariViewController(url: url, configuration: config) - controller.preferredControlTintColor = .main - controller.dismissButtonStyle = .close - present(controller, animated: true, completion: nil) - } - } -} - -extension GuideViewController: GuideSecondCellDelegate { - func didTapUpLogInOutStackView() { - let id = KeychainWrapper.standard.string(forKey: "id") ?? "" - if !id.isEmpty { - KeychainWrapper.standard.set("", forKey: "id") - UIAlertController - .alert(title: "", message: "Log Out Completed".localized) - .action(title: "OK".localized) - .present(to: self) - } else { - guard let next = UIViewController.instantiate(storyboard: "SignIn", identifier: "SignNavigationController") else { return } - next.modalTransitionStyle = .crossDissolve - self.present(next, animated: true, completion: nil) - } - } - - func didTapBPMSettingStackView() { - let message = "Current".localized + " : BPM \(Int(UserDefaults.standard.double(forKey: "bpm")))\n\n" + "It becomes standard of Speed Recommendation.".localized - let alert = UIAlertController - .alert(title: "BPM Default Setting".localized, message: message) - .textField { (textField) in - textField.placeholder = "BPM" - textField.keyboardType = .numberPad - } - alert.action(title: "OK".localized) { _ in - if let input = alert.textFields?.first?.text { - if !input.isEmpty { - guard let value = Double(input) else { return } - UserDefaults.standard.set(value, forKey: "bpm") - UserDefaults.standard.synchronize() - } - } - } - .action(.cancel, title: "Cancel".localized) - .present(to: self) - } - - func didTapFavoriteButtonStackView() { - let key = "favoriteButton" - let favorite = UserDefaults.standard.string(forKey: key) - let message = "Current".localized + " : \(favorite?.uppercased() ?? "None".localized)\n\n" + "The information related to the set value is displayed first.".localized - UIAlertController - .alert(title: "My Favorite Button".localized, message: message) - .action(title: Buttons.button4.uppercased()) { _ in - UserDefaults.standard.set(Buttons.button4, forKey: key) - } - .action(title: Buttons.button5.uppercased()) { _ in - UserDefaults.standard.set(Buttons.button5, forKey: key) - } - .action(title: Buttons.button6.uppercased()) { _ in - UserDefaults.standard.set(Buttons.button6, forKey: key) - } - .action(title: Buttons.button8.uppercased()) { _ in - UserDefaults.standard.set(Buttons.button8, forKey: key) - } - .action(.cancel, title: "Cancel".localized) - .present(to: self) - } -} - -extension GuideViewController: GuideThirdCellDelegate { - func didTapDownloadStackView() { - guard let next = UIViewController.instantiate(storyboard: "Download", identifier: DownloadViewController.classNameToString) else { return } - self.present(next, animated: true, completion: nil) - } - - func didTapUploadStackView() { - guard let next = UIViewController.instantiate(storyboard: "Upload", identifier: UploadViewController.classNameToString) else { return } - self.present(next, animated: true, completion: nil) - } - - func didTapEmailStackView() { - sendEmail() - } - - func didTapRadioStackView() { - if !Reachability.isConnectedToNetwork() { - presentNetworkAlert() - } else { - guard let url = URL(string: "https://djmax.protomox.com") else { return } - let config = SFSafariViewController.Configuration() - config.barCollapsingEnabled = true - let controller = SFSafariViewController(url: url, configuration: config) - controller.preferredControlTintColor = .main - controller.dismissButtonStyle = .close - present(controller, animated: true, completion: nil) - } - } - - func didTapCreditStackView() { - guard let versionInfo = VersionInfo.fetch().first else { return } - let gameVersion = versionInfo.gameVersion - let serverVersion = versionInfo.serverVersion - let message = "PSN ID : Presto_95\n\nDJMAX RESPECT \(gameVersion)\nRespectU (iOS) \(version)\nRespectU (Server) \(serverVersion)\n\nApp icon by icons8" - UIAlertController - .alert(title: "CREDITS".localized, message: message) - .action(title: "OK".localized) - .present(to: self) - } - - func didTapRateStackView() { - self.rateApp(appId: "id1291664067") - } -} - -extension GuideViewController: UITableViewDataSource { - func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { - switch indexPath.section { - case 0: - guard let cell = tableView.dequeueReusableCell(withIdentifier: "guideFirstCell", for: indexPath) as? GuideFirstCell else { return UITableViewCell() } - cell.delegate = self - return cell - case 1: - guard let cell = tableView.dequeueReusableCell(withIdentifier: "guideSecondCell", for: indexPath) as? GuideSecondCell else { return UITableViewCell() } - cell.delegate = self - return cell - case 2: - guard let cell = tableView.dequeueReusableCell(withIdentifier: "guideThirdCell", for: indexPath) as? GuideThirdCell else { return UITableViewCell() } - cell.delegate = self - return cell - default: - return UITableViewCell() - } - } - - func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - return 1 - } - - func numberOfSections(in tableView: UITableView) -> Int { - return 3 - } -} - -extension GuideViewController: UITableViewDelegate { - func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { - tableView.deselectRow(at: indexPath, animated: true) - } - - func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { - return UITableViewAutomaticDimension - } - - func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { - return 30 - } - - func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat { - return .leastNormalMagnitude - } -} - -extension GuideViewController { - private func presentNetworkAlert() { - UIAlertController - .alert(title: "", message: "Check your network status.".localized) - .action(title: "OK".localized) - .present(to: self) - } -} - -extension GuideViewController: MFMailComposeViewControllerDelegate { - func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) { - controller.dismiss(animated: true) - } -} - -private extension GuideViewController { - func sendEmail() { - if MFMailComposeViewController.canSendMail() { - let mail = MFMailComposeViewController() - mail.mailComposeDelegate = self - mail.setToRecipients(["yoohan95@gmail.com"]) - self.present(mail, animated: true) - } - } - - func rateApp(appId: String, completion: ((_ success: Bool) -> Void)? = nil) { - guard let url = URL(string: "itms-apps://itunes.apple.com/app/" + appId) else { - completion?(false) - return - } - guard #available(iOS 10, *) else { - completion?(UIApplication.shared.openURL(url)) - return - } - UIApplication.shared.open(url, options: [:], completionHandler: completion) - } -} diff --git a/RespectU/Guide/Main/View/GuideFirstCell.swift b/RespectU/Guide/Main/View/GuideFirstCell.swift deleted file mode 100644 index 4fe33d9..0000000 --- a/RespectU/Guide/Main/View/GuideFirstCell.swift +++ /dev/null @@ -1,71 +0,0 @@ -// -// GuideFirstCell.swift -// RespectU -// -// Created by Presto on 11/10/2018. -// Copyright © 2018 Presto. All rights reserved. -// - -import UIKit - -protocol GuideFirstCellDelegate: class { - func didTapSongStackView() - func didTapMissionStackView() - func didTapTrophyStackView() - func didTapAchievementStackView() - func didTapTipStackView() - func didTapManualStackView() -} - -class GuideFirstCell: UITableViewCell { - - let titles = ["Music", "Mission", "Trophy", "Achievement", "TIP", "Manual"] - let imageNames = ["song", "mission", "trophy", "achievement", "tip", "manual"] - weak var delegate: GuideFirstCellDelegate? - @IBOutlet weak var view: UIView! - @IBOutlet weak var titleLabel: UILabel! - @IBOutlet weak var songStackView: UIStackView! - @IBOutlet weak var missionStackView: UIStackView! - @IBOutlet weak var trophyStackView: UIStackView! - @IBOutlet weak var achievementStackView: UIStackView! - @IBOutlet weak var tipStackView: UIStackView! - @IBOutlet weak var manualStackView: UIStackView! - - override func awakeFromNib() { - super.awakeFromNib() - view.layer.cornerRadius = 15 - view.layer.borderWidth = 1 - view.layer.borderColor = UIColor.lightGray.cgColor - view.layer.masksToBounds = true - let stackViews = [songStackView, missionStackView, trophyStackView, achievementStackView, tipStackView, manualStackView] - for index in 0.. IndicatorInfo { - return IndicatorInfo(title: "BLACK SQUARE") - } -} diff --git a/RespectU/Guide/Mission/Controller/MissionBaseTableViewController.swift b/RespectU/Guide/Mission/Controller/MissionBaseTableViewController.swift deleted file mode 100644 index d9bbc06..0000000 --- a/RespectU/Guide/Mission/Controller/MissionBaseTableViewController.swift +++ /dev/null @@ -1,72 +0,0 @@ -// -// MissionBaseTableViewController.swift -// RespectU -// -// Created by Presto on 2018. 8. 2.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import UIKit -import RealmSwift - -class MissionBaseTableViewController: UITableViewController { - - var results: Results? - let cellIdentifier = "missionCell" - - override func viewDidLoad() { - super.viewDidLoad() - tableView = UITableView(frame: tableView.bounds, style: .grouped) - tableView.rowHeight = 60 - tableView.showsVerticalScrollIndicator = false - tableView.separatorStyle = .none - tableView.register(UINib(nibName: "MissionCell", bundle: nil), forCellReuseIdentifier: cellIdentifier) - } -} - -extension MissionBaseTableViewController { - override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { - guard let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier) as? MissionCell else { return UITableViewCell() } - let object = self.results?[indexPath.row + indexPath.section * 6] - cell.setProperties(object) - return cell - } - - override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { - tableView.deselectRow(at: indexPath, animated: true) - let object = self.results?[indexPath.row + indexPath.section * 6] - let detailViewController = MissionDetailViewController.instantiate(object)! - detailViewController.modalTransitionStyle = .crossDissolve - self.present(detailViewController, animated: true) - } - - override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - return 6 - } - - override func numberOfSections(in tableView: UITableView) -> Int { - return (self.results?.count ?? 0) / 6 - } - - override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { - return self.results?[section * 6].section - } - - override func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) { - guard let header = view as? UITableViewHeaderFooterView else { return } - header.textLabel?.textColor = .black - header.textLabel?.font = UIFont.systemFont(ofSize: 20, weight: .bold) - header.backgroundView?.backgroundColor = .white - } - - override func tableView(_ tableView: UITableView, didHighlightRowAt indexPath: IndexPath) { - guard let cell = tableView.cellForRow(at: indexPath) as? MissionCell else { return } - guard let object = self.results?[indexPath.row + indexPath.section * 6] else { return } - cell.setColorsInMission(object.section, labels: cell.labels) - } - - override func tableView(_ tableView: UITableView, didUnhighlightRowAt indexPath: IndexPath) { - guard let cell = tableView.cellForRow(at: indexPath) as? MissionCell else { return } - cell.unsetColors(labels: cell.labels) - } -} diff --git a/RespectU/Guide/Mission/Controller/MissionCETableViewController.swift b/RespectU/Guide/Mission/Controller/MissionCETableViewController.swift deleted file mode 100644 index 928c3be..0000000 --- a/RespectU/Guide/Mission/Controller/MissionCETableViewController.swift +++ /dev/null @@ -1,24 +0,0 @@ -// -// MissionCETableViewController.swift -// RespectU -// -// Created by Presto on 2018. 3. 2.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import UIKit -import XLPagerTabStrip - -class MissionCETableViewController: MissionBaseTableViewController { - - override func viewDidLoad() { - super.viewDidLoad() - results = MissionInfo.fetch(of: Series.ce) - } -} - -extension MissionCETableViewController: IndicatorInfoProvider { - func indicatorInfo(for pagerTabStripController: PagerTabStripViewController) -> IndicatorInfo { - return IndicatorInfo(title: "CLAZZIQUAI") - } -} diff --git a/RespectU/Guide/Mission/Controller/MissionDetailViewController.swift b/RespectU/Guide/Mission/Controller/MissionDetailViewController.swift deleted file mode 100644 index b543c6c..0000000 --- a/RespectU/Guide/Mission/Controller/MissionDetailViewController.swift +++ /dev/null @@ -1,257 +0,0 @@ -// -// MissionDetail2ViewController.swift -// RespectU -// -// Created by Presto on 2018. 3. 3.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import UIKit - -class MissionDetailViewController: UIViewController { - - var object: MissionInfo! - let myBPM = UserDefaults.standard.double(forKey: "bpm") - let random = "RANDOM" - - var existsSong1: Bool { - return object.stage1 != nil - } - var existsSong2: Bool { - return object.stage2 != nil - } - var existsSong3: Bool { - return object.stage3 != nil - } - var existsSong4: Bool { - return object.stage4 != nil - } - var existsSong5: Bool { - return object.stage5 != nil - } - var existsSong6: Bool { - return object.stage6 != nil - } - - @IBOutlet weak var titleLabel: UILabel! - @IBOutlet weak var scoreLabel: UILabel! - @IBOutlet weak var feverLabel: UILabel! - @IBOutlet weak var comboLabel: UILabel! - @IBOutlet weak var rateLabel: UILabel! - @IBOutlet weak var breakLabel: UILabel! - @IBOutlet weak var song1ButtonLabel: UILabel! - @IBOutlet weak var song2ButtonLabel: UILabel! - @IBOutlet weak var song3ButtonLabel: UILabel! - @IBOutlet weak var song4ButtonLabel: UILabel! - @IBOutlet weak var song5ButtonLabel: UILabel! - @IBOutlet weak var song6ButtonLabel: UILabel! - @IBOutlet weak var song1DifficultyLabel: UILabel! - @IBOutlet weak var song2DifficultyLabel: UILabel! - @IBOutlet weak var song3DifficultyLabel: UILabel! - @IBOutlet weak var song4DifficultyLabel: UILabel! - @IBOutlet weak var song5DifficultyLabel: UILabel! - @IBOutlet weak var song6DifficultyLabel: UILabel! - @IBOutlet weak var song1TitleLabel: UILabel! - @IBOutlet weak var song2TitleLabel: UILabel! - @IBOutlet weak var song3TitleLabel: UILabel! - @IBOutlet weak var song4TitleLabel: UILabel! - @IBOutlet weak var song5TitleLabel: UILabel! - @IBOutlet weak var song6TitleLabel: UILabel! - @IBOutlet weak var song1MoreButton: UIButton! - @IBOutlet weak var song2MoreButton: UIButton! - @IBOutlet weak var song3MoreButton: UIButton! - @IBOutlet weak var song4MoreButton: UIButton! - @IBOutlet weak var song5MoreButton: UIButton! - @IBOutlet weak var song6MoreButton: UIButton! - @IBOutlet weak var effectorLabel: UILabel! - @IBOutlet weak var rewardLabel: UILabel! - var infoLabels = [UILabel]() - var buttonLabels = [UILabel]() - var difficultyLabels = [UILabel]() - var titleLabels = [UILabel]() - var moreButtons = [UIButton]() - - override func viewDidLoad() { - super.viewDidLoad() - setVisibilityOfViews() - titleLabel.text = object.title - scoreLabel.text = object.score == 0 ? "-" : "\(object.score)" - feverLabel.text = object.fever == 0 ? "-" : "X\(object.fever)" - comboLabel.text = object.combo == 0 ? "-" : "\(object.combo)" - rateLabel.text = object.rate == 0 ? "-" : "\(object.rate)%" - breakLabel.text = object.break == 0 ? "-" : "\(object.break)" - effectorLabel.text = object.effector - rewardLabel.text = object.localizedReward - if let song = object.stage1 { - song1ButtonLabel.text = song.button.uppercased() - song1DifficultyLabel.text = song.difficulty.uppercased() - song1TitleLabel.text = song.localizedTitle - } - if let song = object.stage2 { - song2ButtonLabel.text = song.button.uppercased() - song2DifficultyLabel.text = song.difficulty.uppercased() - song2TitleLabel.text = song.localizedTitle - } - if let song = object.stage3 { - song3ButtonLabel.text = song.button.uppercased() - song3DifficultyLabel.text = song.difficulty.uppercased() - song3TitleLabel.text = song.localizedTitle - } - if let song = object.stage4 { - song4ButtonLabel.text = song.button.uppercased() - song4DifficultyLabel.text = song.difficulty.uppercased() - song4TitleLabel.text = song.localizedTitle - } - if let song = object.stage5 { - song5ButtonLabel.text = song.button.uppercased() - song5DifficultyLabel.text = song.difficulty.uppercased() - song5TitleLabel.text = song.localizedTitle - } - if let song = object.stage6 { - song6ButtonLabel.text = song.button.uppercased() - song6DifficultyLabel.text = song.difficulty.uppercased() - song6TitleLabel.text = song.localizedTitle - } - } - - static func instantiate(_ object: MissionInfo?) -> MissionDetailViewController? { - guard let viewController = UIStoryboard(name: "Mission", bundle: nil).instantiateViewController(withIdentifier: classNameToString) as? MissionDetailViewController else { return nil } - viewController.object = object - return viewController - } - - @IBAction func touchUpCancelButton(_ sender: UIButton) { - self.dismiss(animated: true, completion: nil) - } - - @IBAction func touchUpMoreButton(_ sender: UIButton) { - switch sender.tag { - case 0: - presentMoreAlert(object.stage1) - //presentMoreAlert(title: object.stage1?.localizedTitle, button: object.stage1?.button, difficulty: object.stage1?.difficulty) - case 1: - presentMoreAlert(object.stage2) - //presentMoreAlert(title: object.stage2?.localizedTitle, button: object.stage2?.button, difficulty: object.stage2?.difficulty) - case 2: - presentMoreAlert(object.stage3) - //presentMoreAlert(title: object.stage3?.localizedTitle, button: object.stage3?.button, difficulty: object.stage3?.difficulty) - case 3: - presentMoreAlert(object.stage4) - //presentMoreAlert(title: object.stage4?.localizedTitle, button: object.stage4?.button, difficulty: object.stage4?.difficulty) - case 4: - presentMoreAlert(object.stage5) - //presentMoreAlert(title: object.stage5?.localizedTitle, button: object.stage5?.button, difficulty: object.stage5?.difficulty) - case 5: - presentMoreAlert(object.stage6) - //presentMoreAlert(title: object.stage6?.localizedTitle, button: object.stage6?.button, difficulty: object.stage6?.difficulty) - default: - break - } - } -} - -extension MissionDetailViewController { - /// 더보기 버튼 눌렀을 때 UIAlertController 띄우기 - private func presentMoreAlert(_ object: MissionStageInfo?) { - guard let englishTitle = object?.title?.english, let localizedTitle = object?.localizedTitle, let button = object?.button, let difficulty = object?.difficulty else { return } - var level: Int? - var bpm: Int = 0 - var changesSpeed: Bool = false - if let songInfo = SongInfo.fetch(by: englishTitle) { - if let subBpm = songInfo.subBpm.value { - bpm = subBpm - changesSpeed = true - } else { - bpm = songInfo.bpm - } - if let buttonKeyPath = button.buttonExpansion { - guard let buttonResult = songInfo.value(forKeyPath: buttonKeyPath) as? SongButtonInfo else { return } - switch difficulty { - case Difficulty.normal: - level = buttonResult.normal - case Difficulty.hard: - level = buttonResult.hard - case Difficulty.maximum: - level = buttonResult.maximum - default: - break - } - } - } - let speedString = { () -> String in - if bpm != 0 { - return recommendedSpeed(by: myBPM / Double(bpm)) - } else { - return "??" - } - }() - let levelString = { () -> String in - if let level = level { - return "\(level)" - } else { - return "??" - } - }() - var message = "\(button.uppercased()) \(difficulty.uppercased())\n\n" + "Level".localized + "\n\(levelString)\n\n" + "SPEED Recommendation".localized + "\n\(speedString)" - if changesSpeed { - message += "\n" + "(SPEED Variation)".localized - } - DispatchQueue.main.async { [weak self] in - UIAlertController - .alert(title: localizedTitle, message: message) - .action(title: "OK".localized) - .present(to: self) - } - } - /// 뷰들의 가시성 초기 설정 - private func setVisibilityOfViews() { - if !existsSong1 { - song1ButtonLabel.isHidden = true - song1DifficultyLabel.isHidden = true - song1TitleLabel.isHidden = true - song1MoreButton.isHidden = true - } else if object.stage1?.localizedTitle == random { - song1MoreButton.isHidden = true - } - if !existsSong2 { - song2ButtonLabel.isHidden = true - song2DifficultyLabel.isHidden = true - song2TitleLabel.isHidden = true - song2MoreButton.isHidden = true - } else if object.stage2?.localizedTitle == random { - song2MoreButton.isHidden = true - } - if !existsSong3 { - song3ButtonLabel.isHidden = true - song3DifficultyLabel.isHidden = true - song3TitleLabel.isHidden = true - song3MoreButton.isHidden = true - } else if object.stage3?.localizedTitle == random { - song3MoreButton.isHidden = true - } - if !existsSong4 { - song4ButtonLabel.isHidden = true - song4DifficultyLabel.isHidden = true - song4TitleLabel.isHidden = true - song4MoreButton.isHidden = true - } else if object.stage4?.localizedTitle == random { - song4MoreButton.isHidden = true - } - if !existsSong5 { - song5ButtonLabel.isHidden = true - song5DifficultyLabel.isHidden = true - song5TitleLabel.isHidden = true - song5MoreButton.isHidden = true - } else if object.stage5?.localizedTitle == random { - song5MoreButton.isHidden = true - } - if !existsSong6 { - song6ButtonLabel.isHidden = true - song6DifficultyLabel.isHidden = true - song6TitleLabel.isHidden = true - song6MoreButton.isHidden = true - } else if object.stage6?.localizedTitle == random { - song6MoreButton.isHidden = true - } - } -} diff --git a/RespectU/Guide/Mission/Controller/MissionLinkDiskTableViewController.swift b/RespectU/Guide/Mission/Controller/MissionLinkDiskTableViewController.swift deleted file mode 100644 index b904a12..0000000 --- a/RespectU/Guide/Mission/Controller/MissionLinkDiskTableViewController.swift +++ /dev/null @@ -1,24 +0,0 @@ -// -// MissionLinkDiskTableViewController.swift -// RespectU -// -// Created by Presto on 2018. 6. 28.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import UIKit -import XLPagerTabStrip - -class MissionLinkDiskTableViewController: MissionBaseTableViewController { - - override func viewDidLoad() { - super.viewDidLoad() - results = MissionInfo.fetch(of: Series.linkDisk) - } -} - -extension MissionLinkDiskTableViewController: IndicatorInfoProvider { - func indicatorInfo(for pagerTabStripController: PagerTabStripViewController) -> IndicatorInfo { - return IndicatorInfo(title: "LINK DISK") - } -} diff --git a/RespectU/Guide/Mission/Controller/MissionRespectTableViewController.swift b/RespectU/Guide/Mission/Controller/MissionRespectTableViewController.swift deleted file mode 100644 index a047187..0000000 --- a/RespectU/Guide/Mission/Controller/MissionRespectTableViewController.swift +++ /dev/null @@ -1,24 +0,0 @@ -// -// MissionRespectTableViewController.swift -// RespectU -// -// Created by Presto on 2018. 3. 2.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import UIKit -import XLPagerTabStrip - -class MissionRespectTableViewController: MissionBaseTableViewController { - - override func viewDidLoad() { - super.viewDidLoad() - results = MissionInfo.fetch(of: Series.respect) - } -} - -extension MissionRespectTableViewController: IndicatorInfoProvider { - func indicatorInfo(for pagerTabStripController: PagerTabStripViewController) -> IndicatorInfo { - return IndicatorInfo(title: "RESPECT") - } -} diff --git a/RespectU/Guide/Mission/Controller/MissionTechnika1TableViewController.swift b/RespectU/Guide/Mission/Controller/MissionTechnika1TableViewController.swift deleted file mode 100644 index 2481191..0000000 --- a/RespectU/Guide/Mission/Controller/MissionTechnika1TableViewController.swift +++ /dev/null @@ -1,24 +0,0 @@ -// -// MissionTechnikaTableViewController.swift -// RespectU -// -// Created by Presto on 2018. 3. 21.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import UIKit -import XLPagerTabStrip - -class MissionTechnika1TableViewController: MissionBaseTableViewController { - - override func viewDidLoad() { - super.viewDidLoad() - results = MissionInfo.fetch(of: Series.technika1) - } -} - -extension MissionTechnika1TableViewController: IndicatorInfoProvider { - func indicatorInfo(for pagerTabStripController: PagerTabStripViewController) -> IndicatorInfo { - return IndicatorInfo(title: "TECHNIKA 1") - } -} diff --git a/RespectU/Guide/Mission/Controller/MissionTechnika2TableViewController.swift b/RespectU/Guide/Mission/Controller/MissionTechnika2TableViewController.swift deleted file mode 100644 index 3c5d938..0000000 --- a/RespectU/Guide/Mission/Controller/MissionTechnika2TableViewController.swift +++ /dev/null @@ -1,24 +0,0 @@ -// -// MissionTechnika2TableViewController.swift -// RespectU -// -// Created by Presto on 11/10/2018. -// Copyright © 2018 Presto. All rights reserved. -// - -import UIKit -import XLPagerTabStrip - -class MissionTechnika2TableViewController: MissionBaseTableViewController { - - override func viewDidLoad() { - super.viewDidLoad() - results = MissionInfo.fetch(of: Series.technika2) - } -} - -extension MissionTechnika2TableViewController: IndicatorInfoProvider { - func indicatorInfo(for pagerTabStripController: PagerTabStripViewController) -> IndicatorInfo { - return IndicatorInfo(title: "TECHNIKA 2") - } -} diff --git a/RespectU/Guide/Mission/Controller/MissionTrilogyTableViewController.swift b/RespectU/Guide/Mission/Controller/MissionTrilogyTableViewController.swift deleted file mode 100644 index f44e475..0000000 --- a/RespectU/Guide/Mission/Controller/MissionTrilogyTableViewController.swift +++ /dev/null @@ -1,24 +0,0 @@ -// -// MissionTrilogyTableViewController.swift -// RespectU -// -// Created by Presto on 2018. 3. 2.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import UIKit -import XLPagerTabStrip - -class MissionTrilogyTableViewController: MissionBaseTableViewController { - - override func viewDidLoad() { - super.viewDidLoad() - results = MissionInfo.fetch(of: Series.trilogy) - } -} - -extension MissionTrilogyTableViewController: IndicatorInfoProvider { - func indicatorInfo(for pagerTabStripController: PagerTabStripViewController) -> IndicatorInfo { - return IndicatorInfo(title: "TRILOGY") - } -} diff --git a/RespectU/Guide/Mission/Controller/MissionViewController.swift b/RespectU/Guide/Mission/Controller/MissionViewController.swift deleted file mode 100644 index ec9b839..0000000 --- a/RespectU/Guide/Mission/Controller/MissionViewController.swift +++ /dev/null @@ -1,36 +0,0 @@ -// -// MissionViewController.swift -// RespectU -// -// Created by Presto on 2018. 3. 2.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import UIKit -import XLPagerTabStrip - -class MissionViewController: BaseViewController { - - private lazy var respectTableViewController = MissionRespectTableViewController() - private lazy var trilogyTableViewController = MissionTrilogyTableViewController() - private lazy var ceTableViewController = MissionCETableViewController() - private lazy var technika1TableViewController = MissionTechnika1TableViewController() - private lazy var bsTableViewController = MissionBSTableViewController() - private lazy var technika2TableViewController = MissionTechnika2TableViewController() - private lazy var linkDiskTableViewController = MissionLinkDiskTableViewController() - lazy var missionViewControllers: [MissionBaseTableViewController] = { - return [respectTableViewController, trilogyTableViewController, ceTableViewController, technika1TableViewController, bsTableViewController, technika2TableViewController, linkDiskTableViewController] - }() - - override func viewDidLoad() { - super.viewDidLoad() - } - - override func viewControllers(for pagerTabStripController: PagerTabStripViewController) -> [UIViewController] { - return missionViewControllers - } - - @IBAction func touchUpCancelButton(_ sender: UIButton) { - self.dismiss(animated: true, completion: nil) - } -} diff --git a/RespectU/Guide/Mission/View/MissionCell.swift b/RespectU/Guide/Mission/View/MissionCell.swift deleted file mode 100644 index fa35572..0000000 --- a/RespectU/Guide/Mission/View/MissionCell.swift +++ /dev/null @@ -1,34 +0,0 @@ -// -// MissionCell.swift -// RespectU -// -// Created by Presto on 2018. 3. 2.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import UIKit - -class MissionCell: UITableViewCell { - - @IBOutlet weak var colorLabel: UILabel! - @IBOutlet weak var titleLabel: UILabel! - @IBOutlet weak var rewardLabel: UILabel! - lazy var labels: [UILabel] = { - return [titleLabel, rewardLabel] - }() - - override func awakeFromNib() { - super.awakeFromNib() - colorLabel.layer.cornerRadius = colorLabel.bounds.width / 2 - colorLabel.layer.masksToBounds = true - } - - func setProperties(_ object: MissionInfo?) { - guard let object = object else { return } - let gradient = object.section.missionGradient(.vertical) ?? CAGradientLayer() - gradient.frame = colorLabel.bounds - colorLabel.layer.addSublayer(gradient) - titleLabel.text = object.title - rewardLabel.text = object.localizedReward - } -} diff --git a/RespectU/Guide/Song/Controller/SongAllTableViewController.swift b/RespectU/Guide/Song/Controller/SongAllTableViewController.swift deleted file mode 100644 index b9422ae..0000000 --- a/RespectU/Guide/Song/Controller/SongAllTableViewController.swift +++ /dev/null @@ -1,23 +0,0 @@ -// -// SongAllTableViewController.swift -// RespectU -// -// Created by Presto on 2018. 3. 3.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import UIKit -import XLPagerTabStrip - -class SongAllTableViewController: SongBaseTableViewController { - - override func viewDidLoad() { - super.viewDidLoad() - } -} - -extension SongAllTableViewController: IndicatorInfoProvider { - func indicatorInfo(for pagerTabStripController: PagerTabStripViewController) -> IndicatorInfo { - return IndicatorInfo(title: "ALL") - } -} diff --git a/RespectU/Guide/Song/Controller/SongBSTableViewController.swift b/RespectU/Guide/Song/Controller/SongBSTableViewController.swift deleted file mode 100644 index c9be285..0000000 --- a/RespectU/Guide/Song/Controller/SongBSTableViewController.swift +++ /dev/null @@ -1,24 +0,0 @@ -// -// SongBSTableViewController.swift -// RespectU -// -// Created by Presto on 2018. 6. 28.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import UIKit -import XLPagerTabStrip - -class SongBSTableViewController: SongBaseTableViewController { - - override func viewDidLoad() { - super.viewDidLoad() - songResults = songResults?.filter { $0.series == Series.bs } - } -} - -extension SongBSTableViewController: IndicatorInfoProvider { - func indicatorInfo(for pagerTabStripController: PagerTabStripViewController) -> IndicatorInfo { - return IndicatorInfo(title: "BLACK SQUARE") - } -} diff --git a/RespectU/Guide/Song/Controller/SongBaseTableViewController.swift b/RespectU/Guide/Song/Controller/SongBaseTableViewController.swift deleted file mode 100644 index c181f03..0000000 --- a/RespectU/Guide/Song/Controller/SongBaseTableViewController.swift +++ /dev/null @@ -1,98 +0,0 @@ -// -// SongBaseTableViewController.swift -// RespectU -// -// Created by Presto on 2018. 8. 2.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import UIKit -import RealmSwift - -class SongBaseTableViewController: UITableViewController { - - var songResults: [SongInfo]? - var missionResults: Results? - var achievementResults: Results? - var favoriteButton = UserDefaults.standard.string(forKey: "favoriteButton") ?? "4b" - let myBPM = UserDefaults.standard.double(forKey: "bpm") - let cellIdentifier = "songCell" - - override func viewDidLoad() { - super.viewDidLoad() - songResults = SongInfo.fetch().sorted { $0.localizedLowercase < $1.localizedLowercase } - let predicate = NSPredicate(format: "%K LIKE %@", #keyPath(MissionInfo.reward.english), "Music*") - missionResults = MissionInfo.fetch().filter(predicate) - achievementResults = AchievementInfo.fetch().filter(key: "type", value: "music", method: "=") - tableView.rowHeight = 60 - tableView.showsVerticalScrollIndicator = false - tableView.separatorStyle = .none - tableView.register(UINib(nibName: "SongCell", bundle: nil), forCellReuseIdentifier: cellIdentifier) - } -} - -extension SongBaseTableViewController { - override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { - guard let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier) as? SongCell else { return UITableViewCell() } - cell.contentView.backgroundColor = .clear - let object = self.songResults?[indexPath.row] - cell.setProperties(object, favoriteButton: favoriteButton) - return cell - } - - override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - return self.songResults?.count ?? 0 - } - - override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { - tableView.deselectRow(at: indexPath, animated: true) - guard let object = self.songResults?[indexPath.row] else { return } - var changesSpeed: Bool = false - let bpm: Int - if let subBpm = object.subBpm.value { - bpm = subBpm - changesSpeed = true - } else { - bpm = object.bpm - } - let speed = recommendedSpeed(by: myBPM / Double(bpm)) - let unlockAchievement = "Unlock (ACHIEVEMENT)".localized - let unlockMission = "Unlock (MISSION)".localized - var unlockInfo = "" - if let bindedAchievementResults = achievementResults { - for result in bindedAchievementResults where result.localizedItem == object.localizedTitle { - unlockInfo += "\n\n\(unlockAchievement)\n\(result.localizedSection) Stage \(result.level)" - break - } - } - if let bindedMissionResults = missionResults { - for result in bindedMissionResults { - guard let last = result.localizedReward.split(separator: ":").last?.description.trimmingCharacters(in: .whitespaces) else { return } - if last == object.localizedTitle { - unlockInfo += "\n\n\(unlockMission)\n\(result.section) - \(result.title)" - break - } - } - } - var message: String = "SPEED Recommendation".localized + "\n\(speed)" + unlockInfo - if changesSpeed { - message += "\n" + "(SPEED Variation)".localized - } - UIAlertController - .alert(title: object.localizedTitle, message: message) - .action(title: "OK".localized) - .present(to: self) - } - - override func tableView(_ tableView: UITableView, didHighlightRowAt indexPath: IndexPath) { - guard let cell = tableView.cellForRow(at: indexPath) as? SongCell else { return } - let object = songResults?[indexPath.row] - let series = object?.series ?? "" - cell.setColorsInSong(series, labels: cell.labels) - } - - override func tableView(_ tableView: UITableView, didUnhighlightRowAt indexPath: IndexPath) { - guard let cell = tableView.cellForRow(at: indexPath) as? SongCell else { return } - cell.unsetColors(labels: cell.labels) - } -} diff --git a/RespectU/Guide/Song/Controller/SongCETableViewController.swift b/RespectU/Guide/Song/Controller/SongCETableViewController.swift deleted file mode 100644 index 3ef564f..0000000 --- a/RespectU/Guide/Song/Controller/SongCETableViewController.swift +++ /dev/null @@ -1,24 +0,0 @@ -// -// SongCETableViewController.swift -// RespectU -// -// Created by Presto on 2018. 3. 3.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import UIKit -import XLPagerTabStrip - -class SongCETableViewController: SongBaseTableViewController { - - override func viewDidLoad() { - super.viewDidLoad() - songResults = songResults?.filter { $0.series == Series.ce } - } -} - -extension SongCETableViewController: IndicatorInfoProvider { - func indicatorInfo(for pagerTabStripController: PagerTabStripViewController) -> IndicatorInfo { - return IndicatorInfo(title: "CLAZZIQUAI") - } -} diff --git a/RespectU/Guide/Song/Controller/SongPortable1TableViewController.swift b/RespectU/Guide/Song/Controller/SongPortable1TableViewController.swift deleted file mode 100644 index bb8c298..0000000 --- a/RespectU/Guide/Song/Controller/SongPortable1TableViewController.swift +++ /dev/null @@ -1,24 +0,0 @@ -// -// SongPortable1TableViewController.swift -// RespectU -// -// Created by Presto on 2018. 3. 3.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import UIKit -import XLPagerTabStrip - -class SongPortable1TableViewController: SongBaseTableViewController { - - override func viewDidLoad() { - super.viewDidLoad() - songResults = songResults?.filter { $0.series == Series.portable1 } - } -} - -extension SongPortable1TableViewController: IndicatorInfoProvider { - func indicatorInfo(for pagerTabStripController: PagerTabStripViewController) -> IndicatorInfo { - return IndicatorInfo(title: "PORTABLE 1") - } -} diff --git a/RespectU/Guide/Song/Controller/SongPortable2TableViewController.swift b/RespectU/Guide/Song/Controller/SongPortable2TableViewController.swift deleted file mode 100644 index e07f7f9..0000000 --- a/RespectU/Guide/Song/Controller/SongPortable2TableViewController.swift +++ /dev/null @@ -1,24 +0,0 @@ -// -// SongPortable2TableViewController.swift -// RespectU -// -// Created by Presto on 2018. 3. 3.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import UIKit -import XLPagerTabStrip - -class SongPortable2TableViewController: SongBaseTableViewController { - - override func viewDidLoad() { - super.viewDidLoad() - songResults = songResults?.filter { $0.series == Series.portable2 } - } -} - -extension SongPortable2TableViewController: IndicatorInfoProvider { - func indicatorInfo(for pagerTabStripController: PagerTabStripViewController) -> IndicatorInfo { - return IndicatorInfo(title: "PORTABLE 2") - } -} diff --git a/RespectU/Guide/Song/Controller/SongRespectTableViewController.swift b/RespectU/Guide/Song/Controller/SongRespectTableViewController.swift deleted file mode 100644 index 5382f7e..0000000 --- a/RespectU/Guide/Song/Controller/SongRespectTableViewController.swift +++ /dev/null @@ -1,24 +0,0 @@ -// -// SongRespectTableViewController.swift -// RespectU -// -// Created by Presto on 2018. 3. 3.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import UIKit -import XLPagerTabStrip - -class SongRespectTableViewController: SongBaseTableViewController { - - override func viewDidLoad() { - super.viewDidLoad() - songResults = songResults?.filter { $0.series == Series.respect } - } -} - -extension SongRespectTableViewController: IndicatorInfoProvider { - func indicatorInfo(for pagerTabStripController: PagerTabStripViewController) -> IndicatorInfo { - return IndicatorInfo(title: "RESPECT") - } -} diff --git a/RespectU/Guide/Song/Controller/SongTechnika1TableViewController.swift b/RespectU/Guide/Song/Controller/SongTechnika1TableViewController.swift deleted file mode 100644 index cb26cd9..0000000 --- a/RespectU/Guide/Song/Controller/SongTechnika1TableViewController.swift +++ /dev/null @@ -1,24 +0,0 @@ -// -// SongTechnika1TableViewController.swift -// RespectU -// -// Created by Presto on 2018. 3. 21.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import UIKit -import XLPagerTabStrip - -class SongTechnika1TableViewController: SongBaseTableViewController { - - override func viewDidLoad() { - super.viewDidLoad() - songResults = songResults?.filter { $0.series == Series.technika1 } - } -} - -extension SongTechnika1TableViewController: IndicatorInfoProvider { - func indicatorInfo(for pagerTabStripController: PagerTabStripViewController) -> IndicatorInfo { - return IndicatorInfo(title: "TECHNIKA 1") - } -} diff --git a/RespectU/Guide/Song/Controller/SongTechnika2TableViewController.swift b/RespectU/Guide/Song/Controller/SongTechnika2TableViewController.swift deleted file mode 100644 index e9fc06b..0000000 --- a/RespectU/Guide/Song/Controller/SongTechnika2TableViewController.swift +++ /dev/null @@ -1,24 +0,0 @@ -// -// SongTechnika2TableViewController.swift -// RespectU -// -// Created by Presto on 11/10/2018. -// Copyright © 2018 Presto. All rights reserved. -// - -import UIKit -import XLPagerTabStrip - -class SongTechnika2TableViewController: SongBaseTableViewController { - - override func viewDidLoad() { - super.viewDidLoad() - songResults = songResults?.filter { $0.series == Series.technika2 } - } -} - -extension SongTechnika2TableViewController: IndicatorInfoProvider { - func indicatorInfo(for pagerTabStripController: PagerTabStripViewController) -> IndicatorInfo { - return IndicatorInfo(title: "TECHNIKA 2") - } -} diff --git a/RespectU/Guide/Song/Controller/SongTrilogyTableViewController.swift b/RespectU/Guide/Song/Controller/SongTrilogyTableViewController.swift deleted file mode 100644 index 11556f2..0000000 --- a/RespectU/Guide/Song/Controller/SongTrilogyTableViewController.swift +++ /dev/null @@ -1,24 +0,0 @@ -// -// SongTrilogyTableViewController.swift -// RespectU -// -// Created by Presto on 2018. 3. 3.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import UIKit -import XLPagerTabStrip - -class SongTrilogyTableViewController: SongBaseTableViewController { - - override func viewDidLoad() { - super.viewDidLoad() - songResults = songResults?.filter { $0.series == Series.trilogy } - } -} - -extension SongTrilogyTableViewController: IndicatorInfoProvider { - func indicatorInfo(for pagerTabStripController: PagerTabStripViewController) -> IndicatorInfo { - return IndicatorInfo(title: "TRILOGY") - } -} diff --git a/RespectU/Guide/Song/Controller/SongViewController.swift b/RespectU/Guide/Song/Controller/SongViewController.swift deleted file mode 100644 index ca1185f..0000000 --- a/RespectU/Guide/Song/Controller/SongViewController.swift +++ /dev/null @@ -1,144 +0,0 @@ -// -// SongViewController.swift -// RespectU -// -// Created by Presto on 2018. 3. 3.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import UIKit -import RealmSwift -import XLPagerTabStrip - -class SongViewController: BaseViewController { - - @IBOutlet weak var selectedButtonLabel: UILabel! - private lazy var allTableViewController = SongAllTableViewController() - private lazy var portable1TableViewController = SongPortable1TableViewController() - private lazy var portable2TableViewController = SongPortable2TableViewController() - private lazy var respectTableViewController = SongRespectTableViewController() - private lazy var trilogyTableViewController = SongTrilogyTableViewController() - private lazy var ceTableViewController = SongCETableViewController() - private lazy var technika1TableViewController = SongTechnika1TableViewController() - private lazy var bsTableViewController = SongBSTableViewController() - private lazy var technika2TableViewController = SongTechnika2TableViewController() - lazy var songViewControllers: [SongBaseTableViewController] = { - return [allTableViewController, portable1TableViewController, portable2TableViewController, respectTableViewController, trilogyTableViewController, ceTableViewController, technika1TableViewController, bsTableViewController, technika2TableViewController] - }() - var favoriteButton: String { - return selectedButtonLabel.text ?? "4b" - } - - override func viewDidLoad() { - super.viewDidLoad() - self.selectedButtonLabel.text = (UserDefaults.standard.string(forKey: "favoriteButton") ?? "4b").uppercased() - } - - override func viewControllers(for pagerTabStripController: PagerTabStripViewController) -> [UIViewController] { - return songViewControllers - } - - @IBAction func touchUpSearchButton(_ sender: UIButton) { - UIAlertController - .alert(title: "Search".localized, message: "Select the button type.".localized) - .action(title: Buttons.button4.uppercased()) { [weak self] _ in - self?.setFavoriteButton(Buttons.button4) - self?.reloadAllTableViews() - } - .action(title: Buttons.button5.uppercased()) { [weak self] _ in - self?.setFavoriteButton(Buttons.button5) - self?.reloadAllTableViews() - } - .action(title: Buttons.button6.uppercased()) { [weak self] _ in - self?.setFavoriteButton(Buttons.button6) - self?.reloadAllTableViews() - } - .action(title: Buttons.button8.uppercased()) { [weak self] _ in - self?.setFavoriteButton(Buttons.button8) - self?.reloadAllTableViews() - } - .action(.cancel, title: "Cancel".localized) - .present(to: self) - } - - @IBAction func touchUpSortButton(_ sender: UIButton) { - UIAlertController - .alert(title: "Sort".localized, message: "Select the sort method.".localized) - .action(title: "\(Difficulty.normal.uppercased()) / ASC".localized) { [weak self] _ in - self?.sort(difficulty: Difficulty.normal, isAscending: true) - } - .action(title: "\(Difficulty.normal.uppercased()) / DESC".localized) { [weak self] _ in - self?.sort(difficulty: Difficulty.normal, isAscending: false) - } - .action(title: "\(Difficulty.hard.uppercased()) / ASC".localized) { [weak self] _ in - self?.sort(difficulty: Difficulty.hard, isAscending: true) - } - .action(title: "\(Difficulty.hard.uppercased()) / DESC".localized) { [weak self] _ in - self?.sort(difficulty: Difficulty.hard, isAscending: false) - } - .action(title: "\(Difficulty.maximum.uppercased()) / ASC".localized) { [weak self] _ in - self?.sort(difficulty: Difficulty.maximum, isAscending: true) - } - .action(title: "\(Difficulty.maximum.uppercased()) / DESC".localized) { [weak self] _ in - self?.sort(difficulty: Difficulty.maximum, isAscending: false) - } - .action(.cancel, title: "Cancel".localized) - .present(to: self) - } - - @IBAction func touchUpRandomButton(_ sender: UIButton) { - guard let results = allTableViewController.songResults else { return } - let random = Int(arc4random_uniform(UInt32(results.count - 1))) - let object = results[random] - let myBpm = UserDefaults.standard.double(forKey: "bpm") - let speed = recommendedSpeed(by: myBpm / Double(object.bpm)) - var message = "\(object.series.uppercased())\n\n" + "SPEED Recommendation".localized + "\n\(speed)" - if object.subBpm.value != nil { - message += "\n" + "(SPEED Variation)".localized - } - UIAlertController - .alert(title: object.localizedTitle, message: message) - .action(title: "OK".localized) - .present(to: self) - } - - @IBAction func touchUpCancelButton(_ sender: UIButton) { - self.dismiss(animated: true, completion: nil) - } -} - -extension SongViewController { - private func sort(difficulty: String, isAscending: Bool) { - for viewController in songViewControllers { - viewController.songResults?.sort(by: { (first, second) -> Bool in - guard let button = favoriteButton.lowercased().buttonExpansion else { return false } - guard let firstValue = first.value(forKeyPath: "\(button).\(difficulty)") as? Int else { return false } - guard let secondValue = second.value(forKeyPath: "\(button).\(difficulty)") as? Int else { return false } - if isAscending { - return firstValue < secondValue - } else { - return firstValue > secondValue - } - }) - reloadAllTableViews() - } - } -} - -extension SongViewController { - private func setFavoriteButton(_ button: String) { - for viewController in songViewControllers { - viewController.favoriteButton = button - } - self.selectedButtonLabel.text = button.uppercased() - } - - private func reloadAllTableViews() { - DispatchQueue.main.async { [weak self] in - guard let viewControllers = self?.songViewControllers else { return } - for viewController in viewControllers { - viewController.tableView.reloadSections(IndexSet(0...0), with: .automatic) - } - } - } -} diff --git a/RespectU/Guide/Song/View/SongCell.swift b/RespectU/Guide/Song/View/SongCell.swift deleted file mode 100644 index 0558ec2..0000000 --- a/RespectU/Guide/Song/View/SongCell.swift +++ /dev/null @@ -1,61 +0,0 @@ -// -// SongCell.swift -// RespectU -// -// Created by Presto on 2018. 3. 3.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import UIKit -import RealmSwift - -class SongCell: UITableViewCell { - - @IBOutlet weak var colorLabel: UILabel! - @IBOutlet weak var titleLabel: UILabel! - @IBOutlet weak var composerLabel: UILabel! - @IBOutlet weak var bpmLabel: UILabel! - @IBOutlet weak var normalLabel: UILabel! - @IBOutlet weak var hardLabel: UILabel! - @IBOutlet weak var maximumLabel: UILabel! - lazy var labels: [UILabel] = { - return [titleLabel, composerLabel, bpmLabel, normalLabel, hardLabel, maximumLabel] - }() - - override func awakeFromNib() { - super.awakeFromNib() - colorLabel.layer.cornerRadius = colorLabel.bounds.width / 2 - colorLabel.layer.masksToBounds = true - } - - override func setSelected(_ selected: Bool, animated: Bool) { - super.setSelected(selected, animated: animated) - } - - func setProperties(_ object: SongInfo?, favoriteButton: String) { - guard let object = object else { return } - let gradient = object.series.seriesGradient(.vertical) ?? CAGradientLayer() - gradient.frame = colorLabel.bounds - colorLabel.layer.addSublayer(gradient) - titleLabel.text = object.localizedTitle - composerLabel.text = object.composer - bpmLabel.text = object.bpmToString - var buttons: SongButtonInfo? - switch favoriteButton { - case Buttons.button4: - buttons = object.button4 - case Buttons.button5: - buttons = object.button5 - case Buttons.button6: - buttons = object.button6 - case Buttons.button8: - buttons = object.button8 - default: - break - } - guard let button = buttons else { return } - normalLabel.text = button.normal == 0 ? "-" : "\(button.normal)" - hardLabel.text = button.hard == 0 ? "-" : "\(button.hard)" - maximumLabel.text = button.maximum == 0 ? "-" : "\(button.maximum)" - } -} diff --git a/RespectU/Guide/Tip/TipViewController.swift b/RespectU/Guide/Tip/TipViewController.swift deleted file mode 100644 index d217972..0000000 --- a/RespectU/Guide/Tip/TipViewController.swift +++ /dev/null @@ -1,65 +0,0 @@ -// -// TipViewController.swift -// RespectU -// -// Created by Presto on 2018. 3. 2.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import UIKit -import RealmSwift - -class TipViewController: UIViewController { - - @IBOutlet weak var tableView: UITableView! - var indexes = [Int]() - var results: Results? - - override func viewDidLoad() { - super.viewDidLoad() - results = TipInfo.fetch() - generateRandomNumbers() - setupTableView() - } - - @IBAction func touchUpCancelButton(_ sender: UIButton) { - self.dismiss(animated: true, completion: nil) - } -} - -extension TipViewController { - private func generateRandomNumbers() { - guard let tips = self.results else { return } - var randomNumber = Int.random(in: 0.. UITableViewCell { - guard let cell = tableView.dequeueReusableCell(withIdentifier: "tipCell") else { return UITableViewCell() } - cell.textLabel?.text = self.results?[indexes[indexPath.row]].localizedTitle - return cell - } - - func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - return self.results?.count ?? 0 - } -} - -extension TipViewController: UITableViewDelegate { - func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { - tableView.deselectRow(at: indexPath, animated: true) - } -} diff --git a/RespectU/Guide/Trophy/Controller/TrophyBSTableViewController.swift b/RespectU/Guide/Trophy/Controller/TrophyBSTableViewController.swift deleted file mode 100644 index 1e2961a..0000000 --- a/RespectU/Guide/Trophy/Controller/TrophyBSTableViewController.swift +++ /dev/null @@ -1,24 +0,0 @@ -// -// TrophyBSTableViewController.swift -// RespectU -// -// Created by Presto on 2018. 6. 28.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import UIKit -import XLPagerTabStrip - -class TrophyBSTableViewController: TrophyBaseTableViewController { - - override func viewDidLoad() { - super.viewDidLoad() - results = TrophyInfo.fetch(of: Series.bs) - } -} - -extension TrophyBSTableViewController: IndicatorInfoProvider { - func indicatorInfo(for pagerTabStripController: PagerTabStripViewController) -> IndicatorInfo { - return IndicatorInfo(title: "BLACK SQUARE") - } -} diff --git a/RespectU/Guide/Trophy/Controller/TrophyBaseTableViewController.swift b/RespectU/Guide/Trophy/Controller/TrophyBaseTableViewController.swift deleted file mode 100644 index 17ea2cc..0000000 --- a/RespectU/Guide/Trophy/Controller/TrophyBaseTableViewController.swift +++ /dev/null @@ -1,45 +0,0 @@ -// -// TrophyBaseTableViewController.swift -// RespectU -// -// Created by Presto on 2018. 8. 2.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import UIKit -import RealmSwift - -class TrophyBaseTableViewController: UITableViewController { - - var results: Results? - let cellIdentifier = "trophyCell" - - override func viewDidLoad() { - super.viewDidLoad() - tableView.rowHeight = 60 - tableView.showsVerticalScrollIndicator = false - tableView.separatorStyle = .none - tableView.register(UINib(nibName: "TrophyCell", bundle: nil), forCellReuseIdentifier: cellIdentifier) - } -} - -extension TrophyBaseTableViewController { - override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { - guard let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) as? TrophyCell else { return UITableViewCell() } - let row = indexPath.row - let count = results?.count ?? 0 - if row < count { - let object = self.results?[indexPath.row] - cell.setProperties(object) - } - return cell - } - - override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - return results?.count ?? 0 - } - - override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { - tableView.deselectRow(at: indexPath, animated: true) - } -} diff --git a/RespectU/Guide/Trophy/Controller/TrophyCETableViewController.swift b/RespectU/Guide/Trophy/Controller/TrophyCETableViewController.swift deleted file mode 100644 index 9e72f58..0000000 --- a/RespectU/Guide/Trophy/Controller/TrophyCETableViewController.swift +++ /dev/null @@ -1,37 +0,0 @@ -// -// TrophyCETableViewController.swift -// RespectU -// -// Created by Presto on 2018. 3. 2.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import UIKit -import XLPagerTabStrip - -class TrophyCETableViewController: TrophyBaseTableViewController { - - override func viewDidLoad() { - super.viewDidLoad() - results = TrophyInfo.fetch(of: Series.ce) - } -} - -extension TrophyCETableViewController { - override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { - tableView.deselectRow(at: indexPath, animated: true) - let row = indexPath.row - if row == 6 { - UIAlertController - .alert(title: "Hidden BGA".localized, message: "First Kiss") - .action(title: "OK".localized) - .present(to: self) - } - } -} - -extension TrophyCETableViewController: IndicatorInfoProvider { - func indicatorInfo(for pagerTabStripController: PagerTabStripViewController) -> IndicatorInfo { - return IndicatorInfo(title: "CLAZZIQUAI") - } -} diff --git a/RespectU/Guide/Trophy/Controller/TrophyLinkDiskTableViewController.swift b/RespectU/Guide/Trophy/Controller/TrophyLinkDiskTableViewController.swift deleted file mode 100644 index 9680867..0000000 --- a/RespectU/Guide/Trophy/Controller/TrophyLinkDiskTableViewController.swift +++ /dev/null @@ -1,24 +0,0 @@ -// -// TrophyLinkDiskTableViewController.swift -// RespectU -// -// Created by Presto on 2018. 6. 28.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import UIKit -import XLPagerTabStrip - -class TrophyLinkDiskTableViewController: TrophyBaseTableViewController { - - override func viewDidLoad() { - super.viewDidLoad() - results = TrophyInfo.fetch(of: Series.linkDisk) - } -} - -extension TrophyLinkDiskTableViewController: IndicatorInfoProvider { - func indicatorInfo(for pagerTabStripController: PagerTabStripViewController) -> IndicatorInfo { - return IndicatorInfo(title: "LINK DISK") - } -} diff --git a/RespectU/Guide/Trophy/Controller/TrophyRespectTableViewController.swift b/RespectU/Guide/Trophy/Controller/TrophyRespectTableViewController.swift deleted file mode 100644 index 8cc1285..0000000 --- a/RespectU/Guide/Trophy/Controller/TrophyRespectTableViewController.swift +++ /dev/null @@ -1,49 +0,0 @@ -// -// TrophyRespectTableViewController.swift -// RespectU -// -// Created by Presto on 2018. 3. 2.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import UIKit -import XLPagerTabStrip - -class TrophyRespectTableViewController: TrophyBaseTableViewController { - - override func viewDidLoad() { - super.viewDidLoad() - results = TrophyInfo.fetch(of: Series.respect) - } -} - -extension TrophyRespectTableViewController { - override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { - tableView.deselectRow(at: indexPath, animated: true) - let row = indexPath.row - var title: String = "" - var message: String = "" - if row == 36 || row == 37 { - title = "Hidden BGAs".localized - message = "A Lie\nEnemy Storm\nNB RANGER - Virgin Force\nNever Say\nWhiteBlue\nOut Law" - } else if row == 26 { - title = "777 Combos".localized - message = "5B NORMAL [Seeker]\n47 Combos -> BREAK -> Full Combo -> Trophy Earned".localized - } else if row == 41 { - title = "CREDITS".localized - message = "CREDITS will appear when the average accuracy of three stages are greater than 98%.".localized - } - if !title.isEmpty { - UIAlertController - .alert(title: title, message: message) - .action(title: "OK".localized) - .present(to: self) - } - } -} - -extension TrophyRespectTableViewController: IndicatorInfoProvider { - func indicatorInfo(for pagerTabStripController: PagerTabStripViewController) -> IndicatorInfo { - return IndicatorInfo(title: "RESPECT") - } -} diff --git a/RespectU/Guide/Trophy/Controller/TrophyTechnika1TableViewController.swift b/RespectU/Guide/Trophy/Controller/TrophyTechnika1TableViewController.swift deleted file mode 100644 index 6b20538..0000000 --- a/RespectU/Guide/Trophy/Controller/TrophyTechnika1TableViewController.swift +++ /dev/null @@ -1,37 +0,0 @@ -// -// TrophyTechnikaTableViewController.swift -// RespectU -// -// Created by Presto on 2018. 3. 21.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import UIKit -import XLPagerTabStrip - -class TrophyTechnika1TableViewController: TrophyBaseTableViewController { - - override func viewDidLoad() { - super.viewDidLoad() - results = TrophyInfo.fetch(of: Series.technika1) - } -} - -extension TrophyTechnika1TableViewController { - override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { - tableView.deselectRow(at: indexPath, animated: true) - let row = indexPath.row - if row == 9 { - UIAlertController - .alert(title: "Hidden BGA", message: "Thor") - .action(title: "OK".localized) - .present(to: self) - } - } -} - -extension TrophyTechnika1TableViewController: IndicatorInfoProvider { - func indicatorInfo(for pagerTabStripController: PagerTabStripViewController) -> IndicatorInfo { - return IndicatorInfo(title: "TECHNIKA 1") - } -} diff --git a/RespectU/Guide/Trophy/Controller/TrophyTechnika2TableViewController.swift b/RespectU/Guide/Trophy/Controller/TrophyTechnika2TableViewController.swift deleted file mode 100644 index 00ced1b..0000000 --- a/RespectU/Guide/Trophy/Controller/TrophyTechnika2TableViewController.swift +++ /dev/null @@ -1,24 +0,0 @@ -// -// TrophyTechnika2TableViewController.swift -// RespectU -// -// Created by Presto on 11/10/2018. -// Copyright © 2018 Presto. All rights reserved. -// - -import UIKit -import XLPagerTabStrip - -class TrophyTechnika2TableViewController: TrophyBaseTableViewController { - - override func viewDidLoad() { - super.viewDidLoad() - results = TrophyInfo.fetch(of: Series.technika2) - } -} - -extension TrophyTechnika2TableViewController: IndicatorInfoProvider { - func indicatorInfo(for pagerTabStripController: PagerTabStripViewController) -> IndicatorInfo { - return IndicatorInfo(title: "TECHNIKA 2") - } -} diff --git a/RespectU/Guide/Trophy/Controller/TrophyTrilogyTableViewController.swift b/RespectU/Guide/Trophy/Controller/TrophyTrilogyTableViewController.swift deleted file mode 100644 index c6a1f7e..0000000 --- a/RespectU/Guide/Trophy/Controller/TrophyTrilogyTableViewController.swift +++ /dev/null @@ -1,37 +0,0 @@ -// -// TrophyTrilogyTableViewController.swift -// RespectU -// -// Created by Presto on 2018. 3. 2.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import UIKit -import XLPagerTabStrip - -class TrophyTrilogyTableViewController: TrophyBaseTableViewController { - - override func viewDidLoad() { - super.viewDidLoad() - results = TrophyInfo.fetch(of: Series.trilogy) - } -} - -extension TrophyTrilogyTableViewController { - override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { - tableView.deselectRow(at: indexPath, animated: true) - let row = indexPath.row - if row == 6 { - UIAlertController - .alert(title: "Hidden BGA".localized, message: "STOP") - .action(title: "OK".localized) - .present(to: self) - } - } -} - -extension TrophyTrilogyTableViewController: IndicatorInfoProvider { - func indicatorInfo(for pagerTabStripController: PagerTabStripViewController) -> IndicatorInfo { - return IndicatorInfo(title: "TRILOGY") - } -} diff --git a/RespectU/Guide/Trophy/Controller/TrophyViewController.swift b/RespectU/Guide/Trophy/Controller/TrophyViewController.swift deleted file mode 100644 index c4fa4b9..0000000 --- a/RespectU/Guide/Trophy/Controller/TrophyViewController.swift +++ /dev/null @@ -1,36 +0,0 @@ -// -// TrophyViewController.swift -// RespectU -// -// Created by Presto on 2018. 3. 2.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import UIKit -import XLPagerTabStrip - -class TrophyViewController: BaseViewController { - - private lazy var respectTableViewController = TrophyRespectTableViewController() - private lazy var trilogyTableViewController = TrophyTrilogyTableViewController() - private lazy var ceTableViewController = TrophyCETableViewController() - private lazy var technika1TableViewController = TrophyTechnika1TableViewController() - private lazy var bsTableViewController = TrophyBSTableViewController() - private lazy var linkDiskTableViewController = TrophyLinkDiskTableViewController() - private lazy var technika2TableViewController = TrophyTechnika2TableViewController() - lazy var trophyViewControllers: [TrophyBaseTableViewController] = { - return [respectTableViewController, trilogyTableViewController, ceTableViewController, technika1TableViewController, bsTableViewController, linkDiskTableViewController, technika2TableViewController] - }() - - override func viewDidLoad() { - super.viewDidLoad() - } - - override func viewControllers(for pagerTabStripController: PagerTabStripViewController) -> [UIViewController] { - return trophyViewControllers - } - - @IBAction func touchUpCancelButton(_ sender: UIButton) { - self.dismiss(animated: true, completion: nil) - } -} diff --git a/RespectU/Guide/Trophy/View/TrophyCell.swift b/RespectU/Guide/Trophy/View/TrophyCell.swift deleted file mode 100644 index e59b00e..0000000 --- a/RespectU/Guide/Trophy/View/TrophyCell.swift +++ /dev/null @@ -1,46 +0,0 @@ -// -// TrophyCell.swift -// RespectU -// -// Created by Presto on 2018. 3. 2.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import UIKit - -class TrophyCell: UITableViewCell { - - @IBOutlet weak var trophyThumbnailImageView: UIImageView! - @IBOutlet weak var trophyGradeImageView: UIImageView! - @IBOutlet weak var titleLabel: UILabel! - @IBOutlet weak var contentLabel: UILabel! - - override func awakeFromNib() { - super.awakeFromNib() - trophyThumbnailImageView.layer.cornerRadius = trophyThumbnailImageView.bounds.height / 2 - trophyThumbnailImageView.layer.masksToBounds = true - } - - func setProperties(_ object: TrophyInfo?) { - guard let object = object else { return } - if let filePath = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first?.appendingPathComponent("\(object.image).png").path { - if FileManager.default.fileExists(atPath: filePath) { - trophyThumbnailImageView.image = UIImage(contentsOfFile: filePath) - } - } - titleLabel.text = object.localizedTitle - contentLabel.text = object.localizedContent - switch object.rating { - case TrophyGrade.platinum: - trophyGradeImageView.image = UIImage(named: "platinum") - case TrophyGrade.gold: - trophyGradeImageView.image = UIImage(named: "gold") - case TrophyGrade.silver: - trophyGradeImageView.image = UIImage(named: "silver") - case TrophyGrade.bronze: - trophyGradeImageView.image = UIImage(named: "bronze") - default: - break - } - } -} diff --git a/RespectU/Guide/Upload/UploadViewController.swift b/RespectU/Guide/Upload/UploadViewController.swift deleted file mode 100644 index 4003d82..0000000 --- a/RespectU/Guide/Upload/UploadViewController.swift +++ /dev/null @@ -1,102 +0,0 @@ -// -// SynchronizeViewController.swift -// RespectU -// -// Created by Presto on 2018. 8. 29.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import UIKit -import SwiftKeychainWrapper - -class UploadViewController: UIViewController { - - @IBOutlet weak var uploadLabel: UILabel! - @IBOutlet weak var uploadButton: UIButton! - - override func viewDidLoad() { - super.viewDidLoad() - setup() - } - - func setup() { - uploadLabel.text = "Store recorded performance information on the server.".localized - uploadButton.setTitle("Upload".localized, for: []) - uploadButton.addTarget(self, action: #selector(didTouchUpUploadButton(_:)), for: .touchUpInside) - } - - @objc func didTouchUpUploadButton(_ sender: UIButton) { - let id = KeychainWrapper.standard.string(forKey: "id") ?? "" - if id.isEmpty { - UIAlertController - .alert(title: "", message: "First Log In.".localized) - .action(title: "OK".localized) - .present(to: self) - } else { - let results = NewRecordInfo.fetch() - var records = [RecordResponse.Record]() - for result in results { - let button4Normal = RecordResponse.Record.Button.Difficulty(rank: result.button4?.normal?.rank ?? "", rate: result.button4?.normal?.rate ?? 0, note: result.button4?.normal?.note ?? "") - let button4Hard = RecordResponse.Record.Button.Difficulty(rank: result.button4?.hard?.rank ?? "", rate: result.button4?.hard?.rate ?? 0, note: result.button4?.hard?.note ?? "") - let button4Maximum = RecordResponse.Record.Button.Difficulty(rank: result.button4?.maximum?.rank ?? "", rate: result.button4?.maximum?.rate ?? 0, note: result.button4?.maximum?.note ?? "") - let button4 = RecordResponse.Record.Button(normal: button4Normal, hard: button4Hard, maximum: button4Maximum, skillPoint: result.button4?.skillPoint ?? 0, skillPointDifficulty: result.button4?.skillPointDifficulty ?? "", skillPointNote: result.button4?.skillPointNote ?? "", skillPointRate: result.button4?.skillPointRate ?? 0) - let button5Normal = RecordResponse.Record.Button.Difficulty(rank: result.button5?.normal?.rank ?? "", rate: result.button5?.normal?.rate ?? 0, note: result.button5?.normal?.note ?? "") - let button5Hard = RecordResponse.Record.Button.Difficulty(rank: result.button5?.hard?.rank ?? "", rate: result.button5?.hard?.rate ?? 0, note: result.button5?.hard?.note ?? "") - let button5Maximum = RecordResponse.Record.Button.Difficulty(rank: result.button5?.maximum?.rank ?? "", rate: result.button5?.maximum?.rate ?? 0, note: result.button5?.maximum?.note ?? "") - let button5 = RecordResponse.Record.Button(normal: button5Normal, hard: button5Hard, maximum: button5Maximum, skillPoint: result.button5?.skillPoint ?? 0, skillPointDifficulty: result.button5?.skillPointDifficulty ?? "", skillPointNote: result.button5?.skillPointNote ?? "", skillPointRate: result.button5?.skillPointRate ?? 0) - let button6Normal = RecordResponse.Record.Button.Difficulty(rank: result.button6?.normal?.rank ?? "", rate: result.button6?.normal?.rate ?? 0, note: result.button6?.normal?.note ?? "") - let button6Hard = RecordResponse.Record.Button.Difficulty(rank: result.button6?.hard?.rank ?? "", rate: result.button6?.hard?.rate ?? 0, note: result.button6?.hard?.note ?? "") - let button6Maximum = RecordResponse.Record.Button.Difficulty(rank: result.button6?.maximum?.rank ?? "", rate: result.button6?.maximum?.rate ?? 0, note: result.button6?.maximum?.note ?? "") - let button6 = RecordResponse.Record.Button(normal: button6Normal, hard: button6Hard, maximum: button6Maximum, skillPoint: result.button6?.skillPoint ?? 0, skillPointDifficulty: result.button6?.skillPointDifficulty ?? "", skillPointNote: result.button6?.skillPointNote ?? "", skillPointRate: result.button6?.skillPointRate ?? 0) - let button8Normal = RecordResponse.Record.Button.Difficulty(rank: result.button8?.normal?.rank ?? "", rate: result.button8?.normal?.rate ?? 0, note: result.button8?.normal?.note ?? "") - let button8Hard = RecordResponse.Record.Button.Difficulty(rank: result.button8?.hard?.rank ?? "", rate: result.button8?.hard?.rate ?? 0, note: result.button8?.hard?.note ?? "") - let button8Maximum = RecordResponse.Record.Button.Difficulty(rank: result.button8?.maximum?.rank ?? "", rate: result.button8?.maximum?.rate ?? 0, note: result.button8?.maximum?.note ?? "") - let button8 = RecordResponse.Record.Button(normal: button8Normal, hard: button8Hard, maximum: button8Maximum, skillPoint: result.button8?.skillPoint ?? 0, skillPointDifficulty: result.button8?.skillPointDifficulty ?? "", skillPointNote: result.button8?.skillPointNote ?? "", skillPointRate: result.button8?.skillPointRate ?? 0) - let title = LanguageResponse(english: result.title?.english ?? "", korean: result.title?.korean) - let record = RecordResponse.Record(title: title, series: result.series, button4: button4, button5: button5, button6: button6, button8: button8) - records.append(record) - } - let recordResponse = RecordResponse(id: id, records: records) - guard let uploadData = try? JSONEncoder().encode(recordResponse) else { return } - showIndicator() - API.uploadRecords(uploadData) { statusCode, error in - if let error = error { - UIAlertController.presentErrorAlert(to: self, error: error.localizedDescription) - return - } - guard let statusCode = statusCode else { return } - if (200...299).contains(statusCode) { - self.presentSuccessAlert() - } else { - self.presentFailureAlert() - } - } - } - } - - @IBAction func touchUpCancelButton(_ sender: UIButton) { - self.dismiss(animated: true, completion: nil) - } -} - -extension UploadViewController { - private func presentSuccessAlert() { - DispatchQueue.main.async { [weak self] in - self?.hideIndicator() - UIAlertController - .alert(title: "", message: "Your data has been successfully uploaded.".localized) - .action(title: "OK".localized) - .present(to: self) - } - } - - private func presentFailureAlert() { - DispatchQueue.main.async { [weak self] in - self?.hideIndicator() - UIAlertController - .alert(title: "", message: "Network Error".localized) - .action(title: "OK".localized) - .present(to: self) - } - } -} diff --git a/RespectU/Init/InitViewController.swift b/RespectU/Init/InitViewController.swift deleted file mode 100644 index ac91a2b..0000000 --- a/RespectU/Init/InitViewController.swift +++ /dev/null @@ -1,276 +0,0 @@ -// -// StartViewController.swift -// RespectU -// -// Created by Presto on 2018. 9. 2.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import UIKit - -class InitViewController: UIViewController { - - @IBOutlet weak var descriptionLabel: UILabel! - @IBOutlet weak var startButton: UIButton! - var finishesSong: Bool = false - var finishesMission: Bool = false - var finishesTrophy: Bool = false - var finishesAchievement: Bool = false - var finishesTip: Bool = false - var finishesVersion: Bool = false - var count = 0 { - didSet { - if count == 6 { - hideIndicator() - if finishesAll { - presentSuccessAlert() - } else { - UIAlertController.presentErrorAlert(to: self, error: "Network Error".localized) - } - } - } - } - var finishesAll: Bool { - if finishesSong, finishesMission, finishesTrophy, finishesAchievement, finishesTip, finishesVersion { - return true - } - return false - } - - override func viewDidLoad() { - super.viewDidLoad() - setup() - } - - func setup() { - descriptionLabel.text = "Download data to start the application.".localized - startButton.setTitle("Download".localized, for: []) - startButton.addTarget(self, action: #selector(didTouchUpDownloadButton(_:)), for: .touchUpInside) - } - @objc func didTouchUpDownloadButton(_ sender: UIButton) { - showIndicator() - API.requestSongs(completion: didReceiveSongs) - API.requestMissions(completion: didReceiveMissions) - API.requestTrophies(completion: didReceiveTrophies) - API.requestAchievements(completion: didReceiveAchievements) - API.requestTips(completion: didReceiveTips) - API.requestVersions(completion: didReceiveVersions) - } -} - -private extension InitViewController { - func didReceiveSongs(response: SongResponse?, error: Error?) { - if let error = error { - plusCount() - UIAlertController.presentErrorAlert(to: self, error: error.localizedDescription) - return - } - guard let response = response else { return } - for song in response.songs { - SongInfo.add(song) - } - finishesSong = true - plusCount() - } - - func didReceiveMissions(response: MissionResponse?, error: Error?) { - if let error = error { - plusCount() - UIAlertController.presentErrorAlert(to: self, error: error.localizedDescription) - return - } - guard let response = response else { return } - for mission in response.missions { - MissionInfo.add(mission) - } - finishesMission = true - plusCount() - } - - func didReceiveTrophies(response: TrophyResponse?, error: Error?) { - if let error = error { - plusCount() - UIAlertController.presentErrorAlert(to: self, error: error.localizedDescription) - return - } - guard let response = response else { return } - for trophy in response.trophies { - TrophyInfo.add(trophy) - } - finishesTrophy = true - plusCount() - } - - func didReceiveAchievements(response: AchievementResponse?, error: Error?) { - if let error = error { - plusCount() - UIAlertController.presentErrorAlert(to: self, error: error.localizedDescription) - return - } - guard let response = response else { return } - for achievement in response.achievements { - AchievementInfo.add(achievement) - } - finishesAchievement = true - plusCount() - } - - func didReceiveTips(response: TipResponse?, error: Error?) { - if let error = error { - plusCount() - UIAlertController.presentErrorAlert(to: self, error: error.localizedDescription) - return - } - guard let response = response else { return } - for tip in response.tips { - TipInfo.add(tip) - } - finishesTip = true - plusCount() - } - - func didReceiveVersions(response: VersionResponse?, error: Error?) { - if let error = error { - plusCount() - UIAlertController.presentErrorAlert(to: self, error: error.localizedDescription) - return - } - guard let response = response else { return } - VersionInfo.add(response) - finishesVersion = true - plusCount() - } -} - -extension InitViewController { - private func presentSuccessAlert() { - let results = SongInfo.fetch() - let oldResults = RecordInfo.get() - UIAlertController - .alert(title: "", message: "Your data has been successfully downloaded.".localized) - .action(title: "OK".localized) { _ in - IndicatorView.shared.showIndicator() - for result in results { - let recordInfo = NewRecordInfo() - recordInfo.title = result.title - recordInfo.series = result.series - let button4Record = NewRecordButtonInfo() - let button5Record = NewRecordButtonInfo() - let button6Record = NewRecordButtonInfo() - let button8Record = NewRecordButtonInfo() - let button4NormalRecord = NewRecordDifficultyInfo() - let button4HardRecord = NewRecordDifficultyInfo() - let button4MaximumRecord = NewRecordDifficultyInfo() - let button5NormalRecord = NewRecordDifficultyInfo() - let button5HardRecord = NewRecordDifficultyInfo() - let button5MaximumRecord = NewRecordDifficultyInfo() - let button6NormalRecord = NewRecordDifficultyInfo() - let button6HardRecord = NewRecordDifficultyInfo() - let button6MaximumRecord = NewRecordDifficultyInfo() - let button8NormalRecord = NewRecordDifficultyInfo() - let button8HardRecord = NewRecordDifficultyInfo() - let button8MaximumRecord = NewRecordDifficultyInfo() - if let oldRecord = oldResults.filter("title = %@ OR title = %@", result.title?.english ?? "", result.title?.korean ?? "").first { - button4NormalRecord.rank = oldRecord.nm4Rank == "-" ? "" : oldRecord.nm4Rank - button4NormalRecord.rate = oldRecord.nm4Rate.rateConvertToDouble - button4NormalRecord.note = oldRecord.nm4Note.noteAbbreviation - button4Record.normal = button4NormalRecord - button4HardRecord.rank = oldRecord.hd4Rank == "-" ? "" : oldRecord.hd4Rank - button4HardRecord.rate = oldRecord.hd4Rate.rateConvertToDouble - button4HardRecord.note = oldRecord.hd4Note.noteAbbreviation - button4Record.hard = button4HardRecord - button4MaximumRecord.rank = oldRecord.mx4Rank == "-" ? "" : oldRecord.mx4Rank - button4MaximumRecord.rate = oldRecord.mx4Rate.rateConvertToDouble - button4MaximumRecord.note = oldRecord.mx4Note.noteAbbreviation - button4Record.maximum = button4MaximumRecord - button4Record.skillPoint = oldRecord.button4SkillPoint - button4Record.skillPointDifficulty = oldRecord.button4HighestSkillPointDifficulty.lowercased() - button4Record.skillPointRate = oldRecord.button4HighestSkillPointRate.rateConvertToDouble - button4Record.skillPointNote = oldRecord.button4HighestSkillPointNote.noteAbbreviation - recordInfo.button4 = button4Record - button5NormalRecord.rank = oldRecord.nm5Rank == "-" ? "" : oldRecord.nm5Rank - button5NormalRecord.rate = oldRecord.nm5Rate.rateConvertToDouble - button5NormalRecord.note = oldRecord.nm5Note.noteAbbreviation - button5Record.normal = button5NormalRecord - button5HardRecord.rank = oldRecord.hd5Rank == "-" ? "" : oldRecord.hd5Rank - button5HardRecord.rate = oldRecord.hd5Rate.rateConvertToDouble - button5HardRecord.note = oldRecord.hd5Note.noteAbbreviation - button5Record.hard = button5HardRecord - button5MaximumRecord.rank = oldRecord.mx5Rank == "-" ? "" : oldRecord.mx5Rank - button5MaximumRecord.rate = oldRecord.mx5Rate.rateConvertToDouble - button5MaximumRecord.note = oldRecord.mx5Note.noteAbbreviation - button5Record.maximum = button5MaximumRecord - button5Record.skillPoint = oldRecord.button5SkillPoint - button5Record.skillPointDifficulty = oldRecord.button5HighestSkillPointDifficulty.lowercased() - button5Record.skillPointRate = oldRecord.button5HighestSkillPointRate.rateConvertToDouble - button5Record.skillPointNote = oldRecord.button5HighestSkillPointNote.noteAbbreviation - recordInfo.button5 = button5Record - button6NormalRecord.rank = oldRecord.nm6Rank == "-" ? "" : oldRecord.nm6Rank - button6NormalRecord.rate = oldRecord.nm6Rate.rateConvertToDouble - button6NormalRecord.note = oldRecord.nm6Note.noteAbbreviation - button6Record.normal = button6NormalRecord - button6HardRecord.rank = oldRecord.hd6Rank == "-" ? "" : oldRecord.hd6Rank - button6HardRecord.rate = oldRecord.hd6Rate.rateConvertToDouble - button6HardRecord.note = oldRecord.hd6Note.noteAbbreviation - button6Record.hard = button6HardRecord - button6MaximumRecord.rank = oldRecord.mx6Rank == "-" ? "" : oldRecord.mx6Rank - button6MaximumRecord.rate = oldRecord.mx6Rate.rateConvertToDouble - button6MaximumRecord.note = oldRecord.mx6Note.noteAbbreviation - button6Record.maximum = button6MaximumRecord - button6Record.skillPoint = oldRecord.button6SkillPoint - button6Record.skillPointDifficulty = oldRecord.button6HighestSkillPointDifficulty.lowercased() - button6Record.skillPointRate = oldRecord.button6HighestSkillPointRate.rateConvertToDouble - button6Record.skillPointNote = oldRecord.button6HighestSkillPointNote.noteAbbreviation - recordInfo.button6 = button6Record - button8NormalRecord.rank = oldRecord.nm8Rank == "-" ? "" : oldRecord.nm8Rank - button8NormalRecord.rate = oldRecord.nm8Rate.rateConvertToDouble - button8NormalRecord.note = oldRecord.nm8Note.noteAbbreviation - button8Record.normal = button8NormalRecord - button8HardRecord.rank = oldRecord.hd8Rank == "-" ? "" : oldRecord.hd8Rank - button8HardRecord.rate = oldRecord.hd8Rate.rateConvertToDouble - button8HardRecord.note = oldRecord.hd8Note.noteAbbreviation - button8Record.hard = button8HardRecord - button8MaximumRecord.rank = oldRecord.mx8Rank == "-" ? "" : oldRecord.mx8Rank - button8MaximumRecord.rate = oldRecord.mx8Rate.rateConvertToDouble - button8MaximumRecord.note = oldRecord.mx8Note.noteAbbreviation - button8Record.maximum = button8MaximumRecord - button8Record.skillPoint = oldRecord.button8SkillPoint - button8Record.skillPointDifficulty = oldRecord.button8HighestSkillPointDifficulty.lowercased() - button8Record.skillPointRate = oldRecord.button8HighestSkillPointRate.rateConvertToDouble - button8Record.skillPointNote = oldRecord.button8HighestSkillPointNote.noteAbbreviation - recordInfo.button8 = button8Record - } else { - button4Record.normal = button4NormalRecord - button4Record.hard = button4HardRecord - button4Record.maximum = button4MaximumRecord - button5Record.normal = button5NormalRecord - button5Record.hard = button5HardRecord - button5Record.maximum = button5MaximumRecord - button6Record.normal = button6NormalRecord - button6Record.hard = button6HardRecord - button6Record.maximum = button6MaximumRecord - button8Record.normal = button8NormalRecord - button8Record.hard = button8HardRecord - button8Record.maximum = button8MaximumRecord - recordInfo.button4 = button4Record - recordInfo.button5 = button5Record - recordInfo.button6 = button6Record - recordInfo.button8 = button8Record - } - NewRecordInfo.add(recordInfo) - } - Skill.refresh() - IndicatorView.shared.hideIndicator() - guard let next = UIViewController.instantiate(storyboard: "Performance", identifier: "PerformanceNavigationController") else { return } - next.modalTransitionStyle = .crossDissolve - self.present(next, animated: true, completion: nil) - } - .present(to: self) - } - - private func plusCount() { - DispatchQueue.main.sync { [weak self] in - self?.count += 1 - } - } -} diff --git a/RespectU/Model/AchievementInfo.swift b/RespectU/Model/AchievementInfo.swift deleted file mode 100644 index b139661..0000000 --- a/RespectU/Model/AchievementInfo.swift +++ /dev/null @@ -1,72 +0,0 @@ -// -// AchievementInfo.swift -// RespectU -// -// Created by Presto on 2018. 3. 1.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import RealmSwift - -class AchievementInfo: Object { - - @objc dynamic var type: String = "" - @objc dynamic var level: Int = 0 - @objc dynamic var section: LanguageInfo? - @objc dynamic var item: LanguageInfo? - - var localizedSection: String { - if regionCode == "KR", let korean = section?.korean { - return korean - } else { - return section?.english ?? "" - } - } - var localizedItem: String { - if regionCode == "KR", let korean = item?.korean { - return korean - } else { - return item?.english ?? "" - } - } - - static func add(_ achievementInfo: AchievementResponse.Achievement) { - let realm = try! Realm() - let object = AchievementInfo() - let sectionInfo = LanguageInfo() - let itemInfo = LanguageInfo() - object.type = achievementInfo.type - object.level = achievementInfo.level - sectionInfo.english = achievementInfo.section.english - sectionInfo.korean = achievementInfo.section.korean - itemInfo.english = achievementInfo.item.english - itemInfo.korean = achievementInfo.item.korean - object.section = sectionInfo - object.item = itemInfo - try! realm.write { - realm.add(object) - } - } - - static func fetch(of type: String = "") -> Results { - let achievementInfo = try! Realm().objects(AchievementInfo.self) - if type.isEmpty { - return achievementInfo - } else { - let filtered = achievementInfo.filter(key: "type", value: type, method: "=") - return filtered - } - } - - static func update(_ object: AchievementResponse.Achievement, to achievementInfo: AchievementInfo) { - let realm = try! Realm() - try! realm.write { - achievementInfo.type = object.type - achievementInfo.level = object.level - achievementInfo.section?.english = object.section.english - achievementInfo.section?.korean = object.section.korean - achievementInfo.item?.english = object.item.english - achievementInfo.item?.korean = object.item.korean - } - } -} diff --git a/RespectU/Model/HistoryInfo.swift b/RespectU/Model/HistoryInfo.swift deleted file mode 100644 index 4587d69..0000000 --- a/RespectU/Model/HistoryInfo.swift +++ /dev/null @@ -1,69 +0,0 @@ -// -// HistoryInfo.swift -// RespectU -// -// Created by Presto on 16/10/2018. -// Copyright © 2018 Presto. All rights reserved. -// - -import RealmSwift - -@objcMembers -class HistoryInfo: Object { - - dynamic var date: Date = Date() - dynamic var title: LanguageInfo? - dynamic var series: String = "" - dynamic var historyType: String = "" // RANK / RATE / NOTE - dynamic var previousRecord: String = "" - dynamic var currentRecord: String = "" - - var localizedTitle: String { - if regionCode == "KR", let korean = title?.korean { - return korean - } else { - return title?.english ?? "" - } - } - var localizedDate: String { - let dateFormatter = DateFormatter() - dateFormatter.dateFormat = "yyyy.MM.dd HH:dd" - return dateFormatter.string(from: date) - } - - static func add(_ historyInfo: HistoryInfo) { - let realm = try! Realm() - let object = HistoryInfo() - let titleInfo = LanguageInfo() - titleInfo.english = historyInfo.title?.english ?? "" - titleInfo.korean = historyInfo.title?.korean - object.title = titleInfo - object.series = historyInfo.series - object.historyType = historyInfo.historyType - object.previousRecord = historyInfo.previousRecord - object.currentRecord = historyInfo.currentRecord - try! realm.write { - realm.add(object) - } - } - - static func fetch(_ date: Date) -> Results { - let historyInfo = try! Realm().objects(HistoryInfo.self) - return historyInfo - - } - - static func remove(_ historyInfo: HistoryInfo) { - let realm = try! Realm() - try! realm.write { - realm.delete(historyInfo) - } - } - - static func removeAll() { - let realm = try! Realm() - try! realm.write { - - } - } -} diff --git a/RespectU/Model/LanguageInfo.swift b/RespectU/Model/LanguageInfo.swift deleted file mode 100644 index 5ae4536..0000000 --- a/RespectU/Model/LanguageInfo.swift +++ /dev/null @@ -1,15 +0,0 @@ -// -// LanguageInfo.swift -// RespectU -// -// Created by Presto on 2018. 8. 29.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import RealmSwift - -class LanguageInfo: Object { - - @objc dynamic var english: String = "" - @objc dynamic var korean: String? -} diff --git a/RespectU/Model/MissionInfo.swift b/RespectU/Model/MissionInfo.swift deleted file mode 100644 index fee99e2..0000000 --- a/RespectU/Model/MissionInfo.swift +++ /dev/null @@ -1,147 +0,0 @@ -// -// MissionInfo.swift -// RespectU -// -// Created by Presto on 2018. 3. 1.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import RealmSwift - -class MissionInfo: Object { - - @objc dynamic var series: String = "" - @objc dynamic var section: String = "" - @objc dynamic var title: String = "" - @objc dynamic var score: Int = 0 - @objc dynamic var fever: Int = 0 - @objc dynamic var combo: Int = 0 - @objc dynamic var rate: Int = 0 - @objc dynamic var `break`: Int = 0 - @objc dynamic var effector: String = "" - @objc dynamic var reward: LanguageInfo? - @objc dynamic var stage1: MissionStageInfo? - @objc dynamic var stage2: MissionStageInfo? - @objc dynamic var stage3: MissionStageInfo? - @objc dynamic var stage4: MissionStageInfo? - @objc dynamic var stage5: MissionStageInfo? - @objc dynamic var stage6: MissionStageInfo? - - var localizedReward: String { - if regionCode == "KR", let korean = reward?.korean { - return korean - } else { - return reward?.english ?? "" - } - } - - static func add(_ missionInfo: MissionResponse.Mission) { - let realm = try! Realm() - let object = MissionInfo() - let rewardInfo = LanguageInfo() - object.series = missionInfo.series - object.section = missionInfo.section - object.title = missionInfo.title - object.score = missionInfo.score - object.combo = missionInfo.combo - object.rate = missionInfo.rate - object.break = missionInfo.break - object.effector = missionInfo.effector - rewardInfo.english = missionInfo.reward.english - rewardInfo.korean = missionInfo.reward.korean - object.reward = rewardInfo - if let stage = missionInfo.stage1 { - let stageInfo = MissionStageInfo() - let titleInfo = LanguageInfo() - titleInfo.english = stage.title.english - titleInfo.korean = stage.title.korean - stageInfo.title = titleInfo - stageInfo.difficulty = stage.difficulty - stageInfo.button = stage.button - object.stage1 = stageInfo - } - if let stage = missionInfo.stage2 { - let stageInfo = MissionStageInfo() - let titleInfo = LanguageInfo() - titleInfo.english = stage.title.english - titleInfo.korean = stage.title.korean - stageInfo.title = titleInfo - stageInfo.difficulty = stage.difficulty - stageInfo.button = stage.button - object.stage2 = stageInfo - } - if let stage = missionInfo.stage3 { - let stageInfo = MissionStageInfo() - let titleInfo = LanguageInfo() - titleInfo.english = stage.title.english - titleInfo.korean = stage.title.korean - stageInfo.title = titleInfo - stageInfo.difficulty = stage.difficulty - stageInfo.button = stage.button - object.stage3 = stageInfo - } - if let stage = missionInfo.stage4 { - let stageInfo = MissionStageInfo() - let titleInfo = LanguageInfo() - titleInfo.english = stage.title.english - titleInfo.korean = stage.title.korean - stageInfo.title = titleInfo - stageInfo.difficulty = stage.difficulty - stageInfo.button = stage.button - object.stage4 = stageInfo - } - if let stage = missionInfo.stage5 { - let stageInfo = MissionStageInfo() - let titleInfo = LanguageInfo() - titleInfo.english = stage.title.english - titleInfo.korean = stage.title.korean - stageInfo.title = titleInfo - stageInfo.difficulty = stage.difficulty - stageInfo.button = stage.button - object.stage5 = stageInfo - } - if let stage = missionInfo.stage6 { - let stageInfo = MissionStageInfo() - let titleInfo = LanguageInfo() - titleInfo.english = stage.title.english - titleInfo.korean = stage.title.korean - stageInfo.title = titleInfo - stageInfo.difficulty = stage.difficulty - stageInfo.button = stage.button - object.stage6 = stageInfo - } - try! realm.write { - realm.add(object) - } - } - - static func fetch(of series: String = "") -> Results { - let realm = try! Realm() - let missionInfo = realm.objects(MissionInfo.self) - if series.isEmpty { - return missionInfo - } else { - let filtered = missionInfo.filter(key: "series", value: series, method: "=") - return filtered - } - } - - ///타이틀로 필터링한 내부 데이터베이스 갱신 - static func update(_ object: MissionResponse.Mission, to missionInfo: MissionInfo) { - let realm = try! Realm() - try! realm.write { - missionInfo.series = object.series - missionInfo.section = object.section - missionInfo.title = object.title - missionInfo.score = object.score - missionInfo.fever = object.fever - missionInfo.combo = object.combo - missionInfo.rate = object.rate - missionInfo.break = object.break - missionInfo.effector = object.effector - missionInfo.reward?.english = object.reward.english - missionInfo.reward?.korean = object.reward.korean - - } - } -} diff --git a/RespectU/Model/MissionStageInfo.swift b/RespectU/Model/MissionStageInfo.swift deleted file mode 100644 index 24915aa..0000000 --- a/RespectU/Model/MissionStageInfo.swift +++ /dev/null @@ -1,24 +0,0 @@ -// -// MissionStageInfo.swift -// RespectU -// -// Created by Presto on 2018. 9. 2.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import RealmSwift - -class MissionStageInfo: Object { - - @objc dynamic var title: LanguageInfo? - @objc dynamic var difficulty: String = "" - @objc dynamic var button: String = "" - - var localizedTitle: String { - if regionCode == "KR", let korean = title?.korean { - return korean - } else { - return title?.english ?? "" - } - } -} diff --git a/RespectU/Model/NewRecordButtonInfo.swift b/RespectU/Model/NewRecordButtonInfo.swift deleted file mode 100644 index 8087b59..0000000 --- a/RespectU/Model/NewRecordButtonInfo.swift +++ /dev/null @@ -1,20 +0,0 @@ -// -// RecordButtonInfo.swift -// RespectU -// -// Created by Presto on 2018. 9. 2.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import RealmSwift - -class NewRecordButtonInfo: Object { - - @objc dynamic var normal: NewRecordDifficultyInfo? - @objc dynamic var hard: NewRecordDifficultyInfo? - @objc dynamic var maximum: NewRecordDifficultyInfo? - @objc dynamic var skillPoint: Double = 0 - @objc dynamic var skillPointDifficulty: String = "" - @objc dynamic var skillPointNote: String = "" - @objc dynamic var skillPointRate: Double = 0 -} diff --git a/RespectU/Model/NewRecordDifficultyInfo.swift b/RespectU/Model/NewRecordDifficultyInfo.swift deleted file mode 100644 index a56d50f..0000000 --- a/RespectU/Model/NewRecordDifficultyInfo.swift +++ /dev/null @@ -1,16 +0,0 @@ -// -// RecordPerformanceInfo.swift -// RespectU -// -// Created by Presto on 2018. 9. 2.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import RealmSwift - -class NewRecordDifficultyInfo: Object { - - @objc dynamic var rank: String = "" - @objc dynamic var rate: Double = 0 - @objc dynamic var note: String = "" -} diff --git a/RespectU/Model/NewRecordInfo.swift b/RespectU/Model/NewRecordInfo.swift deleted file mode 100644 index 4f96516..0000000 --- a/RespectU/Model/NewRecordInfo.swift +++ /dev/null @@ -1,122 +0,0 @@ -// -// RecordInfo.swift -// RespectU -// -// Created by Presto on 2018. 3. 1.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import RealmSwift - -class NewRecordInfo: Object { - - @objc dynamic var title: LanguageInfo? - @objc dynamic var series: String = "" - @objc dynamic var button4: NewRecordButtonInfo? - @objc dynamic var button5: NewRecordButtonInfo? - @objc dynamic var button6: NewRecordButtonInfo? - @objc dynamic var button8: NewRecordButtonInfo? - - var localizedTitle: String { - if regionCode == "KR", let korean = title?.korean { - return korean - } else { - return title?.english ?? "" - } - } - - static func add(_ recordInfo: NewRecordInfo) { - let realm = try! Realm() - let object = NewRecordInfo() - object.title = recordInfo.title - object.series = recordInfo.series - object.button4 = recordInfo.button4 - object.button5 = recordInfo.button5 - object.button6 = recordInfo.button6 - object.button8 = recordInfo.button8 - try! realm.write { - realm.add(object) - } - } - - static func fetch(of title: String = "") -> Results { - let recordInfo = try! Realm().objects(NewRecordInfo.self) - if title.isEmpty { - return recordInfo - } else { - let filtered = recordInfo.filter(key: "title", value: title, method: "=") - return filtered - } - } - - static func update(_ object: NewRecordInfo, with dictionary: [String: Any]) { - let realm = try! Realm() - try! realm.write { - for (key, value) in dictionary { - object.setValue(value, forKeyPath: key) - } - } - } - - static func update(_ object: RecordResponse.Record, to recordInfo: NewRecordInfo) { - let realm = try! Realm() - try! realm.write { - recordInfo.title?.english = object.title.english - recordInfo.title?.korean = object.title.korean - recordInfo.series = object.series - recordInfo.button4?.normal?.rank = object.button4.normal.rank - recordInfo.button4?.normal?.rate = object.button4.normal.rate - recordInfo.button4?.normal?.note = object.button4.normal.note - recordInfo.button4?.hard?.rank = object.button4.hard.rank - recordInfo.button4?.hard?.rate = object.button4.hard.rate - recordInfo.button4?.hard?.note = object.button4.hard.note - recordInfo.button4?.maximum?.rank = object.button4.maximum.rank - recordInfo.button4?.maximum?.rate = object.button4.maximum.rate - recordInfo.button4?.maximum?.note = object.button4.maximum.note - recordInfo.button4?.skillPoint = object.button4.skillPoint - recordInfo.button4?.skillPointNote = object.button4.skillPointNote - recordInfo.button4?.skillPointRate = object.button4.skillPointRate - recordInfo.button4?.skillPointDifficulty = object.button4.skillPointDifficulty - recordInfo.button5?.normal?.rank = object.button5.normal.rank - recordInfo.button5?.normal?.rate = object.button5.normal.rate - recordInfo.button5?.normal?.note = object.button5.normal.note - recordInfo.button5?.hard?.rank = object.button5.hard.rank - recordInfo.button5?.hard?.rate = object.button5.hard.rate - recordInfo.button5?.hard?.note = object.button5.hard.note - recordInfo.button5?.maximum?.rank = object.button5.maximum.rank - recordInfo.button5?.maximum?.rate = object.button5.maximum.rate - recordInfo.button5?.maximum?.note = object.button5.maximum.note - recordInfo.button5?.skillPoint = object.button5.skillPoint - recordInfo.button5?.skillPointNote = object.button5.skillPointNote - recordInfo.button5?.skillPointRate = object.button5.skillPointRate - recordInfo.button5?.skillPointDifficulty = object.button5.skillPointDifficulty - recordInfo.button6?.normal?.rank = object.button6.normal.rank - recordInfo.button6?.normal?.rate = object.button6.normal.rate - recordInfo.button6?.normal?.note = object.button6.normal.note - recordInfo.button6?.hard?.rank = object.button6.hard.rank - recordInfo.button6?.hard?.rate = object.button6.hard.rate - recordInfo.button6?.hard?.note = object.button6.hard.note - recordInfo.button6?.maximum?.rank = object.button6.maximum.rank - recordInfo.button6?.maximum?.rate = object.button6.maximum.rate - recordInfo.button6?.maximum?.note = object.button6.maximum.note - recordInfo.button6?.skillPoint = object.button6.skillPoint - recordInfo.button6?.skillPointNote = object.button6.skillPointNote - recordInfo.button6?.skillPointRate = object.button6.skillPointRate - recordInfo.button6?.skillPointDifficulty = object.button6.skillPointDifficulty - recordInfo.button8?.normal?.rank = object.button8.normal.rank - recordInfo.button8?.normal?.rate = object.button8.normal.rate - recordInfo.button8?.normal?.note = object.button8.normal.note - recordInfo.button8?.hard?.rank = object.button8.hard.rank - recordInfo.button8?.hard?.rate = object.button8.hard.rate - recordInfo.button8?.hard?.note = object.button8.hard.note - recordInfo.button8?.maximum?.rank = object.button8.maximum.rank - recordInfo.button8?.maximum?.rate = object.button8.maximum.rate - recordInfo.button8?.maximum?.note = object.button8.maximum.note - recordInfo.button8?.skillPoint = object.button8.skillPoint - recordInfo.button8?.skillPointNote = object.button8.skillPointNote - recordInfo.button8?.skillPointRate = object.button8.skillPointRate - recordInfo.button8?.skillPointDifficulty = object.button8.skillPointDifficulty - - } - } -} diff --git a/RespectU/Model/RecordInfo.swift b/RespectU/Model/RecordInfo.swift deleted file mode 100644 index b80f261..0000000 --- a/RespectU/Model/RecordInfo.swift +++ /dev/null @@ -1,88 +0,0 @@ -// -// OldRecordInfo.swift -// RespectU -// -// Created by Presto on 2018. 3. 1.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import RealmSwift - -class RecordInfo: Object { - - @objc dynamic var series: String = "" - @objc dynamic var title: String = "" - @objc dynamic var nm4Rank: String = "-" - @objc dynamic var nm4Rate: String = "-" - @objc dynamic var nm4Note: String = "-" - @objc dynamic var hd4Rank: String = "-" - @objc dynamic var hd4Rate: String = "-" - @objc dynamic var hd4Note: String = "-" - @objc dynamic var mx4Rank: String = "-" - @objc dynamic var mx4Rate: String = "-" - @objc dynamic var mx4Note: String = "-" - @objc dynamic var nm5Rank: String = "-" - @objc dynamic var nm5Rate: String = "-" - @objc dynamic var nm5Note: String = "-" - @objc dynamic var hd5Rank: String = "-" - @objc dynamic var hd5Rate: String = "-" - @objc dynamic var hd5Note: String = "-" - @objc dynamic var mx5Rank: String = "-" - @objc dynamic var mx5Rate: String = "-" - @objc dynamic var mx5Note: String = "-" - @objc dynamic var nm6Rank: String = "-" - @objc dynamic var nm6Rate: String = "-" - @objc dynamic var nm6Note: String = "-" - @objc dynamic var hd6Rank: String = "-" - @objc dynamic var hd6Rate: String = "-" - @objc dynamic var hd6Note: String = "-" - @objc dynamic var mx6Rank: String = "-" - @objc dynamic var mx6Rate: String = "-" - @objc dynamic var mx6Note: String = "-" - @objc dynamic var nm8Rank: String = "-" - @objc dynamic var nm8Rate: String = "-" - @objc dynamic var nm8Note: String = "-" - @objc dynamic var hd8Rank: String = "-" - @objc dynamic var hd8Rate: String = "-" - @objc dynamic var hd8Note: String = "-" - @objc dynamic var mx8Rank: String = "-" - @objc dynamic var mx8Rate: String = "-" - @objc dynamic var mx8Note: String = "-" - @objc dynamic var nm4: Int = 0 - @objc dynamic var nm5: Int = 0 - @objc dynamic var nm6: Int = 0 - @objc dynamic var nm8: Int = 0 - @objc dynamic var hd4: Int = 0 - @objc dynamic var hd5: Int = 0 - @objc dynamic var hd6: Int = 0 - @objc dynamic var hd8: Int = 0 - @objc dynamic var mx4: Int = 0 - @objc dynamic var mx5: Int = 0 - @objc dynamic var mx6: Int = 0 - @objc dynamic var mx8: Int = 0 - @objc dynamic var button4SkillPoint: Double = 0.0 - @objc dynamic var button5SkillPoint: Double = 0.0 - @objc dynamic var button6SkillPoint: Double = 0.0 - @objc dynamic var button8SkillPoint: Double = 0.0 - @objc dynamic var button4HighestSkillPointDifficulty: String = "" - @objc dynamic var button4HighestSkillPointRate: String = "" - @objc dynamic var button4HighestSkillPointNote: String = "" - @objc dynamic var button5HighestSkillPointDifficulty: String = "" - @objc dynamic var button5HighestSkillPointRate: String = "" - @objc dynamic var button5HighestSkillPointNote: String = "" - @objc dynamic var button6HighestSkillPointDifficulty: String = "" - @objc dynamic var button6HighestSkillPointRate: String = "" - @objc dynamic var button6HighestSkillPointNote: String = "" - @objc dynamic var button8HighestSkillPointDifficulty: String = "" - @objc dynamic var button8HighestSkillPointRate: String = "" - @objc dynamic var button8HighestSkillPointNote: String = "" - @objc dynamic var lowercase: String = "" - - static func get() -> Results { - let oldConfig = Realm.Configuration(fileURL: Realm.Configuration.defaultConfiguration.fileURL!.deletingLastPathComponent().appendingPathComponent("default.realm"), schemaVersion: 13, migrationBlock: { (_, oldVersion) in - if oldVersion < 1 {} - }) - let result = try! Realm(configuration: oldConfig).objects(RecordInfo.self) - return result - } -} diff --git a/RespectU/Model/SongButtonInfo.swift b/RespectU/Model/SongButtonInfo.swift deleted file mode 100644 index c65b9d7..0000000 --- a/RespectU/Model/SongButtonInfo.swift +++ /dev/null @@ -1,16 +0,0 @@ -// -// SongButtonInfo.swift -// RespectU -// -// Created by Presto on 2018. 9. 2.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import RealmSwift - -class SongButtonInfo: Object { - - @objc dynamic var normal: Int = 0 - @objc dynamic var hard: Int = 0 - @objc dynamic var maximum: Int = 0 -} diff --git a/RespectU/Model/SongInfo.swift b/RespectU/Model/SongInfo.swift deleted file mode 100644 index 8c44e0b..0000000 --- a/RespectU/Model/SongInfo.swift +++ /dev/null @@ -1,129 +0,0 @@ -// -// SongInfo.swift -// RespectU -// -// Created by Presto on 2018. 3. 1.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import RealmSwift - -class SongInfo: Object { - - @objc dynamic var title: LanguageInfo? - @objc dynamic var lowercase: LanguageInfo? - @objc dynamic var series: String = "" - @objc dynamic var composer: String = "" - @objc dynamic var bpm: Int = 0 - let subBpm: RealmOptional = RealmOptional() - @objc dynamic var button4: SongButtonInfo? - @objc dynamic var button5: SongButtonInfo? - @objc dynamic var button6: SongButtonInfo? - @objc dynamic var button8: SongButtonInfo? - - var localizedTitle: String { - if regionCode == "KR", let korean = title?.korean { - return korean - } else { - return title?.english ?? "" - } - } - var localizedLowercase: String { - if regionCode == "KR", let korean = lowercase?.korean { - return korean - } else { - return lowercase?.english ?? "" - } - } - var bpmToString: String { - if let subBpm = subBpm.value { - return "BPM \(bpm) ~ \(subBpm)" - } else { - return "BPM \(bpm)" - } - } - - static func add(_ songInfo: SongResponse.Song) { - let realm = try! Realm() - let object = SongInfo() - let titleInfo = LanguageInfo() - let lowercaseInfo = LanguageInfo() - let button4Info = SongButtonInfo() - let button5Info = SongButtonInfo() - let button6Info = SongButtonInfo() - let button8Info = SongButtonInfo() - object.series = songInfo.series - object.composer = songInfo.composer - object.bpm = songInfo.bpm - object.subBpm.value = songInfo.subBpm - titleInfo.english = songInfo.title.english - titleInfo.korean = songInfo.title.korean - object.title = titleInfo - lowercaseInfo.english = songInfo.lowercase.english - lowercaseInfo.korean = songInfo.lowercase.korean - object.lowercase = lowercaseInfo - button4Info.normal = songInfo.button4.normal - button4Info.hard = songInfo.button4.hard - button4Info.maximum = songInfo.button4.maximum - object.button4 = button4Info - button5Info.normal = songInfo.button5.normal - button5Info.hard = songInfo.button5.hard - button5Info.maximum = songInfo.button5.maximum - object.button5 = button5Info - button6Info.normal = songInfo.button6.normal - button6Info.hard = songInfo.button6.hard - button6Info.maximum = songInfo.button6.maximum - object.button6 = button6Info - button8Info.normal = songInfo.button8.normal - button8Info.hard = songInfo.button8.hard - button8Info.maximum = songInfo.button8.maximum - object.button8 = button8Info - try! realm.write { - realm.add(object) - } - } - - /// 시리즈별 음악 가져오기 - static func fetch(of series: String = "") -> Results { - let songInfo = try! Realm().objects(SongInfo.self) - if series.isEmpty { - return songInfo - } else { - let filtered = songInfo.filter(key: "series", value: series, method: "=") - return filtered - } - } - - /// 타이틀별 음악 가져오기 - static func fetch(by title: String) -> SongInfo? { - let predicate = NSPredicate(format: "%K == %@", #keyPath(SongInfo.title.english), title) - return try! Realm().objects(SongInfo.self).filter(predicate).first - } - - /// 타이틀로 필터링한 내부 데이터베이스 갱신 - static func update(_ object: SongResponse.Song, to songInfo: SongInfo) { - let realm = try! Realm() - try! realm.write { - songInfo.title?.english = object.title.english - songInfo.title?.korean = object.title.korean - songInfo.lowercase?.english = object.lowercase.english - songInfo.lowercase?.korean = object.lowercase.korean - songInfo.series = object.series - songInfo.composer = object.composer - songInfo.bpm = object.bpm - songInfo.subBpm.value = object.subBpm - songInfo.button4?.normal = object.button4.normal - songInfo.button4?.hard = object.button4.hard - songInfo.button4?.maximum = object.button4.maximum - songInfo.button5?.normal = object.button5.normal - songInfo.button5?.hard = object.button5.hard - songInfo.button5?.maximum = object.button5.maximum - songInfo.button6?.normal = object.button6.normal - songInfo.button6?.hard = object.button6.hard - songInfo.button6?.maximum = object.button6.maximum - songInfo.button8?.normal = object.button8.normal - songInfo.button8?.hard = object.button8.hard - songInfo.button8?.maximum = object.button8.maximum - } - } -} diff --git a/RespectU/Model/TipInfo.swift b/RespectU/Model/TipInfo.swift deleted file mode 100644 index b8baa5d..0000000 --- a/RespectU/Model/TipInfo.swift +++ /dev/null @@ -1,47 +0,0 @@ -// -// TipInfo.swift -// RespectU -// -// Created by Presto on 2018. 3. 1.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import RealmSwift - -class TipInfo: Object { - - @objc dynamic var title: LanguageInfo? - - var localizedTitle: String { - if regionCode == "KR", let korean = title?.korean { - return korean - } else { - return title?.english ?? "" - } - } - - static func add(_ tipInfo: TipResponse.Tip) { - let realm = try! Realm() - let object = TipInfo() - let languageInfo = LanguageInfo() - languageInfo.english = tipInfo.title.english - languageInfo.korean = tipInfo.title.korean - object.title = languageInfo - try! realm.write { - realm.add(object) - } - } - - static func fetch() -> Results { - let tipInfo = try! Realm().objects(TipInfo.self) - return tipInfo - } - - static func update(_ object: TipResponse.Tip, to tipInfo: TipInfo) { - let realm = try! Realm() - try! realm.write { - tipInfo.title?.english = object.title.english - tipInfo.title?.korean = object.title.korean - } - } -} diff --git a/RespectU/Model/TrophyInfo.swift b/RespectU/Model/TrophyInfo.swift deleted file mode 100644 index 01e7d8f..0000000 --- a/RespectU/Model/TrophyInfo.swift +++ /dev/null @@ -1,101 +0,0 @@ -// -// TrophyInfo.swift -// RespectU -// -// Created by Presto on 2018. 3. 1.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import RealmSwift - -class TrophyInfo: Object { - - @objc dynamic var series: String = "" - @objc dynamic var rating: String = "" - @objc dynamic var image: String = "" - @objc dynamic var title: LanguageInfo? - @objc dynamic var content: LanguageInfo? - - var localizedTitle: String { - if regionCode == "KR", let korean = title?.korean { - return korean - } else { - return title?.english ?? "" - } - } - var localizedContent: String { - if regionCode == "KR", let korean = content?.korean { - return korean - } else { - return content?.english ?? "" - } - } - - static func add(_ trophyInfo: TrophyResponse.Trophy) { - let realm = try! Realm() - let object = TrophyInfo() - let titleInfo = LanguageInfo() - let contentInfo = LanguageInfo() - object.series = trophyInfo.series - object.rating = trophyInfo.rating - object.image = trophyInfo.image - let imageURL = "\(API.baseURL)/images/\(trophyInfo.series)/\(trophyInfo.image).png" - guard let url = URL(string: imageURL) else { return } - guard let imageData = try? Data(contentsOf: url) else { return } - guard let documentURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else { return } - let fileURL = documentURL.appendingPathComponent("\(trophyInfo.image).png") - do { - try imageData.write(to: fileURL, options: .atomic) - } catch { - print(error.localizedDescription) - } - titleInfo.english = trophyInfo.title.english - titleInfo.korean = trophyInfo.title.korean - contentInfo.english = trophyInfo.content.english - contentInfo.korean = trophyInfo.content.korean - object.title = titleInfo - object.content = contentInfo - try! realm.write { - realm.add(object) - } - } - - static func fetch(of series: String = "") -> Results { - let trophyInfo = try! Realm().objects(TrophyInfo.self) - if series.isEmpty { - return trophyInfo - } else { - let filtered = trophyInfo.filter(key: "series", value: series, method: "=") - return filtered - } - } - - ///타이틀로 필터링한 내부 데이터베이스 갱신 - static func update(_ object: TrophyResponse.Trophy, to trophyInfo: TrophyInfo) { - guard let documentURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else { return } - let fileURL = documentURL.appendingPathComponent("\(trophyInfo.image).png") - do { - try FileManager.default.removeItem(at: fileURL) - } catch { - print(error.localizedDescription) - } - let imageURL = "\(API.baseURL)/images/\(trophyInfo.series)/\(trophyInfo.image).png" - guard let url = URL(string: imageURL) else { return } - guard let imageData = try? Data(contentsOf: url) else { return } - do { - try imageData.write(to: fileURL, options: .atomic) - } catch { - print(error.localizedDescription) - } - guard let realm = try? Realm() else { return } - try? realm.write { - trophyInfo.series = object.series - trophyInfo.rating = object.rating - trophyInfo.image = object.image - trophyInfo.title?.english = object.title.english - trophyInfo.title?.korean = object.title.korean - trophyInfo.content?.english = object.content.english - trophyInfo.content?.korean = object.content.korean - } - } -} diff --git a/RespectU/Model/VersionInfo.swift b/RespectU/Model/VersionInfo.swift deleted file mode 100644 index c476347..0000000 --- a/RespectU/Model/VersionInfo.swift +++ /dev/null @@ -1,47 +0,0 @@ -// -// VersionInfo.swift -// RespectU -// -// Created by Presto on 2018. 9. 3.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import RealmSwift - -class VersionInfo: Object { - - @objc dynamic var serverVersion: String = "" - @objc dynamic var gameVersion: String = "" - - static func fetch() -> Results { - let versionInfo = try! Realm().objects(VersionInfo.self) - return versionInfo - } - - static func add(_ versionInfo: VersionResponse) { - let realm = try! Realm() - let object = VersionInfo() - object.serverVersion = versionInfo.serverVersion - object.gameVersion = versionInfo.gameVersion - try! realm.write { - realm.add(object) - } - } - - static func update(_ object: VersionResponse, to versionInfo: VersionInfo) { - let realm = try! Realm() - try! realm.write { - versionInfo.serverVersion = object.serverVersion - versionInfo.gameVersion = object.gameVersion - } - } - - static func update(_ object: VersionInfo, with dictionary: [String: Any]) { - let realm = try! Realm() - try! realm.write { - for (key, value) in dictionary { - object.setValue(value, forKey: key) - } - } - } -} diff --git a/RespectU/Network/API.swift b/RespectU/Network/API.swift deleted file mode 100644 index 747105a..0000000 --- a/RespectU/Network/API.swift +++ /dev/null @@ -1,203 +0,0 @@ -// -// API.swift -// RespectU -// -// Created by Presto on 2018. 8. 21.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import Foundation -import SwiftKeychainWrapper - -class API { - static let baseURL = "http://13.209.166.210:3000" - //static let baseURL = "http://localhost:3000" - private static let jsonDecoder = JSONDecoder() -} -// MARK: - Song -extension API { - static func requestSongs(of series: String = "", completion: @escaping (SongResponse?, Error?) -> Void) { - Network.get("\(baseURL)/songs/\(series)", successHandler: { data in - do { - let decoded = try jsonDecoder.decode(SongResponse.self, from: data) - completion(decoded, nil) - } catch { - completion(nil, error) - } - }, errorHandler: { error in - completion(nil, error) - }) - } -} -// MARK: - Mission -extension API { - static func requestMissions(of series: String = "", completion: @escaping (MissionResponse?, Error?) -> Void) { - Network.get("\(baseURL)/missions/\(series)", successHandler: { data in - do { - let decoded = try jsonDecoder.decode(MissionResponse.self, from: data) - completion(decoded, nil) - } catch { - completion(nil, error) - } - }, errorHandler: { error in - completion(nil, error) - }) - } -} - -// MARK: - Trophy -extension API { - static func requestTrophies(of series: String = "", completion: @escaping (TrophyResponse?, Error?) -> Void) { - Network.get("\(baseURL)/trophies/\(series)", successHandler: { data in - do { - let decoded = try jsonDecoder.decode(TrophyResponse.self, from: data) - completion(decoded, nil) - } catch { - completion(nil, error) - } - }, errorHandler: { error in - completion(nil, error) - }) - } -} -// MARK: - Achievement -extension API { - static func requestAchievements(of type: String = "", completion: @escaping (AchievementResponse?, Error?) -> Void) { - Network.get("\(baseURL)/achievements/\(type)", successHandler: { data in - do { - let decoded = try jsonDecoder.decode(AchievementResponse.self, from: data) - completion(decoded, nil) - } catch { - completion(nil, error) - } - }, errorHandler: { error in - completion(nil, error) - }) - } -} -// MARK: - Tip -extension API { - static func requestTips(completion: @escaping (TipResponse?, Error?) -> Void) { - Network.get("\(baseURL)/tips", successHandler: { data in - do { - let decoded = try jsonDecoder.decode(TipResponse.self, from: data) - completion(decoded, nil) - } catch { - completion(nil, error) - } - }, errorHandler: { error in - completion(nil, error) - }) - } -} -// MARK: - Sign In -extension API { - static func requestSignIn(id: String, password: String, completion: @escaping (Int?, Error?) -> Void) { - let parameters = ["id": id, "password": password] - Network.post("\(baseURL)/users/signin", parameters: parameters, successHandler: { (_, statusCode) in - completion(statusCode, nil) - }, errorHandler: { error in - completion(nil, error) - }) - } -} -// MARK: - Sign Up -extension API { - static func requestSignUp(id: String, password: String, nickname: String, completion: @escaping (Int?, Error?) -> Void) { - let parameters = ["id": id, "password": password, "nickname": nickname] - Network.post("\(baseURL)/users/signup", parameters: parameters, successHandler: { (_, statusCode) in - completion(statusCode, nil) - }, errorHandler: { error in - completion(nil, error) - }) - } -} -// MARK: - Version -extension API { - static func requestVersions(completion: @escaping (VersionResponse?, Error?) -> Void) { - Network.get("\(baseURL)/version", successHandler: { (data) in - do { - let decoded = try jsonDecoder.decode(VersionResponse.self, from: data) - completion(decoded, nil) - } catch { - completion(nil, error) - } - }, errorHandler: { error in - completion(nil, error) - }) - } -} -// MARK: - Nickname -extension API { - static func requestNickname(completion: @escaping (NicknameResponse?, Error?) -> Void) { - let id = KeychainWrapper.standard.string(forKey: "id") ?? "" - if id.isEmpty { return } - Network.get("\(baseURL)/users/nickname/\(id)", successHandler: { data in - do { - let decoded = try jsonDecoder.decode(NicknameResponse.self, from: data) - completion(decoded, nil) - } catch { - completion(nil, error) - } - }, errorHandler: { error in - completion(nil, error) - }) - } - - static func uploadNickname(id: String, nickname: String, completion: @escaping (Int?, Error?) -> Void) { - let parameters = ["id": id, "nickname": nickname] - Network.post("\(baseURL)/users/nickname", parameters: parameters, successHandler: { (_, statusCode) in - completion(statusCode, nil) - - }, errorHandler: { error in - completion(nil, error) - }) - } -} -// MARK: - Record -extension API { - static func requestRecords(_ id: String, completion: @escaping (RecordResponse?, Error?) -> Void) { - Network.get("\(baseURL)/records/\(id)", successHandler: { (data) in - do { - let decoded = try jsonDecoder.decode(RecordResponse.self, from: data) - completion(decoded, nil) - } catch { - completion(nil, error) - } - }, errorHandler: { error in - completion(nil, error) - }) - } - - static func uploadRecords(_ object: Data, completion: @escaping (Int?, Error?) -> Void) { - Network.upload("\(baseURL)/records", data: object, succesHandler: { (_, statusCode) in - completion(statusCode, nil) - }, errorHandler: { error in - completion(nil, error) - }) - } -} -// MARK: - Ranking -extension API { - static func requestRankings(completion: @escaping (RankingResponse?, Error?) -> Void) { - Network.get("\(baseURL)/rankings", successHandler: { (data) in - do { - let decoded = try jsonDecoder.decode(RankingResponse.self, from: data) - completion(decoded, nil) - } catch { - completion(nil, error) - } - }, errorHandler: { error in - completion(nil, error) - }) - } - - static func uploadRanking(id: String, nickname: String, button4: Double, button5: Double, button6: Double, button8: Double, completion: @escaping (Int?, Error?) -> Void) { - let parameters: [String: Any] = ["id": id, "nickname": nickname, "button4": button4, "button5": button5, "button6": button6, "button8": button8] - Network.post("\(baseURL)/rankings", parameters: parameters, successHandler: { (_, statusCode) in - completion(statusCode, nil) - }, errorHandler: { error in - completion(nil, error) - }) - } -} diff --git a/RespectU/Network/Network.swift b/RespectU/Network/Network.swift deleted file mode 100644 index f1a79af..0000000 --- a/RespectU/Network/Network.swift +++ /dev/null @@ -1,69 +0,0 @@ -// -// Network.swift -// RespectU -// -// Created by Presto on 2018. 8. 21.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import Foundation - -class Network { - static func get(_ urlPath: String, successHandler: ((Data) -> Void)?, errorHandler: ((Error) -> Void)?) { - let session = URLSession(configuration: .default) - guard let url = URL(string: urlPath) else { return } - let task = session.dataTask(with: url) { (data, _, error) in - if let error = error { - errorHandler?(error) - session.finishTasksAndInvalidate() - return - } - guard let data = data else { return } - successHandler?(data) - session.finishTasksAndInvalidate() - } - task.resume() - } - - static func post(_ urlPath: String, parameters: [String: Any], successHandler: ((Data, Int) -> Void)?, errorHandler: ((Error) -> Void)?) { - let session = URLSession(configuration: .default) - guard let url = URL(string: urlPath) else { return } - var request = URLRequest(url: url) - request.httpMethod = "POST" - request.setValue("application/json", forHTTPHeaderField: "Content-Type") - guard let httpBody = try? JSONSerialization.data(withJSONObject: parameters, options: []) else { return } - request.httpBody = httpBody - let task = session.dataTask(with: request) { (data, response, error) in - if let error = error { - errorHandler?(error) - session.finishTasksAndInvalidate() - return - } - guard let data = data else { return } - guard let statusCode = (response as? HTTPURLResponse)?.statusCode else { return } - successHandler?(data, statusCode) - session.finishTasksAndInvalidate() - } - task.resume() - } - - static func upload(_ urlPath: String, data: Data, succesHandler: ((Data, Int) -> Void)?, errorHandler: ((Error) -> Void)?) { - let session = URLSession(configuration: .default) - guard let url = URL(string: urlPath) else { return } - var request = URLRequest(url: url) - request.httpMethod = "POST" - request.setValue("application/json", forHTTPHeaderField: "Content-Type") - let task = session.uploadTask(with: request, from: data) { (data, response, error) in - if let error = error { - errorHandler?(error) - session.finishTasksAndInvalidate() - return - } - guard let data = data else { return } - guard let statusCode = (response as? HTTPURLResponse)?.statusCode else { return } - succesHandler?(data, statusCode) - session.finishTasksAndInvalidate() - } - task.resume() - } -} diff --git a/RespectU/Performance/History/HistoryCell.swift b/RespectU/Performance/History/HistoryCell.swift deleted file mode 100644 index 8e9ba7b..0000000 --- a/RespectU/Performance/History/HistoryCell.swift +++ /dev/null @@ -1,17 +0,0 @@ -// -// HistoryCell.swift -// RespectU -// -// Created by Presto on 16/10/2018. -// Copyright © 2018 Presto. All rights reserved. -// - -import UIKit - -class HistoryCell: UITableViewCell { - - override func awakeFromNib() { - super.awakeFromNib() - // Initialization code - } -} diff --git a/RespectU/Performance/History/HistoryCell.xib b/RespectU/Performance/History/HistoryCell.xib deleted file mode 100644 index b253ae0..0000000 --- a/RespectU/Performance/History/HistoryCell.xib +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/RespectU/Performance/Main/PerformanceViewController.swift b/RespectU/Performance/Main/PerformanceViewController.swift deleted file mode 100644 index 298d5ed..0000000 --- a/RespectU/Performance/Main/PerformanceViewController.swift +++ /dev/null @@ -1,248 +0,0 @@ -// -// PerformanceViewController.swift -// RespectU -// -// Created by Presto on 2018. 3. 1.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import UIKit -import RealmSwift -import StoreKit -import SwiftKeychainWrapper - -class PerformanceViewController: UIViewController { - - @IBOutlet weak var tableView: UITableView! - @IBOutlet weak var recordButton: UIButton! - @IBOutlet weak var nicknameButton: UIButton! - var favoriteButton = UserDefaults.standard.string(forKey: "favoriteButton") ?? Buttons.button4 - - override func viewDidLoad() { - super.viewDidLoad() - recordButton.layer.cornerRadius = recordButton.bounds.height / 2 - recordButton.layer.borderWidth = 1 - recordButton.layer.borderColor = UIColor.main.cgColor - tableView.register(UINib(nibName: "SkillLevelCell", bundle: nil), forCellReuseIdentifier: "skillLevelCell") - tableView.register(UINib(nibName: "SummaryCell", bundle: nil), forCellReuseIdentifier: "summaryCell") - self.navigationController?.interactivePopGestureRecognizer?.isEnabled = false - API.requestVersions(completion: didReceiveVersions) - } - - override func viewWillAppear(_ animated: Bool) { - super.viewWillAppear(true) - setup() - } - - override func viewDidAppear(_ animated: Bool) { - super.viewDidAppear(animated) - presentRateView() - } - - func setup() { - recordButton.setTitle("Performance Record".localized, for: .normal) - self.favoriteButton = UserDefaults.standard.string(forKey: "favoriteButton") ?? Buttons.button4 - self.nicknameButton.setTitle(UserDefaults.standard.string(forKey: "nickname") ?? "Nickname Setting".localized, for: []) - self.tableView.reloadData() - } - - @IBAction func didTouchUpNicknameButton(_ sender: UIButton) { - let id = KeychainWrapper.standard.string(forKey: "id") ?? "" - if id.isEmpty { - UIAlertController - .alert(title: "", message: "Log In First.".localized) - .action(title: "OK".localized) - .present(to: self) - return - } - let alert = UIAlertController.alert(title: "Nickname Setting".localized, message: "Enter your nickname.".localized) - alert.textField { textField in - textField.placeholder = "Nickname".localized - } - .action(title: "OK".localized) { [unowned self] _ in - if let input = alert.textFields?.first?.text { - if !input.isEmpty { - API.uploadNickname(id: id, nickname: input, completion: self.didReceiveUploadNickname) - let nickname = input.trimmingCharacters(in: .whitespaces) - UserDefaults.standard.set(nickname, forKey: "nickname") - UserDefaults.standard.synchronize() - self.nicknameButton.setTitle(nickname, for: .normal) - } - } - } - .action(.cancel, title: "Cancel".localized) - .present(to: self) - } - - @IBAction func didTouchUpNextButton(_ sender: UIButton) { - guard let controller = UIViewController.instantiate(storyboard: "Guide", identifier: GuideViewController.classNameToString) as? GuideViewController else { return } - self.navigationController?.pushViewController(controller, animated: true) - } - - @IBAction func didTouchUpRecordButton(_ sender: UIButton) { - guard let controller = UIViewController.instantiate(storyboard: "Record", identifier: RecordViewController.classNameToString) as? RecordViewController else { return } - self.present(controller, animated: true) - } -} - -// MARK: - Version -private extension PerformanceViewController { - func didReceiveVersions(response: VersionResponse?, error: Error?) { - if let error = error { - UIAlertController.presentErrorAlert(to: self, error: error.localizedDescription) - return - } - guard let response = response else { return } - guard let versionInfo = VersionInfo.fetch().first else { return } - if version != response.clientVersion { - DispatchQueue.main.async { - UIAlertController - .alert(title: "", message: "New version released!\nPlease use it after updating.".localized) - .action(title: "Update".localized, handler: { _ in - guard let url = URL(string: "itms-apps://itunes.apple.com/app/id1291664067") else { return } - guard #available(iOS 10, *) else { - UIApplication.shared.openURL(url) - return - } - UIApplication.shared.open(url, options: [:]) - }) - .action(.cancel, title: "Cancel".localized) - .present(to: self) - } - } else if response.serverVersion != versionInfo.serverVersion { - DispatchQueue.main.async { - UIAlertController - .alert(title: "", message: "There is new data.\nGo to \"Downloading from the server\" and update to the latest data.".localized) - .action(title: "OK".localized, handler: { [weak self] _ in - NotificationCenter.default.removeObserver(self as Any) - guard let controller = UIViewController.instantiate(storyboard: "Download", identifier: DownloadViewController.classNameToString) else { return } - self?.present(controller, animated: true, completion: { - }) - }) - .action(.cancel, title: "Cancel".localized) - .present(to: self) - } - } - } -} -// MARK: - Nickname -private extension PerformanceViewController { - func didReceiveUploadNickname(statusCode: Int?, error: Error?) { - if let error = error { - UIAlertController.presentErrorAlert(to: self, error: error.localizedDescription) - return - } - guard let statusCode = statusCode else { return } - if (200...299).contains(statusCode) { - DispatchQueue.main.async { - UIAlertController - .alert(title: "", message: "Succeeded to change nickname".localized) - .action(title: "OK".localized) - .present(to: self) - } - } else { - DispatchQueue.main.async { - UIAlertController - .alert(title: "", message: "Failed to change nickname".localized) - .action(title: "OK".localized) - .present(to: self) - } - } - } -} - -extension PerformanceViewController: UITableViewDataSource { - func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { - switch indexPath.section { - case 0: - guard let cell = tableView.dequeueReusableCell(withIdentifier: "skillLevelCell", for: indexPath) as? SkillLevelCell else { return UITableViewCell() } - cell.delegate = self - cell.selectionStyle = .none - cell.setProperties(favoriteButton, max: Skill.maxSkillPoint(button: favoriteButton), myRecord: Skill.mySkillPointAndHighestSeries(button: favoriteButton)) - return cell - case 1: - guard let cell = tableView.dequeueReusableCell(withIdentifier: "summaryCell", for: indexPath) as? SummaryCell else { return UITableViewCell() } - cell.delegate = self - cell.selectionStyle = .none - cell.collectionView.dataSource = self - cell.collectionView.register(UINib(nibName: "SummaryCollectionCell", bundle: nil), forCellWithReuseIdentifier: "summaryCollectionCell") - return cell - default: - return UITableViewCell() - } - } - - func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - return 1 - } - - func numberOfSections(in tableView: UITableView) -> Int { - return 2 - } -} - -extension PerformanceViewController: UITableViewDelegate { - func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { - tableView.deselectRow(at: indexPath, animated: true) - } - - func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { - return UITableViewAutomaticDimension - } - - func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { - return 30 - } - - func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat { - return .leastNormalMagnitude - } -} - -extension PerformanceViewController: UICollectionViewDataSource { - func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { - guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "summaryCollectionCell", for: indexPath) as? SummaryCollectionCell else { return UICollectionViewCell() } - cell.setProperties(NewRecordInfo.fetch(), at: indexPath.item) - return cell - } - - func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { - return 7 - } -} - -extension PerformanceViewController: SkillLevelCellDelegate { - func didTouchUpMoreButton(_ sender: UIButton) { - guard let controller = UIViewController.instantiate(storyboard: "Performance", identifier: SkillLevelDetailViewController.classNameToString) as? SkillLevelDetailViewController else { return } - self.present(controller, animated: true) - } - - func didTouchUpTop50Button(_ sender: UIButton) { - guard let controller = UIViewController.instantiate(storyboard: "Top50", identifier: Top50ViewController.classNameToString) as? Top50ViewController else { return } - self.present(controller, animated: true) - } -} - -extension PerformanceViewController: SummaryCellDelegate { - func didTouchUpDetailButton(_ sender: UIButton) { - guard let controller = UIViewController.instantiate(storyboard: "Performance", identifier: SummaryDetailViewController.classNameToString) as? SummaryDetailViewController else { return } - self.present(controller, animated: true) - } - - func didTouchUpSearchButton(_ sender: UIButton) { - guard let controller = UIViewController.instantiate(storyboard: "Performance", identifier: SearchRecordViewController.classNameToString) as? SearchRecordViewController else { return } - self.present(controller, animated: true) - } -} - -extension PerformanceViewController { - private func presentRateView() { - if #available(iOS 10.3, *) { - let appOpenCount = UserDefaults.standard.integer(forKey: "appOpenCount") - UserDefaults.standard.set(appOpenCount + 1, forKey: "appOpenCount") - if UserDefaults.standard.integer(forKey: "appOpenCount") % 10 == 0 { - SKStoreReviewController.requestReview() - } - } - } -} diff --git a/RespectU/Performance/Main/SkillLevelDetail/SkillLevelDetailView.swift b/RespectU/Performance/Main/SkillLevelDetail/SkillLevelDetailView.swift deleted file mode 100644 index 6d7fe7f..0000000 --- a/RespectU/Performance/Main/SkillLevelDetail/SkillLevelDetailView.swift +++ /dev/null @@ -1,54 +0,0 @@ -// -// SkillDetailView.swift -// RespectU -// -// Created by Presto on 2018. 3. 5.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import UIKit -import GaugeKit - -class SkillLevelDetailView: UIView { - - @IBOutlet weak var buttonLabel: UILabel! - @IBOutlet var gauge: Gauge! - @IBOutlet weak var skillLevelLabel: UILabel! - @IBOutlet weak var skillPointLabel: UILabel! - @IBOutlet weak var percentLabel: UILabel! - @IBOutlet weak var recordRateLabel: UILabel! - - override func awakeFromNib() { - super.awakeFromNib() - layer.borderColor = UIColor.lightGray.cgColor - layer.borderWidth = 1 - layer.cornerRadius = 15 - } - - func setProperties(button: String) { - let recordRate = Skill.recordRate(button: button) - let maxSkillPoint = Skill.maxSkillPoint(button: button) - let mySkillPoint = Skill.mySkillPointAndHighestSeries(button: button) - let sum = mySkillPoint.sum - let skillLevel: String? - switch button { - case Buttons.button4: - skillLevel = Skill.button4SkillLevel(sum) - case Buttons.button5: - skillLevel = Skill.button5SkillLevel(sum) - case Buttons.button6, Buttons.button8: - skillLevel = Skill.button6And8SkillLevel(sum) - default: - skillLevel = nil - } - buttonLabel.text = button.uppercased() - skillLevelLabel.text = skillLevel - skillPointLabel.text = "\((sum * 100).rounded() / 100) " + "Point".localized - gauge.maxValue = CGFloat(maxSkillPoint) - gauge.startColor = mySkillPoint.highestSeries.seriesColor ?? .clear - gauge.bgColor = self.gauge.startColor - percentLabel.text = String(format: "%05.2f%%", sum * 100 / maxSkillPoint) - recordRateLabel.text = String(format: "%04.1f%%", recordRate * 100) + " Recorded".localized - gauge.animateRate(1, newValue: CGFloat(sum)) { _ in } - } -} diff --git a/RespectU/Performance/Main/SkillLevelDetail/SkillLevelDetailViewController.swift b/RespectU/Performance/Main/SkillLevelDetail/SkillLevelDetailViewController.swift deleted file mode 100644 index 7cddaa5..0000000 --- a/RespectU/Performance/Main/SkillLevelDetail/SkillLevelDetailViewController.swift +++ /dev/null @@ -1,51 +0,0 @@ -// -// SkillLevelDetailViewController.swift -// RespectU -// -// Created by Presto on 2018. 3. 5.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import UIKit -import RealmSwift - -class SkillLevelDetailViewController: UIViewController { - - @IBOutlet weak var button4BackgroundView: UIView! - @IBOutlet weak var button5BackgroundView: UIView! - @IBOutlet weak var button6BackgroundView: UIView! - @IBOutlet weak var button8BackgroundView: UIView! - private let skillLevelDetailView = "SkillLevelDetailView" - - override func viewDidLoad() { - super.viewDidLoad() - guard let button4View = UIView.instantiateFromXib(xibName: skillLevelDetailView) as? SkillLevelDetailView else { return } - guard let button5View = UIView.instantiateFromXib(xibName: skillLevelDetailView) as? SkillLevelDetailView else { return } - guard let button6View = UIView.instantiateFromXib(xibName: skillLevelDetailView) as? SkillLevelDetailView else { return } - guard let button8View = UIView.instantiateFromXib(xibName: skillLevelDetailView) as? SkillLevelDetailView else { return } - let recordViews = [button4View, button5View, button6View, button8View] - let backgroundViews = [button4BackgroundView!, button5BackgroundView!, button6BackgroundView!, button8BackgroundView!] - let buttons = [Buttons.button4, Buttons.button5, Buttons.button6, Buttons.button8] - for index in 0.. $1.button4 } - DispatchQueue.main.async { [weak self] in - self?.tableView.reloadData() - self?.hideIndicator() - } - } - } -} - -extension Ranking4BTableViewController { - override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { - guard let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier) as? RankingCell else { return UITableViewCell() } - cell.setProperties(results, at: indexPath.row, button: Buttons.button4) - return cell - } -} - -extension Ranking4BTableViewController: IndicatorInfoProvider { - func indicatorInfo(for pagerTabStripController: PagerTabStripViewController) -> IndicatorInfo { - return IndicatorInfo(title: Buttons.button4.uppercased()) - } -} diff --git a/RespectU/Performance/SkillLevel/Ranking/Controller/Ranking5BTableViewController.swift b/RespectU/Performance/SkillLevel/Ranking/Controller/Ranking5BTableViewController.swift deleted file mode 100644 index 0b1db17..0000000 --- a/RespectU/Performance/SkillLevel/Ranking/Controller/Ranking5BTableViewController.swift +++ /dev/null @@ -1,44 +0,0 @@ -// -// Ranking5BTableViewController.swift -// RespectU -// -// Created by Presto on 2018. 3. 4.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import UIKit -import XLPagerTabStrip - -class Ranking5BTableViewController: RankingBaseTableViewController { - - override func viewDidLoad() { - super.viewDidLoad() - showIndicator() - API.requestRankings { response, error in - if let error = error { - UIAlertController.presentErrorAlert(to: self, error: error.localizedDescription) - return - } - guard let response = response else { return } - self.results = response.rankings.sorted { $0.button5 > $1.button5 } - DispatchQueue.main.async { [weak self] in - self?.tableView.reloadData() - self?.hideIndicator() - } - } - } -} - -extension Ranking5BTableViewController { - override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { - guard let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier) as? RankingCell else { return UITableViewCell() } - cell.setProperties(results, at: indexPath.row, button: Buttons.button5) - return cell - } -} - -extension Ranking5BTableViewController: IndicatorInfoProvider { - func indicatorInfo(for pagerTabStripController: PagerTabStripViewController) -> IndicatorInfo { - return IndicatorInfo(title: Buttons.button5.uppercased()) - } -} diff --git a/RespectU/Performance/SkillLevel/Ranking/Controller/Ranking6BTableViewController.swift b/RespectU/Performance/SkillLevel/Ranking/Controller/Ranking6BTableViewController.swift deleted file mode 100644 index dcf1de1..0000000 --- a/RespectU/Performance/SkillLevel/Ranking/Controller/Ranking6BTableViewController.swift +++ /dev/null @@ -1,44 +0,0 @@ -// -// Ranking6BTableViewController.swift -// RespectU -// -// Created by Presto on 2018. 3. 4.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import UIKit -import XLPagerTabStrip - -class Ranking6BTableViewController: RankingBaseTableViewController { - - override func viewDidLoad() { - super.viewDidLoad() - showIndicator() - API.requestRankings { response, error in - if let error = error { - UIAlertController.presentErrorAlert(to: self, error: error.localizedDescription) - return - } - guard let response = response else { return } - self.results = response.rankings.sorted { $0.button6 > $1.button6 } - DispatchQueue.main.async { [weak self] in - self?.tableView.reloadData() - self?.hideIndicator() - } - } - } -} - -extension Ranking6BTableViewController { - override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { - guard let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier) as? RankingCell else { return UITableViewCell() } - cell.setProperties(results, at: indexPath.row, button: Buttons.button6) - return cell - } -} - -extension Ranking6BTableViewController: IndicatorInfoProvider { - func indicatorInfo(for pagerTabStripController: PagerTabStripViewController) -> IndicatorInfo { - return IndicatorInfo(title: Buttons.button6.uppercased()) - } -} diff --git a/RespectU/Performance/SkillLevel/Ranking/Controller/Ranking8BTableViewController.swift b/RespectU/Performance/SkillLevel/Ranking/Controller/Ranking8BTableViewController.swift deleted file mode 100644 index c70c3b8..0000000 --- a/RespectU/Performance/SkillLevel/Ranking/Controller/Ranking8BTableViewController.swift +++ /dev/null @@ -1,44 +0,0 @@ -// -// Ranking8BTableViewController.swift -// RespectU -// -// Created by Presto on 2018. 3. 4.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import UIKit -import XLPagerTabStrip - -class Ranking8BTableViewController: RankingBaseTableViewController { - - override func viewDidLoad() { - super.viewDidLoad() - showIndicator() - API.requestRankings { response, error in - if let error = error { - UIAlertController.presentErrorAlert(to: self, error: error.localizedDescription) - return - } - guard let response = response else { return } - self.results = response.rankings.sorted { $0.button8 > $1.button8 } - DispatchQueue.main.async { [weak self] in - self?.tableView.reloadData() - self?.hideIndicator() - } - } - } -} - -extension Ranking8BTableViewController { - override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { - guard let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier) as? RankingCell else { return UITableViewCell() } - cell.setProperties(results, at: indexPath.row, button: Buttons.button8) - return cell - } -} - -extension Ranking8BTableViewController: IndicatorInfoProvider { - func indicatorInfo(for pagerTabStripController: PagerTabStripViewController) -> IndicatorInfo { - return IndicatorInfo(title: Buttons.button8.uppercased()) - } -} diff --git a/RespectU/Performance/SkillLevel/Ranking/Controller/RankingBaseTableViewController.swift b/RespectU/Performance/SkillLevel/Ranking/Controller/RankingBaseTableViewController.swift deleted file mode 100644 index ccac751..0000000 --- a/RespectU/Performance/SkillLevel/Ranking/Controller/RankingBaseTableViewController.swift +++ /dev/null @@ -1,31 +0,0 @@ -// -// RankingBaseTableViewController.swift -// RespectU -// -// Created by Presto on 2018. 8. 3.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import UIKit -import RealmSwift - -class RankingBaseTableViewController: UITableViewController { - - let nickname = UserDefaults.standard.string(forKey: "nickname") ?? "" - let cellIdentifier = "rankingCell" - var results: [RankingResponse.Ranking] = [] - - override func viewDidLoad() { - super.viewDidLoad() - tableView.showsVerticalScrollIndicator = false - tableView.separatorStyle = .none - tableView.rowHeight = 40 - tableView.register(UINib(nibName: "RankingCell", bundle: nil), forCellReuseIdentifier: cellIdentifier) - } -} - -extension RankingBaseTableViewController { - override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - return results.count - } -} diff --git a/RespectU/Performance/SkillLevel/Ranking/Controller/RankingViewController.swift b/RespectU/Performance/SkillLevel/Ranking/Controller/RankingViewController.swift deleted file mode 100644 index e75d7a8..0000000 --- a/RespectU/Performance/SkillLevel/Ranking/Controller/RankingViewController.swift +++ /dev/null @@ -1,33 +0,0 @@ -// -// RankingViewController.swift -// RespectU -// -// Created by Presto on 2018. 3. 4.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import UIKit -import XLPagerTabStrip - -class RankingViewController: BaseViewController { - - private lazy var button4TableViewController = Ranking4BTableViewController() - private lazy var button5TableViewController = Ranking5BTableViewController() - private lazy var button6TableViewController = Ranking6BTableViewController() - private lazy var button8TableViewController = Ranking8BTableViewController() - private lazy var rankingViewControllers: [RankingBaseTableViewController] = { - return [button4TableViewController, button5TableViewController, button6TableViewController, button8TableViewController] - }() - - override func viewDidLoad() { - super.viewDidLoad() - } - - override func viewControllers(for pagerTabStripController: PagerTabStripViewController) -> [UIViewController] { - return rankingViewControllers - } - - @IBAction func touchUpCancelButton(_ sender: UIButton) { - self.dismiss(animated: true, completion: nil) - } -} diff --git a/RespectU/Performance/SkillLevel/Ranking/View/RankingCell.swift b/RespectU/Performance/SkillLevel/Ranking/View/RankingCell.swift deleted file mode 100644 index ec3c062..0000000 --- a/RespectU/Performance/SkillLevel/Ranking/View/RankingCell.swift +++ /dev/null @@ -1,37 +0,0 @@ -// -// RankingCell.swift -// RespectU -// -// Created by Presto on 2018. 3. 4.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import UIKit - -class RankingCell: UITableViewCell { - - @IBOutlet weak var rankingLabel: UILabel! - @IBOutlet weak var nicknameLabel: UILabel! - @IBOutlet weak var valueLabel: UILabel! - - override func awakeFromNib() { - super.awakeFromNib() - } - - func setProperties(_ object: [RankingResponse.Ranking], at row: Int, button: String) { - rankingLabel.text = "\(row + 1)" - nicknameLabel.text = object[row].nickname - switch button { - case Buttons.button4: - valueLabel.text = String(format: "%4.2f", object[row].button4) - case Buttons.button5: - valueLabel.text = String(format: "%4.2f", object[row].button5) - case Buttons.button6: - valueLabel.text = String(format: "%4.2f", object[row].button6) - case Buttons.button8: - valueLabel.text = String(format: "%4.2f", object[row].button8) - default: - break - } - } -} diff --git a/RespectU/Performance/SkillLevel/SkillLevelCell.swift b/RespectU/Performance/SkillLevel/SkillLevelCell.swift deleted file mode 100644 index 6c875c3..0000000 --- a/RespectU/Performance/SkillLevel/SkillLevelCell.swift +++ /dev/null @@ -1,80 +0,0 @@ -// -// SkillPointCell.swift -// RespectU -// -// Created by Presto on 2018. 3. 4.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import UIKit -import GaugeKit -import RealmSwift - -protocol SkillLevelCellDelegate: class { - func didTouchUpTop50Button(_ sender: UIButton) - func didTouchUpMoreButton(_ sender: UIButton) -} - -class SkillLevelCell: UITableViewCell { - - weak var delegate: SkillLevelCellDelegate? - - @IBOutlet weak var view: UIView! - @IBOutlet var gauge: Gauge! - @IBOutlet weak var titleLabel: UILabel! - @IBOutlet weak var skillLevelLabel: UILabel! - @IBOutlet weak var skillPointLabel: UILabel! - @IBOutlet weak var top50Button: UIButton! - @IBOutlet weak var moreButton: UIButton! - @IBOutlet weak var percentLabel: UILabel! - @IBOutlet weak var nextLevelLabel: UILabel! - - override func awakeFromNib() { - super.awakeFromNib() - titleLabel.text = "My Record".localized - view.layer.cornerRadius = 15 - view.layer.borderWidth = 1 - view.layer.borderColor = UIColor.lightGray.cgColor - view.layer.masksToBounds = true - moreButton.setTitle("More".localized, for: []) - top50Button.addTarget(self, action: #selector(didTouchUpTop50Button(_:)), for: .touchUpInside) - moreButton.addTarget(self, action: #selector(didTouchUpMoreButton(_:)), for: .touchUpInside) - } - - override func setSelected(_ selected: Bool, animated: Bool) { - super.setSelected(selected, animated: animated) - } - - func setProperties(_ button: String, max: Double, myRecord: (sum: Double, highestSeries: String)) { - let mySkillPointSum = myRecord.sum - let myHighestSeries = myRecord.highestSeries - let seriesColor = myHighestSeries.seriesColor ?? .clear - gauge.maxValue = CGFloat(max) - gauge.rate = CGFloat(mySkillPointSum) - gauge.startColor = seriesColor - gauge.bgColor = seriesColor - skillPointLabel.text = "\((mySkillPointSum * 100).rounded() / 100) " + "Point".localized - skillLevelLabel.text = { - switch button { - case Buttons.button4: - return Skill.button4SkillLevel(mySkillPointSum) - case Buttons.button5: - return Skill.button5SkillLevel(mySkillPointSum) - case Buttons.button6, Buttons.button8: - return Skill.button6And8SkillLevel(mySkillPointSum) - default: - return nil - } - }() - nextLevelLabel.text = Skill.nextSkillLevel(of: self.skillLevelLabel.text ?? "", button: button) - percentLabel.text = String(format: "%05.2f%%", mySkillPointSum * 100 / max) - } - - @objc func didTouchUpTop50Button(_ sender: UIButton) { - delegate?.didTouchUpTop50Button(sender) - } - - @objc func didTouchUpMoreButton(_ sender: UIButton) { - delegate?.didTouchUpMoreButton(sender) - } -} diff --git a/RespectU/Performance/SkillLevel/Top50/Controller/Top504BTableViewController.swift b/RespectU/Performance/SkillLevel/Top50/Controller/Top504BTableViewController.swift deleted file mode 100644 index a8b0536..0000000 --- a/RespectU/Performance/SkillLevel/Top50/Controller/Top504BTableViewController.swift +++ /dev/null @@ -1,31 +0,0 @@ -// -// Top504BTableViewController.swift -// RespectU -// -// Created by Presto on 2018. 3. 4.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import UIKit -import XLPagerTabStrip - -class Top504BTableViewController: Top50BaseTableViewController { - - override func viewDidLoad() { - super.viewDidLoad() - results = tempResults.sorted { $0.button4?.skillPoint ?? 0 > $1.button4?.skillPoint ?? 0 } - } - - override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { - guard let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier) as? Top50Cell else { return UITableViewCell() } - let object = results[indexPath.row] - cell.setProperties(object, button: Buttons.button4) - return cell - } -} - -extension Top504BTableViewController: IndicatorInfoProvider { - func indicatorInfo(for pagerTabStripController: PagerTabStripViewController) -> IndicatorInfo { - return IndicatorInfo(title: Buttons.button4.uppercased()) - } -} diff --git a/RespectU/Performance/SkillLevel/Top50/Controller/Top505BTableViewController.swift b/RespectU/Performance/SkillLevel/Top50/Controller/Top505BTableViewController.swift deleted file mode 100644 index 9ac50cc..0000000 --- a/RespectU/Performance/SkillLevel/Top50/Controller/Top505BTableViewController.swift +++ /dev/null @@ -1,31 +0,0 @@ -// -// Top505BTableViewController.swift -// RespectU -// -// Created by Presto on 2018. 3. 4.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import UIKit -import XLPagerTabStrip - -class Top505BTableViewController: Top50BaseTableViewController { - - override func viewDidLoad() { - super.viewDidLoad() - results = tempResults.sorted { $0.button5?.skillPoint ?? 0 > $1.button5?.skillPoint ?? 0 } - } - - override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { - guard let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier) as? Top50Cell else { return UITableViewCell() } - let object = results[indexPath.row] - cell.setProperties(object, button: Buttons.button5) - return cell - } -} - -extension Top505BTableViewController: IndicatorInfoProvider { - func indicatorInfo(for pagerTabStripController: PagerTabStripViewController) -> IndicatorInfo { - return IndicatorInfo(title: Buttons.button5.uppercased()) - } -} diff --git a/RespectU/Performance/SkillLevel/Top50/Controller/Top506BTableViewController.swift b/RespectU/Performance/SkillLevel/Top50/Controller/Top506BTableViewController.swift deleted file mode 100644 index 522a471..0000000 --- a/RespectU/Performance/SkillLevel/Top50/Controller/Top506BTableViewController.swift +++ /dev/null @@ -1,31 +0,0 @@ -// -// Top506BTableViewController.swift -// RespectU -// -// Created by Presto on 2018. 3. 4.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import UIKit -import XLPagerTabStrip - -class Top506BTableViewController: Top50BaseTableViewController { - - override func viewDidLoad() { - super.viewDidLoad() - results = tempResults.sorted { $0.button6?.skillPoint ?? 0 > $1.button6?.skillPoint ?? 0 } - } - - override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { - guard let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier) as? Top50Cell else { return UITableViewCell() } - let object = results[indexPath.row] - cell.setProperties(object, button: Buttons.button6) - return cell - } -} - -extension Top506BTableViewController: IndicatorInfoProvider { - func indicatorInfo(for pagerTabStripController: PagerTabStripViewController) -> IndicatorInfo { - return IndicatorInfo(title: Buttons.button6.uppercased()) - } -} diff --git a/RespectU/Performance/SkillLevel/Top50/Controller/Top508BTableViewController.swift b/RespectU/Performance/SkillLevel/Top50/Controller/Top508BTableViewController.swift deleted file mode 100644 index 51512bb..0000000 --- a/RespectU/Performance/SkillLevel/Top50/Controller/Top508BTableViewController.swift +++ /dev/null @@ -1,31 +0,0 @@ -// -// Top508BTableViewController.swift -// RespectU -// -// Created by Presto on 2018. 3. 4.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import UIKit -import XLPagerTabStrip - -class Top508BTableViewController: Top50BaseTableViewController { - - override func viewDidLoad() { - super.viewDidLoad() - results = tempResults.sorted { $0.button8?.skillPoint ?? 0 > $1.button8?.skillPoint ?? 0 } - } - - override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { - guard let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier) as? Top50Cell else { return UITableViewCell() } - let object = results[indexPath.row] - cell.setProperties(object, button: Buttons.button8) - return cell - } -} - -extension Top508BTableViewController: IndicatorInfoProvider { - func indicatorInfo(for pagerTabStripController: PagerTabStripViewController) -> IndicatorInfo { - return IndicatorInfo(title: Buttons.button8.uppercased()) - } -} diff --git a/RespectU/Performance/SkillLevel/Top50/Controller/Top50BaseTableViewController.swift b/RespectU/Performance/SkillLevel/Top50/Controller/Top50BaseTableViewController.swift deleted file mode 100644 index fb23132..0000000 --- a/RespectU/Performance/SkillLevel/Top50/Controller/Top50BaseTableViewController.swift +++ /dev/null @@ -1,30 +0,0 @@ -// -// Top50BaseTableViewController.swift -// RespectU -// -// Created by Presto on 2018. 8. 3.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import UIKit -import RealmSwift - -class Top50BaseTableViewController: UITableViewController { - - var tempResults: Results! - var results: [NewRecordInfo]! - let cellIdentifier = "top50Cell" - - override func viewDidLoad() { - super.viewDidLoad() - tempResults = NewRecordInfo.fetch() - tableView.showsVerticalScrollIndicator = false - tableView.separatorStyle = .none - tableView.rowHeight = 60 - tableView.register(UINib(nibName: "Top50Cell", bundle: nil), forCellReuseIdentifier: cellIdentifier) - } - - override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - return 50 - } -} diff --git a/RespectU/Performance/SkillLevel/Top50/Controller/Top50ViewController.swift b/RespectU/Performance/SkillLevel/Top50/Controller/Top50ViewController.swift deleted file mode 100644 index f8127cd..0000000 --- a/RespectU/Performance/SkillLevel/Top50/Controller/Top50ViewController.swift +++ /dev/null @@ -1,33 +0,0 @@ -// -// Top50ViewController.swift -// RespectU -// -// Created by Presto on 2018. 3. 4.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import UIKit -import XLPagerTabStrip - -class Top50ViewController: BaseViewController { - - lazy var button4TableViewController = Top504BTableViewController() - lazy var button5TableViewController = Top505BTableViewController() - lazy var button6TableViewController = Top506BTableViewController() - lazy var button8TableViewController = Top508BTableViewController() - lazy var top50ViewControllers: [Top50BaseTableViewController] = { - return [button4TableViewController, button5TableViewController, button6TableViewController, button8TableViewController] - }() - - override func viewDidLoad() { - super.viewDidLoad() - } - - override func viewControllers(for pagerTabStripController: PagerTabStripViewController) -> [UIViewController] { - return top50ViewControllers - } - - @IBAction func touchUpCancelButton(_ sender: UIButton) { - self.dismiss(animated: true, completion: nil) - } -} diff --git a/RespectU/Performance/SkillLevel/Top50/View/Top50Cell.swift b/RespectU/Performance/SkillLevel/Top50/View/Top50Cell.swift deleted file mode 100644 index 991cfe7..0000000 --- a/RespectU/Performance/SkillLevel/Top50/View/Top50Cell.swift +++ /dev/null @@ -1,38 +0,0 @@ -// -// Top50Cell.swift -// RespectU -// -// Created by Presto on 2018. 3. 4.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import UIKit - -class Top50Cell: UITableViewCell { - - @IBOutlet weak var colorLabel: UILabel! - @IBOutlet weak var titleLabel: UILabel! - @IBOutlet weak var difficultyLabel: UILabel! - @IBOutlet weak var noteLabel: UILabel! - @IBOutlet weak var rateLabel: UILabel! - @IBOutlet weak var skillPointLabel: UILabel! - - override func awakeFromNib() { - super.awakeFromNib() - colorLabel.layer.cornerRadius = colorLabel.bounds.width / 2 - colorLabel.layer.masksToBounds = true - } - - func setProperties(_ object: NewRecordInfo, button: String) { - let gradient = object.series.seriesGradient(.vertical) ?? CAGradientLayer() - gradient.frame = colorLabel.bounds - colorLabel.layer.addSublayer(gradient) - titleLabel.text = object.localizedTitle - guard let buttonExpansion = button.buttonExpansion else { return } - guard let button = object.value(forKeyPath: buttonExpansion) as? NewRecordButtonInfo else { return } - difficultyLabel.text = button.skillPointDifficulty.isEmpty ? "-" : button.skillPointDifficulty.uppercased() - noteLabel.text = button.skillPointNote.isEmpty ? "-" : button.skillPointNote.noteExpansion - rateLabel.text = button.skillPointRate == 0 ? "-" : "\(button.skillPointRate)%" - skillPointLabel.text = String(format: "%05.2f", button.skillPoint) - } -} diff --git a/RespectU/Performance/Summary/SearchRecord/Controller/SearchRecordDetailViewController.swift b/RespectU/Performance/Summary/SearchRecord/Controller/SearchRecordDetailViewController.swift deleted file mode 100644 index 5e3d3df..0000000 --- a/RespectU/Performance/Summary/SearchRecord/Controller/SearchRecordDetailViewController.swift +++ /dev/null @@ -1,422 +0,0 @@ -// -// SearchRecordDetailViewController.swift -// RespectU -// -// Created by Presto on 2018. 3. 19.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import UIKit -import RealmSwift -import DZNEmptyDataSet - -struct SearchRecordDetail { - let series: String - let title: String - let difficulty: String - let rate: Double -} - -class SearchRecordDetailViewController: UIViewController { - - var results: [SearchRecordDetail] = [] - var executesFirst = false - var methodIndex: Int = 0 - var buttonIndex: Int = 0 - var levelIndex: Int = 0 - var lowerRange: Double = 0 - var upperRange: Double = 0 - var noteDetailIndex: Int = 0 - @IBOutlet weak var resultsLabel: UILabel! - @IBOutlet weak var tableView: UITableView! - - override func viewDidLoad() { - super.viewDidLoad() - tableView.rowHeight = 40 - tableView.separatorColor = .main - tableView.layer.borderColor = UIColor.lightGray.cgColor - tableView.layer.borderWidth = 1 - tableView.layer.cornerRadius = 15 - tableView.register(UINib(nibName: "SearchRecordDetailCell", bundle: nil), forCellReuseIdentifier: "searchRecordDetailCell") - let recordResults = NewRecordInfo.fetch() - switch buttonIndex { - case 0: - switch methodIndex { - case 0: - let songResults = SongInfo.fetch() - let level = levelIndex + 1 - let predicate = NSPredicate(format: "%K = %d OR %K = %d OR %K = %d", #keyPath(SongInfo.button4.normal), level, #keyPath(SongInfo.button4.hard), level, #keyPath(SongInfo.button4.maximum), level) - let filtered = songResults.filter(predicate) - for result in filtered { - guard let record = recordResults.filter(NSPredicate(format: "%K == %@", #keyPath(NewRecordInfo.title.english), result.title?.english ?? "")).first else { return } - if result.button4?.normal == level { - let object = SearchRecordDetail(series: record.series, title: record.localizedTitle, difficulty: Difficulty.normal, rate: record.button4?.normal?.rate ?? 0) - self.results.append(object) - - } - if result.button4?.hard == level { - let object = SearchRecordDetail(series: record.series, title: record.localizedTitle, difficulty: Difficulty.hard, rate: record.button4?.hard?.rate ?? 0) - self.results.append(object) - } - if result.button4?.maximum == level { - let object = SearchRecordDetail(series: record.series, title: record.localizedTitle, difficulty: Difficulty.maximum, rate: record.button4?.maximum?.rate ?? 0) - self.results.append(object) - } - } - case 1: - let range = lowerRange...upperRange - let predicate = NSPredicate(format: "%K BETWEEN {\(lowerRange), \(upperRange)} OR %K BETWEEN {\(lowerRange), \(upperRange)} OR %K BETWEEN {\(lowerRange), \(upperRange)}", #keyPath(NewRecordInfo.button4.normal.rate), #keyPath(NewRecordInfo.button4.hard.rate), #keyPath(NewRecordInfo.button4.maximum.rate)) - let filtered = recordResults.filter(predicate) - for result in filtered { - if range.contains(result.button4?.normal?.rate ?? 0) { - let object = SearchRecordDetail(series: result.series, title: result.localizedTitle, difficulty: Difficulty.normal, rate: result.button4?.normal?.rate ?? 0) - self.results.append(object) - } - if range.contains(result.button4?.hard?.rate ?? 0) { - let object = SearchRecordDetail(series: result.series, title: result.localizedTitle, difficulty: Difficulty.hard, rate: result.button4?.hard?.rate ?? 0) - self.results.append(object) - } - if range.contains(result.button4?.maximum?.rate ?? 0) { - let object = SearchRecordDetail(series: result.series, title: result.localizedTitle, difficulty: Difficulty.maximum, rate: result.button4?.maximum?.rate ?? 0) - self.results.append(object) - } - } - case 2: - if noteDetailIndex == 0 { - let predicate = NSPredicate(format: "%K == %@ AND %K != %@ OR %K == %@ AND %K != %@ OR %K == %@ AND %K != %@", #keyPath(NewRecordInfo.button4.normal.note), "", #keyPath(NewRecordInfo.button4.normal.rank), "", #keyPath(NewRecordInfo.button4.hard.note), "", #keyPath(NewRecordInfo.button4.hard.rank), "", #keyPath(NewRecordInfo.button4.maximum.note), "", #keyPath(NewRecordInfo.button4.maximum.rank), "") - let filtered = recordResults.filter(predicate) - for result in filtered { - if result.button4?.normal?.note.isEmpty ?? false { - let object = SearchRecordDetail(series: result.series, title: result.localizedTitle, difficulty: Difficulty.normal, rate: result.button4?.normal?.rate ?? 0) - self.results.append(object) - } - if result.button4?.hard?.note.isEmpty ?? false { - let object = SearchRecordDetail(series: result.series, title: result.localizedTitle, difficulty: Difficulty.hard, rate: result.button4?.hard?.rate ?? 0) - self.results.append(object) - } - if result.button4?.maximum?.note.isEmpty ?? false { - let object = SearchRecordDetail(series: result.series, title: result.localizedTitle, difficulty: Difficulty.maximum, rate: result.button4?.maximum?.rate ?? 0) - self.results.append(object) - } - } - } else { - let predicate = NSPredicate(format: "%K == %@ OR %K == %@ OR %K == %@", #keyPath(NewRecordInfo.button4.normal.note), Note.perfectPlay, #keyPath(NewRecordInfo.button4.hard.note), Note.perfectPlay, #keyPath(NewRecordInfo.button4.maximum.note), Note.perfectPlay) - let filtered = recordResults.filter(predicate) - for result in filtered { - if result.button4?.normal?.note == Note.perfectPlay { - let object = SearchRecordDetail(series: result.series, title: result.localizedTitle, difficulty: Difficulty.normal, rate: result.button4?.normal?.rate ?? 0) - self.results.append(object) - } - if result.button4?.hard?.note == Note.perfectPlay { - let object = SearchRecordDetail(series: result.series, title: result.localizedTitle, difficulty: Difficulty.hard, rate: result.button4?.hard?.rate ?? 0) - self.results.append(object) - } - if result.button4?.maximum?.note == Note.perfectPlay { - let object = SearchRecordDetail(series: result.series, title: result.localizedTitle, difficulty: Difficulty.maximum, rate: result.button4?.maximum?.rate ?? 0) - self.results.append(object) - } - } - } - default: - break - } - case 1: - switch methodIndex { - case 0: - let songResults = SongInfo.fetch() - let level = levelIndex + 1 - let predicate = NSPredicate(format: "%K = %d OR %K = %d OR %K = %d", #keyPath(SongInfo.button5.normal), level, #keyPath(SongInfo.button5.hard), level, #keyPath(SongInfo.button5.maximum), level) - let filtered = songResults.filter(predicate) - for result in filtered { - guard let record = recordResults.filter(NSPredicate(format: "%K == %@", #keyPath(NewRecordInfo.title.english), result.title?.english ?? "")).first else { return } - if result.button5?.normal == level { - let object = SearchRecordDetail(series: record.series, title: record.localizedTitle, difficulty: Difficulty.normal, rate: record.button5?.normal?.rate ?? 0) - self.results.append(object) - - } - if result.button5?.hard == level { - let object = SearchRecordDetail(series: record.series, title: record.localizedTitle, difficulty: Difficulty.hard, rate: record.button5?.hard?.rate ?? 0) - self.results.append(object) - } - if result.button5?.maximum == level { - let object = SearchRecordDetail(series: record.series, title: record.localizedTitle, difficulty: Difficulty.maximum, rate: record.button5?.maximum?.rate ?? 0) - self.results.append(object) - } - } - case 1: - let range = lowerRange...upperRange - let predicate = NSPredicate(format: "%K BETWEEN {\(lowerRange), \(upperRange)} OR %K BETWEEN {\(lowerRange), \(upperRange)} OR %K BETWEEN {\(lowerRange), \(upperRange)}", #keyPath(NewRecordInfo.button5.normal.rate), #keyPath(NewRecordInfo.button5.hard.rate), #keyPath(NewRecordInfo.button5.maximum.rate)) - let filtered = recordResults.filter(predicate) - for result in filtered { - if range.contains(result.button5?.normal?.rate ?? 0) { - let object = SearchRecordDetail(series: result.series, title: result.localizedTitle, difficulty: Difficulty.normal, rate: result.button5?.normal?.rate ?? 0) - self.results.append(object) - } - if range.contains(result.button5?.hard?.rate ?? 0) { - let object = SearchRecordDetail(series: result.series, title: result.localizedTitle, difficulty: Difficulty.hard, rate: result.button5?.hard?.rate ?? 0) - self.results.append(object) - } - if range.contains(result.button5?.maximum?.rate ?? 0) { - let object = SearchRecordDetail(series: result.series, title: result.localizedTitle, difficulty: Difficulty.maximum, rate: result.button5?.maximum?.rate ?? 0) - self.results.append(object) - } - } - case 2: - if noteDetailIndex == 0 { - let predicate = NSPredicate(format: "%K == %@ AND %K != %@ OR %K == %@ AND %K != %@ OR %K == %@ AND %K != %@", #keyPath(NewRecordInfo.button5.normal.note), "", #keyPath(NewRecordInfo.button5.normal.rank), "", #keyPath(NewRecordInfo.button5.hard.note), "", #keyPath(NewRecordInfo.button5.hard.rank), "", #keyPath(NewRecordInfo.button5.maximum.note), "", #keyPath(NewRecordInfo.button5.maximum.rank), "") - let filtered = recordResults.filter(predicate) - for result in filtered { - if result.button5?.normal?.note.isEmpty ?? false { - let object = SearchRecordDetail(series: result.series, title: result.localizedTitle, difficulty: Difficulty.normal, rate: result.button5?.normal?.rate ?? 0) - self.results.append(object) - } - if result.button5?.hard?.note.isEmpty ?? false { - let object = SearchRecordDetail(series: result.series, title: result.localizedTitle, difficulty: Difficulty.hard, rate: result.button5?.hard?.rate ?? 0) - self.results.append(object) - } - if result.button5?.maximum?.note.isEmpty ?? false { - let object = SearchRecordDetail(series: result.series, title: result.localizedTitle, difficulty: Difficulty.maximum, rate: result.button5?.maximum?.rate ?? 0) - self.results.append(object) - } - } - } else { - let predicate = NSPredicate(format: "%K == %@ OR %K == %@ OR %K == %@", #keyPath(NewRecordInfo.button4.normal.note), Note.perfectPlay, #keyPath(NewRecordInfo.button5.hard.note), Note.perfectPlay, #keyPath(NewRecordInfo.button4.maximum.note), Note.perfectPlay) - let filtered = recordResults.filter(predicate) - for result in filtered { - if result.button5?.normal?.note == Note.perfectPlay { - let object = SearchRecordDetail(series: result.series, title: result.localizedTitle, difficulty: Difficulty.normal, rate: result.button5?.normal?.rate ?? 0) - self.results.append(object) - } - if result.button5?.hard?.note == Note.perfectPlay { - let object = SearchRecordDetail(series: result.series, title: result.localizedTitle, difficulty: Difficulty.hard, rate: result.button5?.hard?.rate ?? 0) - self.results.append(object) - } - if result.button5?.maximum?.note == Note.perfectPlay { - let object = SearchRecordDetail(series: result.series, title: result.localizedTitle, difficulty: Difficulty.maximum, rate: result.button5?.maximum?.rate ?? 0) - self.results.append(object) - } - } - } - default: - break - } - case 2: - switch methodIndex { - case 0: - let songResults = SongInfo.fetch() - let level = levelIndex + 1 - let predicate = NSPredicate(format: "%K = %d OR %K = %d OR %K = %d", #keyPath(SongInfo.button6.normal), level, #keyPath(SongInfo.button6.hard), level, #keyPath(SongInfo.button6.maximum), level) - let filtered = songResults.filter(predicate) - for result in filtered { - guard let record = recordResults.filter(NSPredicate(format: "%K == %@", #keyPath(NewRecordInfo.title.english), result.title?.english ?? "")).first else { return } - if result.button6?.normal == level { - let object = SearchRecordDetail(series: record.series, title: record.localizedTitle, difficulty: Difficulty.normal, rate: record.button6?.normal?.rate ?? 0) - self.results.append(object) - - } - if result.button6?.hard == level { - let object = SearchRecordDetail(series: record.series, title: record.localizedTitle, difficulty: Difficulty.hard, rate: record.button6?.hard?.rate ?? 0) - self.results.append(object) - } - if result.button6?.maximum == level { - let object = SearchRecordDetail(series: record.series, title: record.localizedTitle, difficulty: Difficulty.maximum, rate: record.button6?.maximum?.rate ?? 0) - self.results.append(object) - } - } - case 1: - let range = lowerRange...upperRange - let predicate = NSPredicate(format: "%K BETWEEN {\(lowerRange), \(upperRange)} OR %K BETWEEN {\(lowerRange), \(upperRange)} OR %K BETWEEN {\(lowerRange), \(upperRange)}", #keyPath(NewRecordInfo.button6.normal.rate), #keyPath(NewRecordInfo.button6.hard.rate), #keyPath(NewRecordInfo.button6.maximum.rate)) - let filtered = recordResults.filter(predicate) - for result in filtered { - if range.contains(result.button6?.normal?.rate ?? 0) { - let object = SearchRecordDetail(series: result.series, title: result.localizedTitle, difficulty: Difficulty.normal, rate: result.button6?.normal?.rate ?? 0) - self.results.append(object) - } - if range.contains(result.button6?.hard?.rate ?? 0) { - let object = SearchRecordDetail(series: result.series, title: result.localizedTitle, difficulty: Difficulty.hard, rate: result.button6?.hard?.rate ?? 0) - self.results.append(object) - } - if range.contains(result.button6?.maximum?.rate ?? 0) { - let object = SearchRecordDetail(series: result.series, title: result.localizedTitle, difficulty: Difficulty.maximum, rate: result.button6?.maximum?.rate ?? 0) - self.results.append(object) - } - } - case 2: - if noteDetailIndex == 0 { - let predicate = NSPredicate(format: "%K == %@ AND %K != %@ OR %K == %@ AND %K != %@ OR %K == %@ AND %K != %@", #keyPath(NewRecordInfo.button6.normal.note), "", #keyPath(NewRecordInfo.button6.normal.rank), "", #keyPath(NewRecordInfo.button6.hard.note), "", #keyPath(NewRecordInfo.button6.hard.rank), "", #keyPath(NewRecordInfo.button6.maximum.note), "", #keyPath(NewRecordInfo.button6.maximum.rank), "") - let filtered = recordResults.filter(predicate) - for result in filtered { - if result.button6?.normal?.note.isEmpty ?? false { - let object = SearchRecordDetail(series: result.series, title: result.localizedTitle, difficulty: Difficulty.normal, rate: result.button6?.normal?.rate ?? 0) - self.results.append(object) - } - if result.button6?.hard?.note.isEmpty ?? false { - let object = SearchRecordDetail(series: result.series, title: result.localizedTitle, difficulty: Difficulty.hard, rate: result.button6?.hard?.rate ?? 0) - self.results.append(object) - } - if result.button6?.maximum?.note.isEmpty ?? false { - let object = SearchRecordDetail(series: result.series, title: result.localizedTitle, difficulty: Difficulty.maximum, rate: result.button6?.maximum?.rate ?? 0) - self.results.append(object) - } - } - } else { - let predicate = NSPredicate(format: "%K == %@ OR %K == %@ OR %K == %@", #keyPath(NewRecordInfo.button6.normal.note), Note.perfectPlay, #keyPath(NewRecordInfo.button6.hard.note), Note.perfectPlay, #keyPath(NewRecordInfo.button6.maximum.note), Note.perfectPlay) - let filtered = recordResults.filter(predicate) - for result in filtered { - if result.button6?.normal?.note == Note.perfectPlay { - let object = SearchRecordDetail(series: result.series, title: result.localizedTitle, difficulty: Difficulty.normal, rate: result.button6?.normal?.rate ?? 0) - self.results.append(object) - } - if result.button6?.hard?.note == Note.perfectPlay { - let object = SearchRecordDetail(series: result.series, title: result.localizedTitle, difficulty: Difficulty.hard, rate: result.button6?.hard?.rate ?? 0) - self.results.append(object) - } - if result.button6?.maximum?.note == Note.perfectPlay { - let object = SearchRecordDetail(series: result.series, title: result.localizedTitle, difficulty: Difficulty.maximum, rate: result.button6?.maximum?.rate ?? 0) - self.results.append(object) - } - } - } - default: - break - } - case 3: - switch methodIndex { - case 0: - let songResults = SongInfo.fetch() - let level = levelIndex + 1 - let predicate = NSPredicate(format: "%K = %d OR %K = %d OR %K = %d", #keyPath(SongInfo.button8.normal), level, #keyPath(SongInfo.button8.hard), level, #keyPath(SongInfo.button8.maximum), level) - let filtered = songResults.filter(predicate) - for result in filtered { - guard let record = recordResults.filter(NSPredicate(format: "%K == %@", #keyPath(NewRecordInfo.title.english), result.title?.english ?? "")).first else { return } - if result.button8?.normal == level { - let object = SearchRecordDetail(series: record.series, title: record.localizedTitle, difficulty: Difficulty.normal, rate: record.button8?.normal?.rate ?? 0) - self.results.append(object) - - } - if result.button8?.hard == level { - let object = SearchRecordDetail(series: record.series, title: record.localizedTitle, difficulty: Difficulty.hard, rate: record.button8?.hard?.rate ?? 0) - self.results.append(object) - } - if result.button8?.maximum == level { - let object = SearchRecordDetail(series: record.series, title: record.localizedTitle, difficulty: Difficulty.maximum, rate: record.button8?.maximum?.rate ?? 0) - self.results.append(object) - } - } - case 1: - let range = lowerRange...upperRange - let predicate = NSPredicate(format: "%K BETWEEN {\(lowerRange), \(upperRange)} OR %K BETWEEN {\(lowerRange), \(upperRange)} OR %K BETWEEN {\(lowerRange), \(upperRange)}", #keyPath(NewRecordInfo.button8.normal.rate), #keyPath(NewRecordInfo.button8.hard.rate), #keyPath(NewRecordInfo.button8.maximum.rate)) - let filtered = recordResults.filter(predicate) - for result in filtered { - if range.contains(result.button8?.normal?.rate ?? 0) { - let object = SearchRecordDetail(series: result.series, title: result.localizedTitle, difficulty: Difficulty.normal, rate: result.button8?.normal?.rate ?? 0) - self.results.append(object) - } - if range.contains(result.button8?.hard?.rate ?? 0) { - let object = SearchRecordDetail(series: result.series, title: result.localizedTitle, difficulty: Difficulty.hard, rate: result.button8?.hard?.rate ?? 0) - self.results.append(object) - } - if range.contains(result.button8?.maximum?.rate ?? 0) { - let object = SearchRecordDetail(series: result.series, title: result.localizedTitle, difficulty: Difficulty.maximum, rate: result.button8?.maximum?.rate ?? 0) - self.results.append(object) - } - } - case 2: - if noteDetailIndex == 0 { - let predicate = NSPredicate(format: "%K == %@ AND %K != %@ OR %K == %@ AND %K != %@ OR %K == %@ AND %K != %@", #keyPath(NewRecordInfo.button8.normal.note), "", #keyPath(NewRecordInfo.button8.normal.rank), "", #keyPath(NewRecordInfo.button8.hard.note), "", #keyPath(NewRecordInfo.button8.hard.rank), "", #keyPath(NewRecordInfo.button8.maximum.note), "", #keyPath(NewRecordInfo.button8.maximum.rank), "") - let filtered = recordResults.filter(predicate) - for result in filtered { - if result.button8?.normal?.note.isEmpty ?? false { - let object = SearchRecordDetail(series: result.series, title: result.localizedTitle, difficulty: Difficulty.normal, rate: result.button8?.normal?.rate ?? 0) - self.results.append(object) - } - if result.button8?.hard?.note.isEmpty ?? false { - let object = SearchRecordDetail(series: result.series, title: result.localizedTitle, difficulty: Difficulty.hard, rate: result.button8?.hard?.rate ?? 0) - self.results.append(object) - } - if result.button8?.maximum?.note.isEmpty ?? false { - let object = SearchRecordDetail(series: result.series, title: result.localizedTitle, difficulty: Difficulty.maximum, rate: result.button8?.maximum?.rate ?? 0) - self.results.append(object) - } - } - } else { - let predicate = NSPredicate(format: "%K == %@ OR %K == %@ OR %K == %@", #keyPath(NewRecordInfo.button8.normal.note), Note.perfectPlay, #keyPath(NewRecordInfo.button8.hard.note), Note.perfectPlay, #keyPath(NewRecordInfo.button8.maximum.note), Note.perfectPlay) - let filtered = recordResults.filter(predicate) - for result in filtered { - if result.button8?.normal?.note == Note.perfectPlay { - let object = SearchRecordDetail(series: result.series, title: result.localizedTitle, difficulty: Difficulty.normal, rate: result.button8?.normal?.rate ?? 0) - self.results.append(object) - } - if result.button8?.hard?.note == Note.perfectPlay { - let object = SearchRecordDetail(series: result.series, title: result.localizedTitle, difficulty: Difficulty.hard, rate: result.button8?.hard?.rate ?? 0) - self.results.append(object) - } - if result.button8?.maximum?.note == Note.perfectPlay { - let object = SearchRecordDetail(series: result.series, title: result.localizedTitle, difficulty: Difficulty.maximum, rate: result.button8?.maximum?.rate ?? 0) - self.results.append(object) - } - } - } - default: - break - } - default: - break - } - self.results.sort { $0.title < $1.title } - self.resultsLabel.text = "\(self.results.count)" + " Results".localized - } - - @IBAction func touchUpCancelButton(_ sender: UIButton) { - self.dismiss(animated: true, completion: nil) - } -} - -extension SearchRecordDetailViewController: UITableViewDataSource { - func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { - guard let cell = tableView.dequeueReusableCell(withIdentifier: "searchRecordDetailCell") as? SearchRecordDetailCell else { return UITableViewCell() } - cell.setProperties(self.results[indexPath.row]) - return cell - } - - func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - return self.results.count - } -} -extension SearchRecordDetailViewController: UITableViewDelegate { - func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { - tableView.deselectRow(at: indexPath, animated: true) - } -} - -extension SearchRecordDetailViewController: DZNEmptyDataSetSource { - func image(forEmptyDataSet scrollView: UIScrollView!) -> UIImage! { - return nil - } - - func title(forEmptyDataSet scrollView: UIScrollView!) -> NSAttributedString! { - return NSAttributedString(string: "No Results".localized, attributes: [NSAttributedStringKey.font: UIFont.systemFont(ofSize: 20, weight: .bold)]) - } - - func description(forEmptyDataSet scrollView: UIScrollView!) -> NSAttributedString! { - return nil - } -} - -extension SearchRecordDetailViewController: DZNEmptyDataSetDelegate { - func emptyDataSetShouldAllowScroll(_ scrollView: UIScrollView!) -> Bool { - return false - } - - func emptyDataSetWillAppear(_ scrollView: UIScrollView!) { - tableView.separatorStyle = .none - } - - func emptyDataSetWillDisappear(_ scrollView: UIScrollView!) { - if !executesFirst { - executesFirst = true - return - } - tableView.separatorStyle = .singleLine - } -} diff --git a/RespectU/Performance/Summary/SearchRecord/Controller/SearchRecordViewController.swift b/RespectU/Performance/Summary/SearchRecord/Controller/SearchRecordViewController.swift deleted file mode 100644 index d1de496..0000000 --- a/RespectU/Performance/Summary/SearchRecord/Controller/SearchRecordViewController.swift +++ /dev/null @@ -1,288 +0,0 @@ -// -// SearchByConditionViewController.swift -// RespectU -// -// Created by Presto on 2018. 3. 19.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import UIKit - -class SearchRecordViewController: UIViewController { - - let levels = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15] - var selectedButtonIndex: Int = -1 - var selectedLevelIndex: Int = -1 - var selectedNoteDetailIndex: Int = -1 - var selectedMethodIndex: Int = -1 - @IBOutlet weak var button4Button: UIButton! - @IBOutlet weak var button5Button: UIButton! - @IBOutlet weak var button6Button: UIButton! - @IBOutlet weak var button8Button: UIButton! - @IBOutlet weak var searchByLevelButton: UIButton! - @IBOutlet weak var searchByRateButton: UIButton! - @IBOutlet weak var searchByNoteButton: UIButton! - @IBOutlet weak var subView: UIView! - @IBOutlet weak var searchButton: UIButton! - var buttonButtons = [UIButton?]() - var methodButtons = [UIButton?]() - - override func viewDidLoad() { - super.viewDidLoad() - searchByLevelButton.setTitle("Level".localized, for: []) - searchByRateButton.setTitle("Rate".localized, for: []) - searchByNoteButton.setTitle("Note".localized, for: []) - searchButton.setTitle("Enter all conditions".localized, for: .disabled) - searchButton.setTitle("Search".localized, for: .normal) - searchButton.layer.cornerRadius = searchButton.bounds.height / 2 - searchButton.layer.borderColor = UIColor.main.cgColor - searchButton.layer.borderWidth = 1 - buttonButtons = [button4Button, button5Button, button6Button, button8Button] - methodButtons = [searchByLevelButton, searchByRateButton, searchByNoteButton] - initializeButtons() - initializeMethods() - } - - @IBAction func didTouchUpSearchButton(_ sender: UIButton) { - guard let controller = UIViewController.instantiate(storyboard: "Performance", identifier: SearchRecordDetailViewController.classNameToString) as? SearchRecordDetailViewController else { return } - controller.buttonIndex = { () -> Int in - for index in 0..<4 { - guard let button = buttonButtons[index] else { return -1 } - if button.isSelected { - return index - } - } - return -1 - }() - controller.methodIndex = { () -> Int in - for index in 0..<3 { - guard let button = methodButtons[index] else { return -1 } - if button.isSelected { - return index - } - } - return -1 - }() - if searchByLevelButton.isSelected { - controller.levelIndex = selectedLevelIndex - } else if searchByRateButton.isSelected { - guard let rateView = subView.subviews.first as? SearchByRateView else { return } - let lowerRate = Double(rateView.lowerRateTextField.text ?? "") ?? 0 - let upperRate = Double(rateView.upperRateTextField.text ?? "") ?? 0 - controller.lowerRange = lowerRate - controller.upperRange = upperRate - } else if searchByNoteButton.isSelected { - guard let noteView = subView.subviews.first as? SearchByNoteView else { return } - controller.noteDetailIndex = { () -> Int in - if noteView.noMaxComboButton.isSelected { - return 0 - } else { - return 1 - } - }() - } - self.present(controller, animated: true) - } - - @IBAction func didTouchUpButtons(_ sender: UIButton) { - initializeButtons() - for button in buttonButtons { - button?.isSelected = false -// UIView.animate(withDuration: 0.3) { -// button.back -// } - } - sender.isSelected = true - UIView.animate(withDuration: 0.3) { - sender.backgroundColor = .main - } - switch sender.tag { - case 0: - selectedButtonIndex = 0 - case 1: - selectedButtonIndex = 1 - case 2: - selectedButtonIndex = 2 - case 3: - selectedButtonIndex = 3 - default: - break - } - checkValidity() - } - - @IBAction func didTouchUpMethodButtons(_ sender: UIButton) { - let view = subView.subviews.first - if view is SearchByNoteView { - selectedNoteDetailIndex = -1 - } - if subView.subviews.count != 0 { - subView.subviews.first?.removeFromSuperview() - } - initializeMethods() - for type in methodButtons { - type?.isSelected = false - } - sender.isSelected = true - UIView.animate(withDuration: 0.3) { - sender.backgroundColor = .main - } - switch sender.tag { - case 0: - selectedMethodIndex = 0 - guard let newView = UIView.instantiateFromXib(xibName: "SearchByLevelView") as? SearchByLevelView else { return } - newView.pickerView.delegate = self - newView.pickerView.dataSource = self - subView.addSubview(newView) - newView.translatesAutoresizingMaskIntoConstraints = false - NSLayoutConstraint.activate([ - newView.topAnchor.constraint(equalTo: subView.topAnchor), - newView.leftAnchor.constraint(equalTo: subView.leftAnchor, constant: 16), - newView.rightAnchor.constraint(equalTo: subView.rightAnchor, constant: -16), - newView.heightAnchor.constraint(equalToConstant: 200) - ]) - case 1: - selectedMethodIndex = 1 - guard let newView = UIView.instantiateFromXib(xibName: "SearchByRateView") as? SearchByRateView else { return } - newView.delegate = self - newView.lowerRateTextField.addTarget(self, action: #selector(didEndEditing), for: .editingDidEnd) - newView.upperRateTextField.addTarget(self, action: #selector(didEndEditing), for: .editingDidEnd) - subView.addSubview(newView) - newView.translatesAutoresizingMaskIntoConstraints = false - NSLayoutConstraint.activate([ - newView.topAnchor.constraint(equalTo: subView.topAnchor), - newView.leftAnchor.constraint(equalTo: subView.leftAnchor), - newView.rightAnchor.constraint(equalTo: subView.rightAnchor), - newView.heightAnchor.constraint(equalToConstant: 100) - ]) - case 2: - selectedMethodIndex = 2 - guard let newView = UIView.instantiateFromXib(xibName: "SearchByNoteView") as? SearchByNoteView else { return } - newView.delegate = self - newView.noMaxComboButton.addTarget(self, action: #selector(touchUpSearchByNoteButtons), for: .touchUpInside) - newView.perfectPlayButton.addTarget(self, action: #selector(touchUpSearchByNoteButtons), for: .touchUpInside) - subView.addSubview(newView) - newView.translatesAutoresizingMaskIntoConstraints = false - NSLayoutConstraint.activate([ - newView.topAnchor.constraint(equalTo: subView.topAnchor), - newView.leftAnchor.constraint(equalTo: subView.leftAnchor), - newView.rightAnchor.constraint(equalTo: subView.rightAnchor), - newView.heightAnchor.constraint(equalToConstant: 100) - ]) - default: - break - } - checkValidity() - } - - @IBAction func didTouchUpCancelButton(_ sender: UIButton) { - self.dismiss(animated: true, completion: nil) - } - - @objc func touchUpSearchByNoteButtons(_ sender: UIButton) { - checkValidity() - } - - @objc func didEndEditing(_ sender: UITextField) { - checkValidity() - } -} - -extension SearchRecordViewController: UIPickerViewDataSource { - func numberOfComponents(in pickerView: UIPickerView) -> Int { - return 1 - } - - func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { - return 15 - } -} - -extension SearchRecordViewController: UIPickerViewDelegate { - func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { - return "\(self.levels[row])" - } - - func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { - self.selectedLevelIndex = row - checkValidity() - } -} - -extension SearchRecordViewController: SearchByRateViewDelegate { - func didTouchUpDoneButton(_ textFields: [UITextField]) { - guard let lowerRateTextField = textFields.first else { return } - guard let upperRateTextField = textFields.last else { return } - if lowerRateTextField.isFirstResponder { - lowerRateTextField.resignFirstResponder() - setTextFieldText(lowerRateTextField) - } else if upperRateTextField.isFirstResponder { - upperRateTextField.resignFirstResponder() - setTextFieldText(upperRateTextField) - } - } - private func setTextFieldText(_ textField: UITextField) { - guard let text = textField.text else { return } - guard let value = Double(text) else { return } - if value >= 100 { - textField.text = "100" - } - } -} - -extension SearchRecordViewController: SearchByNoteViewDelegate { - func didTouchUpNoteButtons(_ sender: UIButton) { - switch sender.tag { - case 0: - selectedNoteDetailIndex = 0 - case 1: - selectedNoteDetailIndex = 1 - default: - break - } - } -} - -extension SearchRecordViewController { - private func initializeButtons() { - for button in buttonButtons { - UIView.animate(withDuration: 0.3) { - button?.backgroundColor = .white - } - } - } - - private func initializeMethods() { - for button in methodButtons { - UIView.animate(withDuration: 0.3) { - button?.backgroundColor = .white - } - } - } - - private func checkValidity() { - self.searchButton.isEnabled = false - let view = subView.subviews.first - switch view { - case is SearchByLevelView: - if selectedLevelIndex != -1, selectedMethodIndex != -1, selectedButtonIndex != -1 { - self.searchButton.isEnabled = true - } - case is SearchByRateView: - guard let newView = view as? SearchByRateView else { return } - guard let lowerText = newView.lowerRateTextField.text else { return } - guard let upperText = newView.upperRateTextField.text else { return } - guard let lower = Double(lowerText) else { return } - guard let upper = Double(upperText) else { return } - if upper > lower { - self.searchButton.isEnabled = true - } - case is SearchByNoteView: - if selectedNoteDetailIndex != -1, selectedMethodIndex != -1, selectedButtonIndex != -1 { - self.searchButton.isEnabled = true - } - default: - break - } - } -} diff --git a/RespectU/Performance/Summary/SearchRecord/Controller/SummaryDetailViewController.swift b/RespectU/Performance/Summary/SearchRecord/Controller/SummaryDetailViewController.swift deleted file mode 100644 index 851a1d9..0000000 --- a/RespectU/Performance/Summary/SearchRecord/Controller/SummaryDetailViewController.swift +++ /dev/null @@ -1,285 +0,0 @@ -// -// SummaryDetailViewController.swift -// RespectU -// -// Created by Presto on 2018. 3. 5.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import UIKit -import RealmSwift - -class SummaryDetailViewController: UIViewController { - - // 0 1 2 3 4 5 6 7 : 정확도 - // 8 : 맥스 콤보 - // 9 : 퍼펙트 플레이 - // 10 : 총 패턴 수 - // 11 : 성과 기록한 패턴 수 - @IBOutlet weak var button4StackView: UIStackView! - @IBOutlet weak var button5StackView: UIStackView! - @IBOutlet weak var button6StackView: UIStackView! - @IBOutlet weak var button8StackView: UIStackView! - @IBOutlet weak var allStackView: UIStackView! - var songResults: Results! - var recordResults: Results! - var button4Array = Array(repeating: 0, count: 12) - var button5Array = Array(repeating: 0, count: 12) - var button6Array = Array(repeating: 0, count: 12) - var button8Array = Array(repeating: 0, count: 12) - var allArray = Array(repeating: 0, count: 12) - var rateArray = Array(repeating: 0.0, count: 5) - - override func viewDidLoad() { - super.viewDidLoad() - let buttons = ["button4", "button5", "button6", "button8"] - let difficulties = ["normal", "hard", "maximum"] - self.songResults = SongInfo.fetch() - self.recordResults = NewRecordInfo.fetch() - for recordResult in recordResults { - let predicate = NSPredicate(format: "%K == %@", #keyPath(SongInfo.title.english), recordResult.title?.english ?? "") - guard let songResult = self.songResults.filter(predicate).first else { return } - for index in 0..<4 { - let button = buttons[index] - guard let songButtonKeyPath = songResult.value(forKeyPath: button) as? SongButtonInfo else { return } - guard let recordButtonKeyPath = recordResult.value(forKeyPath: button) as? NewRecordButtonInfo else { return } - for difficulty in difficulties { - guard let level = songButtonKeyPath.value(forKeyPath: difficulty) as? Int else { return } - if level != 0 { - guard let recordKeyPath = recordButtonKeyPath.value(forKeyPath: difficulty) as? NewRecordDifficultyInfo else { return } - if !recordKeyPath.rank.isEmpty { - switch index { - case 0: - button4Array[11] += 1 - rateArray[0] += recordKeyPath.rate - case 1: - button5Array[11] += 1 - rateArray[1] += recordKeyPath.rate - case 2: - button6Array[11] += 1 - rateArray[2] += recordKeyPath.rate - case 3: - button8Array[11] += 1 - rateArray[3] += recordKeyPath.rate - default: - break - } - } - switch recordKeyPath.note { - case Note.maxCombo: - switch index { - case 0: - button4Array[8] += 1 - case 1: - button5Array[8] += 1 - case 2: - button6Array[8] += 1 - case 3: - button8Array[8] += 1 - default: - break - } - case Note.perfectPlay: - switch index { - case 0: - button4Array[9] += 1 - case 1: - button5Array[9] += 1 - case 2: - button6Array[9] += 1 - case 3: - button8Array[9] += 1 - default: - break - } - default: - break - } - switch recordKeyPath.rate { - case 99.8...100: - switch index { - case 0: - button4Array[0] += 1 - case 1: - button5Array[0] += 1 - case 2: - button6Array[0] += 1 - case 3: - button8Array[0] += 1 - default: - break - } - case 99.5..<99.8: - switch index { - case 0: - button4Array[1] += 1 - case 1: - button5Array[1] += 1 - case 2: - button6Array[1] += 1 - case 3: - button8Array[1] += 1 - default: - break - } - case 99..<99.5: - switch index { - case 0: - button4Array[2] += 1 - case 1: - button5Array[2] += 1 - case 2: - button6Array[2] += 1 - case 3: - button8Array[2] += 1 - default: - break - } - case 98.5..<99: - switch index { - case 0: - button4Array[3] += 1 - case 1: - button5Array[3] += 1 - case 2: - button6Array[3] += 1 - case 3: - button8Array[3] += 1 - default: - break - } - case 98..<98.5: - switch index { - case 0: - button4Array[4] += 1 - case 1: - button5Array[4] += 1 - case 2: - button6Array[4] += 1 - case 3: - button8Array[4] += 1 - default: - break - } - case 95..<98: - switch index { - case 0: - button4Array[5] += 1 - case 1: - button5Array[5] += 1 - case 2: - button6Array[5] += 1 - case 3: - button8Array[5] += 1 - default: - break - } - case 90..<95: - switch index { - case 0: - button4Array[6] += 1 - case 1: - button5Array[6] += 1 - case 2: - button6Array[6] += 1 - case 3: - button8Array[6] += 1 - default: - break - } - case ..<90: - switch index { - case 0: - button4Array[7] += 1 - case 1: - button5Array[7] += 1 - case 2: - button6Array[7] += 1 - case 3: - button8Array[7] += 1 - default: - break - } - default: - break - } - } - } - } - } - totalPatterns() - for index in 0..<12 { - allArray[index] = button4Array[index] + button5Array[index] + button6Array[index] + button8Array[index] - } - rateArray[0] = rateArray[0] / Double(button4Array[11]) - rateArray[1] = rateArray[1] / Double(button5Array[11]) - rateArray[2] = rateArray[2] / Double(button6Array[11]) - rateArray[3] = rateArray[3] / Double(button8Array[11]) - rateArray[4] = (rateArray[0] + rateArray[1] + rateArray[2] + rateArray[3]) / 4 - let count = button4StackView.arrangedSubviews.count - for index in 1.., at item: Int) { - let buttons = ["button4", "button5", "button6", "button8"] - let difficulties = ["normal", "hard", "maximum"] - var count: Int = 0 - self.contentLabel.text = self.contents[item] - switch item { - case 0, 1, 2, 3: - self.valueLabel.text = { - for result in results { - for button in buttons { - guard let buttonResult = result.value(forKey: button) as? NewRecordButtonInfo else { return nil } - for difficulty in difficulties { - guard let difficultyResult = buttonResult.value(forKey: difficulty) as? NewRecordDifficultyInfo else { return nil } - if difficultyResult.rank == self.contents[item] { - count += 1 - } - } - } - } - return "\(count)" - }() - case 4, 5: - self.valueLabel.text = { - for result in results { - for button in buttons { - guard let buttonResult = result.value(forKey: button) as? NewRecordButtonInfo else { return nil } - for difficulty in difficulties { - guard let difficultyResult = buttonResult.value(forKey: difficulty) as? NewRecordDifficultyInfo else { return nil } - if difficultyResult.note == self.contents[item] { - count += 1 - } - } - } - } - return "\(count)" - }() - case 6: - self.valueLabel.text = { - for result in results { - for button in buttons { - guard let buttonResult = result.value(forKey: button) as? NewRecordButtonInfo else { return nil } - for difficulty in difficulties { - guard let difficultyResult = buttonResult.value(forKey: difficulty) as? NewRecordDifficultyInfo else { return nil } - if difficultyResult.note == self.contents[4] || difficultyResult.note == self.contents[5] { - count += 1 - } - } - } - } - return "\(count)" - }() - default: - break - } - } -} diff --git a/RespectU/Record/Controller/RecordAllTableViewController.swift b/RespectU/Record/Controller/RecordAllTableViewController.swift deleted file mode 100644 index 15fc5fe..0000000 --- a/RespectU/Record/Controller/RecordAllTableViewController.swift +++ /dev/null @@ -1,24 +0,0 @@ -// -// RecordAllTableViewController.swift -// RespectU -// -// Created by Presto on 2018. 4. 4.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import UIKit -import XLPagerTabStrip - -class RecordAllTableViewController: RecordBaseTableViewController { - - override func viewDidLoad() { - super.viewDidLoad() - self.songResults = self.tempSongResults?.sorted { $0.localizedLowercase < $1.localizedLowercase } - } -} - -extension RecordAllTableViewController: IndicatorInfoProvider { - func indicatorInfo(for pagerTabStripController: PagerTabStripViewController) -> IndicatorInfo { - return IndicatorInfo(title: "All") - } -} diff --git a/RespectU/Record/Controller/RecordBSTableViewController.swift b/RespectU/Record/Controller/RecordBSTableViewController.swift deleted file mode 100644 index 91cff47..0000000 --- a/RespectU/Record/Controller/RecordBSTableViewController.swift +++ /dev/null @@ -1,24 +0,0 @@ -// -// RecordBSTableViewController.swift -// RespectU -// -// Created by Presto on 2018. 6. 28.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import UIKit -import XLPagerTabStrip - -class RecordBSTableViewController: RecordBaseTableViewController { - - override func viewDidLoad() { - super.viewDidLoad() - self.songResults = self.tempSongResults?.filter(key: "series", value: Series.bs, method: "=").sorted { $0.localizedLowercase < $1.localizedLowercase } - } -} - -extension RecordBSTableViewController: IndicatorInfoProvider { - func indicatorInfo(for pagerTabStripController: PagerTabStripViewController) -> IndicatorInfo { - return IndicatorInfo(title: "BLACK SQUARE") - } -} diff --git a/RespectU/Record/Controller/RecordBaseTableViewController.swift b/RespectU/Record/Controller/RecordBaseTableViewController.swift deleted file mode 100644 index a351fb5..0000000 --- a/RespectU/Record/Controller/RecordBaseTableViewController.swift +++ /dev/null @@ -1,302 +0,0 @@ -// -// RecordBaseTableViewController.swift -// RespectU -// -// Created by Presto on 2018. 8. 2.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import UIKit -import RealmSwift - -class RecordBaseTableViewController: UITableViewController { - - var recordViewController: RecordViewController { - guard let parent = self.parent as? RecordViewController else { return RecordViewController() } - return parent - } - let favoriteButton = UserDefaults.standard.string(forKey: "favoriteButton") ?? "4b" - var tempSongResults: Results? - var songResults: [SongInfo]? - var recordResults: Results? - var recordView: RecordView! - let cellIdentifier = "recordCell" - - override func viewDidLoad() { - super.viewDidLoad() - tempSongResults = SongInfo.fetch() - recordResults = NewRecordInfo.fetch() - tableView.showsVerticalScrollIndicator = false - tableView.separatorStyle = .none - tableView.register(UINib(nibName: "RecordCell", bundle: nil), forCellReuseIdentifier: cellIdentifier) - } - - override func viewWillDisappear(_ animated: Bool) { - super.viewWillDisappear(animated) - deselectTableViewIfSelected() - } - - override func viewDidAppear(_ animated: Bool) { - super.viewDidAppear(animated) - dismissRecordViewIfExists() - } -} - -extension RecordBaseTableViewController { - override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { - guard let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) as? RecordCell else { return UITableViewCell() } - guard let object = self.songResults?[indexPath.row] else { return UITableViewCell() } - cell.setProperties(object) - if let selectedIndexPath = tableView.indexPathForSelectedRow { - if selectedIndexPath == indexPath { - cell.setColorsInSong(object.series, labels: cell.labels) - } else { - cell.unsetColors(labels: cell.labels) - } - } - return cell - } - - override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - return self.songResults?.count ?? 0 - } - - override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { - guard let cell = tableView.cellForRow(at: indexPath) as? RecordCell else { return } - dismissRecordViewIfExists() - guard let selectedIndexPath = self.tableView.indexPathForSelectedRow else { return } - guard let songResult = self.songResults?[selectedIndexPath.row] else { return } - let predicate = NSPredicate(format: "%K == %@", #keyPath(NewRecordInfo.title.english), songResult.title?.english ?? "") - guard let object = self.recordResults?.filter(predicate).first else { return } - cell.setColorsInSong(object.series, labels: cell.labels) - self.recordView = UIView.instantiateFromXib(xibName: "RecordView") as? RecordView - self.recordView.delegate = self - self.recordView.translatesAutoresizingMaskIntoConstraints = false - recordViewController.view.addSubview(recordView) - let leadingConstraint = self.recordView.leadingAnchor.constraint(equalTo: recordViewController.view.leadingAnchor, constant: 8) - let trailingConstraint = self.recordView.trailingAnchor.constraint(equalTo: recordViewController.view.trailingAnchor, constant: -8) - let heightConstraint = self.recordView.heightAnchor.constraint(equalToConstant: 200) - let centerXConstraint = self.recordView.centerXAnchor.constraint(equalTo: recordViewController.view.centerXAnchor) - let bottomConstraint: NSLayoutConstraint - if #available(iOS 11.0, *) { - bottomConstraint = self.recordView.safeAreaLayoutGuide.bottomAnchor.constraint(equalTo: recordViewController.view.safeAreaLayoutGuide.bottomAnchor, constant: -20) - } else { - bottomConstraint = self.recordView.bottomAnchor.constraint(equalTo: recordViewController.view.bottomAnchor, constant: -20) - } - NSLayoutConstraint.activate([leadingConstraint, trailingConstraint, heightConstraint, centerXConstraint, bottomConstraint]) - self.recordView.updateRankingAndSkillPointLabel(object, button: favoriteButton) - self.recordView.reloadButtonsAndLabels(object, button: favoriteButton) - recordViewController.scrollViewBottomConstraint.constant += 210 - recordViewController.view.layoutIfNeeded() - tableView.scrollToNearestSelectedRow(at: .middle, animated: true) - } - - override func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) { - guard let cell = tableView.cellForRow(at: indexPath) as? RecordCell else { return } - cell.unsetColors(labels: cell.labels) - } - - override func tableView(_ tableView: UITableView, didHighlightRowAt indexPath: IndexPath) { - guard let cell = tableView.cellForRow(at: indexPath) as? RecordCell else { return } - guard let object = self.songResults?[indexPath.row] else { return } - cell.setColorsInSong(object.series, labels: cell.labels) - - } - - override func tableView(_ tableView: UITableView, didUnhighlightRowAt indexPath: IndexPath) { - guard let cell = tableView.cellForRow(at: indexPath) as? RecordCell else { return } - cell.unsetColors(labels: cell.labels) - } -} - -extension RecordBaseTableViewController: RecordViewDelegate { - func didTouchUpTypeButton(_ sender: UIButton) { - let button = (sender.title(for: .normal) ?? Buttons.button4).lowercased() - guard let selectedIndexPath = self.tableView.indexPathForSelectedRow else { return } - guard let songResult = self.songResults?[selectedIndexPath.row] else { return } - let predicate = NSPredicate(format: "%K == %@", #keyPath(NewRecordInfo.title.english), songResult.title?.english ?? "") - guard let object = self.recordResults?.filter(predicate).first else { return } - recordView.changeButtonProperties(object, button: button) - } - - func presentRankAlert(difficulty: String, button: String) { - guard let selectedIndexPath = self.tableView.indexPathForSelectedRow else { return } - guard let songResult = self.songResults?[selectedIndexPath.row] else { return } - let predicate = NSPredicate(format: "%K == %@", #keyPath(NewRecordInfo.title.english), songResult.title?.english ?? "") - guard let object = self.recordResults?.filter(predicate).first else { return } - UIAlertController - .alert(title: "Rank".localized, message: "Select the rank.".localized) - .action(title: "-") { [weak self] _ in - self?.setRank(object, rank: Rank.none, difficulty: difficulty, button: button) - self?.recordView.reloadButtonsAndLabels(object, button: button) - } - .action(title: Rank.s) { [weak self] _ in - self?.setRank(object, rank: Rank.s, difficulty: difficulty, button: button) - self?.recordView.reloadButtonsAndLabels(object, button: button) - } - .action(title: Rank.a) { [weak self] _ in - self?.setRank(object, rank: Rank.a, difficulty: difficulty, button: button) - self?.recordView.reloadButtonsAndLabels(object, button: button) - } - .action(title: Rank.b) { [weak self] _ in - self?.setRank(object, rank: Rank.b, difficulty: difficulty, button: button) - self?.recordView.reloadButtonsAndLabels(object, button: button) - } - .action(title: Rank.c) { [weak self] _ in - self?.setRank(object, rank: Rank.c, difficulty: difficulty, button: button) - self?.recordView.reloadButtonsAndLabels(object, button: button) - } - .action(.cancel, title: "Cancel".localized) - .present(to: self) - } - - func presentRateAlert(difficulty: String, button: String) { - guard let selectedIndexPath = self.tableView.indexPathForSelectedRow else { return } - guard let songResult = self.songResults?[selectedIndexPath.row] else { return } - let predicate = NSPredicate(format: "%K == %@", #keyPath(NewRecordInfo.title.english), songResult.title?.english ?? "") - guard let object = self.recordResults?.filter(predicate).first else { return } - let alert = UIAlertController - .alert(title: "Rate".localized, message: "Enter the rate.\nTo reset the value, do not enter any values.".localized) - alert.textField { (textField) in - textField.keyboardType = .decimalPad - textField.placeholder = "Rate".localized - } - .action(title: "OK".localized) { [weak self] _ in - let input = alert.textFields?.first?.text ?? "" - if input.isEmpty { - self?.setRate(object, rate: 0, difficulty: difficulty, button: button) - } else { - guard let value = Double(input) else { return } - let rate = value >= 100 ? 100 : value - self?.setRate(object, rate: rate, difficulty: difficulty, button: button) - switch rate { - case 98...100: - self?.setRank(object, rank: Rank.s, difficulty: difficulty, button: button) - case 95..<98: - self?.setRank(object, rank: Rank.a, difficulty: difficulty, button: button) - case 90..<95: - self?.setRank(object, rank: Rank.b, difficulty: difficulty, button: button) - case ..<90: - self?.setRank(object, rank: Rank.c, difficulty: difficulty, button: button) - default: - break - } - } - self?.recordView.reloadButtonsAndLabels(object, button: button) - guard let buttonExpansion = button.buttonExpansion else { return } - guard let note = object.value(forKeyPath: "\(buttonExpansion).\(difficulty).note") as? String else { return } - if note != Note.maxCombo { - self?.presentNoteAlert(difficulty: difficulty, button: button) - } - } - .action(.cancel, title: "Cancel".localized) - .present(to: self) - } - - func presentNoteAlert(difficulty: String, button: String) { - guard let selectedIndexPath = self.tableView.indexPathForSelectedRow else { return } - guard let songResult = self.songResults?[selectedIndexPath.row] else { return } - let predicate = NSPredicate(format: "%K == %@", #keyPath(NewRecordInfo.title.english), songResult.title?.english ?? "") - guard let object = self.recordResults?.filter(predicate).first else { return } - UIAlertController - .alert(title: "Note".localized, message: "Select the note.".localized) - .action(title: "-") { [weak self] _ in - self?.setNote(object, note: Note.none, difficulty: difficulty, button: button) - self?.recordView.reloadButtonsAndLabels(object, button: button) - } - .action(title: Note.maxCombo.noteExpansion) { [weak self] _ in - self?.setNote(object, note: Note.maxCombo, difficulty: difficulty, button: button) - self?.recordView.reloadButtonsAndLabels(object, button: button) - } - .action(title: Note.perfectPlay.noteExpansion) { [weak self] _ in - self?.setRank(object, rank: Rank.s, difficulty: difficulty, button: button) - self?.setRate(object, rate: 100, difficulty: difficulty, button: button) - self?.setNote(object, note: Note.perfectPlay, difficulty: difficulty, button: button) - self?.recordView.reloadButtonsAndLabels(object, button: button) - } - .action(.cancel, title: "Cancel".localized) - .present(to: self) - } - - func didTouchUpCancelButton() { - dismissRecordViewIfExists() - deselectTableViewIfSelected() - } -} - -extension RecordBaseTableViewController { - private func setRank(_ object: NewRecordInfo, rank: String, difficulty: String, button: String) { - guard let buttonExpansion = button.buttonExpansion else { return } - let keyPath = "\(buttonExpansion).\(difficulty).rank" - NewRecordInfo.update(object, with: [keyPath: rank]) - } - - private func setRate(_ object: NewRecordInfo, rate: Double, difficulty: String, button: String) { - guard let buttonExpansion = button.buttonExpansion else { return } - let keyPath = "\(buttonExpansion).\(difficulty).rate" - NewRecordInfo.update(object, with: [keyPath: rate]) - setSkillPoint(object, button: button) - recordView.updateRankingAndSkillPointLabel(object, button: button) - } - - private func setNote(_ object: NewRecordInfo, note: String, difficulty: String, button: String) { - guard let buttonExpansion = button.buttonExpansion else { return } - let keyPath = "\(buttonExpansion).\(difficulty).note" - NewRecordInfo.update(object, with: [keyPath: note]) - setSkillPoint(object, button: button) - recordView.updateRankingAndSkillPointLabel(object, button: button) - } - - private func setSkillPoint(_ object: NewRecordInfo, button: String) { - guard let buttonExpansion = button.buttonExpansion else { return } - guard let recordButtonKeyPath = object.value(forKeyPath: buttonExpansion) as? NewRecordButtonInfo else { return } - let predicate = NSPredicate(format: "%K == %@", #keyPath(SongInfo.title.english), object.title?.english ?? "") - guard let songResult = self.tempSongResults?.filter(predicate).first else { return } - guard let songButtonKeyPath = songResult.value(forKeyPath: buttonExpansion) as? SongButtonInfo else { return } - let normal = Skill.skillPoint(difficulty: songButtonKeyPath.normal, rate: recordButtonKeyPath.normal?.rate, note: recordButtonKeyPath.normal?.note) - let hard = Skill.skillPoint(difficulty: songButtonKeyPath.hard, rate: recordButtonKeyPath.hard?.rate, note: recordButtonKeyPath.hard?.note) - let maximum = Skill.skillPoint(difficulty: songButtonKeyPath.maximum, rate: recordButtonKeyPath.maximum?.rate, note: recordButtonKeyPath.maximum?.note) - guard let max = [normal, hard, maximum].sorted().last else { return } - NewRecordInfo.update(object, with: ["\(buttonExpansion).skillPoint": max]) - switch max { - case normal: - NewRecordInfo.update(object, with: [ - "\(buttonExpansion).skillPointDifficulty": Difficulty.normal, - "\(buttonExpansion).skillPointRate": recordButtonKeyPath.normal?.rate ?? 0, - "\(buttonExpansion).skillPointNote": recordButtonKeyPath.normal?.note ?? "" - ]) - case hard: - NewRecordInfo.update(object, with: [ - "\(buttonExpansion).skillPointDifficulty": Difficulty.hard, - "\(buttonExpansion).skillPointRate": recordButtonKeyPath.hard?.rate ?? 0, - "\(buttonExpansion).skillPointNote": recordButtonKeyPath.hard?.note ?? "" - ]) - case maximum: - NewRecordInfo.update(object, with: [ - "\(buttonExpansion).skillPointDifficulty": Difficulty.maximum, - "\(buttonExpansion).skillPointRate": recordButtonKeyPath.maximum?.rate ?? 0, - "\(buttonExpansion).skillPointNote": recordButtonKeyPath.maximum?.note ?? "" - ]) - default: - break - } - } -} - -extension RecordBaseTableViewController { - private func dismissRecordViewIfExists() { - let lastSubview = recordViewController.view.subviews.last - if lastSubview is RecordView { - lastSubview?.removeFromSuperview() - recordViewController.scrollViewBottomConstraint.constant -= 210 - } - } - - private func deselectTableViewIfSelected() { - if let selectedIndexPath = self.tableView.indexPathForSelectedRow { - guard let cell = tableView.cellForRow(at: selectedIndexPath) as? RecordCell else { return } - tableView.deselectRow(at: selectedIndexPath, animated: true) - cell.unsetColors(labels: cell.labels) - } - } -} diff --git a/RespectU/Record/Controller/RecordCETableViewController.swift b/RespectU/Record/Controller/RecordCETableViewController.swift deleted file mode 100644 index 190efd4..0000000 --- a/RespectU/Record/Controller/RecordCETableViewController.swift +++ /dev/null @@ -1,24 +0,0 @@ -// -// RecordCETableViewController.swift -// RespectU -// -// Created by Presto on 2018. 4. 4.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import UIKit -import XLPagerTabStrip - -class RecordCETableViewController: RecordBaseTableViewController { - - override func viewDidLoad() { - super.viewDidLoad() - self.songResults = self.tempSongResults?.filter(key: "series", value: Series.ce, method: "=").sorted { $0.localizedLowercase < $1.localizedLowercase } - } -} - -extension RecordCETableViewController: IndicatorInfoProvider { - func indicatorInfo(for pagerTabStripController: PagerTabStripViewController) -> IndicatorInfo { - return IndicatorInfo(title: "CLAZZIQUAI") - } -} diff --git a/RespectU/Record/Controller/RecordPortable1TableViewController.swift b/RespectU/Record/Controller/RecordPortable1TableViewController.swift deleted file mode 100644 index dac940a..0000000 --- a/RespectU/Record/Controller/RecordPortable1TableViewController.swift +++ /dev/null @@ -1,23 +0,0 @@ -// -// RecordPortable1TableViewController.swift -// -// -// Created by Presto on 2018. 4. 4.. -// - -import UIKit -import XLPagerTabStrip - -class RecordPortable1TableViewController: RecordBaseTableViewController { - - override func viewDidLoad() { - super.viewDidLoad() - self.songResults = self.tempSongResults?.filter(key: "series", value: Series.portable1, method: "=").sorted { $0.localizedLowercase < $1.localizedLowercase } - } -} - -extension RecordPortable1TableViewController: IndicatorInfoProvider { - func indicatorInfo(for pagerTabStripController: PagerTabStripViewController) -> IndicatorInfo { - return IndicatorInfo(title: "PORTABLE 1") - } -} diff --git a/RespectU/Record/Controller/RecordPortable2TableViewController.swift b/RespectU/Record/Controller/RecordPortable2TableViewController.swift deleted file mode 100644 index a0e2a0d..0000000 --- a/RespectU/Record/Controller/RecordPortable2TableViewController.swift +++ /dev/null @@ -1,24 +0,0 @@ -// -// RecordPortable2TableViewController.swift -// RespectU -// -// Created by Presto on 2018. 4. 4.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import UIKit -import XLPagerTabStrip - -class RecordPortable2TableViewController: RecordBaseTableViewController { - - override func viewDidLoad() { - super.viewDidLoad() - self.songResults = self.tempSongResults?.filter(key: "series", value: Series.portable2, method: "=").sorted { $0.localizedLowercase < $1.localizedLowercase } - } -} - -extension RecordPortable2TableViewController: IndicatorInfoProvider { - func indicatorInfo(for pagerTabStripController: PagerTabStripViewController) -> IndicatorInfo { - return IndicatorInfo(title: "PORTABLE 2") - } -} diff --git a/RespectU/Record/Controller/RecordRespectTableViewController.swift b/RespectU/Record/Controller/RecordRespectTableViewController.swift deleted file mode 100644 index 1c1a161..0000000 --- a/RespectU/Record/Controller/RecordRespectTableViewController.swift +++ /dev/null @@ -1,24 +0,0 @@ -// -// RecordRespectTableViewController.swift -// RespectU -// -// Created by Presto on 2018. 4. 4.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import UIKit -import XLPagerTabStrip - -class RecordRespectTableViewController: RecordBaseTableViewController { - - override func viewDidLoad() { - super.viewDidLoad() - self.songResults = self.tempSongResults?.filter(key: "series", value: Series.respect, method: "=").sorted { $0.localizedLowercase < $1.localizedLowercase } - } -} - -extension RecordRespectTableViewController: IndicatorInfoProvider { - func indicatorInfo(for pagerTabStripController: PagerTabStripViewController) -> IndicatorInfo { - return IndicatorInfo(title: "RESPECT") - } -} diff --git a/RespectU/Record/Controller/RecordTechnika1TableViewController.swift b/RespectU/Record/Controller/RecordTechnika1TableViewController.swift deleted file mode 100644 index 25c378b..0000000 --- a/RespectU/Record/Controller/RecordTechnika1TableViewController.swift +++ /dev/null @@ -1,24 +0,0 @@ -// -// RecordTechnika1TableViewController.swift -// RespectU -// -// Created by Presto on 2018. 4. 4.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import UIKit -import XLPagerTabStrip - -class RecordTechnika1TableViewController: RecordBaseTableViewController { - - override func viewDidLoad() { - super.viewDidLoad() - self.songResults = self.tempSongResults?.filter(key: "series", value: Series.technika1, method: "=").sorted { $0.localizedLowercase < $1.localizedLowercase } - } -} - -extension RecordTechnika1TableViewController: IndicatorInfoProvider { - func indicatorInfo(for pagerTabStripController: PagerTabStripViewController) -> IndicatorInfo { - return IndicatorInfo(title: "TECHNIKA 1") - } -} diff --git a/RespectU/Record/Controller/RecordTechnika2TableViewController.swift b/RespectU/Record/Controller/RecordTechnika2TableViewController.swift deleted file mode 100644 index daa180f..0000000 --- a/RespectU/Record/Controller/RecordTechnika2TableViewController.swift +++ /dev/null @@ -1,24 +0,0 @@ -// -// RecordTechnika2TableViewController.swift -// RespectU -// -// Created by Presto on 11/10/2018. -// Copyright © 2018 Presto. All rights reserved. -// - -import UIKit -import XLPagerTabStrip - -class RecordTechnika2TableViewController: RecordBaseTableViewController { - - override func viewDidLoad() { - super.viewDidLoad() - songResults = tempSongResults?.filter(key: "series", value: Series.technika2, method: "=").sorted { $0.localizedLowercase < $1.localizedLowercase } - } -} - -extension RecordTechnika2TableViewController: IndicatorInfoProvider { - func indicatorInfo(for pagerTabStripController: PagerTabStripViewController) -> IndicatorInfo { - return IndicatorInfo(title: "TECHNIKA 2") - } -} diff --git a/RespectU/Record/Controller/RecordTrilogyTableViewController.swift b/RespectU/Record/Controller/RecordTrilogyTableViewController.swift deleted file mode 100644 index 7434cbd..0000000 --- a/RespectU/Record/Controller/RecordTrilogyTableViewController.swift +++ /dev/null @@ -1,24 +0,0 @@ -// -// RecordTrilogyTableViewController.swift -// RespectU -// -// Created by Presto on 2018. 4. 4.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import UIKit -import XLPagerTabStrip - -class RecordTrilogyTableViewController: RecordBaseTableViewController { - - override func viewDidLoad() { - super.viewDidLoad() - self.songResults = self.tempSongResults?.filter(key: "series", value: Series.trilogy, method: "=").sorted { $0.localizedLowercase < $1.localizedLowercase } - } -} - -extension RecordTrilogyTableViewController: IndicatorInfoProvider { - func indicatorInfo(for pagerTabStripController: PagerTabStripViewController) -> IndicatorInfo { - return IndicatorInfo(title: "TRILOGY") - } -} diff --git a/RespectU/Record/Controller/RecordViewController.swift b/RespectU/Record/Controller/RecordViewController.swift deleted file mode 100644 index 66a2508..0000000 --- a/RespectU/Record/Controller/RecordViewController.swift +++ /dev/null @@ -1,41 +0,0 @@ -// -// Record2ViewController.swift -// RespectU -// -// Created by Presto on 2018. 3. 4.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import UIKit -import XLPagerTabStrip - -class RecordViewController: BaseViewController { - - @IBOutlet weak var scrollViewBottomConstraint: NSLayoutConstraint! - @IBOutlet weak var scrollView: UIScrollView! - @IBOutlet weak var buttonBar: ButtonBarView! - private lazy var allTableViewController = RecordAllTableViewController() - private lazy var portable1TableViewController = RecordPortable1TableViewController() - private lazy var portable2TableViewController = RecordPortable2TableViewController() - private lazy var respectTableViewController = RecordRespectTableViewController() - private lazy var trilogyTableViewController = RecordTrilogyTableViewController() - private lazy var ceTableViewController = RecordCETableViewController() - private lazy var technika1TableViewController = RecordTechnika1TableViewController() - private lazy var bsTableViewController = RecordBSTableViewController() - private lazy var technika2TableViewController = RecordTechnika2TableViewController() - lazy var recordViewControllers: [RecordBaseTableViewController] = { - return [allTableViewController, portable1TableViewController, portable2TableViewController, respectTableViewController, trilogyTableViewController, ceTableViewController, technika1TableViewController, bsTableViewController, technika2TableViewController] - }() - - override func viewDidLoad() { - super.viewDidLoad() - } - - override func viewControllers(for pagerTabStripController: PagerTabStripViewController) -> [UIViewController] { - return recordViewControllers - } - - @IBAction func touchUpCancelButton(_ sender: UIButton) { - self.dismiss(animated: true, completion: nil) - } -} diff --git a/RespectU/Record/View/RecordCell.swift b/RespectU/Record/View/RecordCell.swift deleted file mode 100644 index c62b163..0000000 --- a/RespectU/Record/View/RecordCell.swift +++ /dev/null @@ -1,32 +0,0 @@ -// -// RecordCell.swift -// RespectU -// -// Created by Presto on 2018. 4. 4.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import UIKit - -class RecordCell: UITableViewCell { - - @IBOutlet weak var colorLabel: UILabel! - @IBOutlet weak var titleLabel: UILabel! - lazy var labels: [UILabel] = { - return [colorLabel, titleLabel] - }() - - override func awakeFromNib() { - super.awakeFromNib() - colorLabel.layer.cornerRadius = colorLabel.bounds.width / 2 - colorLabel.layer.masksToBounds = true - } - - func setProperties(_ object: SongInfo?) { - guard let object = object else { return } - let gradient = object.series.seriesGradient(.vertical) ?? CAGradientLayer() - gradient.frame = colorLabel.bounds - colorLabel.layer.addSublayer(gradient) - titleLabel.text = object.localizedTitle - } -} diff --git a/RespectU/Record/View/RecordView.swift b/RespectU/Record/View/RecordView.swift deleted file mode 100644 index e5b323f..0000000 --- a/RespectU/Record/View/RecordView.swift +++ /dev/null @@ -1,210 +0,0 @@ -// -// RecordView.swift -// RespectU -// -// Created by Presto on 2018. 3. 4.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import UIKit -import RealmSwift - -protocol RecordViewDelegate: class { - func didTouchUpTypeButton(_ sender: UIButton) - func presentRankAlert(difficulty: String, button: String) - func presentRateAlert(difficulty: String, button: String) - func presentNoteAlert(difficulty: String, button: String) - func didTouchUpCancelButton() -} - -class RecordView: UIView { - - weak var delegate: RecordViewDelegate? - @IBOutlet weak var titleLabel: UILabel! - @IBOutlet weak var skillPointLabel: UILabel! - @IBOutlet weak var buttonButton: UIButton! - @IBOutlet weak var normalRankButton: UIButton! - @IBOutlet weak var normalRateButton: UIButton! - @IBOutlet weak var normalNoteButton: UIButton! - @IBOutlet weak var hardRankButton: UIButton! - @IBOutlet weak var hardRateButton: UIButton! - @IBOutlet weak var hardNoteButton: UIButton! - @IBOutlet weak var maximumRankButton: UIButton! - @IBOutlet weak var maximumRateButton: UIButton! - @IBOutlet weak var maximumNoteButton: UIButton! - @IBOutlet weak var cancelButton: UIButton! - @IBOutlet weak var normalLabel: UILabel! - @IBOutlet weak var hardLabel: UILabel! - @IBOutlet weak var maximumLabel: UILabel! - @IBOutlet weak var rankingLabel: UILabel! - var levelLabels: [UILabel] { - return [normalLabel, hardLabel, maximumLabel] - } - var normalButtons: [UIButton] { - return [normalRankButton, normalRateButton, normalNoteButton] - } - var hardButtons: [UIButton] { - return [hardRankButton, hardRateButton, hardNoteButton] - } - var maximumButtons: [UIButton] { - return [maximumRankButton, maximumRateButton, maximumNoteButton] - } - - override func awakeFromNib() { - super.awakeFromNib() - self.layer.borderWidth = 1 - self.layer.cornerRadius = 15 - self.layer.borderColor = UIColor.lightGray.cgColor - self.cancelButton.setTitle("Cancel".localized, for: .normal) - self.cancelButton.addTarget(self, action: #selector(didTouchUpCancelButton(_:)), for: .touchUpInside) - } - - @IBAction func didTouchUpOtherButtons(_ sender: UIButton) { - let button = (buttonButton.title(for: .normal) ?? "4b").lowercased() - switch sender.tag { - case 0: - delegate?.presentRankAlert(difficulty: Difficulty.normal, button: button) - case 1: - delegate?.presentRateAlert(difficulty: Difficulty.normal, button: button) - case 2: - delegate?.presentNoteAlert(difficulty: Difficulty.normal, button: button) - case 3: - delegate?.presentRankAlert(difficulty: Difficulty.hard, button: button) - case 4: - delegate?.presentRateAlert(difficulty: Difficulty.hard, button: button) - case 5: - delegate?.presentNoteAlert(difficulty: Difficulty.hard, button: button) - case 6: - delegate?.presentRankAlert(difficulty: Difficulty.maximum, button: button) - case 7: - delegate?.presentRateAlert(difficulty: Difficulty.maximum, button: button) - case 8: - delegate?.presentNoteAlert(difficulty: Difficulty.maximum, button: button) - default: - break - } - } - - @IBAction func didTouchUpTypeButton(_ sender: UIButton) { - delegate?.didTouchUpTypeButton(sender) - } - - @IBAction func didTouchUpCancelButton(_ sender: UIButton) { - delegate?.didTouchUpCancelButton() - } -} - -extension RecordView { - func changeButtonProperties(_ object: NewRecordInfo, button: String) { - switch button { - case Buttons.button4: - self.buttonButton.setTitle(Buttons.button5.uppercased(), for: []) - reloadButtonsAndLabels(object, button: Buttons.button5) - case Buttons.button5: - self.buttonButton.setTitle(Buttons.button6.uppercased(), for: []) - reloadButtonsAndLabels(object, button: Buttons.button6) - case Buttons.button6: - self.buttonButton.setTitle(Buttons.button8.uppercased(), for: []) - reloadButtonsAndLabels(object, button: Buttons.button8) - case Buttons.button8: - self.buttonButton.setTitle(Buttons.button4.uppercased(), for: []) - reloadButtonsAndLabels(object, button: Buttons.button4) - default: - break - } - } - - func updateRankingAndSkillPointLabel(_ object: NewRecordInfo, button: String) { - updateSkillPointLabel(object, button: button) - updateRankingLabel(title: object.localizedTitle, button: button) - } - - func reloadButtonsAndLabels(_ object: NewRecordInfo, button: String) { - let predicate = NSPredicate(format: "%K == %@", #keyPath(SongInfo.title.english), object.title?.english ?? "") - guard let songResult = SongInfo.fetch().filter(predicate).first else { return } - self.buttonButton.setTitle(button.uppercased(), for: []) - self.titleLabel.text = object.localizedTitle - let normalButtons = [normalRankButton, normalRateButton, normalNoteButton] - let hardButtons = [hardRankButton, hardRateButton, hardNoteButton] - let maximumButtons = [maximumRankButton, maximumRateButton, maximumNoteButton] - for index in 0..<3 { - normalButtons[index]?.isEnabled = true - hardButtons[index]?.isEnabled = true - maximumButtons[index]?.isEnabled = true - } - guard let buttonExpansion = button.buttonExpansion else { return } - updateRankingLabel(title: object.localizedTitle, button: button) - self.updateSkillPointLabel(object, button: button) - guard let songButtonKeyPath = songResult.value(forKeyPath: buttonExpansion) as? SongButtonInfo else { return } - if songButtonKeyPath.normal == 0 { - for button in normalButtons { - button?.isEnabled = false - button?.setTitle("None".localized, for: []) - } - normalLabel.text = "-" - } else { - guard let recordButtonKeyPath = object.value(forKeyPath: buttonExpansion) as? NewRecordButtonInfo else { return } - let rank = recordButtonKeyPath.normal?.rank ?? "" - let rate = recordButtonKeyPath.normal?.rate ?? 0 - let note = recordButtonKeyPath.normal?.note ?? "" - normalRankButton.setTitle(rank == "" ? "-" : rank, for: []) - normalRateButton.setTitle(rate == 0 ? "-" : String(format: "%05.2f%%", rate), for: []) - normalNoteButton.setTitle(note == "" ? "-" : note, for: []) - normalLabel.text = "\(songButtonKeyPath.normal)" - } - if songButtonKeyPath.hard == 0 { - for button in hardButtons { - button?.isEnabled = false - button?.setTitle("None".localized, for: []) - } - hardLabel.text = "-" - } else { - guard let recordButtonKeyPath = object.value(forKeyPath: buttonExpansion) as? NewRecordButtonInfo else { return } - let rank = recordButtonKeyPath.hard?.rank ?? "" - let rate = recordButtonKeyPath.hard?.rate ?? 0 - let note = recordButtonKeyPath.hard?.note ?? "" - hardRankButton.setTitle(rank == "" ? "-" : rank, for: []) - hardRateButton.setTitle(rate == 0 ? "-" : String(format: "%05.2f%%", rate), for: []) - hardNoteButton.setTitle(note == "" ? "-" : note, for: []) - hardLabel.text = "\(songButtonKeyPath.hard)" - } - if songButtonKeyPath.maximum == 0 { - for button in maximumButtons { - button?.isEnabled = false - button?.setTitle("None".localized, for: []) - } - maximumLabel.text = "-" - } else { - guard let recordButtonKeyPath = object.value(forKeyPath: buttonExpansion) as? NewRecordButtonInfo else { return } - let rank = recordButtonKeyPath.maximum?.rank ?? "" - let rate = recordButtonKeyPath.maximum?.rate ?? 0 - let note = recordButtonKeyPath.maximum?.note ?? "" - maximumRankButton.setTitle(rank == "" ? "-" : rank, for: []) - maximumRateButton.setTitle(rate == 0 ? "-" : String(format: "%05.2f%%", rate), for: []) - maximumNoteButton.setTitle(note == "" ? "-" : note, for: []) - maximumLabel.text = "\(songButtonKeyPath.maximum)" - } - } -} - -extension RecordView { - private func updateSkillPointLabel(_ object: NewRecordInfo, button: String) { - guard let buttonExpansion = button.buttonExpansion else { return } - let keyPath = "\(buttonExpansion).skillPoint" - guard let value = object.value(forKeyPath: keyPath) as? Double else { return } - self.skillPointLabel.text = "\(value) " + "Point".localized - } - - private func updateRankingLabel(title: String, button: String) { - guard let buttonExpansion = button.buttonExpansion else { return } - let results = NewRecordInfo.fetch().sorted(byKeyPath: "\(buttonExpansion).skillPoint", ascending: false) - let predicate = NSPredicate(format: "%K == %@ OR %K == %@", #keyPath(NewRecordInfo.title.english), title, #keyPath(NewRecordInfo.title.korean), title) - guard let filtered = results.filter(predicate).first else { return } - guard let index = results.index(of: filtered) else { return } - if index < 50 { - self.rankingLabel.text = "#\(index + 1)" - } else { - self.rankingLabel.text = "Out of Rank".localized - } - } -} diff --git a/RespectU/Supporting Files/Assets.xcassets/AppIcon.appiconset/Contents.json b/RespectU/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/AppIcon.appiconset/Contents.json rename to RespectU/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/RespectU/Supporting Files/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/RespectU/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png rename to RespectU/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png diff --git a/RespectU/Supporting Files/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/RespectU/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png rename to RespectU/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png diff --git a/RespectU/Supporting Files/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/RespectU/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png rename to RespectU/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png diff --git a/RespectU/Supporting Files/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/RespectU/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png rename to RespectU/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png diff --git a/RespectU/Supporting Files/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/RespectU/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png rename to RespectU/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png diff --git a/RespectU/Supporting Files/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/RespectU/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png rename to RespectU/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png diff --git a/RespectU/Supporting Files/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/RespectU/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png rename to RespectU/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png diff --git a/RespectU/Supporting Files/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/RespectU/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png rename to RespectU/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png diff --git a/RespectU/Supporting Files/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/RespectU/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png rename to RespectU/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png diff --git a/RespectU/Supporting Files/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png b/RespectU/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png rename to RespectU/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png diff --git a/RespectU/Supporting Files/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png b/RespectU/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png rename to RespectU/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png diff --git a/RespectU/Supporting Files/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/RespectU/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png rename to RespectU/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png diff --git a/RespectU/Supporting Files/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/RespectU/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png rename to RespectU/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png diff --git a/RespectU/Supporting Files/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png b/RespectU/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png rename to RespectU/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png diff --git a/RespectU/Supporting Files/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png b/RespectU/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png rename to RespectU/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png diff --git a/RespectU/Supporting Files/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/RespectU/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png rename to RespectU/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png diff --git a/RespectU/Supporting Files/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/RespectU/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png rename to RespectU/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png diff --git a/RespectU/Supporting Files/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/RespectU/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png rename to RespectU/Resources/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png diff --git a/RespectU/Supporting Files/Assets.xcassets/AppIcon.appiconset/Icon-Small-50x50@1x.png b/RespectU/Resources/Assets.xcassets/AppIcon.appiconset/Icon-Small-50x50@1x.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/AppIcon.appiconset/Icon-Small-50x50@1x.png rename to RespectU/Resources/Assets.xcassets/AppIcon.appiconset/Icon-Small-50x50@1x.png diff --git a/RespectU/Supporting Files/Assets.xcassets/AppIcon.appiconset/Icon-Small-50x50@2x.png b/RespectU/Resources/Assets.xcassets/AppIcon.appiconset/Icon-Small-50x50@2x.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/AppIcon.appiconset/Icon-Small-50x50@2x.png rename to RespectU/Resources/Assets.xcassets/AppIcon.appiconset/Icon-Small-50x50@2x.png diff --git a/RespectU/Supporting Files/Assets.xcassets/AppIcon.appiconset/ItunesArtwork@2x.png b/RespectU/Resources/Assets.xcassets/AppIcon.appiconset/ItunesArtwork@2x.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/AppIcon.appiconset/ItunesArtwork@2x.png rename to RespectU/Resources/Assets.xcassets/AppIcon.appiconset/ItunesArtwork@2x.png diff --git a/RespectU/Supporting Files/Assets.xcassets/Contents.json b/RespectU/Resources/Assets.xcassets/Contents.json similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/Contents.json rename to RespectU/Resources/Assets.xcassets/Contents.json diff --git a/RespectU/Supporting Files/Assets.xcassets/achievement.imageset/Contents.json b/RespectU/Resources/Assets.xcassets/achievement.imageset/Contents.json similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/achievement.imageset/Contents.json rename to RespectU/Resources/Assets.xcassets/achievement.imageset/Contents.json diff --git a/RespectU/Supporting Files/Assets.xcassets/achievement.imageset/icons8-prize-100.png b/RespectU/Resources/Assets.xcassets/achievement.imageset/icons8-prize-100.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/achievement.imageset/icons8-prize-100.png rename to RespectU/Resources/Assets.xcassets/achievement.imageset/icons8-prize-100.png diff --git a/RespectU/Supporting Files/Assets.xcassets/achievement.imageset/icons8-prize-101.png b/RespectU/Resources/Assets.xcassets/achievement.imageset/icons8-prize-101.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/achievement.imageset/icons8-prize-101.png rename to RespectU/Resources/Assets.xcassets/achievement.imageset/icons8-prize-101.png diff --git a/RespectU/Supporting Files/Assets.xcassets/achievement.imageset/icons8-prize-102.png b/RespectU/Resources/Assets.xcassets/achievement.imageset/icons8-prize-102.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/achievement.imageset/icons8-prize-102.png rename to RespectU/Resources/Assets.xcassets/achievement.imageset/icons8-prize-102.png diff --git a/RespectU/Supporting Files/Assets.xcassets/backButton.imageset/Contents.json b/RespectU/Resources/Assets.xcassets/backButton.imageset/Contents.json similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/backButton.imageset/Contents.json rename to RespectU/Resources/Assets.xcassets/backButton.imageset/Contents.json diff --git a/RespectU/Supporting Files/Assets.xcassets/backButton.imageset/icons8-chevron_left_round-1.png b/RespectU/Resources/Assets.xcassets/backButton.imageset/icons8-chevron_left_round-1.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/backButton.imageset/icons8-chevron_left_round-1.png rename to RespectU/Resources/Assets.xcassets/backButton.imageset/icons8-chevron_left_round-1.png diff --git a/RespectU/Supporting Files/Assets.xcassets/backButton.imageset/icons8-chevron_left_round-2.png b/RespectU/Resources/Assets.xcassets/backButton.imageset/icons8-chevron_left_round-2.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/backButton.imageset/icons8-chevron_left_round-2.png rename to RespectU/Resources/Assets.xcassets/backButton.imageset/icons8-chevron_left_round-2.png diff --git a/RespectU/Supporting Files/Assets.xcassets/backButton.imageset/icons8-chevron_left_round.png b/RespectU/Resources/Assets.xcassets/backButton.imageset/icons8-chevron_left_round.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/backButton.imageset/icons8-chevron_left_round.png rename to RespectU/Resources/Assets.xcassets/backButton.imageset/icons8-chevron_left_round.png diff --git a/RespectU/Supporting Files/Assets.xcassets/bpmDefault.imageset/Contents.json b/RespectU/Resources/Assets.xcassets/bpmDefault.imageset/Contents.json similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/bpmDefault.imageset/Contents.json rename to RespectU/Resources/Assets.xcassets/bpmDefault.imageset/Contents.json diff --git a/RespectU/Supporting Files/Assets.xcassets/bpmDefault.imageset/icons8-speed-100.png b/RespectU/Resources/Assets.xcassets/bpmDefault.imageset/icons8-speed-100.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/bpmDefault.imageset/icons8-speed-100.png rename to RespectU/Resources/Assets.xcassets/bpmDefault.imageset/icons8-speed-100.png diff --git a/RespectU/Supporting Files/Assets.xcassets/bpmDefault.imageset/icons8-speed-101.png b/RespectU/Resources/Assets.xcassets/bpmDefault.imageset/icons8-speed-101.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/bpmDefault.imageset/icons8-speed-101.png rename to RespectU/Resources/Assets.xcassets/bpmDefault.imageset/icons8-speed-101.png diff --git a/RespectU/Supporting Files/Assets.xcassets/bpmDefault.imageset/icons8-speed-102.png b/RespectU/Resources/Assets.xcassets/bpmDefault.imageset/icons8-speed-102.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/bpmDefault.imageset/icons8-speed-102.png rename to RespectU/Resources/Assets.xcassets/bpmDefault.imageset/icons8-speed-102.png diff --git a/RespectU/Supporting Files/Assets.xcassets/cancelButton.imageset/Contents.json b/RespectU/Resources/Assets.xcassets/cancelButton.imageset/Contents.json similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/cancelButton.imageset/Contents.json rename to RespectU/Resources/Assets.xcassets/cancelButton.imageset/Contents.json diff --git a/RespectU/Supporting Files/Assets.xcassets/cancelButton.imageset/icons8-cancel-100-2.png b/RespectU/Resources/Assets.xcassets/cancelButton.imageset/icons8-cancel-100-2.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/cancelButton.imageset/icons8-cancel-100-2.png rename to RespectU/Resources/Assets.xcassets/cancelButton.imageset/icons8-cancel-100-2.png diff --git a/RespectU/Supporting Files/Assets.xcassets/cancelButton.imageset/icons8-cancel-100-3.png b/RespectU/Resources/Assets.xcassets/cancelButton.imageset/icons8-cancel-100-3.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/cancelButton.imageset/icons8-cancel-100-3.png rename to RespectU/Resources/Assets.xcassets/cancelButton.imageset/icons8-cancel-100-3.png diff --git a/RespectU/Supporting Files/Assets.xcassets/cancelButton.imageset/icons8-cancel-100-4.png b/RespectU/Resources/Assets.xcassets/cancelButton.imageset/icons8-cancel-100-4.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/cancelButton.imageset/icons8-cancel-100-4.png rename to RespectU/Resources/Assets.xcassets/cancelButton.imageset/icons8-cancel-100-4.png diff --git a/RespectU/Supporting Files/Assets.xcassets/trophies/Contents.json b/RespectU/Resources/Assets.xcassets/colors/Contents.json similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/trophies/Contents.json rename to RespectU/Resources/Assets.xcassets/colors/Contents.json diff --git a/RespectU/Resources/Assets.xcassets/colors/black50.colorset/Contents.json b/RespectU/Resources/Assets.xcassets/colors/black50.colorset/Contents.json new file mode 100644 index 0000000..b3b1eb8 --- /dev/null +++ b/RespectU/Resources/Assets.xcassets/colors/black50.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + }, + "colors" : [ + { + "idiom" : "universal", + "color" : { + "color-space" : "srgb", + "components" : { + "red" : "0x32", + "alpha" : "1.000", + "blue" : "0x32", + "green" : "0x32" + } + } + } + ] +} \ No newline at end of file diff --git a/RespectU/Resources/Assets.xcassets/colors/main.colorset/Contents.json b/RespectU/Resources/Assets.xcassets/colors/main.colorset/Contents.json new file mode 100644 index 0000000..3a8daf7 --- /dev/null +++ b/RespectU/Resources/Assets.xcassets/colors/main.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + }, + "colors" : [ + { + "idiom" : "universal", + "color" : { + "color-space" : "srgb", + "components" : { + "red" : "0xE8", + "alpha" : "1.000", + "blue" : "0x35", + "green" : "0xA2" + } + } + } + ] +} \ No newline at end of file diff --git a/RespectU/Resources/Assets.xcassets/colors/mission/Contents.json b/RespectU/Resources/Assets.xcassets/colors/mission/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/RespectU/Resources/Assets.xcassets/colors/mission/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/RespectU/Resources/Assets.xcassets/colors/mission/bs/Contents.json b/RespectU/Resources/Assets.xcassets/colors/mission/bs/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/RespectU/Resources/Assets.xcassets/colors/mission/bs/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/RespectU/Resources/Assets.xcassets/colors/mission/bs/absoluteSound.colorset/Contents.json b/RespectU/Resources/Assets.xcassets/colors/mission/bs/absoluteSound.colorset/Contents.json new file mode 100644 index 0000000..8080ce1 --- /dev/null +++ b/RespectU/Resources/Assets.xcassets/colors/mission/bs/absoluteSound.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + }, + "colors" : [ + { + "idiom" : "universal", + "color" : { + "color-space" : "srgb", + "components" : { + "red" : "0xCD", + "alpha" : "1.000", + "blue" : "0x9E", + "green" : "0x80" + } + } + } + ] +} \ No newline at end of file diff --git a/RespectU/Resources/Assets.xcassets/colors/mission/bs/stylishPerformance.colorset/Contents.json b/RespectU/Resources/Assets.xcassets/colors/mission/bs/stylishPerformance.colorset/Contents.json new file mode 100644 index 0000000..9af0d5d --- /dev/null +++ b/RespectU/Resources/Assets.xcassets/colors/mission/bs/stylishPerformance.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + }, + "colors" : [ + { + "idiom" : "universal", + "color" : { + "color-space" : "srgb", + "components" : { + "red" : "0x7F", + "alpha" : "1.000", + "blue" : "0xD0", + "green" : "0xA0" + } + } + } + ] +} \ No newline at end of file diff --git a/RespectU/Resources/Assets.xcassets/colors/mission/ce/Contents.json b/RespectU/Resources/Assets.xcassets/colors/mission/ce/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/RespectU/Resources/Assets.xcassets/colors/mission/ce/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/RespectU/Resources/Assets.xcassets/colors/mission/ce/electronicCity.colorset/Contents.json b/RespectU/Resources/Assets.xcassets/colors/mission/ce/electronicCity.colorset/Contents.json new file mode 100644 index 0000000..3508106 --- /dev/null +++ b/RespectU/Resources/Assets.xcassets/colors/mission/ce/electronicCity.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + }, + "colors" : [ + { + "idiom" : "universal", + "color" : { + "color-space" : "srgb", + "components" : { + "red" : "0xE2", + "alpha" : "1.000", + "blue" : "0x71", + "green" : "0xDF" + } + } + } + ] +} \ No newline at end of file diff --git a/RespectU/Resources/Assets.xcassets/colors/mission/ce/metropolis.colorset/Contents.json b/RespectU/Resources/Assets.xcassets/colors/mission/ce/metropolis.colorset/Contents.json new file mode 100644 index 0000000..1f7e5dc --- /dev/null +++ b/RespectU/Resources/Assets.xcassets/colors/mission/ce/metropolis.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + }, + "colors" : [ + { + "idiom" : "universal", + "color" : { + "color-space" : "srgb", + "components" : { + "red" : "0xB6", + "alpha" : "1.000", + "blue" : "0xCD", + "green" : "0xA1" + } + } + } + ] +} \ No newline at end of file diff --git a/RespectU/Resources/Assets.xcassets/colors/mission/linkDisk/Contents.json b/RespectU/Resources/Assets.xcassets/colors/mission/linkDisk/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/RespectU/Resources/Assets.xcassets/colors/mission/linkDisk/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/RespectU/Resources/Assets.xcassets/colors/mission/linkDisk/blackDisk.colorset/Contents.json b/RespectU/Resources/Assets.xcassets/colors/mission/linkDisk/blackDisk.colorset/Contents.json new file mode 100644 index 0000000..8b66f5d --- /dev/null +++ b/RespectU/Resources/Assets.xcassets/colors/mission/linkDisk/blackDisk.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + }, + "colors" : [ + { + "idiom" : "universal", + "color" : { + "color-space" : "srgb", + "components" : { + "red" : "0xA3", + "alpha" : "1.000", + "blue" : "0x6B", + "green" : "0x99" + } + } + } + ] +} \ No newline at end of file diff --git a/RespectU/Resources/Assets.xcassets/colors/mission/linkDisk/whiteDisk.colorset/Contents.json b/RespectU/Resources/Assets.xcassets/colors/mission/linkDisk/whiteDisk.colorset/Contents.json new file mode 100644 index 0000000..6199975 --- /dev/null +++ b/RespectU/Resources/Assets.xcassets/colors/mission/linkDisk/whiteDisk.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + }, + "colors" : [ + { + "idiom" : "universal", + "color" : { + "color-space" : "srgb", + "components" : { + "red" : "0xB4", + "alpha" : "1.000", + "blue" : "0x79", + "green" : "0x6E" + } + } + } + ] +} \ No newline at end of file diff --git a/RespectU/Resources/Assets.xcassets/colors/mission/respect/Contents.json b/RespectU/Resources/Assets.xcassets/colors/mission/respect/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/RespectU/Resources/Assets.xcassets/colors/mission/respect/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/RespectU/Resources/Assets.xcassets/colors/mission/respect/anotherWorld.colorset/Contents.json b/RespectU/Resources/Assets.xcassets/colors/mission/respect/anotherWorld.colorset/Contents.json new file mode 100644 index 0000000..5d44699 --- /dev/null +++ b/RespectU/Resources/Assets.xcassets/colors/mission/respect/anotherWorld.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + }, + "colors" : [ + { + "idiom" : "universal", + "color" : { + "color-space" : "srgb", + "components" : { + "red" : "0x71", + "alpha" : "1.000", + "blue" : "0xDE", + "green" : "0x96" + } + } + } + ] +} \ No newline at end of file diff --git a/RespectU/Resources/Assets.xcassets/colors/mission/respect/backStage.colorset/Contents.json b/RespectU/Resources/Assets.xcassets/colors/mission/respect/backStage.colorset/Contents.json new file mode 100644 index 0000000..0fb8f2a --- /dev/null +++ b/RespectU/Resources/Assets.xcassets/colors/mission/respect/backStage.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + }, + "colors" : [ + { + "idiom" : "universal", + "color" : { + "color-space" : "srgb", + "components" : { + "red" : "0xB4", + "alpha" : "1.000", + "blue" : "0xEB", + "green" : "0xA0" + } + } + } + ] +} \ No newline at end of file diff --git a/RespectU/Resources/Assets.xcassets/colors/mission/respect/chaosTheory.colorset/Contents.json b/RespectU/Resources/Assets.xcassets/colors/mission/respect/chaosTheory.colorset/Contents.json new file mode 100644 index 0000000..0a7d315 --- /dev/null +++ b/RespectU/Resources/Assets.xcassets/colors/mission/respect/chaosTheory.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + }, + "colors" : [ + { + "idiom" : "universal", + "color" : { + "color-space" : "srgb", + "components" : { + "red" : "0xB3", + "alpha" : "1.000", + "blue" : "0xE5", + "green" : "0x8C" + } + } + } + ] +} \ No newline at end of file diff --git a/RespectU/Resources/Assets.xcassets/colors/mission/respect/clubRoad645.colorset/Contents.json b/RespectU/Resources/Assets.xcassets/colors/mission/respect/clubRoad645.colorset/Contents.json new file mode 100644 index 0000000..9fb6ad5 --- /dev/null +++ b/RespectU/Resources/Assets.xcassets/colors/mission/respect/clubRoad645.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + }, + "colors" : [ + { + "idiom" : "universal", + "color" : { + "color-space" : "srgb", + "components" : { + "red" : "0x56", + "alpha" : "1.000", + "blue" : "0xF4", + "green" : "0xD8" + } + } + } + ] +} \ No newline at end of file diff --git a/RespectU/Resources/Assets.xcassets/colors/mission/respect/departure.colorset/Contents.json b/RespectU/Resources/Assets.xcassets/colors/mission/respect/departure.colorset/Contents.json new file mode 100644 index 0000000..599458d --- /dev/null +++ b/RespectU/Resources/Assets.xcassets/colors/mission/respect/departure.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + }, + "colors" : [ + { + "idiom" : "universal", + "color" : { + "color-space" : "srgb", + "components" : { + "red" : "0x4E", + "alpha" : "1.000", + "blue" : "0xBE", + "green" : "0xE7" + } + } + } + ] +} \ No newline at end of file diff --git a/RespectU/Resources/Assets.xcassets/colors/mission/respect/destination.colorset/Contents.json b/RespectU/Resources/Assets.xcassets/colors/mission/respect/destination.colorset/Contents.json new file mode 100644 index 0000000..5d0ccb6 --- /dev/null +++ b/RespectU/Resources/Assets.xcassets/colors/mission/respect/destination.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + }, + "colors" : [ + { + "idiom" : "universal", + "color" : { + "color-space" : "srgb", + "components" : { + "red" : "0xCB", + "alpha" : "1.000", + "blue" : "0x63", + "green" : "0x49" + } + } + } + ] +} \ No newline at end of file diff --git a/RespectU/Resources/Assets.xcassets/colors/mission/respect/developers.colorset/Contents.json b/RespectU/Resources/Assets.xcassets/colors/mission/respect/developers.colorset/Contents.json new file mode 100644 index 0000000..ec63fad --- /dev/null +++ b/RespectU/Resources/Assets.xcassets/colors/mission/respect/developers.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + }, + "colors" : [ + { + "idiom" : "universal", + "color" : { + "color-space" : "srgb", + "components" : { + "red" : "0xF5", + "alpha" : "1.000", + "blue" : "0xA7", + "green" : "0x55" + } + } + } + ] +} \ No newline at end of file diff --git a/RespectU/Resources/Assets.xcassets/colors/mission/respect/maxTheater.colorset/Contents.json b/RespectU/Resources/Assets.xcassets/colors/mission/respect/maxTheater.colorset/Contents.json new file mode 100644 index 0000000..f057813 --- /dev/null +++ b/RespectU/Resources/Assets.xcassets/colors/mission/respect/maxTheater.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + }, + "colors" : [ + { + "idiom" : "universal", + "color" : { + "color-space" : "srgb", + "components" : { + "red" : "0x4F", + "alpha" : "1.000", + "blue" : "0xE8", + "green" : "0xB2" + } + } + } + ] +} \ No newline at end of file diff --git a/RespectU/Resources/Assets.xcassets/colors/mission/respect/soundLab.colorset/Contents.json b/RespectU/Resources/Assets.xcassets/colors/mission/respect/soundLab.colorset/Contents.json new file mode 100644 index 0000000..da9d973 --- /dev/null +++ b/RespectU/Resources/Assets.xcassets/colors/mission/respect/soundLab.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + }, + "colors" : [ + { + "idiom" : "universal", + "color" : { + "color-space" : "srgb", + "components" : { + "red" : "0xD4", + "alpha" : "1.000", + "blue" : "0xEF", + "green" : "0x78" + } + } + } + ] +} \ No newline at end of file diff --git a/RespectU/Resources/Assets.xcassets/colors/mission/respect/visualizer.colorset/Contents.json b/RespectU/Resources/Assets.xcassets/colors/mission/respect/visualizer.colorset/Contents.json new file mode 100644 index 0000000..be8188e --- /dev/null +++ b/RespectU/Resources/Assets.xcassets/colors/mission/respect/visualizer.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + }, + "colors" : [ + { + "idiom" : "universal", + "color" : { + "color-space" : "srgb", + "components" : { + "red" : "0xE4", + "alpha" : "1.000", + "blue" : "0xE6", + "green" : "0x79" + } + } + } + ] +} \ No newline at end of file diff --git a/RespectU/Resources/Assets.xcassets/colors/mission/technika1/Contents.json b/RespectU/Resources/Assets.xcassets/colors/mission/technika1/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/RespectU/Resources/Assets.xcassets/colors/mission/technika1/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/RespectU/Resources/Assets.xcassets/colors/mission/technika1/platinumMixing.colorset/Contents.json b/RespectU/Resources/Assets.xcassets/colors/mission/technika1/platinumMixing.colorset/Contents.json new file mode 100644 index 0000000..d57d196 --- /dev/null +++ b/RespectU/Resources/Assets.xcassets/colors/mission/technika1/platinumMixing.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + }, + "colors" : [ + { + "idiom" : "universal", + "color" : { + "color-space" : "srgb", + "components" : { + "red" : "0xB6", + "alpha" : "1.000", + "blue" : "0xE5", + "green" : "0xD1" + } + } + } + ] +} \ No newline at end of file diff --git a/RespectU/Resources/Assets.xcassets/colors/mission/technika1/technicalMixing.colorset/Contents.json b/RespectU/Resources/Assets.xcassets/colors/mission/technika1/technicalMixing.colorset/Contents.json new file mode 100644 index 0000000..71977f5 --- /dev/null +++ b/RespectU/Resources/Assets.xcassets/colors/mission/technika1/technicalMixing.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + }, + "colors" : [ + { + "idiom" : "universal", + "color" : { + "color-space" : "srgb", + "components" : { + "red" : "0.890", + "alpha" : "1.000", + "blue" : "0.780", + "green" : "0.600" + } + } + } + ] +} \ No newline at end of file diff --git a/RespectU/Resources/Assets.xcassets/colors/mission/technika2/Contents.json b/RespectU/Resources/Assets.xcassets/colors/mission/technika2/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/RespectU/Resources/Assets.xcassets/colors/mission/technika2/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/RespectU/Resources/Assets.xcassets/colors/mission/technika2/clubMixing.colorset/Contents.json b/RespectU/Resources/Assets.xcassets/colors/mission/technika2/clubMixing.colorset/Contents.json new file mode 100644 index 0000000..95f25e8 --- /dev/null +++ b/RespectU/Resources/Assets.xcassets/colors/mission/technika2/clubMixing.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + }, + "colors" : [ + { + "idiom" : "universal", + "color" : { + "color-space" : "srgb", + "components" : { + "red" : "0xC7", + "alpha" : "1.000", + "blue" : "0x5D", + "green" : "0xB2" + } + } + } + ] +} \ No newline at end of file diff --git a/RespectU/Resources/Assets.xcassets/colors/mission/technika2/starMixing.colorset/Contents.json b/RespectU/Resources/Assets.xcassets/colors/mission/technika2/starMixing.colorset/Contents.json new file mode 100644 index 0000000..95f25e8 --- /dev/null +++ b/RespectU/Resources/Assets.xcassets/colors/mission/technika2/starMixing.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + }, + "colors" : [ + { + "idiom" : "universal", + "color" : { + "color-space" : "srgb", + "components" : { + "red" : "0xC7", + "alpha" : "1.000", + "blue" : "0x5D", + "green" : "0xB2" + } + } + } + ] +} \ No newline at end of file diff --git a/RespectU/Resources/Assets.xcassets/colors/mission/technika3/Contents.json b/RespectU/Resources/Assets.xcassets/colors/mission/technika3/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/RespectU/Resources/Assets.xcassets/colors/mission/technika3/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/RespectU/Resources/Assets.xcassets/colors/mission/technika3/crewChallenge.colorset/Contents.json b/RespectU/Resources/Assets.xcassets/colors/mission/technika3/crewChallenge.colorset/Contents.json new file mode 100644 index 0000000..b1dc3e2 --- /dev/null +++ b/RespectU/Resources/Assets.xcassets/colors/mission/technika3/crewChallenge.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + }, + "colors" : [ + { + "idiom" : "universal", + "color" : { + "color-space" : "srgb", + "components" : { + "red" : "118", + "alpha" : "1.000", + "blue" : "164", + "green" : "117" + } + } + } + ] +} \ No newline at end of file diff --git a/RespectU/Resources/Assets.xcassets/colors/mission/technika3/popMixing.colorset/Contents.json b/RespectU/Resources/Assets.xcassets/colors/mission/technika3/popMixing.colorset/Contents.json new file mode 100644 index 0000000..612ea35 --- /dev/null +++ b/RespectU/Resources/Assets.xcassets/colors/mission/technika3/popMixing.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + }, + "colors" : [ + { + "idiom" : "universal", + "color" : { + "color-space" : "srgb", + "components" : { + "red" : "107", + "alpha" : "1.000", + "blue" : "138", + "green" : "124" + } + } + } + ] +} \ No newline at end of file diff --git a/RespectU/Resources/Assets.xcassets/colors/mission/trilogy/Contents.json b/RespectU/Resources/Assets.xcassets/colors/mission/trilogy/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/RespectU/Resources/Assets.xcassets/colors/mission/trilogy/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/RespectU/Resources/Assets.xcassets/colors/mission/trilogy/rSide.colorset/Contents.json b/RespectU/Resources/Assets.xcassets/colors/mission/trilogy/rSide.colorset/Contents.json new file mode 100644 index 0000000..64805c4 --- /dev/null +++ b/RespectU/Resources/Assets.xcassets/colors/mission/trilogy/rSide.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + }, + "colors" : [ + { + "idiom" : "universal", + "color" : { + "color-space" : "srgb", + "components" : { + "red" : "0xA9", + "alpha" : "1.000", + "blue" : "0xDE", + "green" : "0x94" + } + } + } + ] +} \ No newline at end of file diff --git a/RespectU/Resources/Assets.xcassets/colors/mission/trilogy/tSide.colorset/Contents.json b/RespectU/Resources/Assets.xcassets/colors/mission/trilogy/tSide.colorset/Contents.json new file mode 100644 index 0000000..7331a7e --- /dev/null +++ b/RespectU/Resources/Assets.xcassets/colors/mission/trilogy/tSide.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + }, + "colors" : [ + { + "idiom" : "universal", + "color" : { + "color-space" : "srgb", + "components" : { + "red" : "0x8F", + "alpha" : "1.000", + "blue" : "0xD4", + "green" : "0xAD" + } + } + } + ] +} \ No newline at end of file diff --git a/RespectU/Resources/Assets.xcassets/colors/series/Contents.json b/RespectU/Resources/Assets.xcassets/colors/series/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/RespectU/Resources/Assets.xcassets/colors/series/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/RespectU/Resources/Assets.xcassets/colors/series/bs.colorset/Contents.json b/RespectU/Resources/Assets.xcassets/colors/series/bs.colorset/Contents.json new file mode 100644 index 0000000..1cb4105 --- /dev/null +++ b/RespectU/Resources/Assets.xcassets/colors/series/bs.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + }, + "colors" : [ + { + "idiom" : "universal", + "color" : { + "color-space" : "srgb", + "components" : { + "red" : "0xC9", + "alpha" : "1.000", + "blue" : "0x1C", + "green" : "0x13" + } + } + } + ] +} \ No newline at end of file diff --git a/RespectU/Resources/Assets.xcassets/colors/series/ce.colorset/Contents.json b/RespectU/Resources/Assets.xcassets/colors/series/ce.colorset/Contents.json new file mode 100644 index 0000000..cc78235 --- /dev/null +++ b/RespectU/Resources/Assets.xcassets/colors/series/ce.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + }, + "colors" : [ + { + "idiom" : "universal", + "color" : { + "color-space" : "srgb", + "components" : { + "red" : "0xFF", + "alpha" : "1.000", + "blue" : "0xDD", + "green" : "0xF8" + } + } + } + ] +} \ No newline at end of file diff --git a/RespectU/Resources/Assets.xcassets/colors/series/portable1.colorset/Contents.json b/RespectU/Resources/Assets.xcassets/colors/series/portable1.colorset/Contents.json new file mode 100644 index 0000000..04375c7 --- /dev/null +++ b/RespectU/Resources/Assets.xcassets/colors/series/portable1.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + }, + "colors" : [ + { + "idiom" : "universal", + "color" : { + "color-space" : "srgb", + "components" : { + "red" : "0.114", + "alpha" : "1.000", + "blue" : "0.824", + "green" : "0.706" + } + } + } + ] +} \ No newline at end of file diff --git a/RespectU/Resources/Assets.xcassets/colors/series/portable2.colorset/Contents.json b/RespectU/Resources/Assets.xcassets/colors/series/portable2.colorset/Contents.json new file mode 100644 index 0000000..4956869 --- /dev/null +++ b/RespectU/Resources/Assets.xcassets/colors/series/portable2.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + }, + "colors" : [ + { + "idiom" : "universal", + "color" : { + "color-space" : "srgb", + "components" : { + "red" : "0xFC", + "alpha" : "1.000", + "blue" : "0x2B", + "green" : "0x22" + } + } + } + ] +} \ No newline at end of file diff --git a/RespectU/Resources/Assets.xcassets/colors/series/respect.colorset/Contents.json b/RespectU/Resources/Assets.xcassets/colors/series/respect.colorset/Contents.json new file mode 100644 index 0000000..a8e47fd --- /dev/null +++ b/RespectU/Resources/Assets.xcassets/colors/series/respect.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + }, + "colors" : [ + { + "idiom" : "universal", + "color" : { + "color-space" : "srgb", + "components" : { + "red" : "0xF0", + "alpha" : "1.000", + "blue" : "0x2C", + "green" : "0xB3" + } + } + } + ] +} \ No newline at end of file diff --git a/RespectU/Resources/Assets.xcassets/colors/series/technika1.colorset/Contents.json b/RespectU/Resources/Assets.xcassets/colors/series/technika1.colorset/Contents.json new file mode 100644 index 0000000..5912171 --- /dev/null +++ b/RespectU/Resources/Assets.xcassets/colors/series/technika1.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + }, + "colors" : [ + { + "idiom" : "universal", + "color" : { + "color-space" : "srgb", + "components" : { + "red" : "0xEE", + "alpha" : "1.000", + "blue" : "0xBD", + "green" : "0x2C" + } + } + } + ] +} \ No newline at end of file diff --git a/RespectU/Resources/Assets.xcassets/colors/series/technika2.colorset/Contents.json b/RespectU/Resources/Assets.xcassets/colors/series/technika2.colorset/Contents.json new file mode 100644 index 0000000..071f7a7 --- /dev/null +++ b/RespectU/Resources/Assets.xcassets/colors/series/technika2.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + }, + "colors" : [ + { + "idiom" : "universal", + "color" : { + "color-space" : "srgb", + "components" : { + "red" : "0xAD", + "alpha" : "1.000", + "blue" : "0x21", + "green" : "0x58" + } + } + } + ] +} \ No newline at end of file diff --git a/RespectU/Resources/Assets.xcassets/colors/series/technika3.colorset/Contents.json b/RespectU/Resources/Assets.xcassets/colors/series/technika3.colorset/Contents.json new file mode 100644 index 0000000..aed5896 --- /dev/null +++ b/RespectU/Resources/Assets.xcassets/colors/series/technika3.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + }, + "colors" : [ + { + "idiom" : "universal", + "color" : { + "color-space" : "srgb", + "components" : { + "red" : "36", + "alpha" : "1.000", + "blue" : "102", + "green" : "66" + } + } + } + ] +} \ No newline at end of file diff --git a/RespectU/Resources/Assets.xcassets/colors/series/trilogy.colorset/Contents.json b/RespectU/Resources/Assets.xcassets/colors/series/trilogy.colorset/Contents.json new file mode 100644 index 0000000..6bfaa9a --- /dev/null +++ b/RespectU/Resources/Assets.xcassets/colors/series/trilogy.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + }, + "colors" : [ + { + "idiom" : "universal", + "color" : { + "color-space" : "srgb", + "components" : { + "red" : "0x73", + "alpha" : "1.000", + "blue" : "0xFC", + "green" : "0x8B" + } + } + } + ] +} \ No newline at end of file diff --git a/RespectU/Resources/Assets.xcassets/colors/sub.colorset/Contents.json b/RespectU/Resources/Assets.xcassets/colors/sub.colorset/Contents.json new file mode 100644 index 0000000..2ffbb30 --- /dev/null +++ b/RespectU/Resources/Assets.xcassets/colors/sub.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + }, + "colors" : [ + { + "idiom" : "universal", + "color" : { + "color-space" : "srgb", + "components" : { + "red" : "0xFF", + "alpha" : "1.000", + "blue" : "0x9E", + "green" : "0xD6" + } + } + } + ] +} \ No newline at end of file diff --git a/RespectU/Resources/Assets.xcassets/colors/trophy/Contents.json b/RespectU/Resources/Assets.xcassets/colors/trophy/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/RespectU/Resources/Assets.xcassets/colors/trophy/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/RespectU/Resources/Assets.xcassets/colors/trophy/bronze.colorset/Contents.json b/RespectU/Resources/Assets.xcassets/colors/trophy/bronze.colorset/Contents.json new file mode 100644 index 0000000..6c30df0 --- /dev/null +++ b/RespectU/Resources/Assets.xcassets/colors/trophy/bronze.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + }, + "colors" : [ + { + "idiom" : "universal", + "color" : { + "color-space" : "srgb", + "components" : { + "red" : "0xCD", + "alpha" : "1.000", + "blue" : "0x32", + "green" : "0x7F" + } + } + } + ] +} \ No newline at end of file diff --git a/RespectU/Resources/Assets.xcassets/colors/trophy/gold.colorset/Contents.json b/RespectU/Resources/Assets.xcassets/colors/trophy/gold.colorset/Contents.json new file mode 100644 index 0000000..55cbf4f --- /dev/null +++ b/RespectU/Resources/Assets.xcassets/colors/trophy/gold.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + }, + "colors" : [ + { + "idiom" : "universal", + "color" : { + "color-space" : "srgb", + "components" : { + "red" : "0xD4", + "alpha" : "1.000", + "blue" : "0x37", + "green" : "0xAF" + } + } + } + ] +} \ No newline at end of file diff --git a/RespectU/Resources/Assets.xcassets/colors/trophy/platinum.colorset/Contents.json b/RespectU/Resources/Assets.xcassets/colors/trophy/platinum.colorset/Contents.json new file mode 100644 index 0000000..8d17213 --- /dev/null +++ b/RespectU/Resources/Assets.xcassets/colors/trophy/platinum.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + }, + "colors" : [ + { + "idiom" : "universal", + "color" : { + "color-space" : "srgb", + "components" : { + "red" : "0xE5", + "alpha" : "1.000", + "blue" : "0xE2", + "green" : "0xE4" + } + } + } + ] +} \ No newline at end of file diff --git a/RespectU/Resources/Assets.xcassets/colors/trophy/silver.colorset/Contents.json b/RespectU/Resources/Assets.xcassets/colors/trophy/silver.colorset/Contents.json new file mode 100644 index 0000000..059fe80 --- /dev/null +++ b/RespectU/Resources/Assets.xcassets/colors/trophy/silver.colorset/Contents.json @@ -0,0 +1,20 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + }, + "colors" : [ + { + "idiom" : "universal", + "color" : { + "color-space" : "srgb", + "components" : { + "red" : "0xC0", + "alpha" : "1.000", + "blue" : "0xC0", + "green" : "0xC0" + } + } + } + ] +} \ No newline at end of file diff --git a/RespectU/Supporting Files/Assets.xcassets/credit.imageset/Contents.json b/RespectU/Resources/Assets.xcassets/credit.imageset/Contents.json similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/credit.imageset/Contents.json rename to RespectU/Resources/Assets.xcassets/credit.imageset/Contents.json diff --git a/RespectU/Supporting Files/Assets.xcassets/credit.imageset/icons8-developer-100.png b/RespectU/Resources/Assets.xcassets/credit.imageset/icons8-developer-100.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/credit.imageset/icons8-developer-100.png rename to RespectU/Resources/Assets.xcassets/credit.imageset/icons8-developer-100.png diff --git a/RespectU/Supporting Files/Assets.xcassets/credit.imageset/icons8-developer-101.png b/RespectU/Resources/Assets.xcassets/credit.imageset/icons8-developer-101.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/credit.imageset/icons8-developer-101.png rename to RespectU/Resources/Assets.xcassets/credit.imageset/icons8-developer-101.png diff --git a/RespectU/Supporting Files/Assets.xcassets/credit.imageset/icons8-developer-102.png b/RespectU/Resources/Assets.xcassets/credit.imageset/icons8-developer-102.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/credit.imageset/icons8-developer-102.png rename to RespectU/Resources/Assets.xcassets/credit.imageset/icons8-developer-102.png diff --git a/RespectU/Supporting Files/Assets.xcassets/download.imageset/Contents.json b/RespectU/Resources/Assets.xcassets/download.imageset/Contents.json similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/download.imageset/Contents.json rename to RespectU/Resources/Assets.xcassets/download.imageset/Contents.json diff --git a/RespectU/Supporting Files/Assets.xcassets/download.imageset/icons8-download_from_cloud-1.png b/RespectU/Resources/Assets.xcassets/download.imageset/icons8-download_from_cloud-1.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/download.imageset/icons8-download_from_cloud-1.png rename to RespectU/Resources/Assets.xcassets/download.imageset/icons8-download_from_cloud-1.png diff --git a/RespectU/Supporting Files/Assets.xcassets/download.imageset/icons8-download_from_cloud-2.png b/RespectU/Resources/Assets.xcassets/download.imageset/icons8-download_from_cloud-2.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/download.imageset/icons8-download_from_cloud-2.png rename to RespectU/Resources/Assets.xcassets/download.imageset/icons8-download_from_cloud-2.png diff --git a/RespectU/Supporting Files/Assets.xcassets/download.imageset/icons8-download_from_cloud.png b/RespectU/Resources/Assets.xcassets/download.imageset/icons8-download_from_cloud.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/download.imageset/icons8-download_from_cloud.png rename to RespectU/Resources/Assets.xcassets/download.imageset/icons8-download_from_cloud.png diff --git a/RespectU/Supporting Files/Assets.xcassets/email.imageset/Contents.json b/RespectU/Resources/Assets.xcassets/email.imageset/Contents.json similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/email.imageset/Contents.json rename to RespectU/Resources/Assets.xcassets/email.imageset/Contents.json diff --git a/RespectU/Supporting Files/Assets.xcassets/email.imageset/icons8-new-post-100.png b/RespectU/Resources/Assets.xcassets/email.imageset/icons8-new-post-100.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/email.imageset/icons8-new-post-100.png rename to RespectU/Resources/Assets.xcassets/email.imageset/icons8-new-post-100.png diff --git a/RespectU/Supporting Files/Assets.xcassets/email.imageset/icons8-new-post-101.png b/RespectU/Resources/Assets.xcassets/email.imageset/icons8-new-post-101.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/email.imageset/icons8-new-post-101.png rename to RespectU/Resources/Assets.xcassets/email.imageset/icons8-new-post-101.png diff --git a/RespectU/Supporting Files/Assets.xcassets/email.imageset/icons8-new-post-102.png b/RespectU/Resources/Assets.xcassets/email.imageset/icons8-new-post-102.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/email.imageset/icons8-new-post-102.png rename to RespectU/Resources/Assets.xcassets/email.imageset/icons8-new-post-102.png diff --git a/RespectU/Supporting Files/Assets.xcassets/fail.imageset/Contents.json b/RespectU/Resources/Assets.xcassets/fail.imageset/Contents.json similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/fail.imageset/Contents.json rename to RespectU/Resources/Assets.xcassets/fail.imageset/Contents.json diff --git a/RespectU/Supporting Files/Assets.xcassets/fail.imageset/icons8-Cancel-100.png b/RespectU/Resources/Assets.xcassets/fail.imageset/icons8-Cancel-100.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/fail.imageset/icons8-Cancel-100.png rename to RespectU/Resources/Assets.xcassets/fail.imageset/icons8-Cancel-100.png diff --git a/RespectU/Supporting Files/Assets.xcassets/fail.imageset/icons8-Cancel-101.png b/RespectU/Resources/Assets.xcassets/fail.imageset/icons8-Cancel-101.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/fail.imageset/icons8-Cancel-101.png rename to RespectU/Resources/Assets.xcassets/fail.imageset/icons8-Cancel-101.png diff --git a/RespectU/Supporting Files/Assets.xcassets/fail.imageset/icons8-Cancel-102.png b/RespectU/Resources/Assets.xcassets/fail.imageset/icons8-Cancel-102.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/fail.imageset/icons8-Cancel-102.png rename to RespectU/Resources/Assets.xcassets/fail.imageset/icons8-Cancel-102.png diff --git a/RespectU/Supporting Files/Assets.xcassets/favorite.imageset/Contents.json b/RespectU/Resources/Assets.xcassets/favorite.imageset/Contents.json similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/favorite.imageset/Contents.json rename to RespectU/Resources/Assets.xcassets/favorite.imageset/Contents.json diff --git a/RespectU/Supporting Files/Assets.xcassets/favorite.imageset/icons8-star-100.png b/RespectU/Resources/Assets.xcassets/favorite.imageset/icons8-star-100.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/favorite.imageset/icons8-star-100.png rename to RespectU/Resources/Assets.xcassets/favorite.imageset/icons8-star-100.png diff --git a/RespectU/Supporting Files/Assets.xcassets/favorite.imageset/icons8-star-101.png b/RespectU/Resources/Assets.xcassets/favorite.imageset/icons8-star-101.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/favorite.imageset/icons8-star-101.png rename to RespectU/Resources/Assets.xcassets/favorite.imageset/icons8-star-101.png diff --git a/RespectU/Supporting Files/Assets.xcassets/favorite.imageset/icons8-star-102.png b/RespectU/Resources/Assets.xcassets/favorite.imageset/icons8-star-102.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/favorite.imageset/icons8-star-102.png rename to RespectU/Resources/Assets.xcassets/favorite.imageset/icons8-star-102.png diff --git a/RespectU/Supporting Files/Assets.xcassets/info.imageset/Contents.json b/RespectU/Resources/Assets.xcassets/info.imageset/Contents.json similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/info.imageset/Contents.json rename to RespectU/Resources/Assets.xcassets/info.imageset/Contents.json diff --git a/RespectU/Supporting Files/Assets.xcassets/info.imageset/icons8-Info-100.png b/RespectU/Resources/Assets.xcassets/info.imageset/icons8-Info-100.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/info.imageset/icons8-Info-100.png rename to RespectU/Resources/Assets.xcassets/info.imageset/icons8-Info-100.png diff --git a/RespectU/Supporting Files/Assets.xcassets/info.imageset/icons8-Info-101.png b/RespectU/Resources/Assets.xcassets/info.imageset/icons8-Info-101.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/info.imageset/icons8-Info-101.png rename to RespectU/Resources/Assets.xcassets/info.imageset/icons8-Info-101.png diff --git a/RespectU/Supporting Files/Assets.xcassets/info.imageset/icons8-Info-102.png b/RespectU/Resources/Assets.xcassets/info.imageset/icons8-Info-102.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/info.imageset/icons8-Info-102.png rename to RespectU/Resources/Assets.xcassets/info.imageset/icons8-Info-102.png diff --git a/RespectU/Supporting Files/Assets.xcassets/log.imageset/Contents.json b/RespectU/Resources/Assets.xcassets/log.imageset/Contents.json similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/log.imageset/Contents.json rename to RespectU/Resources/Assets.xcassets/log.imageset/Contents.json diff --git a/RespectU/Supporting Files/Assets.xcassets/log.imageset/icons8-edit-property-100.png b/RespectU/Resources/Assets.xcassets/log.imageset/icons8-edit-property-100.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/log.imageset/icons8-edit-property-100.png rename to RespectU/Resources/Assets.xcassets/log.imageset/icons8-edit-property-100.png diff --git a/RespectU/Supporting Files/Assets.xcassets/log.imageset/icons8-edit-property-101.png b/RespectU/Resources/Assets.xcassets/log.imageset/icons8-edit-property-101.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/log.imageset/icons8-edit-property-101.png rename to RespectU/Resources/Assets.xcassets/log.imageset/icons8-edit-property-101.png diff --git a/RespectU/Supporting Files/Assets.xcassets/log.imageset/icons8-edit-property-102.png b/RespectU/Resources/Assets.xcassets/log.imageset/icons8-edit-property-102.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/log.imageset/icons8-edit-property-102.png rename to RespectU/Resources/Assets.xcassets/log.imageset/icons8-edit-property-102.png diff --git a/RespectU/Supporting Files/Assets.xcassets/manual.imageset/Contents.json b/RespectU/Resources/Assets.xcassets/manual.imageset/Contents.json similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/manual.imageset/Contents.json rename to RespectU/Resources/Assets.xcassets/manual.imageset/Contents.json diff --git a/RespectU/Supporting Files/Assets.xcassets/manual.imageset/icons8-user_manual-1.png b/RespectU/Resources/Assets.xcassets/manual.imageset/icons8-user_manual-1.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/manual.imageset/icons8-user_manual-1.png rename to RespectU/Resources/Assets.xcassets/manual.imageset/icons8-user_manual-1.png diff --git a/RespectU/Supporting Files/Assets.xcassets/manual.imageset/icons8-user_manual-2.png b/RespectU/Resources/Assets.xcassets/manual.imageset/icons8-user_manual-2.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/manual.imageset/icons8-user_manual-2.png rename to RespectU/Resources/Assets.xcassets/manual.imageset/icons8-user_manual-2.png diff --git a/RespectU/Supporting Files/Assets.xcassets/manual.imageset/icons8-user_manual.png b/RespectU/Resources/Assets.xcassets/manual.imageset/icons8-user_manual.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/manual.imageset/icons8-user_manual.png rename to RespectU/Resources/Assets.xcassets/manual.imageset/icons8-user_manual.png diff --git a/RespectU/Supporting Files/Assets.xcassets/mission.imageset/Contents.json b/RespectU/Resources/Assets.xcassets/mission.imageset/Contents.json similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/mission.imageset/Contents.json rename to RespectU/Resources/Assets.xcassets/mission.imageset/Contents.json diff --git a/RespectU/Supporting Files/Assets.xcassets/mission.imageset/icons8-Mission-100.png b/RespectU/Resources/Assets.xcassets/mission.imageset/icons8-Mission-100.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/mission.imageset/icons8-Mission-100.png rename to RespectU/Resources/Assets.xcassets/mission.imageset/icons8-Mission-100.png diff --git a/RespectU/Supporting Files/Assets.xcassets/mission.imageset/icons8-Mission-101.png b/RespectU/Resources/Assets.xcassets/mission.imageset/icons8-Mission-101.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/mission.imageset/icons8-Mission-101.png rename to RespectU/Resources/Assets.xcassets/mission.imageset/icons8-Mission-101.png diff --git a/RespectU/Supporting Files/Assets.xcassets/mission.imageset/icons8-Mission-102.png b/RespectU/Resources/Assets.xcassets/mission.imageset/icons8-Mission-102.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/mission.imageset/icons8-Mission-102.png rename to RespectU/Resources/Assets.xcassets/mission.imageset/icons8-Mission-102.png diff --git a/RespectU/Supporting Files/Assets.xcassets/more.imageset/Contents.json b/RespectU/Resources/Assets.xcassets/more.imageset/Contents.json similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/more.imageset/Contents.json rename to RespectU/Resources/Assets.xcassets/more.imageset/Contents.json diff --git a/RespectU/Supporting Files/Assets.xcassets/more.imageset/icons8-More-104.png b/RespectU/Resources/Assets.xcassets/more.imageset/icons8-More-104.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/more.imageset/icons8-More-104.png rename to RespectU/Resources/Assets.xcassets/more.imageset/icons8-More-104.png diff --git a/RespectU/Supporting Files/Assets.xcassets/more.imageset/icons8-More-105.png b/RespectU/Resources/Assets.xcassets/more.imageset/icons8-More-105.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/more.imageset/icons8-More-105.png rename to RespectU/Resources/Assets.xcassets/more.imageset/icons8-More-105.png diff --git a/RespectU/Supporting Files/Assets.xcassets/more.imageset/icons8-More-106.png b/RespectU/Resources/Assets.xcassets/more.imageset/icons8-More-106.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/more.imageset/icons8-More-106.png rename to RespectU/Resources/Assets.xcassets/more.imageset/icons8-More-106.png diff --git a/RespectU/Supporting Files/Assets.xcassets/nextButton.imageset/Contents.json b/RespectU/Resources/Assets.xcassets/nextButton.imageset/Contents.json similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/nextButton.imageset/Contents.json rename to RespectU/Resources/Assets.xcassets/nextButton.imageset/Contents.json diff --git a/RespectU/Supporting Files/Assets.xcassets/nextButton.imageset/icons8-next-page-100.png b/RespectU/Resources/Assets.xcassets/nextButton.imageset/icons8-next-page-100.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/nextButton.imageset/icons8-next-page-100.png rename to RespectU/Resources/Assets.xcassets/nextButton.imageset/icons8-next-page-100.png diff --git a/RespectU/Supporting Files/Assets.xcassets/nextButton.imageset/icons8-next-page-101.png b/RespectU/Resources/Assets.xcassets/nextButton.imageset/icons8-next-page-101.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/nextButton.imageset/icons8-next-page-101.png rename to RespectU/Resources/Assets.xcassets/nextButton.imageset/icons8-next-page-101.png diff --git a/RespectU/Supporting Files/Assets.xcassets/nextButton.imageset/icons8-next-page-102.png b/RespectU/Resources/Assets.xcassets/nextButton.imageset/icons8-next-page-102.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/nextButton.imageset/icons8-next-page-102.png rename to RespectU/Resources/Assets.xcassets/nextButton.imageset/icons8-next-page-102.png diff --git a/RespectU/Supporting Files/Assets.xcassets/question.imageset/Contents.json b/RespectU/Resources/Assets.xcassets/question.imageset/Contents.json similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/question.imageset/Contents.json rename to RespectU/Resources/Assets.xcassets/question.imageset/Contents.json diff --git a/RespectU/Supporting Files/Assets.xcassets/question.imageset/icons8-help-96.png b/RespectU/Resources/Assets.xcassets/question.imageset/icons8-help-96.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/question.imageset/icons8-help-96.png rename to RespectU/Resources/Assets.xcassets/question.imageset/icons8-help-96.png diff --git a/RespectU/Supporting Files/Assets.xcassets/question.imageset/icons8-help-97.png b/RespectU/Resources/Assets.xcassets/question.imageset/icons8-help-97.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/question.imageset/icons8-help-97.png rename to RespectU/Resources/Assets.xcassets/question.imageset/icons8-help-97.png diff --git a/RespectU/Supporting Files/Assets.xcassets/question.imageset/icons8-help-98.png b/RespectU/Resources/Assets.xcassets/question.imageset/icons8-help-98.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/question.imageset/icons8-help-98.png rename to RespectU/Resources/Assets.xcassets/question.imageset/icons8-help-98.png diff --git a/RespectU/Supporting Files/Assets.xcassets/radio.imageset/Contents.json b/RespectU/Resources/Assets.xcassets/radio.imageset/Contents.json similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/radio.imageset/Contents.json rename to RespectU/Resources/Assets.xcassets/radio.imageset/Contents.json diff --git a/RespectU/Supporting Files/Assets.xcassets/radio.imageset/icons8-radio-station-100.png b/RespectU/Resources/Assets.xcassets/radio.imageset/icons8-radio-station-100.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/radio.imageset/icons8-radio-station-100.png rename to RespectU/Resources/Assets.xcassets/radio.imageset/icons8-radio-station-100.png diff --git a/RespectU/Supporting Files/Assets.xcassets/radio.imageset/icons8-radio-station-101.png b/RespectU/Resources/Assets.xcassets/radio.imageset/icons8-radio-station-101.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/radio.imageset/icons8-radio-station-101.png rename to RespectU/Resources/Assets.xcassets/radio.imageset/icons8-radio-station-101.png diff --git a/RespectU/Supporting Files/Assets.xcassets/radio.imageset/icons8-radio-station-102.png b/RespectU/Resources/Assets.xcassets/radio.imageset/icons8-radio-station-102.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/radio.imageset/icons8-radio-station-102.png rename to RespectU/Resources/Assets.xcassets/radio.imageset/icons8-radio-station-102.png diff --git a/RespectU/Supporting Files/Assets.xcassets/random.imageset/Contents.json b/RespectU/Resources/Assets.xcassets/random.imageset/Contents.json similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/random.imageset/Contents.json rename to RespectU/Resources/Assets.xcassets/random.imageset/Contents.json diff --git a/RespectU/Supporting Files/Assets.xcassets/random.imageset/icons8-shuffle-96.png b/RespectU/Resources/Assets.xcassets/random.imageset/icons8-shuffle-96.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/random.imageset/icons8-shuffle-96.png rename to RespectU/Resources/Assets.xcassets/random.imageset/icons8-shuffle-96.png diff --git a/RespectU/Supporting Files/Assets.xcassets/random.imageset/icons8-shuffle-97.png b/RespectU/Resources/Assets.xcassets/random.imageset/icons8-shuffle-97.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/random.imageset/icons8-shuffle-97.png rename to RespectU/Resources/Assets.xcassets/random.imageset/icons8-shuffle-97.png diff --git a/RespectU/Supporting Files/Assets.xcassets/random.imageset/icons8-shuffle-98.png b/RespectU/Resources/Assets.xcassets/random.imageset/icons8-shuffle-98.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/random.imageset/icons8-shuffle-98.png rename to RespectU/Resources/Assets.xcassets/random.imageset/icons8-shuffle-98.png diff --git a/RespectU/Supporting Files/Assets.xcassets/rate.imageset/Contents.json b/RespectU/Resources/Assets.xcassets/rate.imageset/Contents.json similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/rate.imageset/Contents.json rename to RespectU/Resources/Assets.xcassets/rate.imageset/Contents.json diff --git a/RespectU/Supporting Files/Assets.xcassets/rate.imageset/icons8-test_results-1.png b/RespectU/Resources/Assets.xcassets/rate.imageset/icons8-test_results-1.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/rate.imageset/icons8-test_results-1.png rename to RespectU/Resources/Assets.xcassets/rate.imageset/icons8-test_results-1.png diff --git a/RespectU/Supporting Files/Assets.xcassets/rate.imageset/icons8-test_results-2.png b/RespectU/Resources/Assets.xcassets/rate.imageset/icons8-test_results-2.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/rate.imageset/icons8-test_results-2.png rename to RespectU/Resources/Assets.xcassets/rate.imageset/icons8-test_results-2.png diff --git a/RespectU/Supporting Files/Assets.xcassets/rate.imageset/icons8-test_results.png b/RespectU/Resources/Assets.xcassets/rate.imageset/icons8-test_results.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/rate.imageset/icons8-test_results.png rename to RespectU/Resources/Assets.xcassets/rate.imageset/icons8-test_results.png diff --git a/RespectU/Supporting Files/Assets.xcassets/respectuColor.imageset/Contents.json b/RespectU/Resources/Assets.xcassets/respectuColor.imageset/Contents.json similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/respectuColor.imageset/Contents.json rename to RespectU/Resources/Assets.xcassets/respectuColor.imageset/Contents.json diff --git a/RespectU/Supporting Files/Assets.xcassets/respectuColor.imageset/respectu-3d-color-1.png b/RespectU/Resources/Assets.xcassets/respectuColor.imageset/respectu-3d-color-1.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/respectuColor.imageset/respectu-3d-color-1.png rename to RespectU/Resources/Assets.xcassets/respectuColor.imageset/respectu-3d-color-1.png diff --git a/RespectU/Supporting Files/Assets.xcassets/respectuColor.imageset/respectu-3d-color-2.png b/RespectU/Resources/Assets.xcassets/respectuColor.imageset/respectu-3d-color-2.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/respectuColor.imageset/respectu-3d-color-2.png rename to RespectU/Resources/Assets.xcassets/respectuColor.imageset/respectu-3d-color-2.png diff --git a/RespectU/Supporting Files/Assets.xcassets/respectuColor.imageset/respectu-3d-color.png b/RespectU/Resources/Assets.xcassets/respectuColor.imageset/respectu-3d-color.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/respectuColor.imageset/respectu-3d-color.png rename to RespectU/Resources/Assets.xcassets/respectuColor.imageset/respectu-3d-color.png diff --git a/RespectU/Supporting Files/Assets.xcassets/search.imageset/Contents.json b/RespectU/Resources/Assets.xcassets/search.imageset/Contents.json similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/search.imageset/Contents.json rename to RespectU/Resources/Assets.xcassets/search.imageset/Contents.json diff --git a/RespectU/Supporting Files/Assets.xcassets/search.imageset/icons8-search_filled-1.png b/RespectU/Resources/Assets.xcassets/search.imageset/icons8-search_filled-1.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/search.imageset/icons8-search_filled-1.png rename to RespectU/Resources/Assets.xcassets/search.imageset/icons8-search_filled-1.png diff --git a/RespectU/Supporting Files/Assets.xcassets/search.imageset/icons8-search_filled-2.png b/RespectU/Resources/Assets.xcassets/search.imageset/icons8-search_filled-2.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/search.imageset/icons8-search_filled-2.png rename to RespectU/Resources/Assets.xcassets/search.imageset/icons8-search_filled-2.png diff --git a/RespectU/Supporting Files/Assets.xcassets/search.imageset/icons8-search_filled.png b/RespectU/Resources/Assets.xcassets/search.imageset/icons8-search_filled.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/search.imageset/icons8-search_filled.png rename to RespectU/Resources/Assets.xcassets/search.imageset/icons8-search_filled.png diff --git a/RespectU/Supporting Files/Assets.xcassets/shareButton.imageset/Contents.json b/RespectU/Resources/Assets.xcassets/shareButton.imageset/Contents.json similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/shareButton.imageset/Contents.json rename to RespectU/Resources/Assets.xcassets/shareButton.imageset/Contents.json diff --git a/RespectU/Supporting Files/Assets.xcassets/shareButton.imageset/icons8-share-1.png b/RespectU/Resources/Assets.xcassets/shareButton.imageset/icons8-share-1.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/shareButton.imageset/icons8-share-1.png rename to RespectU/Resources/Assets.xcassets/shareButton.imageset/icons8-share-1.png diff --git a/RespectU/Supporting Files/Assets.xcassets/shareButton.imageset/icons8-share-2.png b/RespectU/Resources/Assets.xcassets/shareButton.imageset/icons8-share-2.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/shareButton.imageset/icons8-share-2.png rename to RespectU/Resources/Assets.xcassets/shareButton.imageset/icons8-share-2.png diff --git a/RespectU/Supporting Files/Assets.xcassets/shareButton.imageset/icons8-share.png b/RespectU/Resources/Assets.xcassets/shareButton.imageset/icons8-share.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/shareButton.imageset/icons8-share.png rename to RespectU/Resources/Assets.xcassets/shareButton.imageset/icons8-share.png diff --git a/RespectU/Supporting Files/Assets.xcassets/song.imageset/Contents.json b/RespectU/Resources/Assets.xcassets/song.imageset/Contents.json similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/song.imageset/Contents.json rename to RespectU/Resources/Assets.xcassets/song.imageset/Contents.json diff --git a/RespectU/Supporting Files/Assets.xcassets/song.imageset/icons8-Music Record-100.png b/RespectU/Resources/Assets.xcassets/song.imageset/icons8-Music Record-100.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/song.imageset/icons8-Music Record-100.png rename to RespectU/Resources/Assets.xcassets/song.imageset/icons8-Music Record-100.png diff --git a/RespectU/Supporting Files/Assets.xcassets/song.imageset/icons8-Music Record-101.png b/RespectU/Resources/Assets.xcassets/song.imageset/icons8-Music Record-101.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/song.imageset/icons8-Music Record-101.png rename to RespectU/Resources/Assets.xcassets/song.imageset/icons8-Music Record-101.png diff --git a/RespectU/Supporting Files/Assets.xcassets/song.imageset/icons8-Music Record-102.png b/RespectU/Resources/Assets.xcassets/song.imageset/icons8-Music Record-102.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/song.imageset/icons8-Music Record-102.png rename to RespectU/Resources/Assets.xcassets/song.imageset/icons8-Music Record-102.png diff --git a/RespectU/Supporting Files/Assets.xcassets/sort.imageset/Contents.json b/RespectU/Resources/Assets.xcassets/sort.imageset/Contents.json similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/sort.imageset/Contents.json rename to RespectU/Resources/Assets.xcassets/sort.imageset/Contents.json diff --git a/RespectU/Supporting Files/Assets.xcassets/sort.imageset/icons8-up-down-arrow-96.png b/RespectU/Resources/Assets.xcassets/sort.imageset/icons8-up-down-arrow-96.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/sort.imageset/icons8-up-down-arrow-96.png rename to RespectU/Resources/Assets.xcassets/sort.imageset/icons8-up-down-arrow-96.png diff --git a/RespectU/Supporting Files/Assets.xcassets/sort.imageset/icons8-up-down-arrow-97.png b/RespectU/Resources/Assets.xcassets/sort.imageset/icons8-up-down-arrow-97.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/sort.imageset/icons8-up-down-arrow-97.png rename to RespectU/Resources/Assets.xcassets/sort.imageset/icons8-up-down-arrow-97.png diff --git a/RespectU/Supporting Files/Assets.xcassets/sort.imageset/icons8-up-down-arrow-98.png b/RespectU/Resources/Assets.xcassets/sort.imageset/icons8-up-down-arrow-98.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/sort.imageset/icons8-up-down-arrow-98.png rename to RespectU/Resources/Assets.xcassets/sort.imageset/icons8-up-down-arrow-98.png diff --git a/RespectU/Supporting Files/Assets.xcassets/success.imageset/Contents.json b/RespectU/Resources/Assets.xcassets/success.imageset/Contents.json similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/success.imageset/Contents.json rename to RespectU/Resources/Assets.xcassets/success.imageset/Contents.json diff --git a/RespectU/Supporting Files/Assets.xcassets/success.imageset/icons8-Ok-100.png b/RespectU/Resources/Assets.xcassets/success.imageset/icons8-Ok-100.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/success.imageset/icons8-Ok-100.png rename to RespectU/Resources/Assets.xcassets/success.imageset/icons8-Ok-100.png diff --git a/RespectU/Supporting Files/Assets.xcassets/success.imageset/icons8-Ok-101.png b/RespectU/Resources/Assets.xcassets/success.imageset/icons8-Ok-101.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/success.imageset/icons8-Ok-101.png rename to RespectU/Resources/Assets.xcassets/success.imageset/icons8-Ok-101.png diff --git a/RespectU/Supporting Files/Assets.xcassets/success.imageset/icons8-Ok-102.png b/RespectU/Resources/Assets.xcassets/success.imageset/icons8-Ok-102.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/success.imageset/icons8-Ok-102.png rename to RespectU/Resources/Assets.xcassets/success.imageset/icons8-Ok-102.png diff --git a/RespectU/Supporting Files/Assets.xcassets/tip.imageset/Contents.json b/RespectU/Resources/Assets.xcassets/tip.imageset/Contents.json similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/tip.imageset/Contents.json rename to RespectU/Resources/Assets.xcassets/tip.imageset/Contents.json diff --git a/RespectU/Supporting Files/Assets.xcassets/tip.imageset/icons8-info-100-2.png b/RespectU/Resources/Assets.xcassets/tip.imageset/icons8-info-100-2.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/tip.imageset/icons8-info-100-2.png rename to RespectU/Resources/Assets.xcassets/tip.imageset/icons8-info-100-2.png diff --git a/RespectU/Supporting Files/Assets.xcassets/tip.imageset/icons8-info-100-3.png b/RespectU/Resources/Assets.xcassets/tip.imageset/icons8-info-100-3.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/tip.imageset/icons8-info-100-3.png rename to RespectU/Resources/Assets.xcassets/tip.imageset/icons8-info-100-3.png diff --git a/RespectU/Supporting Files/Assets.xcassets/tip.imageset/icons8-info-100-4.png b/RespectU/Resources/Assets.xcassets/tip.imageset/icons8-info-100-4.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/tip.imageset/icons8-info-100-4.png rename to RespectU/Resources/Assets.xcassets/tip.imageset/icons8-info-100-4.png diff --git a/RespectU/Resources/Assets.xcassets/trophies/Contents.json b/RespectU/Resources/Assets.xcassets/trophies/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/RespectU/Resources/Assets.xcassets/trophies/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/RespectU/Supporting Files/Assets.xcassets/trophies/bronze.imageset/40-bronze.png b/RespectU/Resources/Assets.xcassets/trophies/trophy_bronze.imageset/40-bronze.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/trophies/bronze.imageset/40-bronze.png rename to RespectU/Resources/Assets.xcassets/trophies/trophy_bronze.imageset/40-bronze.png diff --git a/RespectU/Supporting Files/Assets.xcassets/trophies/bronze.imageset/Contents.json b/RespectU/Resources/Assets.xcassets/trophies/trophy_bronze.imageset/Contents.json similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/trophies/bronze.imageset/Contents.json rename to RespectU/Resources/Assets.xcassets/trophies/trophy_bronze.imageset/Contents.json diff --git a/RespectU/Supporting Files/Assets.xcassets/trophies/gold.imageset/40-gold.png b/RespectU/Resources/Assets.xcassets/trophies/trophy_gold.imageset/40-gold.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/trophies/gold.imageset/40-gold.png rename to RespectU/Resources/Assets.xcassets/trophies/trophy_gold.imageset/40-gold.png diff --git a/RespectU/Supporting Files/Assets.xcassets/trophies/gold.imageset/Contents.json b/RespectU/Resources/Assets.xcassets/trophies/trophy_gold.imageset/Contents.json similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/trophies/gold.imageset/Contents.json rename to RespectU/Resources/Assets.xcassets/trophies/trophy_gold.imageset/Contents.json diff --git a/RespectU/Supporting Files/Assets.xcassets/trophies/platinum.imageset/40-platinum.png b/RespectU/Resources/Assets.xcassets/trophies/trophy_platinum.imageset/40-platinum.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/trophies/platinum.imageset/40-platinum.png rename to RespectU/Resources/Assets.xcassets/trophies/trophy_platinum.imageset/40-platinum.png diff --git a/RespectU/Supporting Files/Assets.xcassets/trophies/platinum.imageset/Contents.json b/RespectU/Resources/Assets.xcassets/trophies/trophy_platinum.imageset/Contents.json similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/trophies/platinum.imageset/Contents.json rename to RespectU/Resources/Assets.xcassets/trophies/trophy_platinum.imageset/Contents.json diff --git a/RespectU/Supporting Files/Assets.xcassets/trophies/silver.imageset/40-silver.png b/RespectU/Resources/Assets.xcassets/trophies/trophy_silver.imageset/40-silver.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/trophies/silver.imageset/40-silver.png rename to RespectU/Resources/Assets.xcassets/trophies/trophy_silver.imageset/40-silver.png diff --git a/RespectU/Supporting Files/Assets.xcassets/trophies/silver.imageset/Contents.json b/RespectU/Resources/Assets.xcassets/trophies/trophy_silver.imageset/Contents.json similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/trophies/silver.imageset/Contents.json rename to RespectU/Resources/Assets.xcassets/trophies/trophy_silver.imageset/Contents.json diff --git a/RespectU/Supporting Files/Assets.xcassets/trophy.imageset/Contents.json b/RespectU/Resources/Assets.xcassets/trophy.imageset/Contents.json similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/trophy.imageset/Contents.json rename to RespectU/Resources/Assets.xcassets/trophy.imageset/Contents.json diff --git a/RespectU/Supporting Files/Assets.xcassets/trophy.imageset/icons8-Trophy-80.png b/RespectU/Resources/Assets.xcassets/trophy.imageset/icons8-Trophy-80.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/trophy.imageset/icons8-Trophy-80.png rename to RespectU/Resources/Assets.xcassets/trophy.imageset/icons8-Trophy-80.png diff --git a/RespectU/Supporting Files/Assets.xcassets/trophy.imageset/icons8-Trophy-81.png b/RespectU/Resources/Assets.xcassets/trophy.imageset/icons8-Trophy-81.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/trophy.imageset/icons8-Trophy-81.png rename to RespectU/Resources/Assets.xcassets/trophy.imageset/icons8-Trophy-81.png diff --git a/RespectU/Supporting Files/Assets.xcassets/trophy.imageset/icons8-Trophy-82.png b/RespectU/Resources/Assets.xcassets/trophy.imageset/icons8-Trophy-82.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/trophy.imageset/icons8-Trophy-82.png rename to RespectU/Resources/Assets.xcassets/trophy.imageset/icons8-Trophy-82.png diff --git a/RespectU/Supporting Files/Assets.xcassets/upload.imageset/Contents.json b/RespectU/Resources/Assets.xcassets/upload.imageset/Contents.json similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/upload.imageset/Contents.json rename to RespectU/Resources/Assets.xcassets/upload.imageset/Contents.json diff --git a/RespectU/Supporting Files/Assets.xcassets/upload.imageset/icons8-upload_to_cloud-1.png b/RespectU/Resources/Assets.xcassets/upload.imageset/icons8-upload_to_cloud-1.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/upload.imageset/icons8-upload_to_cloud-1.png rename to RespectU/Resources/Assets.xcassets/upload.imageset/icons8-upload_to_cloud-1.png diff --git a/RespectU/Supporting Files/Assets.xcassets/upload.imageset/icons8-upload_to_cloud-2.png b/RespectU/Resources/Assets.xcassets/upload.imageset/icons8-upload_to_cloud-2.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/upload.imageset/icons8-upload_to_cloud-2.png rename to RespectU/Resources/Assets.xcassets/upload.imageset/icons8-upload_to_cloud-2.png diff --git a/RespectU/Supporting Files/Assets.xcassets/upload.imageset/icons8-upload_to_cloud.png b/RespectU/Resources/Assets.xcassets/upload.imageset/icons8-upload_to_cloud.png similarity index 100% rename from RespectU/Supporting Files/Assets.xcassets/upload.imageset/icons8-upload_to_cloud.png rename to RespectU/Resources/Assets.xcassets/upload.imageset/icons8-upload_to_cloud.png diff --git a/RespectU/Start/Base.lproj/LaunchScreen.storyboard b/RespectU/Resources/Base.lproj/LaunchScreen.storyboard similarity index 100% rename from RespectU/Start/Base.lproj/LaunchScreen.storyboard rename to RespectU/Resources/Base.lproj/LaunchScreen.storyboard diff --git a/RespectU/Resources/SwiftGen/Assets.swift b/RespectU/Resources/SwiftGen/Assets.swift new file mode 100644 index 0000000..441a5c0 --- /dev/null +++ b/RespectU/Resources/SwiftGen/Assets.swift @@ -0,0 +1,179 @@ +// swiftlint:disable all +// Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen + +#if os(OSX) + import AppKit.NSImage + internal typealias AssetColorTypeAlias = NSColor + internal typealias AssetImageTypeAlias = NSImage +#elseif os(iOS) || os(tvOS) || os(watchOS) + import UIKit.UIImage + internal typealias AssetColorTypeAlias = UIColor + internal typealias AssetImageTypeAlias = UIImage +#endif + +// swiftlint:disable superfluous_disable_command +// swiftlint:disable file_length + +// MARK: - Asset Catalogs + +// swiftlint:disable identifier_name line_length nesting type_body_length type_name +internal enum Asset { + internal static let achievement = ImageAsset(name: "achievement") + internal static let backButton = ImageAsset(name: "backButton") + internal static let bpmDefault = ImageAsset(name: "bpmDefault") + internal static let cancelButton = ImageAsset(name: "cancelButton") + internal static let black50 = ColorAsset(name: "black50") + internal static let main = ColorAsset(name: "main") + internal static let absoluteSound = ColorAsset(name: "absoluteSound") + internal static let stylishPerformance = ColorAsset(name: "stylishPerformance") + internal static let electronicCity = ColorAsset(name: "electronicCity") + internal static let metropolis = ColorAsset(name: "metropolis") + internal static let blackDisk = ColorAsset(name: "blackDisk") + internal static let whiteDisk = ColorAsset(name: "whiteDisk") + internal static let anotherWorld = ColorAsset(name: "anotherWorld") + internal static let backStage = ColorAsset(name: "backStage") + internal static let chaosTheory = ColorAsset(name: "chaosTheory") + internal static let clubRoad645 = ColorAsset(name: "clubRoad645") + internal static let departure = ColorAsset(name: "departure") + internal static let destination = ColorAsset(name: "destination") + internal static let developers = ColorAsset(name: "developers") + internal static let maxTheater = ColorAsset(name: "maxTheater") + internal static let soundLab = ColorAsset(name: "soundLab") + internal static let visualizer = ColorAsset(name: "visualizer") + internal static let platinumMixing = ColorAsset(name: "platinumMixing") + internal static let technicalMixing = ColorAsset(name: "technicalMixing") + internal static let clubMixing = ColorAsset(name: "clubMixing") + internal static let starMixing = ColorAsset(name: "starMixing") + internal static let crewChallenge = ColorAsset(name: "crewChallenge") + internal static let popMixing = ColorAsset(name: "popMixing") + internal static let rSide = ColorAsset(name: "rSide") + internal static let tSide = ColorAsset(name: "tSide") + internal static let bs = ColorAsset(name: "bs") + internal static let ce = ColorAsset(name: "ce") + internal static let portable1 = ColorAsset(name: "portable1") + internal static let portable2 = ColorAsset(name: "portable2") + internal static let respect = ColorAsset(name: "respect") + internal static let technika1 = ColorAsset(name: "technika1") + internal static let technika2 = ColorAsset(name: "technika2") + internal static let technika3 = ColorAsset(name: "technika3") + internal static let trilogy = ColorAsset(name: "trilogy") + internal static let sub = ColorAsset(name: "sub") + internal static let bronze = ColorAsset(name: "bronze") + internal static let gold = ColorAsset(name: "gold") + internal static let platinum = ColorAsset(name: "platinum") + internal static let silver = ColorAsset(name: "silver") + internal static let credit = ImageAsset(name: "credit") + internal static let download = ImageAsset(name: "download") + internal static let email = ImageAsset(name: "email") + internal static let fail = ImageAsset(name: "fail") + internal static let favorite = ImageAsset(name: "favorite") + internal static let info = ImageAsset(name: "info") + internal static let log = ImageAsset(name: "log") + internal static let manual = ImageAsset(name: "manual") + internal static let mission = ImageAsset(name: "mission") + internal static let more = ImageAsset(name: "more") + internal static let nextButton = ImageAsset(name: "nextButton") + internal static let question = ImageAsset(name: "question") + internal static let radio = ImageAsset(name: "radio") + internal static let random = ImageAsset(name: "random") + internal static let rate = ImageAsset(name: "rate") + internal static let respectuColor = ImageAsset(name: "respectuColor") + internal static let search = ImageAsset(name: "search") + internal static let shareButton = ImageAsset(name: "shareButton") + internal static let song = ImageAsset(name: "song") + internal static let sort = ImageAsset(name: "sort") + internal static let success = ImageAsset(name: "success") + internal static let tip = ImageAsset(name: "tip") + internal static let trophyBronze = ImageAsset(name: "trophy_bronze") + internal static let trophyGold = ImageAsset(name: "trophy_gold") + internal static let trophyPlatinum = ImageAsset(name: "trophy_platinum") + internal static let trophySilver = ImageAsset(name: "trophy_silver") + internal static let trophy = ImageAsset(name: "trophy") + internal static let upload = ImageAsset(name: "upload") +} +// swiftlint:enable identifier_name line_length nesting type_body_length type_name + +// MARK: - Implementation Details + +internal struct ColorAsset { + internal fileprivate(set) var name: String + + @available(iOS 11.0, tvOS 11.0, watchOS 4.0, OSX 10.13, *) + internal var color: AssetColorTypeAlias { + return AssetColorTypeAlias(asset: self) + } +} + +internal extension AssetColorTypeAlias { + @available(iOS 11.0, tvOS 11.0, watchOS 4.0, OSX 10.13, *) + convenience init!(asset: ColorAsset) { + let bundle = Bundle(for: BundleToken.self) + #if os(iOS) || os(tvOS) + self.init(named: asset.name, in: bundle, compatibleWith: nil) + #elseif os(OSX) + self.init(named: NSColor.Name(asset.name), bundle: bundle) + #elseif os(watchOS) + self.init(named: asset.name) + #endif + } +} + +internal struct DataAsset { + internal fileprivate(set) var name: String + + #if os(iOS) || os(tvOS) || os(OSX) + @available(iOS 9.0, tvOS 9.0, OSX 10.11, *) + internal var data: NSDataAsset { + return NSDataAsset(asset: self) + } + #endif +} + +#if os(iOS) || os(tvOS) || os(OSX) +@available(iOS 9.0, tvOS 9.0, OSX 10.11, *) +internal extension NSDataAsset { + convenience init!(asset: DataAsset) { + let bundle = Bundle(for: BundleToken.self) + #if os(iOS) || os(tvOS) + self.init(name: asset.name, bundle: bundle) + #elseif os(OSX) + self.init(name: NSDataAsset.Name(asset.name), bundle: bundle) + #endif + } +} +#endif + +internal struct ImageAsset { + internal fileprivate(set) var name: String + + internal var image: AssetImageTypeAlias { + let bundle = Bundle(for: BundleToken.self) + #if os(iOS) || os(tvOS) + let image = AssetImageTypeAlias(named: name, in: bundle, compatibleWith: nil) + #elseif os(OSX) + let image = bundle.image(forResource: NSImage.Name(name)) + #elseif os(watchOS) + let image = AssetImageTypeAlias(named: name) + #endif + guard let result = image else { fatalError("Unable to load image named \(name).") } + return result + } +} + +internal extension AssetImageTypeAlias { + @available(iOS 1.0, tvOS 1.0, watchOS 1.0, *) + @available(OSX, deprecated, + message: "This initializer is unsafe on macOS, please use the ImageAsset.image property") + convenience init!(asset: ImageAsset) { + #if os(iOS) || os(tvOS) + let bundle = Bundle(for: BundleToken.self) + self.init(named: asset.name, in: bundle, compatibleWith: nil) + #elseif os(OSX) + self.init(named: NSImage.Name(asset.name)) + #elseif os(watchOS) + self.init(named: asset.name) + #endif + } +} + +private final class BundleToken {} diff --git a/RespectU/Resources/SwiftGen/Storyboard.swift b/RespectU/Resources/SwiftGen/Storyboard.swift new file mode 100644 index 0000000..adcb753 --- /dev/null +++ b/RespectU/Resources/SwiftGen/Storyboard.swift @@ -0,0 +1,148 @@ +// swiftlint:disable all +// Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen + +// swiftlint:disable sorted_imports +import Foundation +import UIKit + +// swiftlint:disable superfluous_disable_command +// swiftlint:disable file_length + +// MARK: - Storyboard Scenes + +// swiftlint:disable explicit_type_interface identifier_name line_length type_body_length type_name +internal enum StoryboardScene { + internal enum Achievement: StoryboardType { + internal static let storyboardName = "Achievement" + + internal static let achievementViewController = SceneType(storyboard: Achievement.self, identifier: "AchievementViewController") + } + internal enum Download: StoryboardType { + internal static let storyboardName = "Download" + + internal static let downloadViewController = SceneType(storyboard: Download.self, identifier: "DownloadViewController") + } + internal enum Guide: StoryboardType { + internal static let storyboardName = "Guide" + + internal static let guideViewController = SceneType(storyboard: Guide.self, identifier: "GuideViewController") + } + internal enum Init: StoryboardType { + internal static let storyboardName = "Init" + + internal static let initViewController = SceneType(storyboard: Init.self, identifier: "InitViewController") + } + internal enum LaunchScreen: StoryboardType { + internal static let storyboardName = "LaunchScreen" + + internal static let initialScene = InitialSceneType(storyboard: LaunchScreen.self) + } + internal enum Mission: StoryboardType { + internal static let storyboardName = "Mission" + + internal static let missionDetailViewController = SceneType(storyboard: Mission.self, identifier: "MissionDetailViewController") + + internal static let missionViewController = SceneType(storyboard: Mission.self, identifier: "MissionViewController") + } + internal enum Performance: StoryboardType { + internal static let storyboardName = "Performance" + + internal static let initialScene = InitialSceneType(storyboard: Performance.self) + + internal static let performanceNavigationController = SceneType(storyboard: Performance.self, identifier: "PerformanceNavigationController") + + internal static let performanceViewController = SceneType(storyboard: Performance.self, identifier: "PerformanceViewController") + + internal static let searchRecordDetailViewController = SceneType(storyboard: Performance.self, identifier: "SearchRecordDetailViewController") + + internal static let searchRecordViewController = SceneType(storyboard: Performance.self, identifier: "SearchRecordViewController") + + internal static let skillLevelDetailViewController = SceneType(storyboard: Performance.self, identifier: "SkillLevelDetailViewController") + + internal static let summaryDetailViewController = SceneType(storyboard: Performance.self, identifier: "SummaryDetailViewController") + } + internal enum Ranking: StoryboardType { + internal static let storyboardName = "Ranking" + + internal static let rankingViewController = SceneType(storyboard: Ranking.self, identifier: "RankingViewController") + } + internal enum Record: StoryboardType { + internal static let storyboardName = "Record" + + internal static let recordViewController = SceneType(storyboard: Record.self, identifier: "RecordViewController") + } + internal enum SignIn: StoryboardType { + internal static let storyboardName = "SignIn" + + internal static let signInViewController = SceneType(storyboard: SignIn.self, identifier: "SignInViewController") + + internal static let signNavigationController = SceneType(storyboard: SignIn.self, identifier: "SignNavigationController") + + internal static let signUpViewController = SceneType(storyboard: SignIn.self, identifier: "SignUpViewController") + } + internal enum Song: StoryboardType { + internal static let storyboardName = "Song" + + internal static let songViewController = SceneType(storyboard: Song.self, identifier: "SongViewController") + } + internal enum Tip: StoryboardType { + internal static let storyboardName = "Tip" + + internal static let tipViewController = SceneType(storyboard: Tip.self, identifier: "TipViewController") + } + internal enum Top50: StoryboardType { + internal static let storyboardName = "Top50" + + internal static let top50ViewController = SceneType(storyboard: Top50.self, identifier: "Top50ViewController") + } + internal enum Trophy: StoryboardType { + internal static let storyboardName = "Trophy" + + internal static let trophyViewController = SceneType(storyboard: Trophy.self, identifier: "TrophyViewController") + } + internal enum Upload: StoryboardType { + internal static let storyboardName = "Upload" + + internal static let uploadViewController = SceneType(storyboard: Upload.self, identifier: "UploadViewController") + } +} +// swiftlint:enable explicit_type_interface identifier_name line_length type_body_length type_name + +// MARK: - Implementation Details + +internal protocol StoryboardType { + static var storyboardName: String { get } +} + +internal extension StoryboardType { + static var storyboard: UIStoryboard { + let name = self.storyboardName + return UIStoryboard(name: name, bundle: Bundle(for: BundleToken.self)) + } +} + +internal struct SceneType { + internal let storyboard: StoryboardType.Type + internal let identifier: String + + internal func instantiate() -> T { + let identifier = self.identifier + guard let controller = storyboard.storyboard.instantiateViewController(withIdentifier: identifier) as? T else { + fatalError("ViewController '\(identifier)' is not of the expected class \(T.self).") + } + return controller + } +} + +internal struct InitialSceneType { + internal let storyboard: StoryboardType.Type + + internal func instantiate() -> T { + guard let controller = storyboard.storyboard.instantiateInitialViewController() as? T else { + fatalError("ViewController is not of the expected class \(T.self).") + } + return controller + } +} + +private final class BundleToken {} diff --git a/RespectU/Resources/SwiftGen/Strings.swift b/RespectU/Resources/SwiftGen/Strings.swift new file mode 100644 index 0000000..f323fff --- /dev/null +++ b/RespectU/Resources/SwiftGen/Strings.swift @@ -0,0 +1,316 @@ +// swiftlint:disable all +// Generated using SwiftGen — https://github.com/SwiftGen/SwiftGen + +import Foundation + +// swiftlint:disable superfluous_disable_command +// swiftlint:disable file_length + +// MARK: - Strings + +// swiftlint:disable explicit_type_interface function_parameter_count identifier_name line_length +// swiftlint:disable nesting type_body_length type_name +internal enum L10n { + /// 기록됨 + internal static let recorded = L10n.tr("Localizable", " Recorded") + /// 건 + internal static let results = L10n.tr("Localizable", " Results") + /// (변속) + internal static let speedVariation = L10n.tr("Localizable", "(SPEED Variation)") + /// 5B NORMAL [Seeker]\n47콤보 -> BREAK -> 풀 콤보 -> 트로피 획득 + internal static let _5BNORMALSeeker47CombosBREAKFullComboTrophyEarned = L10n.tr("Localizable", "5B NORMAL [Seeker]\n47 Combos -> BREAK -> Full Combo -> Trophy Earned") + /// 777콤보 달성하기 + internal static let _777Combos = L10n.tr("Localizable", "777 Combos") + /// 도전과제 + internal static let achievement = L10n.tr("Localizable", "Achievement") + /// 오름차순 + internal static let asc = L10n.tr("Localizable", "Asc") + /// 평균 정확도 + internal static let average = L10n.tr("Localizable", "AVERAGE") + /// 이하 + internal static let below = L10n.tr("Localizable", "Below") + /// BPM 기본값 설정 + internal static let bpmDefaultSetting = L10n.tr("Localizable", "BPM Default Setting") + /// 계산기 + internal static let calculator = L10n.tr("Localizable", "Calculator") + /// 취소 + internal static let cancel = L10n.tr("Localizable", "Cancel") + /// BPM 기본값 변경 + internal static let changeBPMDefault = L10n.tr("Localizable", "Change BPM Default") + /// 네트워크 상태를 확인하세요. + internal static let checkYourNetworkStatus = L10n.tr("Localizable", "Check your network status.") + /// 준비중입니다. + internal static let comingSoon = L10n.tr("Localizable", "Coming soon.") + /// 크레딧 + internal static let credit = L10n.tr("Localizable", "Credit") + /// 크레딧 + internal static let credits = L10n.tr("Localizable", "CREDITS") + /// 크레딧은 세 스테이지의 평균 정확도가 98% 이상일 때 출현합니다. + internal static let creditsWillAppearWhenTheAverageAccuracyOfThreeStagesAreGreaterThan98 = L10n.tr("Localizable", "CREDITS will appear when the average accuracy of three stages are greater than 98%.") + /// 현재 + internal static let current = L10n.tr("Localizable", "Current") + /// 내림차순 + internal static let desc = L10n.tr("Localizable", "Desc") + /// 상세 정보 확인 + internal static let detail = L10n.tr("Localizable", "Detail") + /// 난이도 + internal static let difficulty = L10n.tr("Localizable", "Difficulty") + /// 다운로드 + internal static let download = L10n.tr("Localizable", "Download") + /// 애플리케이션을 시작하기 위해 데이터를 다운로드합니다. + internal static let downloadDataToStartTheApplication = L10n.tr("Localizable", "Download data to start the application.") + /// 서버에서 다운로드하기 + internal static let downloadFromServer = L10n.tr("Localizable", "Download From Server") + /// 닉네임 중복 + internal static let duplicateNickname = L10n.tr("Localizable", "Duplicate nickname") + /// 이메일 + internal static let email = L10n.tr("Localizable", "Email") + /// 유효한 값을 입력하세요 + internal static let enterAValidValue = L10n.tr("Localizable", "Enter a valid value.") + /// 조건을 모두 입력하세요 + internal static let enterAllConditions = L10n.tr("Localizable", "Enter all conditions") + /// 모두 입력하세요. + internal static let enterAll = L10n.tr("Localizable", "Enter All.") + /// 닉네임을 입력해 주세요. + internal static let enterYourNickname = L10n.tr("Localizable", "Enter your nickname.") + /// 오류 + internal static let error = L10n.tr("Localizable", "Error") + /// 실패 + internal static let fail = L10n.tr("Localizable", "Fail") + /// 닉네임을 변경하지 못했습니다. + internal static let failedToChangingYourNickname = L10n.tr("Localizable", "Failed to changing your nickname.") + /// 내보낸 성과 기록 정보를 가져옵니다. + internal static let getExportedPerformanceRecordData = L10n.tr("Localizable", "Get exported performance record data.") + /// 그래프 + internal static let graph = L10n.tr("Localizable", "Graph") + /// DJMAX RESPECT 가이드 + internal static let guideForDJMAXRESPECT = L10n.tr("Localizable", "Guide for DJMAX RESPECT") + /// HARD / 오름차순 + internal static let hardAsc = L10n.tr("Localizable", "HARD / ASC") + /// HARD / 내림차순 + internal static let hardDesc = L10n.tr("Localizable", "HARD / DESC") + /// 히든 BGA + internal static let hiddenBGA = L10n.tr("Localizable", "Hidden BGA") + /// 히든 BGA + internal static let hiddenBGAs = L10n.tr("Localizable", "Hidden BGAs") + /// 아이디 + internal static let id = L10n.tr("Localizable", "ID") + /// 서버에 데이터가 없는 경우 기록한 성과 정보가 초기화될 수 있습니다. + internal static let ifThereIsNoDataOnTheServerTheRecordedPerformanceInformationCanBeInitialized = L10n.tr("Localizable", "If there is no data on the server, the recorded performance information can be initialized.") + /// 추천 배속의 기준값이 됩니다. + internal static let itBecomesStandardOfSpeedRecommendation = L10n.tr("Localizable", "It becomes standard of Speed Recommendation.") + /// 등록된 사용자입니다. + internal static let itIsRegistered = L10n.tr("Localizable", "It is registered.") + /// 난이도 + internal static let level = L10n.tr("Localizable", "Level") + /// 로그인 실패 + internal static let logInFailure = L10n.tr("Localizable", "Log In Failure") + /// 먼저 로그인하세요. + internal static let logInFirst = L10n.tr("Localizable", "Log in first.") + /// 로그인 성공 + internal static let logInSucceeded = L10n.tr("Localizable", "Log In Succeeded") + /// 로그아웃 완료 + internal static let logOutCompleted = L10n.tr("Localizable", "Log Out Completed") + /// 로그인 + internal static let login = L10n.tr("Localizable", "Login") + /// 로그인 / 로그아웃 + internal static let loginLogout = L10n.tr("Localizable", "Login / Logout") + /// 로그아웃 + internal static let logout = L10n.tr("Localizable", "Logout") + /// 매뉴얼 + internal static let manual = L10n.tr("Localizable", "Manual") + /// MAX COMBO 실패 + internal static let maxcomboFailure = L10n.tr("Localizable", "MAX COMBO Failure") + /// MAXIMUM / 오름차순 + internal static let maximumAsc = L10n.tr("Localizable", "MAXIMUM / ASC") + /// MAXIMUM / 내림차순 + internal static let maximumDesc = L10n.tr("Localizable", "MAXIMUM / DESC") + /// 미션 + internal static let mission = L10n.tr("Localizable", "Mission") + /// 더보기 + internal static let more = L10n.tr("Localizable", "More") + /// 이상 + internal static let moreThan = L10n.tr("Localizable", "More Than") + /// 음악 + internal static let music = L10n.tr("Localizable", "Music") + /// 주 버튼 설정 + internal static let myFavoriteButton = L10n.tr("Localizable", "My Favorite Button") + /// 내 기록 + internal static let myRecord = L10n.tr("Localizable", "My Record") + /// 통신 실패 + internal static let networkError = L10n.tr("Localizable", "Network Error") + /// 새 버전 출시!\n업데이트 후 사용해 주세요. + internal static let newVersionReleasedPleaseUseItAfterUpdating = L10n.tr("Localizable", "New version released!\nPlease use it after updating.") + /// 다음 + internal static let next = L10n.tr("Localizable", "Next") + /// 닉네임 + internal static let nickname = L10n.tr("Localizable", "Nickname") + /// 닉네임 설정 + internal static let nicknameSetting = L10n.tr("Localizable", "Nickname Setting") + /// MAX COMBO 실패 + internal static let noMAXCOMBOs = L10n.tr("Localizable", "No MAX COMBOs") + /// 패턴 없음 + internal static let noPattern = L10n.tr("Localizable", "No Pattern") + /// 기록 없음 + internal static let noRecord = L10n.tr("Localizable", "No Record") + /// 검색 결과 없음 + internal static let noResults = L10n.tr("Localizable", "No Results") + /// 없음 + internal static let `none` = L10n.tr("Localizable", "None") + /// NORMAL / 오름차순 + internal static let normalAsc = L10n.tr("Localizable", "NORMAL / ASC") + /// NORMAL / 내림차순 + internal static let normalDesc = L10n.tr("Localizable", "NORMAL / DESC") + /// 비고 + internal static let note = L10n.tr("Localizable", "NOTE") + /// 알림 + internal static let notification = L10n.tr("Localizable", "Notification") + /// 확인 + internal static let ok = L10n.tr("Localizable", "OK") + /// 순위 밖 + internal static let outOfRank = L10n.tr("Localizable", "Out of Rank") + /// 비밀번호 + internal static let password = L10n.tr("Localizable", "Password") + /// 패턴 + internal static let patterns = L10n.tr("Localizable", "PATTERNS") + /// PERFECT PLAY + internal static let perfectplaYs = L10n.tr("Localizable", "PERFECT PLAYs") + /// 성과 + internal static let performance = L10n.tr("Localizable", "Performance") + /// 성과 기록하기 + internal static let performanceRecord = L10n.tr("Localizable", "Performance Record") + /// 개인 설정 + internal static let personalSetting = L10n.tr("Localizable", "Personal Setting") + /// 올바른 값을 입력하세요. + internal static let pleaseEnterAValidValue = L10n.tr("Localizable", "Please enter a valid value.") + /// 닉네임을 입력해 주세요. + internal static let pleaseEnterYourNickname = L10n.tr("Localizable", "Please enter your nickname.") + /// 점 + internal static let point = L10n.tr("Localizable", "Point") + /// 랭크 + internal static let rank = L10n.tr("Localizable", "RANK") + /// 랭킹 + internal static let ranking = L10n.tr("Localizable", "Ranking") + /// 정확도 범위 (%) + internal static let rateRange = L10n.tr("Localizable", "Rate Range (%)") + /// 앱 평가하기 + internal static let rateThisApp = L10n.tr("Localizable", "Rate This App") + /// 정확도 + internal static let rating = L10n.tr("Localizable", "RATING") + /// 제거 + internal static let remove = L10n.tr("Localizable", "Remove") + /// 검색 + internal static let search = L10n.tr("Localizable", "Search") + /// 조건별 성과 검색 + internal static let searchByCondition = L10n.tr("Localizable", "Search by Condition") + /// 버튼 선택 + internal static let selectButton = L10n.tr("Localizable", "Select Button") + /// 상세 비고 선택 + internal static let selectDetailNote = L10n.tr("Localizable", "Select Detail Note") + /// 난이도 선택 + internal static let selectLevel = L10n.tr("Localizable", "Select Level") + /// 검색 방법 선택 + internal static let selectSearchMethod = L10n.tr("Localizable", "Select Search Method") + /// 버튼 종류를 선택하세요. + internal static let selectTheButtonType = L10n.tr("Localizable", "Select the button type.") + /// 비고를 선택하세요. + internal static let selectTheNote = L10n.tr("Localizable", "Select the note.") + /// 랭크를 선택하세요. + internal static let selectTheRank = L10n.tr("Localizable", "Select the rank.") + /// 정렬 방법을 선택하세요. + internal static let selectTheSortMethod = L10n.tr("Localizable", "Select the sort method.") + /// 비고를 선택하세요. + internal static let selectYourNote = L10n.tr("Localizable", "Select your note.") + /// 랭크를 선택하세요. + internal static let selectYourRank = L10n.tr("Localizable", "Select your rank.") + /// 개발자에게 이메일 보내기 + internal static let sendEmailToDeveloper = L10n.tr("Localizable", "Send Email to Developer") + /// 로그인 + internal static let signIn = L10n.tr("Localizable", "Sign In") + /// 로그인하여 더 많은 기능을 사용하세요. + internal static let signInToGetMoreFeatures = L10n.tr("Localizable", "Sign in to get more features.") + /// 회원가입 + internal static let signUp = L10n.tr("Localizable", "Sign Up") + /// 스킬 레벨 + internal static let skillLevel = L10n.tr("Localizable", "Skill Level") + /// 스킬 포인트 + internal static let skillPoint = L10n.tr("Localizable", "Skill Point") + /// 스킬포인트 계산기 + internal static let skillPointCalculator = L10n.tr("Localizable", "Skill Point Calculator") + /// 건너뛰기 + internal static let skip = L10n.tr("Localizable", "SKIP") + /// 음악 + internal static let song = L10n.tr("Localizable", "Song") + /// 정렬 + internal static let sort = L10n.tr("Localizable", "Sort") + /// 추천 배속 + internal static let speedRecommendation = L10n.tr("Localizable", "SPEED Recommendation") + /// 기록한 성과 정보를 서버에 저장합니다. + internal static let storeRecordedPerformanceInformationOnTheServer = L10n.tr("Localizable", "Store recorded performance information on the server.") + /// 성공 + internal static let success = L10n.tr("Localizable", "Success") + /// 닉네임을 변경했습니다. + internal static let successfullyChangingYourNickname = L10n.tr("Localizable", "Successfully changing your nickname.") + /// 요약 + internal static let summary = L10n.tr("Localizable", "Summary") + /// 설정값에 따라 첫 실행 화면에 표시되는 정보가 달라집니다. + internal static let theInformationDisplayedOnTheFirstRunScreenDependsOnTheSettingValue = L10n.tr("Localizable", "The information displayed on the first run screen depends on the setting value.") + /// 설정값과 관련된 정보가 먼저 표시됩니다. + internal static let theInformationRelatedToTheSetValueIsDisplayedFirst = L10n.tr("Localizable", "The information related to the set value is displayed first.") + /// 트로피 + internal static let trophy = L10n.tr("Localizable", "Trophy") + /// 해금 (도전과제) + internal static let unlockACHIEVEMENT = L10n.tr("Localizable", "Unlock (ACHIEVEMENT)") + /// 해금 (미션) + internal static let unlockMISSION = L10n.tr("Localizable", "Unlock (MISSION)") + /// 업데이트 + internal static let update = L10n.tr("Localizable", "Update") + /// 최신 데이터로 갱신합니다. + internal static let updateWithLatestData = L10n.tr("Localizable", "Update with latest data.") + /// 업로드 + internal static let upload = L10n.tr("Localizable", "Upload") + /// 서버로 업로드하기 + internal static let uploadToServer = L10n.tr("Localizable", "Upload To Server") + /// 경고 + internal static let warning = L10n.tr("Localizable", "Warning") + /// 데이터를 성공적으로 가져왔습니다. + internal static let yourDataHasBeenSuccessfullyDownloaded = L10n.tr("Localizable", "Your data has been successfully downloaded.") + /// 데이터를 성공적으로 내보냈습니다. + internal static let yourDataHasBeenSuccessfullyUploaded = L10n.tr("Localizable", "Your data has been successfully uploaded.") + /// 최신 데이터로 업데이트합니다. + internal static let 트 = L10n.tr("Localizable", "트") + + internal enum EnterTheRate { + /// 정확도를 입력하세요.\n초기화하려면 아무 값도 입력하지 마세요. + internal static let toResetTheValueDoNotEnterAnyValues = L10n.tr("Localizable", "Enter the rate.\nTo reset the value, do not enter any values.") + } + + internal enum InputYourRate { + /// 정확도를 입력하세요.\n값을 초기화하려면 어떠한 값도 입력하지 마세요. + internal static let toResetTheValueDoNotEnterAnyValues = L10n.tr("Localizable", "Input your rate.\nTo reset the value, do not enter any values.") + } + + internal enum InputYourRating { + /// 정확도를 입력하세요.\n값을 초기화하려면 어떠한 값도 입력하지 마세요. + internal static let toResetTheValueDoNotEnterAnyValues = L10n.tr("Localizable", "Input your rating.\nTo reset the value, do not enter any values.") + } + + internal enum ThereIsNewData { + /// 새로운 데이터가 있습니다.\n"서버에서 다운로드하기"로 이동하여 최신 데이터로 업데이트하세요. + internal static let goToDownloadingFromTheServerAndUpdateToTheLatestData = L10n.tr("Localizable", "There is new data.\nGo to [Downloading from the server] and update to the latest data.") + } +} +// swiftlint:enable explicit_type_interface function_parameter_count identifier_name line_length +// swiftlint:enable nesting type_body_length type_name + +// MARK: - Implementation Details + +extension L10n { + private static func tr(_ table: String, _ key: String, _ args: CVarArg...) -> String { + // swiftlint:disable:next nslocalizedstring_key + let format = NSLocalizedString(key, tableName: table, bundle: Bundle(for: BundleToken.self), comment: "") + return String(format: format, locale: Locale.current, arguments: args) + } +} + +private final class BundleToken {} diff --git a/RespectU/Start/ja.lproj/LaunchScreen.strings b/RespectU/Resources/ko.lproj/LaunchScreen.strings similarity index 100% rename from RespectU/Start/ja.lproj/LaunchScreen.strings rename to RespectU/Resources/ko.lproj/LaunchScreen.strings diff --git a/RespectU/Supporting Files/ko.lproj/Localizable.strings b/RespectU/Resources/ko.lproj/Localizable.strings similarity index 90% rename from RespectU/Supporting Files/ko.lproj/Localizable.strings rename to RespectU/Resources/ko.lproj/Localizable.strings index 02f767c..0a39170 100644 --- a/RespectU/Supporting Files/ko.lproj/Localizable.strings +++ b/RespectU/Resources/ko.lproj/Localizable.strings @@ -1,11 +1,12 @@ -/* +/* Localizable.strings RespectU Created by Presto on 2017. 10. 17.. Copyright © 2017년 Presto. All rights reserved. */ -//영어 -> 한국어 + +// 영어 -> 한국어 "Music" = "음악"; "OK" = "확인"; @@ -25,18 +26,14 @@ "Performance" = "성과"; "Performance Record" = "성과 기록"; "RANK" = "랭크"; -"Rank" = "랭크"; -"Rate" = "정확도"; -"Input your rate.\nTo reset the value, do not enter any values." = "정확도를 입력하세요.\n값을 초기화하려면 어떠한 값도 입력하지 마세요."; -"ACCURACY" = "정확도"; -"Accuracy" = "정확도"; +"RATING" = "정확도"; "NOTE" = "비고"; -"Note" = "비고"; +"Input your rate.\nTo reset the value, do not enter any values." = "정확도를 입력하세요.\n값을 초기화하려면 어떠한 값도 입력하지 마세요."; "No Pattern" = "패턴 없음"; "My Record" = "내 기록"; "PATTERNS" = "패턴"; "AVERAGE" = "평균 정확도"; -"Input your accuracy.\nTo reset the value, do not enter any values." = "정확도를 입력하세요.\n값을 초기화하려면 어떠한 값도 입력하지 마세요."; +"Input your rating.\nTo reset the value, do not enter any values." = "정확도를 입력하세요.\n값을 초기화하려면 어떠한 값도 입력하지 마세요."; "Select your rank." = "랭크를 선택하세요."; "Select your note." = "비고를 선택하세요."; @@ -51,7 +48,6 @@ "Unlock (ACHIEVEMENT)" = "해금 (도전과제)"; "Unlock (MISSION)" = "해금 (미션)"; -"ACHIEVEMENT" = "도전과제"; "My Favorite Button" = "주 버튼 설정"; "The information displayed on the first run screen depends on the setting value." = "설정값에 따라 첫 실행 화면에 표시되는 정보가 달라집니다."; @@ -97,7 +93,6 @@ "Nickname Setting" = "닉네임 설정"; "Enter your nickname." = "닉네임을 입력해 주세요."; "Point" = "점"; -"Coming soon" = "준비중"; "Summary" = "요약"; "Graph" = "그래프"; "MAX COMBO Failure" = "MAX COMBO 실패"; @@ -122,7 +117,7 @@ "Enter all conditions" = "조건을 모두 입력하세요"; "Skill Point Calculator" = "스킬포인트 계산기"; -//서버연동 이후 +// 서버연동 이후 "ID" = "아이디"; "Password" = "비밀번호"; "Sign In" = "로그인"; @@ -145,10 +140,7 @@ "Store recorded performance information on the server." = "기록한 성과 정보를 서버에 저장합니다."; "If there is no data on the server, the recorded performance information can be initialized." = "서버에 데이터가 없는 경우 기록한 성과 정보가 초기화될 수 있습니다."; "Warning" = "경고"; -"There is new data.\nGo to \"Downloading from the server\" and update to the latest data." = "새로운 데이터가 있습니다.\n\"서버에서 다운로드하기\"로 이동하여 최신 데이터로 업데이트하세요."; -"Rank" = "랭크"; -"Rate" = "정확도"; -"Note" = "비고"; +"There is new data.\nGo to [Downloading from the server] and update to the latest data." = "새로운 데이터가 있습니다.\n\"서버에서 다운로드하기\"로 이동하여 최신 데이터로 업데이트하세요."; "Select the note." = "비고를 선택하세요."; "Select the rank." = "랭크를 선택하세요."; "Enter the rate.\nTo reset the value, do not enter any values." = "정확도를 입력하세요.\n초기화하려면 아무 값도 입력하지 마세요."; @@ -169,3 +161,6 @@ "Guide for DJMAX RESPECT" = "DJMAX RESPECT 가이드"; "Personal Setting" = "개인 설정"; "More" = "더보기"; + +"Successfully changing your nickname." = "닉네임을 변경했습니다."; +"Failed to changing your nickname." = "닉네임을 변경하지 못했습니다."; diff --git a/RespectU/Response/AchievementResponse.swift b/RespectU/Response/AchievementResponse.swift deleted file mode 100644 index 1f9215d..0000000 --- a/RespectU/Response/AchievementResponse.swift +++ /dev/null @@ -1,39 +0,0 @@ -// -// AchievementResponse.swift -// RespectU -// -// Created by Presto on 2018. 8. 21.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import Foundation - -struct AchievementResponse: Codable { - struct Achievement: Codable { - let type: String - let level: Int - let section: LanguageResponse - let item: LanguageResponse - var localizedSection: String { - if Locale.current.regionCode == "KR", let korean = section.korean { - return korean - } else { - return section.english - } - } - var localizedItem: String { - if Locale.current.regionCode == "KR", let korean = item.korean { - return korean - } else { - return item.english - } - } - } - let achievements: [Achievement] - var count: Int { - return achievements.count - } - subscript(index: Int) -> Achievement { - return achievements[index] - } -} diff --git a/RespectU/Response/MissionResponse.swift b/RespectU/Response/MissionResponse.swift deleted file mode 100644 index 7c79db5..0000000 --- a/RespectU/Response/MissionResponse.swift +++ /dev/null @@ -1,56 +0,0 @@ -// -// MissionResponse.swift -// RespectU -// -// Created by Presto on 2018. 8. 21.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import Foundation - -struct MissionResponse: Codable { - struct Mission: Codable { - struct Stage: Codable { - let title: LanguageResponse - let difficulty: String - let button: String - var localizedTitle: String { - if Locale.current.regionCode == "KR", let korean = title.korean { - return korean - } else { - return title.english - } - } - } - let series: String - let section: String - let title: String - let score: Int - let fever: Int - let combo: Int - let rate: Int - let `break`: Int - let effector: String - let reward: LanguageResponse - let stage1: Stage? - let stage2: Stage? - let stage3: Stage? - let stage4: Stage? - let stage5: Stage? - let stage6: Stage? - var localizedReward: String { - if Locale.current.regionCode == "KR", let korean = reward.korean { - return korean - } else { - return reward.english - } - } - } - let missions: [Mission] - var count: Int { - return missions.count - } - subscript(index: Int) -> Mission { - return missions[index] - } -} diff --git a/RespectU/Response/RankingResponse.swift b/RespectU/Response/RankingResponse.swift deleted file mode 100644 index 627c994..0000000 --- a/RespectU/Response/RankingResponse.swift +++ /dev/null @@ -1,21 +0,0 @@ -// -// Ranking.swift -// RespectU -// -// Created by Presto on 2018. 8. 21.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import Foundation - -struct RankingResponse: Codable { - struct Ranking: Codable { - let id: String - let nickname: String - let button4: Double - let button5: Double - let button6: Double - let button8: Double - } - let rankings: [Ranking] -} diff --git a/RespectU/Response/RecordResponse.swift b/RespectU/Response/RecordResponse.swift deleted file mode 100644 index 88aede0..0000000 --- a/RespectU/Response/RecordResponse.swift +++ /dev/null @@ -1,36 +0,0 @@ -// -// RecordResponse.swift -// RespectU -// -// Created by Presto on 2018. 8. 28.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import Foundation - -struct RecordResponse: Codable { - struct Record: Codable { - struct Button: Codable { - struct Difficulty: Codable { - let rank: String - let rate: Double - let note: String - } - let normal: Difficulty - let hard: Difficulty - let maximum: Difficulty - let skillPoint: Double - let skillPointDifficulty: String - let skillPointNote: String - let skillPointRate: Double - } - let title: LanguageResponse - let series: String - let button4: Button - let button5: Button - let button6: Button - let button8: Button - } - let id: String - let records: [Record] -} diff --git a/RespectU/Response/SongResponse.swift b/RespectU/Response/SongResponse.swift deleted file mode 100644 index 6f7f6e3..0000000 --- a/RespectU/Response/SongResponse.swift +++ /dev/null @@ -1,57 +0,0 @@ -// -// SongResponse.swift -// RespectU -// -// Created by Presto on 2018. 8. 21.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import Foundation - -struct SongResponse: Codable { - struct Song: Codable { - struct Button: Codable { - let normal: Int - let hard: Int - let maximum: Int - } - let title: LanguageResponse - let lowercase: LanguageResponse - let series: String - let composer: String - let bpm: Int - let subBpm: Int? - let button4: Button - let button5: Button - let button6: Button - let button8: Button - var localizedTitle: String { - if Locale.current.regionCode == "KR", let korean = title.korean { - return korean - } else { - return title.english - } - } - var localizedLowercase: String { - if Locale.current.regionCode == "KR", let korean = lowercase.korean { - return korean - } else { - return lowercase.english - } - } - var bpmToString: String { - if let subBpm = subBpm { - return "BPM \(bpm) ~ \(subBpm)" - } else { - return "BPM \(bpm)" - } - } - } - let songs: [Song] - var count: Int { - return songs.count - } - subscript(index: Int) -> Song { - return songs[index] - } -} diff --git a/RespectU/Response/TipResponse.swift b/RespectU/Response/TipResponse.swift deleted file mode 100644 index ca835fa..0000000 --- a/RespectU/Response/TipResponse.swift +++ /dev/null @@ -1,29 +0,0 @@ -// -// TipResponse.swift -// RespectU -// -// Created by Presto on 2018. 8. 21.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import Foundation - -struct TipResponse: Codable { - struct Tip: Codable { - let title: LanguageResponse - var localizedTitle: String { - if Locale.current.regionCode == "KR", let korean = title.korean { - return korean - } else { - return title.english - } - } - } - let tips: [Tip] - var count: Int { - return tips.count - } - subscript(index: Int) -> Tip { - return tips[index] - } -} diff --git a/RespectU/Response/TrophyResponse.swift b/RespectU/Response/TrophyResponse.swift deleted file mode 100644 index d90a67a..0000000 --- a/RespectU/Response/TrophyResponse.swift +++ /dev/null @@ -1,40 +0,0 @@ -// -// TrophyResponse.swift -// RespectU -// -// Created by Presto on 2018. 8. 21.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import Foundation - -struct TrophyResponse: Codable { - struct Trophy: Codable { - let series: String - let rating: String - let image: String - let title: LanguageResponse - let content: LanguageResponse - var localizedTitle: String { - if Locale.current.regionCode == "KR", let korean = title.korean { - return korean - } else { - return title.english - } - } - var localizedContent: String { - if Locale.current.regionCode == "KR", let korean = content.korean { - return korean - } else { - return content.english - } - } - } - let trophies: [Trophy] - var count: Int { - return trophies.count - } - subscript(index: Int) -> Trophy { - return trophies[index] - } -} diff --git a/RespectU/Response/UserResponse.swift b/RespectU/Response/UserResponse.swift deleted file mode 100644 index 0213d12..0000000 --- a/RespectU/Response/UserResponse.swift +++ /dev/null @@ -1,17 +0,0 @@ -// -// User.swift -// RespectU -// -// Created by Presto on 2018. 8. 21.. -// Copyright © 2018년 Presto. All rights reserved. -// - -struct UserResponse: Codable { - struct User: Codable { - let uid: String - let nickname: String - let identifier: String - let password: String - } - let users: [User] -} diff --git a/RespectU/Response/VersionResponse.swift b/RespectU/Response/VersionResponse.swift deleted file mode 100644 index c9ce97f..0000000 --- a/RespectU/Response/VersionResponse.swift +++ /dev/null @@ -1,15 +0,0 @@ -// -// VersionResponse.swift -// RespectU -// -// Created by Presto on 2018. 9. 3.. -// Copyright © 2018년 Presto. All rights reserved. -// - -import Foundation - -struct VersionResponse: Codable { - let clientVersion: String - let serverVersion: String - let gameVersion: String -} diff --git a/RespectU/Sources/AppDelegate.swift b/RespectU/Sources/AppDelegate.swift new file mode 100644 index 0000000..9fc4cbe --- /dev/null +++ b/RespectU/Sources/AppDelegate.swift @@ -0,0 +1,79 @@ +// +// AppDelegate.swift +// RespectU +// +// Created by Presto on 2017. 9. 26.. +// Copyright © 2017년 Presto. All rights reserved. +// + +import UIKit + +import RealmSwift +import SwiftKeychainWrapper + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + + var window: UIWindow? + + func application(_ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { + var config = Realm.Configuration() + if let fileURL = config.fileURL { + config.fileURL = fileURL.deletingLastPathComponent().appendingPathComponent("new.realm") + config.schemaVersion = 1 + config.migrationBlock = { migration, oldSchemaVersion in + if oldSchemaVersion < 2 { + + } + } + Realm.Configuration.defaultConfiguration = config + } + // 개발용 + // KeychainWrapper.standard.set("", forKey: "id") + // do { + // try FileManager.default.removeItem(at: Realm.Configuration.defaultConfiguration.fileURL!) + // } catch { + // print(error.localizedDescription) + // } + window = UIWindow(frame: UIScreen.main.bounds) + window?.tintColor = .main + let id = KeychainWrapper.standard.string(forKey: "id") ?? "" + if !id.isEmpty { + if TipInfo.fetch().count != 0 { + let controller = StoryboardScene.Performance.performanceNavigationController.instantiate() + window?.rootViewController = controller + } else { + Persistence.bpm = 450 + let controller = StoryboardScene.Init.initViewController.instantiate() + window?.rootViewController = controller + } + } else { + let controller = StoryboardScene.SignIn.signNavigationController.instantiate() + window?.rootViewController = controller + } + window?.makeKeyAndVisible() + if UserDefaults.standard.double(forKey: "bpm") == 0 { + UserDefaults.standard.set(450, forKey: "bpm") + } + if let favoriteButton = UserDefaults.standard.string(forKey: "favoriteButton") { + UserDefaults.standard.set(favoriteButton.lowercased(), forKey: "favoriteButton") + } + UINavigationBar.appearance().do { + $0.setBackgroundImage(.init(), for: .default) + $0.shadowImage = .init() + $0.backgroundColor = .clear + $0.isTranslucent = true + } + UITableView.appearance().do { + $0.backgroundColor = .white + $0.separatorColor = .lightGray + $0.separatorInset = .init(top: 0, left: 16, bottom: 0, right: 16) + $0.layer.borderColor = UIColor.main.cgColor + $0.layer.borderWidth = 3 + $0.layer.cornerRadius = 10 + $0.tableFooterView = .init() + } + return true + } +} diff --git a/RespectU/Sources/Common/AchievementType.swift b/RespectU/Sources/Common/AchievementType.swift new file mode 100644 index 0000000..70e4c3e --- /dev/null +++ b/RespectU/Sources/Common/AchievementType.swift @@ -0,0 +1,32 @@ +// +// AchievementType.swift +// RespectU +// +// Created by Presto on 10/03/2019. +// Copyright © 2019 Presto. All rights reserved. +// + +/// The `enum` that defines types of achievement. +enum AchievementType: String { + + /// ALL. + case all + + /// MUSIC. + case music + + /// GEAR SKIN. + case gearSkin = "gear" + + /// NOTE SKIN. + case noteSkin = "note" + + /// PLATE. + case plate + + /// GALLERY. + case gallery + + /// COMMENT. + case comment +} diff --git a/RespectU/Sources/Common/Button.swift b/RespectU/Sources/Common/Button.swift new file mode 100644 index 0000000..ad52334 --- /dev/null +++ b/RespectU/Sources/Common/Button.swift @@ -0,0 +1,46 @@ +// +// Buttons.swift +// RespectU +// +// Created by Presto on 2018. 8. 1.. +// Copyright © 2018년 Presto. All rights reserved. +// + +/// The `enum` that defines buttons. +enum Button: String { + + /// 4B TUNES. + case button4 = "4b" + + /// 5B TUNES. + case button5 = "5b" + + /// 6B TUNES. + case button6 = "6b" + + /// 8B TUNES. + case button8 = "8b" + + /// Only in mission - 10 button mode. + case xb + + /// Only in mission - TECHNIKA mode. + case tb + + /// Expands the raw value of each case. + /// + /// If a passed value is `xb` or `tb`, it returns `nil`. + /// - Note: `4b` -> `button4` / `5b` -> `button5` / `xb` -> `nil` + var expansion: String? { + switch self { + case .button4: return "button4" + case .button5: return "button5" + case .button6: return "button6" + case .button8: return "button8" + default: return nil + } + } + + /// The all buttons in normal mode. + static let all: [Button] = [.button4, .button5, .button6, .button8] +} diff --git a/RespectU/Sources/Common/Constants/SkillLevel.swift b/RespectU/Sources/Common/Constants/SkillLevel.swift new file mode 100644 index 0000000..fad523f --- /dev/null +++ b/RespectU/Sources/Common/Constants/SkillLevel.swift @@ -0,0 +1,195 @@ +// +// SkillLevel.swift +// RespectU +// +// Created by Presto on 2018. 8. 3.. +// Copyright © 2018년 Presto. All rights reserved. +// + +/// The `enum` that defines constants about skill level. +enum SkillLevel: String, CaseIterable { + + /// BEGINNER. + case beginner = "BEGINNER" + + /// AMATUER 4. + case amateur4 = "AMATEUR Ⅳ" + + /// AMATUER 3. + case amateur3 = "AMATEUR Ⅲ" + + /// AMATUER 2. + case amateur2 = "AMATEUR Ⅱ" + + /// AMATUER 1. + case amateur1 = "AMATEUR Ⅰ" + + /// SUB DJ 4. + case subDj4 = "SUB DJ Ⅳ" + + /// SUB DJ 3. + case subDj3 = "SUB DJ Ⅲ" + + /// SUB DJ 2. + case subDj2 = "SUB DJ Ⅱ" + + /// SUB DJ 1. + case subDj1 = "SUB DJ Ⅰ" + + /// MAIN DJ 4. + case mainDj4 = "MAIN DJ Ⅳ" + + /// MAIN DJ 3. + case mainDj3 = "MAIN DJ Ⅲ" + + /// MAIN DJ 2. + case mainDj2 = "MAIN DJ Ⅱ" + + /// MAIN DJ 1. + case mainDj1 = "MAIN DJ Ⅰ" + + /// POP DJ 4. + case popDj4 = "POP DJ Ⅳ" + + /// POP DJ 3. + case popDj3 = "POP DJ Ⅲ" + + /// POP DJ 2. + case popDj2 = "POP DJ Ⅱ" + + /// POP DJ 1. + case popDj1 = "POP DJ Ⅰ" + + /// PROFESSIONAL 4. + case professional4 = "PROFESSIONAL Ⅳ" + + /// PROFESSIONAL 3. + case professional3 = "PROFESSIONAL Ⅲ" + + /// PROFESSIONAL 2. + case professional2 = "PROFESSIONAL Ⅱ" + + /// PROFESSIONAL 1. + case professional1 = "PROFESSIONAL Ⅰ" + + /// MIX MASTER 3. + case mixMaster3 = "MIX MASTER Ⅲ" + + /// MIX MASTER 2. + case mixMaster2 = "MIX MASTER Ⅱ" + + /// MIX MASTER 1. + case mixMaster1 = "MIX MASTER Ⅰ" + + /// SUPERSTAR 3. + case superstar3 = "SUPERSTAR Ⅲ" + + /// SUPERSTAR 2. + case superstar2 = "SUPERSTAR Ⅱ" + + /// SUPERSTAR 1. + case superstar1 = "SUPERSTAR Ⅰ" + + /// DJMAX GRAND MASTER. + case djmaxGrandMaster = "🔥DJMAX GRAND MASTER🔥" + + /// THE DJMAX. + case theDjmax = "✨THE DJMAX✨" + + /// The skill levels of 4 button mode. + static let button4SkillLevels: [SkillLevel] = [ + .beginner, + .amateur4, + .amateur3, + .amateur2, + .amateur1, + .subDj4, + .subDj3, + .subDj2, + .subDj1, + .mainDj4, + .mainDj3, + .mainDj2, + .mainDj1, + .popDj4, + .popDj3, + .popDj2, + .popDj1, + .professional3, + .professional2, + .professional1, + .mixMaster3, + .mixMaster2, + .mixMaster1, + .superstar3, + .superstar2, + .superstar1, + .djmaxGrandMaster, + .theDjmax + ] + + /// The skill levels of 5 button mode. + static let button5SkillLevels: [SkillLevel] = [ + .beginner, + .amateur4, + .amateur3, + .amateur2, + .amateur1, + .subDj4, + .subDj3, + .subDj2, + .subDj1, + .mainDj4, + .mainDj3, + .mainDj2, + .mainDj1, + .popDj4, + .popDj3, + .popDj2, + .popDj1, + .professional3, + .professional2, + .professional1, + .mixMaster3, + .mixMaster2, + .mixMaster1, + .superstar3, + .superstar2, + .superstar1, + .djmaxGrandMaster, + .theDjmax + ] + + /// The skill levels of 6 and 8 button mode. + static let button6And8SkillLevels: [SkillLevel] = [ + .beginner, + .amateur4, + .amateur3, + .amateur2, + .amateur1, + .subDj4, + .subDj3, + .subDj2, + .subDj1, + .mainDj4, + .mainDj3, + .mainDj2, + .mainDj1, + .popDj4, + .popDj3, + .popDj2, + .popDj1, + .professional4, + .professional3, + .professional2, + .professional1, + .mixMaster3, + .mixMaster2, + .mixMaster1, + .superstar3, + .superstar2, + .superstar1, + .djmaxGrandMaster, + .theDjmax + ] +} diff --git a/RespectU/Sources/Common/Constants/SkillPoint.swift b/RespectU/Sources/Common/Constants/SkillPoint.swift new file mode 100644 index 0000000..4283a31 --- /dev/null +++ b/RespectU/Sources/Common/Constants/SkillPoint.swift @@ -0,0 +1,23 @@ +// +// SkillPoint.swift +// RespectU +// +// Created by Presto on 10/03/2019. +// Copyright © 2019 Presto. All rights reserved. +// + +/// The `enum` that defines constants about skill point. +enum SkillPoint { + + /// `button4SkillPoint`. + static let button4 = "button4SkillPoint" + + /// `button5SkillPoint`. + static let button5 = "button5SkillPoint" + + /// `button6SkillPoint`. + static let button6 = "button6SkillPoint" + + /// `button8SkillPoint`. + static let button8 = "button8SkillPoint" +} diff --git a/RespectU/Sources/Common/Difficulty.swift b/RespectU/Sources/Common/Difficulty.swift new file mode 100644 index 0000000..1f02d9c --- /dev/null +++ b/RespectU/Sources/Common/Difficulty.swift @@ -0,0 +1,32 @@ +// +// Difficulty.swift +// RespectU +// +// Created by Presto on 2018. 3. 4.. +// Copyright © 2018년 Presto. All rights reserved. +// + +/// The `enum` that defines difficulty. +enum Difficulty: String { + + /// NORMAL. + case normal + + /// HARD. + case hard + + /// MAXIMUM. + case maximum + + /// Only in mission - FX. + case fx + + /// Only in mission - SPECIAL. + case special + + /// Only in mission - REDESIGN. + case redesign + + /// The all difficulties in normal mode. + static let all: [Difficulty] = [.normal, .hard, .maximum] +} diff --git a/RespectU/Sources/Common/GradientDirection.swift b/RespectU/Sources/Common/GradientDirection.swift new file mode 100644 index 0000000..504bfb4 --- /dev/null +++ b/RespectU/Sources/Common/GradientDirection.swift @@ -0,0 +1,39 @@ +// +// GradientDirection.swift +// RespectU +// +// Created by Presto on 10/03/2019. +// Copyright © 2019 Presto. All rights reserved. +// + +import UIKit + +/// The `enum` that defines a direction of gradient layer. +enum GradientDirection { + + /// Horizontal. + case horizontal + + /// Vertical. + case vertical + + /// The start point of gradient layer according to the direction. + var startPoint: CGPoint { + switch self { + case .horizontal: + return .init(x: 0, y: 0.5) + case .vertical: + return .init(x: 0.5, y: 0) + } + } + + /// The end point of gradient layer according to the direction. + var endPoint: CGPoint { + switch self { + case .horizontal: + return .init(x: 1, y: 0.5) + case .vertical: + return .init(x: 0.5, y: 1) + } + } +} diff --git a/RespectU/Sources/Common/MissionSection.swift b/RespectU/Sources/Common/MissionSection.swift new file mode 100644 index 0000000..7e64da5 --- /dev/null +++ b/RespectU/Sources/Common/MissionSection.swift @@ -0,0 +1,218 @@ +// +// Mission.swift +// RespectU +// +// Created by Presto on 2018. 8. 1.. +// Copyright © 2018년 Presto. All rights reserved. +// + +import UIKit + +/// The `protocol` that defines mission section type. +protocol MissionSectionType { + + /// The color representing each section. + var color: UIColor? { get } + + /// Makes gradient layer by `direction`. + /// + /// - Parameter direction: The direction of the gradient layer. + /// + /// - Returns: The created gradient layer. + func makeGradient(by direction: GradientDirection) -> CAGradientLayer? +} + +/// The `enum` that defines each mission sections. +enum MissionSection { + + /// The `enum` that defines RESPECT mission sections. + enum Respect: String, MissionSectionType { + + /// RESPECT - Departure. + case departure = "Departure" + + /// RESPECT - CLUB Road645. + case clubRoad645 = "CLUB Road645" + + /// RESPECT - MAX Theater. + case maxTheater = "MAX Theater" + + /// RESPECT - Another WORLD. + case anotherWorld = "Another WORLD" + + /// RESPECT - Back STAGE. + case backStage = "Back STAGE" + + /// RESPECT - Chaos theory. + case chaosTheory = "Chaos theory" + + /// RESPECT - Sound Lab. + case soundLab = "Sound Lab" + + /// RESPECT - Visualizer. + case visualizer = "Visualizer" + + /// RESPECT - D-VELOPERS. + case developers = "D-VELOPERS" + + /// RESPECT - Destination. + case destination = "Destination" + + var color: UIColor? { + switch self { + case .departure: return .departure + case .clubRoad645: return .clubRoad645 + case .maxTheater: return .maxTheater + case .anotherWorld: return .anotherWorld + case .backStage: return .backStage + case .chaosTheory: return .chaosTheory + case .soundLab: return .soundLab + case .visualizer: return .visualizer + case .developers: return .developers + case .destination: return .destination + } + } + } + + /// The `enum` that defines TRILOGY mission sections. + enum Trilogy: String, MissionSectionType { + + /// TRILOGY - T-SIDE. + case tSide = "T-SIDE" + + /// TRILOGY - R-SIDE. + case rSide = "R-SIDE" + + var color: UIColor? { + switch self { + case .tSide: return .tSide + case .rSide: return .rSide + } + } + } + + /// The `enum` that defines CLAZZIQUAI EDITION mission sections. + enum CE: String, MissionSectionType { + + /// CE - Electronic City. + case electronicCity = "Electronic City" + + /// CE - Metropolis. + case metropolis = "Metropolis" + + var color: UIColor? { + switch self { + case .electronicCity: return .electronicCity + case .metropolis: return .metropolis + } + } + } + + /// The `enum` that defines TECHNIKA 1 mission sections. + enum Technika1: String, MissionSectionType { + + /// TECHNIKA 1 - Platinum Mixing. + case platinumMixing = "Platinum Mixing" + + /// TECHNIKA 1 - Technical Mixing. + case technicalMixing = "Technical Mixing" + + var color: UIColor? { + switch self { + case .platinumMixing: return .platinumMixing + case .technicalMixing: return .technicalMixing + } + } + } + + /// The `enum` that defines BLACK SQUARE mission sections. + enum BS: String, MissionSectionType { + + /// BS - Stylish Performance. + case stylishPerformance = "Stylish Performance" + + /// BS - Absolute Sound. + case absoluteSound = "Absolute Sound" + + var color: UIColor? { + switch self { + case .stylishPerformance: return .stylishPerformance + case .absoluteSound: return .absoluteSound + } + } + } + + /// The `enum` that defines TECHNIKA 2 mission sections. + enum Technika2: String, MissionSectionType { + + /// TECHNIKA 2 - STAR MIXING. + case starMixing = "STAR MIXING" + + /// TECHNIKA 2 - CLUB MIXING. + case clubMixing = "CLUB MIXING" + + var color: UIColor? { + switch self { + case .starMixing: return .starMixing + case .clubMixing: return .clubMixing + } + } + } + + /// The `enum` that defines LINK DISK mission sections. + enum LinkDisk: String, MissionSectionType { + + /// LINK DISK - WHITE DISK. + case whiteDisk = "WHITE DISK" + + /// LINK DISK - BLACK DISK. + case blackDisk = "BLACK DISK" + + var color: UIColor? { + switch self { + case .whiteDisk: return .whiteDisk + case .blackDisk: return .blackDisk + } + } + } + + /// The `enum` that defines TECHNIKA 3 mission sections. + enum Technika3: String, MissionSectionType { + + /// TECHNIKA 3 - POP MIXING. + case popMixing = "POP MIXING" + + /// TECHNIKA 3 - Crew Challenge. + case crewChallenge = "Crew Challenge" + + var color: UIColor? { + switch self { + case .popMixing: return .popMixing + case .crewChallenge: return .crewChallenge + } + } + } + + static func makeSection(bySeries series: Series, section: String) -> MissionSectionType? { + switch series { + case .respect: + return MissionSection.Respect(rawValue: section) + case .trilogy: + return MissionSection.Trilogy(rawValue: section) + case .ce: + return MissionSection.CE(rawValue: section) + case .technika1: + return MissionSection.Technika1(rawValue: section) + case .bs: + return MissionSection.BS(rawValue: section) + case .linkdisk: + return MissionSection.LinkDisk(rawValue: section) + case .technika2: + return MissionSection.Technika2(rawValue: section) + case .technika3: + return MissionSection.Technika3(rawValue: section) + default: + return nil + } + } +} diff --git a/RespectU/Sources/Common/Note.swift b/RespectU/Sources/Common/Note.swift new file mode 100644 index 0000000..625fb62 --- /dev/null +++ b/RespectU/Sources/Common/Note.swift @@ -0,0 +1,48 @@ +// +// Result.swift +// RespectU +// +// Created by Presto on 2018. 8. 3.. +// Copyright © 2018년 Presto. All rights reserved. +// + +/// The `enum` that defines note. +enum Note: String { + + /// MAX COMBO. + case maxCombo = "MC" + + /// PERFECT PLAY. + case perfectPlay = "PP" + + /// NONE. + case none = "" + + /// Initializes a `Note` with the expanded note string. + init?(expansion: String) { + switch expansion { + case "PERFECT PLAY": + self = .perfectPlay + case "MAX COMBO": + self = .maxCombo + case "": + self = .none + default: + return nil + } + } + + /// Expanded string. + /// + /// - Note: `Note.maxCombo` -> `MAX COMBO` + var expansion: String { + switch self { + case .maxCombo: + return "MAX COMBO" + case .perfectPlay: + return "PERFECT PLAY" + case .none: + return "" + } + } +} diff --git a/RespectU/Sources/Common/RUButton.swift b/RespectU/Sources/Common/RUButton.swift new file mode 100644 index 0000000..150b691 --- /dev/null +++ b/RespectU/Sources/Common/RUButton.swift @@ -0,0 +1,32 @@ +// +// CommonButton.swift +// RespectU +// +// Created by Presto on 11/10/2018. +// Copyright © 2018 Presto. All rights reserved. +// + +import UIKit + +/// The custom button used throughout the application. +final class RUButton: UIButton { + + override init(frame: CGRect) { + super.init(frame: frame) + configure() + } + + required init?(coder aDecoder: NSCoder) { + super.init(coder: aDecoder) + configure() + } + + /// Configures default settings. + private func configure() { + layer.cornerRadius = bounds.height / 2 + layer.borderWidth = 1 + layer.borderColor = UIColor.main.cgColor + titleLabel?.font = UIFont.boldSystemFont(ofSize: 14) + setTitleColor(.main, for: []) + } +} diff --git a/RespectU/Sources/Common/Rank.swift b/RespectU/Sources/Common/Rank.swift new file mode 100644 index 0000000..d54021f --- /dev/null +++ b/RespectU/Sources/Common/Rank.swift @@ -0,0 +1,26 @@ +// +// Rank.swift +// RespectU +// +// Created by Presto on 2018. 8. 3.. +// Copyright © 2018년 Presto. All rights reserved. +// + +/// The `enum` that defines rank. +enum Rank: String { + + /// S Rank. + case s + + /// A Rank. + case a + + /// B Rank. + case b + + /// C Rank. + case c + + /// None. + case none = "" +} diff --git a/RespectU/Sources/Common/SearchRecordDetail.swift b/RespectU/Sources/Common/SearchRecordDetail.swift new file mode 100644 index 0000000..5a3e688 --- /dev/null +++ b/RespectU/Sources/Common/SearchRecordDetail.swift @@ -0,0 +1,23 @@ +// +// SearchRecordDetail.swift +// RespectU +// +// Created by Presto on 12/03/2019. +// Copyright © 2019 Presto. All rights reserved. +// + +/// The `struct` using in search record detail. +struct SearchRecordDetail { + + /// The series string value. + let series: String + + /// The title. + let title: String + + /// The difficulty string value. + let difficulty: String + + /// The rating double value. + let rate: Double +} diff --git a/RespectU/Sources/Common/Series.swift b/RespectU/Sources/Common/Series.swift new file mode 100644 index 0000000..8881116 --- /dev/null +++ b/RespectU/Sources/Common/Series.swift @@ -0,0 +1,41 @@ +// +// Series.swift +// RespectU +// +// Created by Presto on 2018. 8. 1.. +// Copyright © 2018년 Presto. All rights reserved. +// + +/// The `enum` that defines series. +enum Series: String { + + /// RESPECT. + case respect + + /// PORTABLE 1. + case portable1 + + /// PORTABLE 2. + case portable2 + + /// TRILOGY DLC. + case trilogy + + /// CLAZZIQUAI EDITION DLC. + case ce + + /// TECHNIKA 1 DLC. + case technika1 + + /// BLACK SQUARE DLC. + case bs + + /// LINK DISK. + case linkdisk + + /// TECHNIKA 2 DLC. + case technika2 + + /// TECHNIKA 3 DLC. + case technika3 +} diff --git a/RespectU/Sources/Common/TrophyGrade.swift b/RespectU/Sources/Common/TrophyGrade.swift new file mode 100644 index 0000000..4d516db --- /dev/null +++ b/RespectU/Sources/Common/TrophyGrade.swift @@ -0,0 +1,37 @@ +// +// TrophyGrade.swift +// RespectU +// +// Created by Presto on 2018. 8. 1.. +// Copyright © 2018년 Presto. All rights reserved. +// + +/// The `enum` that defines a grade of specific trophy. +enum TrophyGrade: String { + + /// PLATINUM. + case platinum + + /// GOLD. + case gold + + /// SILVER. + case silver + + /// BRONZE. + case bronze + + /// Accesses the image of each case. + var image: AssetImageTypeAlias { + switch self { + case .platinum: + return Asset.trophyPlatinum.image + case .gold: + return Asset.trophyGold.image + case .silver: + return Asset.trophySilver.image + case .bronze: + return Asset.trophyBronze.image + } + } +} diff --git a/RespectU/Sources/Extension/CAGradientLayer+.swift b/RespectU/Sources/Extension/CAGradientLayer+.swift new file mode 100644 index 0000000..4057b02 --- /dev/null +++ b/RespectU/Sources/Extension/CAGradientLayer+.swift @@ -0,0 +1,30 @@ +// +// CAGradientLayer+.swift +// RespectU +// +// Created by Presto on 13/10/2018. +// Copyright © 2018 Presto. All rights reserved. +// + +import UIKit + +extension CAGradientLayer { + + /// Initializes the gradient layer. + /// + /// - Parameters: + /// - startPoint: The start point of a gradient layer. + /// - endPoint: The end point of a gradient layer. + /// - colors: The colors of a gradient layer. + /// - locations: The locations of a gradient layer. + convenience init(startPoint: CGPoint, + endPoint: CGPoint, + colors: [CGColor], + locations: [NSNumber]) { + self.init() + self.startPoint = startPoint + self.endPoint = endPoint + self.colors = colors + self.locations = locations + } +} diff --git a/RespectU/Sources/Extension/Double+.swift b/RespectU/Sources/Extension/Double+.swift new file mode 100644 index 0000000..d753f79 --- /dev/null +++ b/RespectU/Sources/Extension/Double+.swift @@ -0,0 +1,13 @@ +// +// Double+.swift +// RespectU +// +// Created by Presto on 11/03/2019. +// Copyright © 2019 Presto. All rights reserved. +// + +extension Double { + + /// The natural constant. + static let naturalConstant = 2.71828 +} diff --git a/RespectU/Sources/Extension/MissionSection.BS+Gradient.swift b/RespectU/Sources/Extension/MissionSection.BS+Gradient.swift new file mode 100644 index 0000000..1920467 --- /dev/null +++ b/RespectU/Sources/Extension/MissionSection.BS+Gradient.swift @@ -0,0 +1,35 @@ +// +// MissionSection.BS+Gradient.swift +// RespectU +// +// Created by Presto on 10/03/2019. +// Copyright © 2019 Presto. All rights reserved. +// + +import UIKit + +extension MissionSection.BS { + + /// Creates `CAGradientLayer` matching each mission section. + /// + /// - Parameter direction: The direction of gradient layer. + /// + /// - Returns: The created `CAGradientLayer`. + func makeGradient(by direction: GradientDirection) -> CAGradientLayer? { + let startPoint = direction.startPoint + let endPoint = direction.endPoint + let locations: [NSNumber] = [0, 0.5, 1] + switch self { + case .stylishPerformance: + return CAGradientLayer(startPoint: startPoint, + endPoint: endPoint, + colors: [#colorLiteral(red: 0.3411764706, green: 0.6274509804, blue: 0.9215686275, alpha: 1), #colorLiteral(red: 0.09803921569, green: 0.262745098, blue: 0.6784313725, alpha: 1)], + locations: locations) + case .absoluteSound: + return CAGradientLayer(startPoint: startPoint, + endPoint: endPoint, + colors: [#colorLiteral(red: 0.8588235294, green: 0.2078431373, blue: 0.5960784314, alpha: 1), #colorLiteral(red: 0.3960784314, green: 0.05490196078, blue: 0.1960784314, alpha: 1)], + locations: locations) + } + } +} diff --git a/RespectU/Sources/Extension/MissionSection.CE+Gradient.swift b/RespectU/Sources/Extension/MissionSection.CE+Gradient.swift new file mode 100644 index 0000000..8049f3e --- /dev/null +++ b/RespectU/Sources/Extension/MissionSection.CE+Gradient.swift @@ -0,0 +1,35 @@ +// +// MissionSection.CE+Gradient.swift +// RespectU +// +// Created by Presto on 10/03/2019. +// Copyright © 2019 Presto. All rights reserved. +// + +import UIKit + +extension MissionSection.CE { + + /// Creates `CAGradientLayer` matching each mission section. + /// + /// - Parameter direction: The direction of gradient layer. + /// + /// - Returns: The created `CAGradientLayer`. + func makeGradient(by direction: GradientDirection) -> CAGradientLayer? { + let startPoint = direction.startPoint + let endPoint = direction.endPoint + let locations: [NSNumber] = [0, 0.5, 1] + switch self { + case .electronicCity: + return CAGradientLayer(startPoint: startPoint, + endPoint: endPoint, + colors: [#colorLiteral(red: 0.2509803922, green: 0.2352941176, blue: 0.1960784314, alpha: 1), #colorLiteral(red: 0.8352941176, green: 0.7254901961, blue: 0.2235294118, alpha: 1)], + locations: locations) + case .metropolis: + return CAGradientLayer(startPoint: startPoint, + endPoint: endPoint, + colors: [#colorLiteral(red: 0.9254901961, green: 0.6980392157, blue: 0.2509803922, alpha: 1), #colorLiteral(red: 0.6274509804, green: 0.4784313725, blue: 0.7450980392, alpha: 1)], + locations: locations) + } + } +} diff --git a/RespectU/Sources/Extension/MissionSection.LinkDisk+Gradient.swift b/RespectU/Sources/Extension/MissionSection.LinkDisk+Gradient.swift new file mode 100644 index 0000000..b56214c --- /dev/null +++ b/RespectU/Sources/Extension/MissionSection.LinkDisk+Gradient.swift @@ -0,0 +1,35 @@ +// +// MissionSection.LinkDisk+Gradient.swift +// RespectU +// +// Created by Presto on 10/03/2019. +// Copyright © 2019 Presto. All rights reserved. +// + +import UIKit + +extension MissionSection.LinkDisk { + + /// Creates `CAGradientLayer` matching each mission section. + /// + /// - Parameter direction: The direction of gradient layer. + /// + /// - Returns: The created `CAGradientLayer`. + func makeGradient(by direction: GradientDirection) -> CAGradientLayer? { + let startPoint = direction.startPoint + let endPoint = direction.endPoint + let locations: [NSNumber] = [0, 0.5, 1] + switch self { + case .whiteDisk: + return CAGradientLayer(startPoint: startPoint, + endPoint: endPoint, + colors: [#colorLiteral(red: 0.6549019608, green: 0.03529411765, blue: 0.06274509804, alpha: 1), #colorLiteral(red: 0.9333333333, green: 0.7960784314, blue: 0.8117647059, alpha: 1)], + locations: locations) + case .blackDisk: + return CAGradientLayer(startPoint: startPoint, + endPoint: endPoint, + colors: [#colorLiteral(red: 0.1333333333, green: 0.1176470588, blue: 0.1098039216, alpha: 1), #colorLiteral(red: 0.5921568627, green: 0.5411764706, blue: 0.3843137255, alpha: 1)], + locations: locations) + } + } +} diff --git a/RespectU/Sources/Extension/MissionSection.Respect+Gradient.swift b/RespectU/Sources/Extension/MissionSection.Respect+Gradient.swift new file mode 100644 index 0000000..821955e --- /dev/null +++ b/RespectU/Sources/Extension/MissionSection.Respect+Gradient.swift @@ -0,0 +1,75 @@ +// +// MissionSection.Respect+Gradient.swift +// RespectU +// +// Created by Presto on 10/03/2019. +// Copyright © 2019 Presto. All rights reserved. +// + +import UIKit + +extension MissionSection.Respect { + + /// Creates `CAGradientLayer` matching each mission section. + /// + /// - Parameter direction: The direction of gradient layer. + /// + /// - Returns: The created `CAGradientLayer`. + func makeGradient(by direction: GradientDirection) -> CAGradientLayer? { + let startPoint = direction.startPoint + let endPoint = direction.endPoint + let locations: [NSNumber] = [0, 0.5, 1] + switch self { + case .departure: + return CAGradientLayer(startPoint: startPoint, + endPoint: endPoint, + colors: [#colorLiteral(red: 0.137254902, green: 0.6549019608, blue: 0.3921568627, alpha: 1), #colorLiteral(red: 0.2431372549, green: 0.8235294118, blue: 0.8274509804, alpha: 1)], + locations: locations) + case .clubRoad645: + return CAGradientLayer(startPoint: startPoint, + endPoint: endPoint, + colors: [#colorLiteral(red: 0.1568627451, green: 0.6431372549, blue: 0.7725490196, alpha: 1), #colorLiteral(red: 0.2352941176, green: 0.8235294118, blue: 0.8, alpha: 1)], + locations: locations) + case .maxTheater: + return CAGradientLayer(startPoint: startPoint, + endPoint: endPoint, + colors: [#colorLiteral(red: 0.5176470588, green: 0.737254902, blue: 0.5019607843, alpha: 1), #colorLiteral(red: 0.2941176471, green: 0.7137254902, blue: 0.9176470588, alpha: 1)], + locations: locations) + case .anotherWorld: + return CAGradientLayer(startPoint: startPoint, + endPoint: endPoint, + colors: [#colorLiteral(red: 0.2156862745, green: 0.6392156863, blue: 0.7098039216, alpha: 1), #colorLiteral(red: 0.3215686275, green: 0.537254902, blue: 0.9333333333, alpha: 1)], + locations: locations) + case .backStage: + return CAGradientLayer(startPoint: startPoint, + endPoint: endPoint, + colors: [#colorLiteral(red: 0.631372549, green: 0.4117647059, blue: 0.9254901961, alpha: 1), #colorLiteral(red: 0.3450980392, green: 0.431372549, blue: 0.937254902, alpha: 1)], + locations: locations) + case .chaosTheory: + return CAGradientLayer(startPoint: startPoint, + endPoint: endPoint, + colors: [#colorLiteral(red: 0.6705882353, green: 0.3254901961, blue: 0.7725490196, alpha: 1), #colorLiteral(red: 0.5294117647, green: 0.3647058824, blue: 0.9764705882, alpha: 1)], + locations: locations) + case .soundLab: + return CAGradientLayer(startPoint: startPoint, + endPoint: endPoint, + colors: [#colorLiteral(red: 0.7098039216, green: 0.3294117647, blue: 0.8941176471, alpha: 1), #colorLiteral(red: 0.7568627451, green: 0.5529411765, blue: 0.3725490196, alpha: 1)], + locations: locations) + case .visualizer: + return CAGradientLayer(startPoint: startPoint, + endPoint: endPoint, + colors: [#colorLiteral(red: 0.7294117647, green: 0.3137254902, blue: 0.9254901961, alpha: 1), #colorLiteral(red: 0.9843137255, green: 0.4078431373, blue: 0.8156862745, alpha: 1)], + locations: locations) + case .developers: + return CAGradientLayer(startPoint: startPoint, + endPoint: endPoint, + colors: [#colorLiteral(red: 0.6392156863, green: 0.2784313725, blue: 0.6901960784, alpha: 1), #colorLiteral(red: 0.9803921569, green: 0.4470588235, blue: 0.4392156863, alpha: 1)], + locations: locations) + case .destination: + return CAGradientLayer(startPoint: startPoint, + endPoint: endPoint, + colors: [#colorLiteral(red: 0.5921568627, green: 0.2588235294, blue: 0.2588235294, alpha: 1), #colorLiteral(red: 0.6470588235, green: 0.06274509804, blue: 0.1803921569, alpha: 1)], + locations: locations) + } + } +} diff --git a/RespectU/Sources/Extension/MissionSection.Technika1+Gradient.swift b/RespectU/Sources/Extension/MissionSection.Technika1+Gradient.swift new file mode 100644 index 0000000..f8d2b8a --- /dev/null +++ b/RespectU/Sources/Extension/MissionSection.Technika1+Gradient.swift @@ -0,0 +1,35 @@ +// +// MissionSection.Technika1+Gradient.swift +// RespectU +// +// Created by Presto on 10/03/2019. +// Copyright © 2019 Presto. All rights reserved. +// + +import UIKit + +extension MissionSection.Technika1 { + + /// Creates `CAGradientLayer` matching each mission section. + /// + /// - Parameter direction: The direction of gradient layer. + /// + /// - Returns: The created `CAGradientLayer`. + func makeGradient(by direction: GradientDirection) -> CAGradientLayer? { + let startPoint = direction.startPoint + let endPoint = direction.endPoint + let locations: [NSNumber] = [0, 0.5, 1] + switch self { + case .platinumMixing: + return CAGradientLayer(startPoint: startPoint, + endPoint: endPoint, + colors: [#colorLiteral(red: 0.09803921569, green: 0.1882352941, blue: 0.2980392157, alpha: 1), #colorLiteral(red: 0.5490196078, green: 0.6862745098, blue: 0.7921568627, alpha: 1)], + locations: locations) + case .technicalMixing: + return CAGradientLayer(startPoint: startPoint, + endPoint: endPoint, + colors: [#colorLiteral(red: 0.4, green: 0.07450980392, blue: 0.3803921569, alpha: 1), #colorLiteral(red: 0.8705882353, green: 0.2039215686, blue: 0.6392156863, alpha: 1)], + locations: locations) + } + } +} diff --git a/RespectU/Sources/Extension/MissionSection.Technika2+Gradient.swift b/RespectU/Sources/Extension/MissionSection.Technika2+Gradient.swift new file mode 100644 index 0000000..d433aa7 --- /dev/null +++ b/RespectU/Sources/Extension/MissionSection.Technika2+Gradient.swift @@ -0,0 +1,34 @@ +// +// MissionSection.Technika2+Gradient.swift +// RespectU +// +// Created by Presto on 10/03/2019. +// Copyright © 2019 Presto. All rights reserved. +// + +import UIKit + +extension MissionSection.Technika2 { + + /// Creates `CAGradientLayer` matching each mission section. + /// + /// - Parameter direction: The direction of gradient layer. + /// + /// - Returns: The created `CAGradientLayer`. + func makeGradient(by direction: GradientDirection) -> CAGradientLayer? { + let startPoint = direction.startPoint + let endPoint = direction.endPoint + switch self { + case .starMixing: + return CAGradientLayer(startPoint: startPoint, + endPoint: endPoint, + colors: [#colorLiteral(red: 0.537254902, green: 0.07058823529, blue: 0.5058823529, alpha: 1), #colorLiteral(red: 0.1058823529, green: 0.3882352941, blue: 0.6392156863, alpha: 1), #colorLiteral(red: 0.2470588235, green: 0.6588235294, blue: 0.1921568627, alpha: 1), #colorLiteral(red: 0.9333333333, green: 0.7333333333, blue: 0.1843137255, alpha: 1)], + locations: [0, 0.25, 0.5, 0.75, 1]) + case .clubMixing: + return CAGradientLayer(startPoint: startPoint, + endPoint: endPoint, + colors: [#colorLiteral(red: 0.07843137255, green: 0.2470588235, blue: 0.6705882353, alpha: 1), #colorLiteral(red: 0.9843137255, green: 0.7960784314, blue: 0.1882352941, alpha: 1)], + locations: [0, 0.5, 1]) + } + } +} diff --git a/RespectU/Sources/Extension/MissionSection.Technika3+Gradient.swift b/RespectU/Sources/Extension/MissionSection.Technika3+Gradient.swift new file mode 100644 index 0000000..585ba06 --- /dev/null +++ b/RespectU/Sources/Extension/MissionSection.Technika3+Gradient.swift @@ -0,0 +1,28 @@ +// +// MissionSection.Technika3+Gradient.swift +// RespectU +// +// Created by Presto on 10/03/2019. +// Copyright © 2019 Presto. All rights reserved. +// + +import UIKit + +extension MissionSection.Technika3 { + + /// Creates `CAGradientLayer` matching each mission section. + /// + /// - Parameter direction: The direction of gradient layer. + /// + /// - Returns: The created `CAGradientLayer`. + func makeGradient(by direction: GradientDirection) -> CAGradientLayer? { + let startPoint = direction.startPoint + let endPoint = direction.endPoint + switch self { + case .popMixing: + return nil + case .crewChallenge: + return nil + } + } +} diff --git a/RespectU/Sources/Extension/MissionSection.Trilogy+Gradient.swift b/RespectU/Sources/Extension/MissionSection.Trilogy+Gradient.swift new file mode 100644 index 0000000..922a267 --- /dev/null +++ b/RespectU/Sources/Extension/MissionSection.Trilogy+Gradient.swift @@ -0,0 +1,36 @@ +// +// MissionSection.Trilogy+Gradient.swift +// RespectU +// +// Created by Presto on 10/03/2019. +// Copyright © 2019 Presto. All rights reserved. +// + +import UIKit + +extension MissionSection.Trilogy { + + /// Creates `CAGradientLayer` matching each mission section. + /// + /// - Parameter direction: The direction of gradient layer. + /// + /// - Returns: The created `CAGradientLayer`. + func makeGradient(by direction: GradientDirection) -> CAGradientLayer? { + let startPoint = direction.startPoint + let endPoint = direction.endPoint + let locations: [NSNumber] = [0, 0.5, 1] + switch self { + case .tSide: + return CAGradientLayer(startPoint: startPoint, + endPoint: endPoint, + colors: [#colorLiteral(red: 0.2980392157, green: 0.337254902, blue: 0.9843137255, alpha: 1), #colorLiteral(red: 0.4, green: 0.6980392157, blue: 0.9764705882, alpha: 1)], + locations: locations) + case .rSide: + return CAGradientLayer(startPoint: startPoint, + endPoint: endPoint, + colors: [#colorLiteral(red: 0.2941176471, green: 0.337254902, blue: 0.9843137255, alpha: 1), #colorLiteral(red: 0.5882352941, green: 0.4352941176, blue: 0.9568627451, alpha: 1)], + locations: locations) + + } + } +} diff --git a/RespectU/Sources/Extension/NSObject+.swift b/RespectU/Sources/Extension/NSObject+.swift new file mode 100644 index 0000000..cd3f1c5 --- /dev/null +++ b/RespectU/Sources/Extension/NSObject+.swift @@ -0,0 +1,37 @@ +// +// NSObject+.swift +// RespectU +// +// Created by Presto on 2018. 8. 2.. +// Copyright © 2018년 Presto. All rights reserved. +// + +import Foundation + +extension NSObject { + + /// The type name of the class. + var name: String { + return NSStringFromClass(type(of: self)) + } + + /// The type name of the class. + static var name: String { + return NSStringFromClass(self).components(separatedBy: ".").last ?? "" + } + + /// The region code of the user. + var regionCode: String { + return Locale.current.regionCode ?? "" + } + + /// A boolean value indicating whether the user uses region code of Korea. + var isInKorea: Bool { + return regionCode == "KR" + } + + /// The version of the application. + var version: String { + return Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as? String ?? "" + } +} diff --git a/RespectU/Sources/Extension/Series+UI.swift b/RespectU/Sources/Extension/Series+UI.swift new file mode 100644 index 0000000..24cb8de --- /dev/null +++ b/RespectU/Sources/Extension/Series+UI.swift @@ -0,0 +1,94 @@ +// +// Series+UI.swift +// RespectU +// +// Created by Presto on 10/03/2019. +// Copyright © 2019 Presto. All rights reserved. +// + +import UIKit + +extension Series { + + /// The color of each series. + var color: UIColor? { + switch self { + case .portable1: + return Asset.portable1.color + case .portable2: + return Asset.portable2.color + case .respect: + return Asset.respect.color + case .trilogy: + return Asset.trilogy.color + case .ce: + return Asset.ce.color + case .technika1: + return Asset.technika1.color + case .bs: + return Asset.bs.color + case .technika2: + return Asset.technika2.color + case .technika3: + return Asset.technika3.color + case .linkdisk: + return nil + } + } + + /// Creates `CAGradientLayer` matching each series in `direction`. + /// + /// - Parameter direction: The direction of the created gradient layer. + /// + /// - Returns: The created `CAGradientLayer`. + func makeGradient(by direction: GradientDirection) -> CAGradientLayer? { + let startPoint = direction.startPoint + let endPoint = direction.endPoint + switch self { + case .portable1: + return CAGradientLayer(startPoint: startPoint, + endPoint: endPoint, + colors: [#colorLiteral(red: 0.1215686275, green: 0.7098039216, blue: 0.8784313725, alpha: 1), #colorLiteral(red: 0.7254901961, green: 0.2823529412, blue: 0.9764705882, alpha: 1)], + locations: [0, 0.5, 1]) + case .portable2: + return CAGradientLayer(startPoint: startPoint, + endPoint: endPoint, + colors: [#colorLiteral(red: 0.9882352941, green: 0.1254901961, blue: 0.2784313725, alpha: 1), #colorLiteral(red: 0.9882352941, green: 0.2156862745, blue: 0.6705882353, alpha: 1)], + locations: [0, 0.5, 1]) + case .respect: + return CAGradientLayer(startPoint: startPoint, + endPoint: endPoint, + colors: [#colorLiteral(red: 0.9607843137, green: 0.6745098039, blue: 0.1647058824, alpha: 1), #colorLiteral(red: 0.9803921569, green: 0.3921568627, blue: 0.4941176471, alpha: 1)], + locations: [0, 0.5, 1]) + case .trilogy: + return CAGradientLayer(startPoint: startPoint, + endPoint: endPoint, + colors: [#colorLiteral(red: 0.3176470588, green: 0.4784313725, blue: 0.9725490196, alpha: 1), #colorLiteral(red: 0.3803921569, green: 0.9019607843, blue: 0.9725490196, alpha: 1)], + locations: [0, 0.5, 1]) + case .ce: + return CAGradientLayer(startPoint: startPoint, + endPoint: endPoint, + colors: [#colorLiteral(red: 1, green: 1, blue: 1, alpha: 1), #colorLiteral(red: 0.9568627451, green: 0.831372549, blue: 0.3254901961, alpha: 1), #colorLiteral(red: 0.6039215686, green: 0.4941176471, blue: 0.1333333333, alpha: 1), #colorLiteral(red: 0.7764705882, green: 0.5921568627, blue: 0.2509803922, alpha: 1)], + locations: [0, 0.7, 0.8, 0.9, 1]) + case .technika1: + return CAGradientLayer(startPoint: startPoint, + endPoint: endPoint, + colors: [#colorLiteral(red: 0.5019607843, green: 0.4, blue: 0.8666666667, alpha: 1), #colorLiteral(red: 0.9333333333, green: 0.1058823529, blue: 0.5921568627, alpha: 1)], + locations: [0, 0.5, 1]) + case .bs: + return CAGradientLayer(startPoint: startPoint, + endPoint: endPoint, + colors: [#colorLiteral(red: 0.8941176471, green: 0.06274509804, blue: 0.2901960784, alpha: 1), #colorLiteral(red: 0.4823529412, green: 0.09803921569, blue: 0.168627451, alpha: 1)], + locations: [0, 0.5, 1]) + case .technika2: + return CAGradientLayer(startPoint: startPoint, + endPoint: endPoint, + colors: [#colorLiteral(red: 0.9647058824, green: 0.1411764706, blue: 0.8784313725, alpha: 1), #colorLiteral(red: 0.9882352941, green: 0.4235294118, blue: 0.1333333333, alpha: 1), #colorLiteral(red: 0.9960784314, green: 0.768627451, blue: 0.1764705882, alpha: 1), #colorLiteral(red: 0.337254902, green: 0.8156862745, blue: 0.5058823529, alpha: 1), #colorLiteral(red: 0.1411764706, green: 0.8274509804, blue: 0.9921568627, alpha: 1)], + locations: [0, 0.2, 0.4, 0.6, 0.8, 1]) + case .technika3: + return nil + case .linkdisk: + return nil + } + } +} diff --git a/RespectU/Sources/Extension/String+.swift b/RespectU/Sources/Extension/String+.swift new file mode 100644 index 0000000..3573f9d --- /dev/null +++ b/RespectU/Sources/Extension/String+.swift @@ -0,0 +1,17 @@ +// +// StringExtension.swift +// RespectU +// +// Created by Presto on 2017. 10. 17.. +// Copyright © 2017년 Presto. All rights reserved. +// + +import Foundation + +extension String { + + /// The localized string. + var localized: String { + return NSLocalizedString(self, tableName: nil, bundle: Bundle.main, value: "", comment: "") + } +} diff --git a/RespectU/Sources/Extension/UIAlertController+.swift b/RespectU/Sources/Extension/UIAlertController+.swift new file mode 100644 index 0000000..1138bd1 --- /dev/null +++ b/RespectU/Sources/Extension/UIAlertController+.swift @@ -0,0 +1,91 @@ +// +// UIAlertController+.swift +// RespectU +// +// Created by Presto on 2018. 6. 28.. +// Copyright © 2018년 Presto. All rights reserved. +// + +import UIKit + +extension UIAlertController { + + // MARK: Alert + + /// Creates an `UIAlertController`. + /// + /// - Parameters: + /// - title: The `title` of created `UIAlertController`. + /// - message: The `message` of created `UIAlertController`. + /// + /// - Returns: The created `UIAlertController`. + static func alert(title: String?, message: String?) -> UIAlertController { + let alert = UIAlertController(title: title, message: message, preferredStyle: .alert) + return alert + } + + // MARK: Action + + /// Adds `UIAlertAction` to the created `UIAlertController`. + /// + /// - Parameters: + /// - title: The `title` of created `UIAlertAction`. + /// - style: The `style` of created `UIAlertAction`. + /// The default value is `UIAlertAction.Style.default`. + /// - completion: The `completion` handler of created `UIAlertAction`. + /// The default value is `nil`. + /// + /// - Returns: The `UIAlertController` with the created `UIAlertAction`. + @discardableResult + func action(title: String?, + style: UIAlertAction.Style = .default, + completion: ((UIAlertAction) -> Void)? = nil) -> UIAlertController { + let action = UIAlertAction(title: title, style: style, handler: completion) + addAction(action) + return self + } + + /// Adds `UITextField` to the created `UIAlertController`. + /// + /// - Parameters: + /// - handler: The `configuration handler` of created `UITextField`. + /// The default value is `nil`. + /// + /// - Returns: The `UIAlertController` with the created `UITextField`. + @discardableResult + func textField( + configurationHandler handler: ((UITextField) -> Void)? = nil + ) -> UIAlertController { + addTextField(configurationHandler: handler) + return self + } + + // MARK: Present + + /// Presents the `UIAlertController` to `viewController`. + /// + /// - Parameters: + /// - viewController: The `viewController` presenting the `UIAlertController`. + /// - completion: The `completion` handler of the `UIAlertController`. + /// The default value is `nil`. + func present(to viewController: UIViewController?, completion: (() -> Void)? = nil) { + viewController?.present(self, animated: true, completion: completion) + } + + // MARK: Error Alert + + /// Makes an `UIAlertController` that can presents an error description. + /// + /// - Parameters: + /// - error: The `Error`. + /// - completion: The `completion` handler of the `UIAlertController`. + /// The default value is `nil`. + /// + /// - Returns: The created `UIAlertController`. + static func makeErrorAlert(_ error: Error, + completion: ((UIAlertAction) -> Void)? = nil) -> UIAlertController { + return UIAlertController + .alert(title: "", message: error.localizedDescription) + .action(title: L10n.ok, completion: completion) + } +} diff --git a/RespectU/Sources/Extension/UIColor+.swift b/RespectU/Sources/Extension/UIColor+.swift new file mode 100644 index 0000000..e01e042 --- /dev/null +++ b/RespectU/Sources/Extension/UIColor+.swift @@ -0,0 +1,138 @@ +// +// UIColor+.swift +// RespectU +// +// Created by Presto on 2018. 3. 2.. +// Copyright © 2018년 Presto. All rights reserved. +// + +import UIKit + +extension UIColor { + + // MARK: App Color + + /// The main color of the application. + static let main = Asset.main.color + + /// The sub color of the application. + static let sub = Asset.sub.color + + /// The black color(RGB: 50). + static let black50 = Asset.black50.color + + // MARK: Series Color + + /// The color representing RESPECT series. + static let respect = Asset.respect.color + + /// The color representing PORTABLE 1 series. + static let portable1 = Asset.portable1.color + + /// The color representing PORTABLE 2 series. + static let portable2 = Asset.portable2.color + + /// The color representing TRILOGY series. + static let trilogy = Asset.trilogy.color + + /// The color representing CLAZZIQUAI EDITION series. + static let ce = Asset.ce.color + + /// The color representing TECHNIKA 1 series. + static let technika1 = Asset.technika1.color + + /// The color representing BLACK SQUARE series. + static let bs = Asset.bs.color + + /// The color representing TECHNIKA 2 series. + static let technika2 = Asset.technika2.color + + /// The color representing TECHNIKA 3 series. + static let technika3 = Asset.technika3.color + + // MARK: Mission Color + + /// The color representing Departure section in RESPECT series. + static let departure = Asset.departure.color + + /// The color representing CLUB Road645 section in RESPECT series. + static let clubRoad645 = Asset.clubRoad645.color + + /// The color representing MAX Theater section in RESPECT series. + static let maxTheater = Asset.maxTheater.color + + /// The color representing Another WORLD section in RESPECT series. + static let anotherWorld = Asset.anotherWorld.color + + /// The color representing Back STAGE section in RESPECT series. + static let backStage = Asset.backStage.color + + /// The color representing Chaos theory section in RESPECT series. + static let chaosTheory = Asset.chaosTheory.color + + /// The color representing Sound Lab section in RESPECT series. + static let soundLab = Asset.soundLab.color + + /// The color representing Visualizer section in RESPECT series. + static let visualizer = Asset.visualizer.color + + /// The color representing D-VELOPERS section in RESPECT series. + static let developers = Asset.developers.color + + /// The color representing Destination section in RESPECT series. + static let destination = Asset.destination.color + + /// The color representing T-SIDE section in TRILOGY series. + static let tSide = Asset.tSide.color + + /// The color representing R-SIDE section in TRILOGY series. + static let rSide = Asset.rSide.color + + /// The color representing Electronic City section in CLAZZIQUAI EDITION series. + static let electronicCity = Asset.electronicCity.color + + /// The color representing Metropolis section in CLAZZIQUAI EDITION series. + static let metropolis = Asset.metropolis.color + + /// The color representing Platinum Mixing section in TECHNIKA 1 series. + static let platinumMixing = Asset.platinumMixing.color + + /// The color representing Technical Mixing section in TECHNIKA 1 series. + static let technicalMixing = Asset.technicalMixing.color + + /// The color representing Stylish Performance section in BLACK SQUARE series. + static let stylishPerformance = Asset.stylishPerformance.color + + /// The color representing Absolute Sound section in BLACK SQUARE series. + static let absoluteSound = Asset.absoluteSound.color + + /// The color representing STAR MIXING section in TECHNIKA 2 series. + static let starMixing = Asset.starMixing.color + + /// The color representing CLUB MIXING section in TECHNIKA 2 series. + static let clubMixing = Asset.clubMixing.color + + /// The color representing WHITE DISK section in LINK DISK series. + static let whiteDisk = Asset.whiteDisk.color + + /// The color representing BLACK DISK section in LINK DISK series. + static let blackDisk = Asset.blackDisk.color + + static let popMixing = Asset.popMixing.color + + static let crewChallenge = Asset.crewChallenge.color + + // MARK: Trophy Color + + /// The color of PLATINUM trophy. + static let platinum = Asset.platinum.color + + /// The color of GOLD trophy. + static let gold = Asset.gold.color + + /// The color of SILVER trophy. + static let silver = Asset.silver.color + + /// The color of BRONZE trophy. + static let bronze = Asset.bronze.color +} diff --git a/RespectU/Sources/Extension/UIView+.swift b/RespectU/Sources/Extension/UIView+.swift new file mode 100644 index 0000000..74ff2a2 --- /dev/null +++ b/RespectU/Sources/Extension/UIView+.swift @@ -0,0 +1,22 @@ +// +// UIView+.swift +// RespectU +// +// Created by Presto on 2018. 3. 4.. +// Copyright © 2018년 Presto. All rights reserved. +// + +import UIKit + +extension UIView { + + /// Instantiates the view named `xibName`. + /// + /// - Parameter xibName: The name of xib file. + /// + /// - Returns: The instantiated view. + static func instantiateFromXIB(xibName: String) -> UIView? { + return UINib(nibName: xibName, bundle: nil) + .instantiate(withOwner: nil, options: nil).first as? UIView + } +} diff --git a/RespectU/Sources/Extension/UIViewController+.swift b/RespectU/Sources/Extension/UIViewController+.swift new file mode 100644 index 0000000..3623918 --- /dev/null +++ b/RespectU/Sources/Extension/UIViewController+.swift @@ -0,0 +1,25 @@ +// +// UIViewController+.swift +// RespectU +// +// Created by Presto on 2018. 8. 2.. +// Copyright © 2018년 Presto. All rights reserved. +// + +import UIKit + +extension UIViewController { + + /// Instantiates the view controller having `identifier` in `storyboard`. + /// + /// - Parameters: + /// - storyboard: The `storyboard` identifier. + /// - identifier: The `identifier` of a view controller. + /// + /// - Returns: The instantiated view controller. + static func instantiate(storyboard: String, identifier: String) -> UIViewController? { + let viewController = UIStoryboard(name: storyboard, bundle: nil) + .instantiateViewController(withIdentifier: identifier) + return viewController + } +} diff --git a/RespectU/Sources/Models/Persistence.swift b/RespectU/Sources/Models/Persistence.swift new file mode 100644 index 0000000..162daab --- /dev/null +++ b/RespectU/Sources/Models/Persistence.swift @@ -0,0 +1,66 @@ +// +// Persistence.swift +// RespectU +// +// Created by Presto on 13/03/2019. +// Copyright © 2019 Presto. All rights reserved. +// + +import Foundation + +/// The `struct` that defines user defaults persistence. +struct Persistence { + + /// The favorite button. + static var favoriteButton: Button { + get { + let buttonString = UserDefaults.standard.string(forKey: "favoriteButton") ?? "" + return Button(rawValue: buttonString) ?? .button4 + } + set { + UserDefaults.standard.do { + $0.set(newValue.rawValue, forKey: "favoriteButton") + $0.synchronize() + } + } + } + + /// The nickname. + static var nickname: String { + get { + return UserDefaults.standard.string(forKey: "nickname") ?? L10n.nicknameSetting + } + set { + UserDefaults.standard.do { + $0.set(newValue, forKey: "nickname") + $0.synchronize() + } + } + } + + /// The number of launching. + static var numberOfLaunching: Int { + get { + return UserDefaults.standard.integer(forKey: "appOpenCount") + } + set { + UserDefaults.standard.do { + $0.set(newValue, forKey: "appOpenCount") + $0.synchronize() + } + } + } + + /// The favorite bpm. + static var bpm: Double { + get { + return UserDefaults.standard.double(forKey: "bpm") + } + set { + UserDefaults.standard.do { + $0.set(newValue, forKey: "bpm") + $0.synchronize() + } + } + } +} diff --git a/RespectU/Sources/Models/Realm/AchievementInfo.swift b/RespectU/Sources/Models/Realm/AchievementInfo.swift new file mode 100644 index 0000000..2697636 --- /dev/null +++ b/RespectU/Sources/Models/Realm/AchievementInfo.swift @@ -0,0 +1,101 @@ +// +// AchievementInfo.swift +// RespectU +// +// Created by Presto on 2018. 3. 1.. +// Copyright © 2018년 Presto. All rights reserved. +// + +import RealmSwift + +/// The realm object about achievement. +final class AchievementInfo: Object { + + /// The type of the achievement. + @objc dynamic var type: String = "" + + /// The level of the achievement. + @objc dynamic var level: Int = 0 + + /// The section of the achievement. + @objc dynamic var section: LanguageInfo? + + /// The item of the achievement. + @objc dynamic var item: LanguageInfo? + + /// The localized section of the achievement. + var localizedSection: String { + if isInKorea, let korean = section?.korean { + return korean + } else { + return section?.english ?? "" + } + } + + /// The localized item of the achievement. + var localizedItem: String { + if isInKorea, let korean = item?.korean { + return korean + } else { + return item?.english ?? "" + } + } + + /// The achievement type of the achievement. + var typeEnum: AchievementType? { + return AchievementType(rawValue: type) + } + + /// Adds the `achievementInfo` to realm. + /// + /// - Parameter achievementInfo: The achievement information will be added. + static func add(_ achievementInfo: AchievementResponse.Achievement) { + let realm = try! Realm() + let object = AchievementInfo() + let sectionInfo = LanguageInfo() + let itemInfo = LanguageInfo() + object.type = achievementInfo.type + object.level = achievementInfo.level + sectionInfo.english = achievementInfo.section.english + sectionInfo.korean = achievementInfo.section.korean + itemInfo.english = achievementInfo.item.english + itemInfo.korean = achievementInfo.item.korean + object.section = sectionInfo + object.item = itemInfo + try! realm.write { + realm.add(object) + } + } + + /// Fetches achievements of specific `type`. + /// + /// - Parameter type: The `AchievementType` filtered by this value. + /// + /// - Returns: The fetched achievements. + static func fetch(byType type: AchievementType) -> Results { + let achievementInfo = try! Realm().objects(AchievementInfo.self) + if case .all = type { + return achievementInfo + } else { + return achievementInfo.filter("type = '\(type.rawValue)'") + } + } + + /// Updates `achievementInfo` to `object`. + /// + /// - Parameters: + /// - object: The source achievement information. + /// - achievementInfo: The updated achievement information. + static func update(_ object: AchievementResponse.Achievement, + to achievementInfo: AchievementInfo) { + let realm = try! Realm() + try! realm.write { + achievementInfo.type = object.type + achievementInfo.level = object.level + achievementInfo.section?.english = object.section.english + achievementInfo.section?.korean = object.section.korean + achievementInfo.item?.english = object.item.english + achievementInfo.item?.korean = object.item.korean + } + } +} diff --git a/RespectU/Sources/Models/Realm/LanguageInfo.swift b/RespectU/Sources/Models/Realm/LanguageInfo.swift new file mode 100644 index 0000000..c6e1844 --- /dev/null +++ b/RespectU/Sources/Models/Realm/LanguageInfo.swift @@ -0,0 +1,19 @@ +// +// LanguageInfo.swift +// RespectU +// +// Created by Presto on 2018. 8. 29.. +// Copyright © 2018년 Presto. All rights reserved. +// + +import RealmSwift + +/// The realm object about langugae. +final class LanguageInfo: Object { + + /// The english data. + @objc dynamic var english: String = "" + + /// The korean data. + @objc dynamic var korean: String? +} diff --git a/RespectU/Sources/Models/Realm/MissionInfo.swift b/RespectU/Sources/Models/Realm/MissionInfo.swift new file mode 100644 index 0000000..e3e6fc4 --- /dev/null +++ b/RespectU/Sources/Models/Realm/MissionInfo.swift @@ -0,0 +1,197 @@ +// +// MissionInfo.swift +// RespectU +// +// Created by Presto on 2018. 3. 1.. +// Copyright © 2018년 Presto. All rights reserved. +// + +import RealmSwift + +/// The realm object about mission. +final class MissionInfo: Object { + + /// The series of the mission. + @objc dynamic var series: String = "" + + /// The section of the mission. + @objc dynamic var section: String = "" + + /// The title of the mission. + @objc dynamic var title: String = "" + + /// The score limit of the mission. + @objc dynamic var score: Int = 0 + + /// The fever limit of the mission. + @objc dynamic var fever: Int = 0 + + /// The combo limit of the mission. + @objc dynamic var combo: Int = 0 + + /// The rate limit of the mission. + @objc dynamic var rate: Int = 0 + + /// The break limit of the mission. + @objc dynamic var `break`: Int = 0 + + /// The effector of the mission. + @objc dynamic var effector: String = "" + + /// The reward of the mission. + @objc dynamic var reward: LanguageInfo? + + /// The information about first stage of the mission. + @objc dynamic var stage1: MissionStageInfo? + + /// The information about second stage of the mission. + @objc dynamic var stage2: MissionStageInfo? + + /// The information about third stage of the mission. + @objc dynamic var stage3: MissionStageInfo? + + /// The informatio about fourth stage of the mission. + @objc dynamic var stage4: MissionStageInfo? + + /// The information about fifth stage of the mission. + @objc dynamic var stage5: MissionStageInfo? + + /// The information about sixth stage of the mission. + @objc dynamic var stage6: MissionStageInfo? + + /// The localized reward of the mission. + var localizedReward: String { + if isInKorea, let korean = reward?.korean { + return korean + } else { + return reward?.english ?? "" + } + } + + /// The `Series` of the mission. + var seriesEnum: Series? { + return Series(rawValue: series) + } + + /// Adds the `missionInfo` to realm. + /// + /// - Parameter missionInfo: The mission information will be added. + static func add(_ missionInfo: MissionResponse.Mission) { + let realm = try! Realm() + let object = MissionInfo() + let rewardInfo = LanguageInfo() + object.series = missionInfo.series + object.section = missionInfo.section + object.title = missionInfo.title + object.score = missionInfo.score + object.combo = missionInfo.combo + object.rate = missionInfo.rate + object.break = missionInfo.break + object.effector = missionInfo.effector + rewardInfo.english = missionInfo.reward.english + rewardInfo.korean = missionInfo.reward.korean + object.reward = rewardInfo + if let stage = missionInfo.stage1 { + let stageInfo = MissionStageInfo() + let titleInfo = LanguageInfo() + titleInfo.english = stage.title.english + titleInfo.korean = stage.title.korean + stageInfo.title = titleInfo + stageInfo.difficulty = stage.difficulty + stageInfo.button = stage.button + object.stage1 = stageInfo + } + if let stage = missionInfo.stage2 { + let stageInfo = MissionStageInfo() + let titleInfo = LanguageInfo() + titleInfo.english = stage.title.english + titleInfo.korean = stage.title.korean + stageInfo.title = titleInfo + stageInfo.difficulty = stage.difficulty + stageInfo.button = stage.button + object.stage2 = stageInfo + } + if let stage = missionInfo.stage3 { + let stageInfo = MissionStageInfo() + let titleInfo = LanguageInfo() + titleInfo.english = stage.title.english + titleInfo.korean = stage.title.korean + stageInfo.title = titleInfo + stageInfo.difficulty = stage.difficulty + stageInfo.button = stage.button + object.stage3 = stageInfo + } + if let stage = missionInfo.stage4 { + let stageInfo = MissionStageInfo() + let titleInfo = LanguageInfo() + titleInfo.english = stage.title.english + titleInfo.korean = stage.title.korean + stageInfo.title = titleInfo + stageInfo.difficulty = stage.difficulty + stageInfo.button = stage.button + object.stage4 = stageInfo + } + if let stage = missionInfo.stage5 { + let stageInfo = MissionStageInfo() + let titleInfo = LanguageInfo() + titleInfo.english = stage.title.english + titleInfo.korean = stage.title.korean + stageInfo.title = titleInfo + stageInfo.difficulty = stage.difficulty + stageInfo.button = stage.button + object.stage5 = stageInfo + } + if let stage = missionInfo.stage6 { + let stageInfo = MissionStageInfo() + let titleInfo = LanguageInfo() + titleInfo.english = stage.title.english + titleInfo.korean = stage.title.korean + stageInfo.title = titleInfo + stageInfo.difficulty = stage.difficulty + stageInfo.button = stage.button + object.stage6 = stageInfo + } + try! realm.write { + realm.add(object) + } + } + + /// Fetches missions of specific `series`. + /// + /// - Parameter series: The `Series` filtered by this value. The default value is `nil`. + /// + /// - Note: If `series` is `nil`, it fetches all saved missions. + /// + /// - Returns: The fetched missions. + static func fetch(bySeries series: Series? = nil) -> Results { + let realm = try! Realm() + let missionInfo = realm.objects(MissionInfo.self) + if case let series? = series { + return missionInfo.filter("series = '\(series.rawValue)'") + } else { + return missionInfo + } + } + + /// Updates `missionInfo` to `object`. + /// + /// - Parameters: + /// - object: The source mission information. + /// - achievementInfo: The updated mission information. + static func update(_ object: MissionResponse.Mission, to missionInfo: MissionInfo) { + let realm = try! Realm() + try! realm.write { + missionInfo.series = object.series + missionInfo.section = object.section + missionInfo.title = object.title + missionInfo.score = object.score + missionInfo.fever = object.fever + missionInfo.combo = object.combo + missionInfo.rate = object.rate + missionInfo.break = object.break + missionInfo.effector = object.effector + missionInfo.reward?.english = object.reward.english + missionInfo.reward?.korean = object.reward.korean + } + } +} diff --git a/RespectU/Sources/Models/Realm/MissionStageInfo.swift b/RespectU/Sources/Models/Realm/MissionStageInfo.swift new file mode 100644 index 0000000..871080a --- /dev/null +++ b/RespectU/Sources/Models/Realm/MissionStageInfo.swift @@ -0,0 +1,41 @@ +// +// MissionStageInfo.swift +// RespectU +// +// Created by Presto on 2018. 9. 2.. +// Copyright © 2018년 Presto. All rights reserved. +// + +import RealmSwift + +/// The realm object about stage information of a mission. +final class MissionStageInfo: Object { + + /// The title of the stage. + @objc dynamic var title: LanguageInfo? + + /// The difficulty of the stage. + @objc dynamic var difficulty: String = "" + + /// The button of the stage. + @objc dynamic var button: String = "" + + /// The localized title of the stage. + var localizedTitle: String { + if isInKorea, let korean = title?.korean { + return korean + } else { + return title?.english ?? "" + } + } + + /// The `Difficulty` of the stage. + var difficultyEnum: Difficulty? { + return Difficulty(rawValue: difficulty) + } + + /// The `Button` of the stage. + var buttonEnum: Button? { + return Button(rawValue: button) + } +} diff --git a/RespectU/Sources/Models/Realm/OldRecordInfo.swift b/RespectU/Sources/Models/Realm/OldRecordInfo.swift new file mode 100644 index 0000000..56c113f --- /dev/null +++ b/RespectU/Sources/Models/Realm/OldRecordInfo.swift @@ -0,0 +1,234 @@ +// +// OldRecordInfo.swift +// RespectU +// +// Created by Presto on 2018. 3. 1.. +// Copyright © 2018년 Presto. All rights reserved. +// + +import RealmSwift + +/// The realm object about record. +/// +/// - Note: This is deprecated. It remains only for users using 2.x version. +@available (*, deprecated) +final class OldRecordInfo: Object { + + /// The series of the record. + @objc dynamic var series: String = "" + + /// The titie of the record. + @objc dynamic var title: String = "" + + /// The rank of 4B in normal difficulty of the record. + @objc dynamic var nm4Rank: String = "-" + + /// The rate of 4B in normal difficulty of the record. + @objc dynamic var nm4Rate: String = "-" + + /// The note of 4B in normal difficulty of the record. + @objc dynamic var nm4Note: String = "-" + + /// The rank of 4B in hard difficulty of the record. + @objc dynamic var hd4Rank: String = "-" + + /// The rate of 4B in hard difficulty of the record. + @objc dynamic var hd4Rate: String = "-" + + /// The note of 4B in hard difficulty of the record. + @objc dynamic var hd4Note: String = "-" + + /// The rank of 4B in maximum difficulty of the record. + @objc dynamic var mx4Rank: String = "-" + + /// The rate of 4B in maximum difficulty of the record. + @objc dynamic var mx4Rate: String = "-" + + /// The note of 4B in maximum difficulty of the record. + @objc dynamic var mx4Note: String = "-" + + /// The rank of 5B in normal difficulty of the record. + @objc dynamic var nm5Rank: String = "-" + + /// The rate of 5B in normal difficulty of the record. + @objc dynamic var nm5Rate: String = "-" + + /// The note of 5B in normal difficulty of the record. + @objc dynamic var nm5Note: String = "-" + + /// The rank of 5B in hard difficulty of the record. + @objc dynamic var hd5Rank: String = "-" + + /// The rate of 5B in hard difficulty of the record. + @objc dynamic var hd5Rate: String = "-" + + /// The note of 5B in hard difficulty of the record. + @objc dynamic var hd5Note: String = "-" + + /// The rank of 5B in maximum difficulty of the record. + @objc dynamic var mx5Rank: String = "-" + + /// The rate of 5B in maximum difficulty of the record. + @objc dynamic var mx5Rate: String = "-" + + /// The note of 5B in maximum difficulty of the record. + @objc dynamic var mx5Note: String = "-" + + /// The rank of 6B in normal difficulty of the record. + @objc dynamic var nm6Rank: String = "-" + + /// The rate of 6B in normal difficulty of the record. + @objc dynamic var nm6Rate: String = "-" + + /// The note of 6B in normal difficulty of the record. + @objc dynamic var nm6Note: String = "-" + + /// The rank of 6B in hard difficulty of the record. + @objc dynamic var hd6Rank: String = "-" + + /// The rate of 6B in hard difficulty of the record. + @objc dynamic var hd6Rate: String = "-" + + /// The note of 6B in hard difficulty of the record. + @objc dynamic var hd6Note: String = "-" + + /// The rank of 6B in maximum difficulty of the record. + @objc dynamic var mx6Rank: String = "-" + + /// The rate of 6B in maximum difficulty of the record. + @objc dynamic var mx6Rate: String = "-" + + /// The note of 6B in maximum difficulty of the record. + @objc dynamic var mx6Note: String = "-" + + /// The rank of 8B in normal difficulty of the record. + @objc dynamic var nm8Rank: String = "-" + + /// The rate of 8B in normal difficulty of the record. + @objc dynamic var nm8Rate: String = "-" + + /// The note of 8B in normal difficulty of the record. + @objc dynamic var nm8Note: String = "-" + + /// The rank of 8B in hard difficulty of the record. + @objc dynamic var hd8Rank: String = "-" + + /// The rate of 8B in hard difficulty of the record. + @objc dynamic var hd8Rate: String = "-" + + /// The note of 8B in hard difficulty of the record. + @objc dynamic var hd8Note: String = "-" + + /// The rank of 8B in maximum difficulty of the record. + @objc dynamic var mx8Rank: String = "-" + + /// The rate of 8B in maximum difficulty of the record. + @objc dynamic var mx8Rate: String = "-" + + /// The note of 8B in maximum difficulty of the record. + @objc dynamic var mx8Note: String = "-" + + /// The normal difficulty in 4B of the record. + @objc dynamic var nm4: Int = 0 + + /// The normal difficulty in 5B of the record. + @objc dynamic var nm5: Int = 0 + + /// The normal difficulty in 6B of the record. + @objc dynamic var nm6: Int = 0 + + /// The normal difficulty in 8B of the record. + @objc dynamic var nm8: Int = 0 + + /// The hard difficulty in 4B of the record. + @objc dynamic var hd4: Int = 0 + + /// The hard difficulty in 5B of the record. + @objc dynamic var hd5: Int = 0 + + /// The hard difficulty in 6B of the record. + @objc dynamic var hd6: Int = 0 + + /// The hard difficulty in 8B of the record. + @objc dynamic var hd8: Int = 0 + + /// The maximum difficulty in 4B of the record. + @objc dynamic var mx4: Int = 0 + + /// The maximum difficulty in 5B of the record. + @objc dynamic var mx5: Int = 0 + + /// The maximum difficulty in 6B of the record. + @objc dynamic var mx6: Int = 0 + + /// The maximum difficulty in 8B of the record. + @objc dynamic var mx8: Int = 0 + + /// The skill point in 4B of the record. + @objc dynamic var button4SkillPoint: Double = 0.0 + + /// The skill point in 5B of the record. + @objc dynamic var button5SkillPoint: Double = 0.0 + + /// The skill point in 6B of the record. + @objc dynamic var button6SkillPoint: Double = 0.0 + + /// The skill point in 8B of the record. + @objc dynamic var button8SkillPoint: Double = 0.0 + + /// The difficulty using for calculating the skill point in 4B of the record. + @objc dynamic var button4HighestSkillPointDifficulty: String = "" + + /// The rate using for calculating the skill point in 4B of the record. + @objc dynamic var button4HighestSkillPointRate: String = "" + + /// The note using for calculating the skill point in 4B of the record. + @objc dynamic var button4HighestSkillPointNote: String = "" + + /// The difficulty using for calculating the skill point in 5B of the record. + @objc dynamic var button5HighestSkillPointDifficulty: String = "" + + /// The rate using for calculating the skill point in 5B of the record. + @objc dynamic var button5HighestSkillPointRate: String = "" + + /// The note using for calculating the skill point in 5B of the record. + @objc dynamic var button5HighestSkillPointNote: String = "" + + /// The difficulty using for calculating the skill point in 6B of the record. + @objc dynamic var button6HighestSkillPointDifficulty: String = "" + + /// The rate using for calculating the skill point in 6B of the record. + @objc dynamic var button6HighestSkillPointRate: String = "" + + /// The note using for calculating the skill point in 6B of the record. + @objc dynamic var button6HighestSkillPointNote: String = "" + + /// The difficulty using for calculating the skill point in 8B of the record. + @objc dynamic var button8HighestSkillPointDifficulty: String = "" + + /// The rate using for calculating the skill point in 8B of the record. + @objc dynamic var button8HighestSkillPointRate: String = "" + + /// The note using for calculating the skill point in 8B of the record. + @objc dynamic var button8HighestSkillPointNote: String = "" + + /// The lowercased title. + @objc dynamic var lowercase: String = "" + + /// Fetches all records. + /// + /// - Returns: Fetched records. + static func get() -> Results { + let oldConfig = Realm + .Configuration(fileURL: Realm.Configuration + .defaultConfiguration.fileURL! + .deletingLastPathComponent() + .appendingPathComponent("default.realm"), + schemaVersion: 13, + migrationBlock: { (_, oldVersion) in + if oldVersion < 1 {} + }) + let result = try! Realm(configuration: oldConfig).objects(OldRecordInfo.self) + return result + } +} diff --git a/RespectU/Sources/Models/Realm/RecordButtonInfo.swift b/RespectU/Sources/Models/Realm/RecordButtonInfo.swift new file mode 100644 index 0000000..3a029ae --- /dev/null +++ b/RespectU/Sources/Models/Realm/RecordButtonInfo.swift @@ -0,0 +1,34 @@ +// +// RecordButtonInfo.swift +// RespectU +// +// Created by Presto on 2018. 9. 2.. +// Copyright © 2018년 Presto. All rights reserved. +// + +import RealmSwift + +/// The realm object about button information on a record. +final class RecordButtonInfo: Object { + + /// The information about 'normal' difficulty in the button of the record. + @objc dynamic var normal: RecordDifficultyInfo? + + /// The information about 'hard' difficulty in the button of the record. + @objc dynamic var hard: RecordDifficultyInfo? + + /// The information about 'maximum' difficulty in the button of the record. + @objc dynamic var maximum: RecordDifficultyInfo? + + /// The skill point in the button of the record. + @objc dynamic var skillPoint: Double = 0 + + /// The difficulty using for calculating skill point in the button of the record. + @objc dynamic var skillPointDifficulty: String = "" + + /// The note using for calculating skill point in the button of the record. + @objc dynamic var skillPointNote: String = "" + + /// The rate using for calculating skill point in the button of the record. + @objc dynamic var skillPointRate: Double = 0 +} diff --git a/RespectU/Sources/Models/Realm/RecordDifficultyInfo.swift b/RespectU/Sources/Models/Realm/RecordDifficultyInfo.swift new file mode 100644 index 0000000..254cf10 --- /dev/null +++ b/RespectU/Sources/Models/Realm/RecordDifficultyInfo.swift @@ -0,0 +1,37 @@ +// +// RecordPerformanceInfo.swift +// RespectU +// +// Created by Presto on 2018. 9. 2.. +// Copyright © 2018년 Presto. All rights reserved. +// + +import RealmSwift + +/// The realm object about difficulty information on a record. +final class RecordDifficultyInfo: Object { + + /// The rank in the difficulty in the button of the record. + @objc dynamic var rank: String = "" + + /// The rate in the difficulty in the button of the record. + @objc dynamic var rate: Double = 0 + + /// The note in the difficulty in the button of the record. + @objc dynamic var note: String = "" + + /// The `Rank` in the difficulty in the button of the record. + var rankEnum: Rank? { + return Rank(rawValue: rank) + } + + /// The rank with percent symbol in the difficulty in the button of the record. + var rateWithPercent: String { + return "\(rate)%" + } + + /// The `Note` in the difficulty in the button of the record. + var noteEnum: Note? { + return Note(rawValue: note) + } +} diff --git a/RespectU/Sources/Models/Realm/RecordInfo.swift b/RespectU/Sources/Models/Realm/RecordInfo.swift new file mode 100644 index 0000000..6f29052 --- /dev/null +++ b/RespectU/Sources/Models/Realm/RecordInfo.swift @@ -0,0 +1,156 @@ +// +// RecordInfo.swift +// RespectU +// +// Created by Presto on 2018. 3. 1.. +// Copyright © 2018년 Presto. All rights reserved. +// + +import RealmSwift + +/// The realm object about record. +final class RecordInfo: Object { + + /// The title of the record. + @objc dynamic var title: LanguageInfo? + + /// The series of the record. + @objc dynamic var series: String = "" + + /// The information about 4B TUNES. + @objc dynamic var button4: RecordButtonInfo? + + /// The information about 5B TUNES. + @objc dynamic var button5: RecordButtonInfo? + + /// The information about 6B TUNES. + @objc dynamic var button6: RecordButtonInfo? + + /// The information about 8B TUNES. + @objc dynamic var button8: RecordButtonInfo? + + /// The localized title of the record. + var localizedTitle: String { + if isInKorea, let korean = title?.korean { + return korean + } else { + return title?.english ?? "" + } + } + + /// The `Series` of the record. + var seriesEnum: Series? { + return Series(rawValue: series) + } + + /// Adds the `recordInfo` to realm. + /// + /// - Parameter recordInfo: The record information will be added. + static func add(_ recordInfo: RecordInfo) { + let realm = try! Realm() + let object = RecordInfo() + object.title = recordInfo.title + object.series = recordInfo.series + object.button4 = recordInfo.button4 + object.button5 = recordInfo.button5 + object.button6 = recordInfo.button6 + object.button8 = recordInfo.button8 + try! realm.write { + realm.add(object) + } + } + + /// Fetches records of specific `title`. + /// + /// - Parameter title: The `title` filtered by this value. The default value is `""`. + /// + /// - Returns: The fetched records. + static func fetch(byTitle title: String = "") -> Results { + let recordInfo = try! Realm().objects(RecordInfo.self) + if title.isEmpty { + return recordInfo + } else { + return recordInfo.filter("title = '\(title)'") + } + } + + /// Updates `object` with `dictionary`. + /// + /// - Parameters: + /// - object: The updated record information. + /// - dictionary: The dictionary contains the record information. + static func update(_ object: RecordInfo, with dictionary: [String: Any]) { + let realm = try! Realm() + try! realm.write { + for (key, value) in dictionary { + object.setValue(value, forKeyPath: key) + } + } + } + + /// Updates` recordInfo` to `object`. + /// + /// - Parameters: + /// - object: The source record information. + /// - recordInfo: The updated record information. + static func update(_ object: RecordResponse.Record, to recordInfo: RecordInfo) { + let realm = try! Realm() + try! realm.write { + recordInfo.title?.english = object.title.english + recordInfo.title?.korean = object.title.korean + recordInfo.series = object.series + recordInfo.button4?.normal?.rank = object.button4.normal.rank + recordInfo.button4?.normal?.rate = object.button4.normal.rate + recordInfo.button4?.normal?.note = object.button4.normal.note + recordInfo.button4?.hard?.rank = object.button4.hard.rank + recordInfo.button4?.hard?.rate = object.button4.hard.rate + recordInfo.button4?.hard?.note = object.button4.hard.note + recordInfo.button4?.maximum?.rank = object.button4.maximum.rank + recordInfo.button4?.maximum?.rate = object.button4.maximum.rate + recordInfo.button4?.maximum?.note = object.button4.maximum.note + recordInfo.button4?.skillPoint = object.button4.skillPoint + recordInfo.button4?.skillPointNote = object.button4.skillPointNote + recordInfo.button4?.skillPointRate = object.button4.skillPointRate + recordInfo.button4?.skillPointDifficulty = object.button4.skillPointDifficulty + recordInfo.button5?.normal?.rank = object.button5.normal.rank + recordInfo.button5?.normal?.rate = object.button5.normal.rate + recordInfo.button5?.normal?.note = object.button5.normal.note + recordInfo.button5?.hard?.rank = object.button5.hard.rank + recordInfo.button5?.hard?.rate = object.button5.hard.rate + recordInfo.button5?.hard?.note = object.button5.hard.note + recordInfo.button5?.maximum?.rank = object.button5.maximum.rank + recordInfo.button5?.maximum?.rate = object.button5.maximum.rate + recordInfo.button5?.maximum?.note = object.button5.maximum.note + recordInfo.button5?.skillPoint = object.button5.skillPoint + recordInfo.button5?.skillPointNote = object.button5.skillPointNote + recordInfo.button5?.skillPointRate = object.button5.skillPointRate + recordInfo.button5?.skillPointDifficulty = object.button5.skillPointDifficulty + recordInfo.button6?.normal?.rank = object.button6.normal.rank + recordInfo.button6?.normal?.rate = object.button6.normal.rate + recordInfo.button6?.normal?.note = object.button6.normal.note + recordInfo.button6?.hard?.rank = object.button6.hard.rank + recordInfo.button6?.hard?.rate = object.button6.hard.rate + recordInfo.button6?.hard?.note = object.button6.hard.note + recordInfo.button6?.maximum?.rank = object.button6.maximum.rank + recordInfo.button6?.maximum?.rate = object.button6.maximum.rate + recordInfo.button6?.maximum?.note = object.button6.maximum.note + recordInfo.button6?.skillPoint = object.button6.skillPoint + recordInfo.button6?.skillPointNote = object.button6.skillPointNote + recordInfo.button6?.skillPointRate = object.button6.skillPointRate + recordInfo.button6?.skillPointDifficulty = object.button6.skillPointDifficulty + recordInfo.button8?.normal?.rank = object.button8.normal.rank + recordInfo.button8?.normal?.rate = object.button8.normal.rate + recordInfo.button8?.normal?.note = object.button8.normal.note + recordInfo.button8?.hard?.rank = object.button8.hard.rank + recordInfo.button8?.hard?.rate = object.button8.hard.rate + recordInfo.button8?.hard?.note = object.button8.hard.note + recordInfo.button8?.maximum?.rank = object.button8.maximum.rank + recordInfo.button8?.maximum?.rate = object.button8.maximum.rate + recordInfo.button8?.maximum?.note = object.button8.maximum.note + recordInfo.button8?.skillPoint = object.button8.skillPoint + recordInfo.button8?.skillPointNote = object.button8.skillPointNote + recordInfo.button8?.skillPointRate = object.button8.skillPointRate + recordInfo.button8?.skillPointDifficulty = object.button8.skillPointDifficulty + } + } +} diff --git a/RespectU/Sources/Models/Realm/SongButtonInfo.swift b/RespectU/Sources/Models/Realm/SongButtonInfo.swift new file mode 100644 index 0000000..ffcc5e6 --- /dev/null +++ b/RespectU/Sources/Models/Realm/SongButtonInfo.swift @@ -0,0 +1,22 @@ +// +// SongButtonInfo.swift +// RespectU +// +// Created by Presto on 2018. 9. 2.. +// Copyright © 2018년 Presto. All rights reserved. +// + +import RealmSwift + +/// The realm object about information in the button. +final class SongButtonInfo: Object { + + /// The normal difficulty value in the button. + @objc dynamic var normal: Int = 0 + + /// The hard difficulty value in the button. + @objc dynamic var hard: Int = 0 + + /// The maximum difficulty value in the button. + @objc dynamic var maximum: Int = 0 +} diff --git a/RespectU/Sources/Models/Realm/SongInfo.swift b/RespectU/Sources/Models/Realm/SongInfo.swift new file mode 100644 index 0000000..42e8b96 --- /dev/null +++ b/RespectU/Sources/Models/Realm/SongInfo.swift @@ -0,0 +1,181 @@ +// +// SongInfo.swift +// RespectU +// +// Created by Presto on 2018. 3. 1.. +// Copyright © 2018년 Presto. All rights reserved. +// + +import RealmSwift + +/// The realm object about song. +final class SongInfo: Object { + + /// The title of the song. + @objc dynamic var title: LanguageInfo? + + /// The losercased title of the song. + @objc dynamic var lowercase: LanguageInfo? + + /// The series of the song. + @objc dynamic var series: String = "" + + /// The composer of the song. + @objc dynamic var composer: String = "" + + /// The bpm of the song. + @objc dynamic var bpm: Int = 0 + + /// The sub bpm of the song. + /// + /// If this value is not nil, this song has variant bpm. + /// In this case, `bpm` becomes the minimum bpm and `subBpm` becomes the maximum bpm. + let subBPM: RealmOptional = RealmOptional() + + /// The information about 4B of the song. + @objc dynamic var button4: SongButtonInfo? + + /// The information about 5B of the song. + @objc dynamic var button5: SongButtonInfo? + + /// The information about 6B of the song. + @objc dynamic var button6: SongButtonInfo? + + /// The information about 8B of the song. + @objc dynamic var button8: SongButtonInfo? + + /// The localized title of the song. + var localizedTitle: String { + if isInKorea, let korean = title?.korean { + return korean + } else { + return title?.english ?? "" + } + } + + /// The localized lowercased title of the song. + var localizedLowercase: String { + if isInKorea, let korean = lowercase?.korean { + return korean + } else { + return lowercase?.english ?? "" + } + } + + /// The `Series` of the song. + var seriesEnum: Series? { + return Series(rawValue: series) + } + + /// The string value conveted by `bpm` and `subBPM`. + /// + /// `bpm == 130, subBPM == nil` -> "BPM 130" + /// `bpm == 130, subBPM == 153` -> "BPM 130 ~ 153" + var bpmToString: String { + if let subBpm = subBPM.value { + return "BPM \(bpm) ~ \(subBpm)" + } else { + return "BPM \(bpm)" + } + } + + /// Adds the `songInfo` to realm. + /// + /// - Parameter songInfo: The song information will be added. + static func add(_ songInfo: SongResponse.Song) { + let realm = try! Realm() + let object = SongInfo() + let titleInfo = LanguageInfo() + let lowercaseInfo = LanguageInfo() + let button4Info = SongButtonInfo() + let button5Info = SongButtonInfo() + let button6Info = SongButtonInfo() + let button8Info = SongButtonInfo() + object.series = songInfo.series + object.composer = songInfo.composer + object.bpm = songInfo.bpm + object.subBPM.value = songInfo.subBpm + titleInfo.english = songInfo.title.english + titleInfo.korean = songInfo.title.korean + object.title = titleInfo + lowercaseInfo.english = songInfo.lowercase.english + lowercaseInfo.korean = songInfo.lowercase.korean + object.lowercase = lowercaseInfo + button4Info.normal = songInfo.button4.normal + button4Info.hard = songInfo.button4.hard + button4Info.maximum = songInfo.button4.maximum + object.button4 = button4Info + button5Info.normal = songInfo.button5.normal + button5Info.hard = songInfo.button5.hard + button5Info.maximum = songInfo.button5.maximum + object.button5 = button5Info + button6Info.normal = songInfo.button6.normal + button6Info.hard = songInfo.button6.hard + button6Info.maximum = songInfo.button6.maximum + object.button6 = button6Info + button8Info.normal = songInfo.button8.normal + button8Info.hard = songInfo.button8.hard + button8Info.maximum = songInfo.button8.maximum + object.button8 = button8Info + try! realm.write { + realm.add(object) + } + } + + /// Fetches songs of specific `series`. + /// + /// - Parameter series: The `Series` filtered by this value. The default value is `nil`. + /// + /// - Note: If `series` is `nil`, it fetches all saved songs. + /// + /// - Returns: The fetched songs. + static func fetch(bySeries series: Series? = nil) -> Results { + let songInfo = try! Realm().objects(SongInfo.self) + if case let series? = series { + return songInfo.filter("series = '\(series.rawValue)'") + } else { + return songInfo + } + } + + /// Fetches songs of specific `title`. + /// + /// - Parameter series: The `title` filtered by this value. + /// + /// - Returns: The fetched songs. + static func fetch(byTitle title: String) -> SongInfo? { + let predicate = NSPredicate(format: "%K == %@", #keyPath(SongInfo.title.english), title) + return try! Realm().objects(SongInfo.self).filter(predicate).first + } + + /// Updates `songInfo` to `object`. + /// + /// - Parameters: + /// - object: The source song information. + /// - songInfo: The updated song information. + static func update(_ object: SongResponse.Song, to songInfo: SongInfo) { + let realm = try! Realm() + try! realm.write { + songInfo.title?.english = object.title.english + songInfo.title?.korean = object.title.korean + songInfo.lowercase?.english = object.lowercase.english + songInfo.lowercase?.korean = object.lowercase.korean + songInfo.series = object.series + songInfo.composer = object.composer + songInfo.bpm = object.bpm + songInfo.subBPM.value = object.subBpm + songInfo.button4?.normal = object.button4.normal + songInfo.button4?.hard = object.button4.hard + songInfo.button4?.maximum = object.button4.maximum + songInfo.button5?.normal = object.button5.normal + songInfo.button5?.hard = object.button5.hard + songInfo.button5?.maximum = object.button5.maximum + songInfo.button6?.normal = object.button6.normal + songInfo.button6?.hard = object.button6.hard + songInfo.button6?.maximum = object.button6.maximum + songInfo.button8?.normal = object.button8.normal + songInfo.button8?.hard = object.button8.hard + songInfo.button8?.maximum = object.button8.maximum + } + } +} diff --git a/RespectU/Sources/Models/Realm/TipInfo.swift b/RespectU/Sources/Models/Realm/TipInfo.swift new file mode 100644 index 0000000..959a7cc --- /dev/null +++ b/RespectU/Sources/Models/Realm/TipInfo.swift @@ -0,0 +1,61 @@ +// +// TipInfo.swift +// RespectU +// +// Created by Presto on 2018. 3. 1.. +// Copyright © 2018년 Presto. All rights reserved. +// + +import RealmSwift + +/// The realm object about tip. +final class TipInfo: Object { + + /// The title of the tip. + @objc dynamic var title: LanguageInfo? + + /// The localized title of the tip. + var localizedTitle: String { + if isInKorea, let korean = title?.korean { + return korean + } else { + return title?.english ?? "" + } + } + + /// Adds the `tipInfo` to realm. + /// + /// - Parameter tipInfo: The tip information will be added. + static func add(_ tipInfo: TipResponse.Tip) { + let realm = try! Realm() + let object = TipInfo() + let languageInfo = LanguageInfo() + languageInfo.english = tipInfo.title.english + languageInfo.korean = tipInfo.title.korean + object.title = languageInfo + try! realm.write { + realm.add(object) + } + } + + /// Fetches tips. + /// + /// - Returns: The fetched tips. + static func fetch() -> Results { + let tipInfo = try! Realm().objects(TipInfo.self) + return tipInfo + } + + /// Updates `tipInfo` to `object`. + /// + /// - Parameters: + /// - object: The source tip information. + /// - tipInfo: The updated tip information. + static func update(_ object: TipResponse.Tip, to tipInfo: TipInfo) { + let realm = try! Realm() + try! realm.write { + tipInfo.title?.english = object.title.english + tipInfo.title?.korean = object.title.korean + } + } +} diff --git a/RespectU/Sources/Models/Realm/TrophyInfo.swift b/RespectU/Sources/Models/Realm/TrophyInfo.swift new file mode 100644 index 0000000..572c27a --- /dev/null +++ b/RespectU/Sources/Models/Realm/TrophyInfo.swift @@ -0,0 +1,141 @@ +// +// TrophyInfo.swift +// RespectU +// +// Created by Presto on 2018. 3. 1.. +// Copyright © 2018년 Presto. All rights reserved. +// + +import RealmSwift + +/// The realm object about trophy. +final class TrophyInfo: Object { + + /// The series of the trophy. + @objc dynamic var series: String = "" + + /// The rating of the trophy. + @objc dynamic var rating: String = "" + + /// The image name of the trophy. + @objc dynamic var image: String = "" + + /// The title of the trophy. + @objc dynamic var title: LanguageInfo? + + /// The content of the trophy. + @objc dynamic var content: LanguageInfo? + + /// The localized title of the trophy. + var localizedTitle: String { + if isInKorea, let korean = title?.korean { + return korean + } else { + return title?.english ?? "" + } + } + + /// The localized content of the trophy. + var localizedContent: String { + if isInKorea, let korean = content?.korean { + return korean + } else { + return content?.english ?? "" + } + } + + /// The `Series` of the trophy. + var seriesEnum: Series? { + return Series(rawValue: series) + } + + /// The `TrophyGrade` of the trophy. + var ratingEnum: TrophyGrade? { + return TrophyGrade(rawValue: rating) + } + + /// Adds the `trophyInfo` to realm. + /// + /// - Parameter trophyInfo: The trophy information will be added. + static func add(_ trophyInfo: TrophyResponse.Trophy) { + let realm = try! Realm() + let object = TrophyInfo() + let titleInfo = LanguageInfo() + let contentInfo = LanguageInfo() + object.series = trophyInfo.series + object.rating = trophyInfo.rating + object.image = trophyInfo.image + let imageURL = "\(APIService.baseURL)/images/\(trophyInfo.series)/\(trophyInfo.image).png" + guard let url = URL(string: imageURL) else { return } + guard let imageData = try? Data(contentsOf: url) else { return } + guard let documentURL + = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first + else { return } + let fileURL = documentURL.appendingPathComponent("\(trophyInfo.image).png") + do { + try imageData.write(to: fileURL, options: .atomic) + } catch { + print(error.localizedDescription) + } + titleInfo.english = trophyInfo.title.english + titleInfo.korean = trophyInfo.title.korean + contentInfo.english = trophyInfo.content.english + contentInfo.korean = trophyInfo.content.korean + object.title = titleInfo + object.content = contentInfo + try! realm.write { + realm.add(object) + } + } + + /// Fetches trophies of specific `series`. + /// + /// - Parameter series: The `Series` filtered by this value. The default value is `nil`. + /// + /// - Note: If `series` is `nil`, if fetches all saved trophies. + /// + /// - Returns: The fetched trophies. + static func fetch(bySeries series: Series? = nil) -> Results { + let trophyInfo = try! Realm().objects(TrophyInfo.self) + if case let series? = series { + return trophyInfo.filter("series = '\(series.rawValue)'") + } else { + return trophyInfo + } + } + + /// Updates `trophyInfo` to `object`. + /// + /// - Parameters: + /// - object: The source trophy information. + /// - achievementInfo: The updated trophy information. + static func update(_ object: TrophyResponse.Trophy, to trophyInfo: TrophyInfo) { + guard let documentURL + = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first + else { return } + let fileURL = documentURL.appendingPathComponent("\(trophyInfo.image).png") + do { + try FileManager.default.removeItem(at: fileURL) + } catch { + print(error.localizedDescription) + } + let imageURL = "\(APIService.baseURL)/images/\(trophyInfo.series)/\(trophyInfo.image).png" + guard let url = URL(string: imageURL) else { return } + guard let imageData = try? Data(contentsOf: url) else { return } + do { + try imageData.write(to: fileURL, options: .atomic) + } catch { + print(error.localizedDescription) + } + guard let realm = try? Realm() else { return } + try? realm.write { + trophyInfo.series = object.series + trophyInfo.rating = object.rating + trophyInfo.image = object.image + trophyInfo.title?.english = object.title.english + trophyInfo.title?.korean = object.title.korean + trophyInfo.content?.english = object.content.english + trophyInfo.content?.korean = object.content.korean + } + } +} diff --git a/RespectU/Sources/Models/Realm/VersionInfo.swift b/RespectU/Sources/Models/Realm/VersionInfo.swift new file mode 100644 index 0000000..7587bd5 --- /dev/null +++ b/RespectU/Sources/Models/Realm/VersionInfo.swift @@ -0,0 +1,67 @@ +// +// VersionInfo.swift +// RespectU +// +// Created by Presto on 2018. 9. 3.. +// Copyright © 2018년 Presto. All rights reserved. +// + +import RealmSwift + +/// The realm object about version. +final class VersionInfo: Object { + + /// The server version. + @objc dynamic var serverVersion: String = "" + + /// The in-game version. + @objc dynamic var gameVersion: String = "" + + /// Fetches version information. + /// + /// - Returns: The fetched version information. + static func fetch() -> Results { + let versionInfo = try! Realm().objects(VersionInfo.self) + return versionInfo + } + + /// Adds the `versionInfo` to realm. + /// + /// - Parameter versionInfo: The version information will be added. + static func add(_ versionInfo: VersionResponse) { + let realm = try! Realm() + let object = VersionInfo() + object.serverVersion = versionInfo.serverVersion + object.gameVersion = versionInfo.gameVersion + try! realm.write { + realm.add(object) + } + } + + /// Updates `versionInfo` to `object`. + /// + /// - Parameters: + /// - object: The source version information. + /// - versionInfo: The updated version information. + static func update(_ object: VersionResponse, to versionInfo: VersionInfo) { + let realm = try! Realm() + try! realm.write { + versionInfo.serverVersion = object.serverVersion + versionInfo.gameVersion = object.gameVersion + } + } + + /// Updates `object` with `dictionary`. + /// + /// - Parameters: + /// - object: The updated version information. + /// - dictionary: The dictionary contains version information. + static func update(_ object: VersionInfo, with dictionary: [String: Any]) { + let realm = try! Realm() + try! realm.write { + for (key, value) in dictionary { + object.setValue(value, forKey: key) + } + } + } +} diff --git a/RespectU/Sources/Models/Response/AchievementResponse.swift b/RespectU/Sources/Models/Response/AchievementResponse.swift new file mode 100644 index 0000000..17ee9ef --- /dev/null +++ b/RespectU/Sources/Models/Response/AchievementResponse.swift @@ -0,0 +1,60 @@ +// +// AchievementResponse.swift +// RespectU +// +// Created by Presto on 2018. 8. 21.. +// Copyright © 2018년 Presto. All rights reserved. +// + +import Foundation + +/// The response object about achievement. +struct AchievementResponse: Codable { + + /// The achievement data in the achievement response object. + struct Achievement: Codable { + + /// The type of the achievement. + let type: String + + /// The level of the achievement. + let level: Int + + /// The section of the achievement. + let section: LanguageResponse + + /// The item of the achievement. + let item: LanguageResponse + + /// The localized section of the achievement. + var localizedSection: String { + if Locale.current.regionCode == "KR", let korean = section.korean { + return korean + } else { + return section.english + } + } + + /// The localized item of the achievement. + var localizedItem: String { + if Locale.current.regionCode == "KR", let korean = item.korean { + return korean + } else { + return item.english + } + } + } + + /// The achievements. + let achievements: [Achievement] + + /// The number of `achievements`. + var count: Int { + return achievements.count + } + + /// Accesses the `index`th element in `achievements`. + subscript(index: Int) -> Achievement { + return achievements[index] + } +} diff --git a/RespectU/Response/LanguageResponse.swift b/RespectU/Sources/Models/Response/LanguageResponse.swift similarity index 55% rename from RespectU/Response/LanguageResponse.swift rename to RespectU/Sources/Models/Response/LanguageResponse.swift index 47013c9..0c0ac69 100644 --- a/RespectU/Response/LanguageResponse.swift +++ b/RespectU/Sources/Models/Response/LanguageResponse.swift @@ -6,7 +6,12 @@ // Copyright © 2018년 Presto. All rights reserved. // +/// The response object about language. struct LanguageResponse: Codable { - let english: String - let korean: String? + + /// The english data. + let english: String + + /// The korean data. + let korean: String? } diff --git a/RespectU/Sources/Models/Response/MissionResponse.swift b/RespectU/Sources/Models/Response/MissionResponse.swift new file mode 100644 index 0000000..217a1fe --- /dev/null +++ b/RespectU/Sources/Models/Response/MissionResponse.swift @@ -0,0 +1,109 @@ +// +// MissionResponse.swift +// RespectU +// +// Created by Presto on 2018. 8. 21.. +// Copyright © 2018년 Presto. All rights reserved. +// + +import Foundation + +/// The response object about mission. +struct MissionResponse: Codable { + + /// The mission data in the mission response object. + struct Mission: Codable { + + /// The stage data in the mission response object. + struct Stage: Codable { + + /// The title of the mission. + let title: LanguageResponse + + /// The difficulty of the mission. + let difficulty: String + + /// The button of the mission. + let button: String + + /// The localized title of the mission. + var localizedTitle: String { + if Locale.current.regionCode == "KR", let korean = title.korean { + return korean + } else { + return title.english + } + } + } + + /// The series of the mission. + let series: String + + /// The section of the mission. + let section: String + + /// The title of the mission. + let title: String + + /// The score limit of the mission. + let score: Int + + /// The fever limit of the mission. + let fever: Int + + /// The combo limit of the mission. + let combo: Int + + /// The rate limit of the mission. + let rate: Int + + /// The break limit of the mission. + let `break`: Int + + /// The effector of the mission. + let effector: String + + /// The reward of the mission. + let reward: LanguageResponse + + /// The information about first stage of the mission. + let stage1: Stage? + + /// The information about second stage of the mission. + let stage2: Stage? + + /// The information about third stage of the mission. + let stage3: Stage? + + /// The information about fourth stage of the mission. + let stage4: Stage? + + /// The information about fifth stage of the mission. + let stage5: Stage? + + /// The information about sixth stage of the mission. + let stage6: Stage? + + /// The localized reward of the mission. + var localizedReward: String { + if Locale.current.regionCode == "KR", let korean = reward.korean { + return korean + } else { + return reward.english + } + } + } + + /// The missions. + let missions: [Mission] + + /// The number of `missions`. + var count: Int { + return missions.count + } + + /// Accesses the `index`th element in `missions`. + subscript(index: Int) -> Mission { + return missions[index] + } +} diff --git a/RespectU/Response/NicknameResponse.swift b/RespectU/Sources/Models/Response/NicknameResponse.swift similarity index 69% rename from RespectU/Response/NicknameResponse.swift rename to RespectU/Sources/Models/Response/NicknameResponse.swift index f380996..90a76ce 100644 --- a/RespectU/Response/NicknameResponse.swift +++ b/RespectU/Sources/Models/Response/NicknameResponse.swift @@ -8,6 +8,9 @@ import Foundation +/// The response object about nickname. struct NicknameResponse: Codable { - let nickname: String + + /// The nickname. + let nickname: String } diff --git a/RespectU/Sources/Models/Response/RankingResponse.swift b/RespectU/Sources/Models/Response/RankingResponse.swift new file mode 100644 index 0000000..d415cd1 --- /dev/null +++ b/RespectU/Sources/Models/Response/RankingResponse.swift @@ -0,0 +1,38 @@ +// +// Ranking.swift +// RespectU +// +// Created by Presto on 2018. 8. 21.. +// Copyright © 2018년 Presto. All rights reserved. +// + +import Foundation + +/// The response object about ranking. +struct RankingResponse: Codable { + + /// The ranking data in the ranking response object. + struct Ranking: Codable { + + /// The user identifier. + let id: String + + /// The nickname. + let nickname: String + + /// The 4B tunes skill point. + let button4: Double + + /// The 5B tunes skill point. + let button5: Double + + /// The 6B tunes skill point. + let button6: Double + + /// The 8B tunes skill point. + let button8: Double + } + + /// The rankings. + let rankings: [Ranking] +} diff --git a/RespectU/Sources/Models/Response/RecordResponse.swift b/RespectU/Sources/Models/Response/RecordResponse.swift new file mode 100644 index 0000000..469dc54 --- /dev/null +++ b/RespectU/Sources/Models/Response/RecordResponse.swift @@ -0,0 +1,79 @@ +// +// RecordResponse.swift +// RespectU +// +// Created by Presto on 2018. 8. 28.. +// Copyright © 2018년 Presto. All rights reserved. +// + +import Foundation + +/// The response object about record. +struct RecordResponse: Codable { + + /// The record data in the record response object. + struct Record: Codable { + + /// The button data in the record response object. + struct Button: Codable { + + /// The difficulty data in the record response object. + struct Difficulty: Codable { + + /// The rank in the difficulty in the button of the record. + let rank: String + + /// The rate in the difficulty in the button of the record. + let rate: Double + + /// The note in the difficulty in the button of the record. + let note: String + } + + /// The normal difficulty in the button of the record. + let normal: Difficulty + + /// The hard difficulty in the button of the record. + let hard: Difficulty + + /// The maximum difficulty in the button of the record. + let maximum: Difficulty + + /// The skill point in the button of the record. + let skillPoint: Double + + /// The difficulty using for calculating skill point in the button of the record. + let skillPointDifficulty: String + + /// The note using for calculating skill point in the button of the record. + let skillPointNote: String + + /// The rate using for calculating skill point in the button of the record. + let skillPointRate: Double + } + + /// The title of the record. + let title: LanguageResponse + + /// The series of the record. + let series: String + + /// The information about 4B of the record. + let button4: Button + + /// The information about 5B of the record. + let button5: Button + + /// The information about 6B of the record. + let button6: Button + + /// The information about 8B of the record. + let button8: Button + } + + /// The user identifier. + let id: String + + /// The records. + let records: [Record] +} diff --git a/RespectU/Sources/Models/Response/SongResponse.swift b/RespectU/Sources/Models/Response/SongResponse.swift new file mode 100644 index 0000000..102ccbd --- /dev/null +++ b/RespectU/Sources/Models/Response/SongResponse.swift @@ -0,0 +1,106 @@ +// +// SongResponse.swift +// RespectU +// +// Created by Presto on 2018. 8. 21.. +// Copyright © 2018년 Presto. All rights reserved. +// + +import Foundation + +/// The response object about song. +struct SongResponse: Codable { + + /// The song data in the song response object. + struct Song: Codable { + + /// The button data in the song response object. + struct Button: Codable { + + /// The normal difficulty value in the button of the song. + let normal: Int + + /// The hard difficulty value in the button of the song. + let hard: Int + + /// The maximum difficulty value in the button of the song. + let maximum: Int + } + + /// The title of the song. + let title: LanguageResponse + + /// The lowercased title of the song. + let lowercase: LanguageResponse + + /// The series of the song. + let series: String + + /// The composer of the song. + let composer: String + + /// The bpm of the song. + let bpm: Int + + /// The sub bpm of the song. + /// + /// If this value is not nil, this song has variant bpm. + /// In this case, `bpm` becomes the minimum bpm and `subBpm` becomes the maximum bpm. + let subBpm: Int? + + /// The information about 4B of the song. + let button4: Button + + /// The information about 5B of the song. + let button5: Button + + /// The information about 6B of the song. + let button6: Button + + /// The information about 8B of the song. + let button8: Button + + /// The localized title of the song. + var localizedTitle: String { + if Locale.current.regionCode == "KR", let korean = title.korean { + return korean + } else { + return title.english + } + } + + /// The localized lowercased title of the song. + var localizedLowercase: String { + if Locale.current.regionCode == "KR", let korean = lowercase.korean { + return korean + } else { + return lowercase.english + } + } + + /// The string value conveted by `bpm` and `subBPM`. + /// + /// `bpm == 130, subBPM == nil` -> "BPM 130" + /// `bpm == 130, subBPM == 153` -> "BPM 130 ~ 153" + var bpmToString: String { + if let subBpm = subBpm { + return "BPM \(bpm) ~ \(subBpm)" + } else { + return "BPM \(bpm)" + } + } + } + + /// The songs. + let songs: [Song] + + /// The number of `songs`. + var count: Int { + return songs.count + } + + /// Accesses the `index`th element in `songs`. + subscript(index: Int) -> Song { + return songs[index] + } +} diff --git a/RespectU/Sources/Models/Response/TipResponse.swift b/RespectU/Sources/Models/Response/TipResponse.swift new file mode 100644 index 0000000..633330a --- /dev/null +++ b/RespectU/Sources/Models/Response/TipResponse.swift @@ -0,0 +1,42 @@ +// +// TipResponse.swift +// RespectU +// +// Created by Presto on 2018. 8. 21.. +// Copyright © 2018년 Presto. All rights reserved. +// + +import Foundation + +/// The response object about tip. +struct TipResponse: Codable { + + /// The tip data in the tip response object. + struct Tip: Codable { + + /// The title of the tip. + let title: LanguageResponse + + /// The localized title of the tip. + var localizedTitle: String { + if Locale.current.regionCode == "KR", let korean = title.korean { + return korean + } else { + return title.english + } + } + } + + /// The tips. + let tips: [Tip] + + /// The number of `tips`. + var count: Int { + return tips.count + } + + /// Accesses the `index`th element in `tips`. + subscript(index: Int) -> Tip { + return tips[index] + } +} diff --git a/RespectU/Sources/Models/Response/TrophyResponse.swift b/RespectU/Sources/Models/Response/TrophyResponse.swift new file mode 100644 index 0000000..148069d --- /dev/null +++ b/RespectU/Sources/Models/Response/TrophyResponse.swift @@ -0,0 +1,63 @@ +// +// TrophyResponse.swift +// RespectU +// +// Created by Presto on 2018. 8. 21.. +// Copyright © 2018년 Presto. All rights reserved. +// + +import Foundation + +/// The response object about trophy. +struct TrophyResponse: Codable { + + /// The trophy data in the trophy response object. + struct Trophy: Codable { + + /// The series of the trophy. + let series: String + + /// The rating of the trophy. + let rating: String + + /// The image name of the trophy. + let image: String + + /// The title of the trophy. + let title: LanguageResponse + + /// The content of the trophy. + let content: LanguageResponse + + /// The localized title of the trophy. + var localizedTitle: String { + if Locale.current.regionCode == "KR", let korean = title.korean { + return korean + } else { + return title.english + } + } + + /// The localized content of the trophy. + var localizedContent: String { + if Locale.current.regionCode == "KR", let korean = content.korean { + return korean + } else { + return content.english + } + } + } + + /// The trophies. + let trophies: [Trophy] + + /// The number of `trophies`. + var count: Int { + return trophies.count + } + + /// Accesses the `index`th element in `trophies`. + subscript(index: Int) -> Trophy { + return trophies[index] + } +} diff --git a/RespectU/Sources/Models/Response/UserResponse.swift b/RespectU/Sources/Models/Response/UserResponse.swift new file mode 100644 index 0000000..fab74d1 --- /dev/null +++ b/RespectU/Sources/Models/Response/UserResponse.swift @@ -0,0 +1,30 @@ +// +// User.swift +// RespectU +// +// Created by Presto on 2018. 8. 21.. +// Copyright © 2018년 Presto. All rights reserved. +// + +/// The repsonse object about user. +struct UserResponse: Codable { + + /// The user data in the user response object. + struct User: Codable { + + /// The uid of the user. + let uid: String + + /// The nickname of the user. + let nickname: String + + /// The identifier of the user. + let identifier: String + + /// The password of the user. + let password: String + } + + /// The users. + let users: [User] +} diff --git a/RespectU/Sources/Models/Response/VersionResponse.swift b/RespectU/Sources/Models/Response/VersionResponse.swift new file mode 100644 index 0000000..c49f345 --- /dev/null +++ b/RespectU/Sources/Models/Response/VersionResponse.swift @@ -0,0 +1,22 @@ +// +// VersionResponse.swift +// RespectU +// +// Created by Presto on 2018. 9. 3.. +// Copyright © 2018년 Presto. All rights reserved. +// + +import Foundation + +/// The response object about version. +struct VersionResponse: Codable { + + /// The client version. + let clientVersion: String + + /// The server version. + let serverVersion: String + + /// The ingame version. + let gameVersion: String +} diff --git a/RespectU/Sources/Services/APIService+Achievement.swift b/RespectU/Sources/Services/APIService+Achievement.swift new file mode 100644 index 0000000..dcc4adf --- /dev/null +++ b/RespectU/Sources/Services/APIService+Achievement.swift @@ -0,0 +1,28 @@ +// +// API+Achievement.swift +// RespectU +// +// Created by Presto on 10/03/2019. +// Copyright © 2019 Presto. All rights reserved. +// + +import Foundation + +// MARK: APIService + Achievement + +extension APIService { + + func requestAchievements(byType type: AchievementType? = nil, + completion: @escaping (AchievementResponse?, Error?) -> Void) { + let urlString: String + if case let type? = type { + urlString = "\(baseURL)/achievements/\(type.rawValue)" + } else { + urlString = "\(baseURL)/achievements" + } + networkManager.get(urlString) { data, error in + let (decoded, error) = self.decode(to: AchievementResponse.self, data: data, error: error) + completion(decoded, error) + } + } +} diff --git a/RespectU/Sources/Services/APIService+Base.swift b/RespectU/Sources/Services/APIService+Base.swift new file mode 100644 index 0000000..fbeb1ed --- /dev/null +++ b/RespectU/Sources/Services/APIService+Base.swift @@ -0,0 +1,199 @@ +// +// API.swift +// RespectU +// +// Created by Presto on 2018. 8. 21.. +// Copyright © 2018년 Presto. All rights reserved. +// + +import Foundation + +import SwiftKeychainWrapper + +/// The `protocol` for api service. +protocol APIServiceType: class { + + /// The network manager for api requests. + var networkManager: NetworkManagerType { get } + + /// The base url. + static var baseURL: String { get } + + /// The base url. + var baseURL: String { get } + + /// The json decoder. + var jsonDecoder: JSONDecoder { get } + + /// Decodes `data` to `type`. + /// + /// If the decoding process has failed, the error throwed by the process is returned. + /// If the data is `nil`, passed error is returned. + /// + /// - Parameters: + /// - type : The type that the `data` has converted. It conforms to `Decodable` protocol. + /// - data : The `Data` to be converted to `type`. + /// - error : The error. + /// + /// - Returns: The decoded object and error. + func decode(to type: T.Type, data: Data?, error: Error?) -> (T?, Error?) where T: Decodable + + /// Requests songs by `series`. + /// + /// If `series` is `nil`, it requests all songs. + /// + /// - Parameters: + /// - series: The series filtering songs. + /// - completion: The completion handler. + func requestSongs(bySeries series: Series?, + completion: @escaping (SongResponse?, Error?) -> Void) + + /// Requests missions by `series`. + /// + /// If `series` is `nil`, it requests all missions. + /// + /// - Parameters: + /// - series: The series filtering missions. + /// - completion: The completion handler. + func requestMissions(bySeries series: Series?, + completion: @escaping (MissionResponse?, Error?) -> Void) + + /// Requests trophies by `series`. + /// + /// If `series` is `nil`, it requests all trophies. + /// + /// - Parameters: + /// - series: The series filtering trophies. + /// - completion: The completion handler. + func requestTrophies(bySeries series: Series?, + completion: @escaping (TrophyResponse?, Error?) -> Void) + + /// Requests achievements by `type`. + /// + /// If `type` is `nil`, it requests all achievements. + /// + /// - Parameters: + /// - type: The type filtering achievements. + /// - completion: The completion handler. + func requestAchievements(byType type: AchievementType?, + completion: @escaping (AchievementResponse?, Error?) -> Void) + + /// Requests tips. + /// + /// - Parameter completion: The completion handler. + func requestTips(completion: @escaping (TipResponse?, Error?) -> Void) + + /// Requests sign in. + /// + /// - Parameters: + /// - id: The id of an user. + /// - password: The password of an user. + /// - completion: The completion handler. + func requestSignIn(id: String, password: String, completion: @escaping (Int?, Error?) -> Void) + + /// Requests sign up. + /// + /// - Parameters: + /// - id: The id of an user. + /// - password: The password of an user. + /// - nickname: The nickname of an user. + /// - completion: The completion handler. + func requestSignUp(id: String, + password: String, + nickname: String, + completion: @escaping (Int?, Error?) -> Void) + + /// Requests the version. + /// + /// - Parameter completion: The completion handler. + func requestVersions(completion: @escaping (VersionResponse?, Error?) -> Void) + + /// Requests the nickname. + /// + /// - Parameter completin: The completion handler. + func requestNickname(completion: @escaping (NicknameResponse?, Error?) -> Void) + + /// Uploads the nickname. + /// + /// - Parameters: + /// - id: The id of the user. + /// - nickname: The nickname of the user. + /// - completion: The completion handler. + func uploadNickname(id: String, nickname: String, completion: @escaping (Int?, Error?) -> Void) + + /// Requests records. + /// + /// - Parameters: + /// - id: The id of the user. + /// - completion: The completion handler. + func requestRecords(id: String, completion: @escaping (RecordResponse?, Error?) -> Void) + + /// Uploads records. + /// + /// - Parameters: + /// - data: The data contains the record information. + /// - completion: The completion handler. + func uploadRecords(_ data: Data, completion: @escaping (Int?, Error?) -> Void) + + /// Requests rankings. + /// + /// - Parameter completion: The completion handler. + func requestRankings(completion: @escaping (RankingResponse?, Error?) -> Void) + + /// Uploads the ranking. + /// + /// - Parameters: + /// - id: The id of the user. + /// - nickname: The nickname of the user. + /// - button4: The 4B skill point of the user. + /// - button5: The 5B skill point of the user. + /// - button6: The 6B skill point of the user. + /// - button8: The 8B skill point of the user. + /// - completion: The completion handler. + func uploadRanking(id: String, + nickname: String, + button4: Double, + button5: Double, + button6: Double, + button8: Double, + completion: @escaping (Int?, Error?) -> Void) +} + +// MARK: - APIType protocol default implementation + +extension APIServiceType { + + var networkManager: NetworkManagerType { + return NetworkManager() + } + + var baseURL: String { + return "http://13.209.166.210:3000" + // return "http://localhost:3000" + } + + static var baseURL: String { + return "http://13.209.166.210:3000" + // return "http://localhost:3000" + } + + var jsonDecoder: JSONDecoder { + return JSONDecoder() + } + + func decode(to type: T.Type, data: Data?, error: Error?) -> (T?, Error?) where T: Decodable { + if case let data? = data { + do { + let decoded = try jsonDecoder.decode(type, from: data) + return (decoded, nil) + } catch { + return (nil, error) + } + } else { + return (nil, error) + } + } +} + +/// The api service conforming `APIServiceType`. +final class APIService: APIServiceType { } diff --git a/RespectU/Sources/Services/APIService+Mission.swift b/RespectU/Sources/Services/APIService+Mission.swift new file mode 100644 index 0000000..e1f2334 --- /dev/null +++ b/RespectU/Sources/Services/APIService+Mission.swift @@ -0,0 +1,28 @@ +// +// API+Mission.swift +// RespectU +// +// Created by Presto on 10/03/2019. +// Copyright © 2019 Presto. All rights reserved. +// + +import Foundation + +// MARK: APIService + Mission + +extension APIService { + + func requestMissions(bySeries series: Series? = nil, + completion: @escaping (MissionResponse?, Error?) -> Void) { + let urlString: String + if case let series? = series { + urlString = "\(baseURL)/missions/\(series.rawValue)" + } else { + urlString = "\(baseURL)/missions" + } + networkManager.get(urlString) { data, error in + let (decoded, error) = self.decode(to: MissionResponse.self, data: data, error: error) + completion(decoded, error) + } + } +} diff --git a/RespectU/Sources/Services/APIService+Ranking.swift b/RespectU/Sources/Services/APIService+Ranking.swift new file mode 100644 index 0000000..ad9ff1c --- /dev/null +++ b/RespectU/Sources/Services/APIService+Ranking.swift @@ -0,0 +1,41 @@ +// +// API+Ranking.swift +// RespectU +// +// Created by Presto on 10/03/2019. +// Copyright © 2019 Presto. All rights reserved. +// + +import Foundation + +// MARK: APIService + Ranking + +extension APIService { + + func requestRankings(completion: @escaping (RankingResponse?, Error?) -> Void) { + networkManager.get("\(baseURL)/rankings") { data, error in + let (decoded, error) = self.decode(to: RankingResponse.self, data: data, error: error) + completion(decoded, error) + } + } + + func uploadRanking(id: String, + nickname: String, + button4: Double, + button5: Double, + button6: Double, + button8: Double, + completion: @escaping (Int?, Error?) -> Void) { + let parameters: [String: Any] = [ + "id": id, + "nickname": nickname, + "button4": button4, + "button5": button5, + "button6": button6, + "button8": button8 + ] + networkManager.post("\(baseURL)/rankings", parameters: parameters) { _, statusCode, error in + completion(statusCode, error) + } + } +} diff --git a/RespectU/Sources/Services/APIService+Record.swift b/RespectU/Sources/Services/APIService+Record.swift new file mode 100644 index 0000000..76a4206 --- /dev/null +++ b/RespectU/Sources/Services/APIService+Record.swift @@ -0,0 +1,27 @@ +// +// API+Record.swift +// RespectU +// +// Created by Presto on 10/03/2019. +// Copyright © 2019 Presto. All rights reserved. +// + +import Foundation + +// MARK: APIService + Record + +extension APIService { + + func requestRecords(id: String, completion: @escaping (RecordResponse?, Error?) -> Void) { + networkManager.get("\(baseURL)/records/\(id)") { data, error in + let (decoded, error) = self.decode(to: RecordResponse.self, data: data, error: error) + completion(decoded, error) + } + } + + func uploadRecords(_ data: Data, completion: @escaping (Int?, Error?) -> Void) { + networkManager.upload(data, to: "\(baseURL)/records") { _, statusCode, error in + completion(statusCode, error) + } + } +} diff --git a/RespectU/Sources/Services/APIService+Song.swift b/RespectU/Sources/Services/APIService+Song.swift new file mode 100644 index 0000000..35c074e --- /dev/null +++ b/RespectU/Sources/Services/APIService+Song.swift @@ -0,0 +1,28 @@ +// +// API+Song.swift +// RespectU +// +// Created by Presto on 10/03/2019. +// Copyright © 2019 Presto. All rights reserved. +// + +import Foundation + +// MARK: APIService + Song + +extension APIService { + + func requestSongs(bySeries series: Series? = nil, + completion: @escaping (SongResponse?, Error?) -> Void) { + let urlString: String + if case let series? = series { + urlString = "\(baseURL)/songs/\(series.rawValue)" + } else { + urlString = "\(baseURL)/songs" + } + networkManager.get(urlString) { data, error in + let (decoded, error) = self.decode(to: SongResponse.self, data: data, error: error) + completion(decoded, error) + } + } +} diff --git a/RespectU/Sources/Services/APIService+Tip.swift b/RespectU/Sources/Services/APIService+Tip.swift new file mode 100644 index 0000000..443e68e --- /dev/null +++ b/RespectU/Sources/Services/APIService+Tip.swift @@ -0,0 +1,21 @@ +// +// API+Tip.swift +// RespectU +// +// Created by Presto on 10/03/2019. +// Copyright © 2019 Presto. All rights reserved. +// + +import Foundation + +// MARK: APIService + Tip + +extension APIService { + + func requestTips(completion: @escaping (TipResponse?, Error?) -> Void) { + networkManager.get("\(baseURL)/tips") { data, error in + let (decoded, error) = self.decode(to: TipResponse.self, data: data, error: error) + completion(decoded, error) + } + } +} diff --git a/RespectU/Sources/Services/APIService+Trophy.swift b/RespectU/Sources/Services/APIService+Trophy.swift new file mode 100644 index 0000000..872667f --- /dev/null +++ b/RespectU/Sources/Services/APIService+Trophy.swift @@ -0,0 +1,27 @@ +// +// API+Trophy.swift +// RespectU +// +// Created by Presto on 10/03/2019. +// Copyright © 2019 Presto. All rights reserved. +// + +import Foundation + +// MARK: APIService + Trophy + +extension APIService { + + func requestTrophies(bySeries series: Series? = nil, + completion: @escaping (TrophyResponse?, Error?) -> Void) { + let urlString: String + if case let series? = series { + urlString = "\(baseURL)/trophies/\(series.rawValue)" + } else { + urlString = "\(baseURL)/trophies" + } + networkManager.get(urlString) { data, error in + let (decoded, error) = self.decode(to: TrophyResponse.self, data: data, error: error) + completion(decoded, error) } + } +} diff --git a/RespectU/Sources/Services/APIService+User.swift b/RespectU/Sources/Services/APIService+User.swift new file mode 100644 index 0000000..f9a41d3 --- /dev/null +++ b/RespectU/Sources/Services/APIService+User.swift @@ -0,0 +1,59 @@ +// +// API+User.swift +// RespectU +// +// Created by Presto on 10/03/2019. +// Copyright © 2019 Presto. All rights reserved. +// + +import Foundation + +import SwiftKeychainWrapper + +// MARK: APIService + User + +extension APIService { + + func requestSignIn(id: String, password: String, completion: @escaping (Int?, Error?) -> Void) { + let parameters = ["id": id, "password": password] + networkManager + .post("\(baseURL)/users/signin", parameters: parameters) { _, statusCode, error in + completion(statusCode, error) + } + } + + func requestSignUp(id: String, + password: String, + nickname: String, + completion: @escaping (Int?, Error?) -> Void) { + let parameters = ["id": id, "password": password, "nickname": nickname] + networkManager + .post("\(baseURL)/users/signup", parameters: parameters) { _, statusCode, error in + completion(statusCode, error) + } + } + + func requestVersions(completion: @escaping (VersionResponse?, Error?) -> Void) { + networkManager.get("\(baseURL)/version") { data, error in + let (decoded, error) = self.decode(to: VersionResponse.self, data: data, error: error) + completion(decoded, error) + } + } + + func requestNickname(completion: @escaping (NicknameResponse?, Error?) -> Void) { + let id = KeychainWrapper.standard.string(forKey: "id") ?? "" + if id.isEmpty { return } + networkManager.get("\(baseURL)/users/nickname/\(id)") { data, error in + let (decoded, error) = self.decode(to: NicknameResponse.self, data: data, error: error) + completion(decoded, error) + } + } + + func uploadNickname(id: String, nickname: String, completion: @escaping (Int?, Error?) -> Void) { + let parameters = ["id": id, "nickname": nickname] + networkManager + .post("\(baseURL)/users/nickname", parameters: parameters) { _, statusCode, error in + completion(statusCode, error) + } + } +} diff --git a/RespectU/Sources/Services/NetworkManager.swift b/RespectU/Sources/Services/NetworkManager.swift new file mode 100644 index 0000000..e91c4c7 --- /dev/null +++ b/RespectU/Sources/Services/NetworkManager.swift @@ -0,0 +1,85 @@ +// +// Network.swift +// RespectU +// +// Created by Presto on 2018. 8. 21.. +// Copyright © 2018년 Presto. All rights reserved. +// + +import Foundation + +/// The `protocol` for networking. +protocol NetworkManagerType: class { + + /// Requests networking to `url` using `GET` method. + /// + /// - Parameters: + /// - url: The url string. + /// - completion: The completion handler. + func get(_ url: String, completion: @escaping (Data?, Error?) -> Void) + + /// Requests networking to `url` using `POST` method. + /// + /// - Parameters: + /// - url: The url string. + /// - parameters: The parameters for making http body. + /// - completion: The completion handler. + func post(_ url: String, + parameters: [String: Any], + completion: @escaping (Data?, Int?, Error?) -> Void) + + /// Uploads `data` to `url`. + /// + /// - Parameters: + /// - data: The data to uploading. + /// - url: The url string. + /// - completion: The completion handler. + func upload(_ data: Data, to url: String, completion: @escaping (Data?, Int?, Error?) -> Void) +} + +/// The network manager conforming `NetworkManagerType`. +final class NetworkManager: NetworkManagerType { + + func get(_ url: String, completion: @escaping (Data?, Error?) -> Void) { + let session = URLSession(configuration: .default) + guard case let url? = URL(string: url) else { return } + let task = session.dataTask(with: url) { data, _, error in + completion(data, error) + session.finishTasksAndInvalidate() + } + task.resume() + } + + func post(_ url: String, + parameters: [String: Any], + completion: @escaping (Data?, Int?, Error?) -> Void) { + let session = URLSession(configuration: .default) + guard case let url? = URL(string: url) else { return } + var request = URLRequest(url: url) + request.httpMethod = "POST" + request.setValue("application/json", forHTTPHeaderField: "Content-Type") + guard case let httpBody? = try? JSONSerialization.data(withJSONObject: parameters, options: []) + else { return } + request.httpBody = httpBody + let task = session.dataTask(with: request) { data, response, error in + let statusCode = (response as? HTTPURLResponse)?.statusCode + completion(data, statusCode, error) + session.finishTasksAndInvalidate() + } + task.resume() + } + + func upload(_ data: Data, to url: String, completion: @escaping (Data?, Int?, Error?) -> Void) { + let session = URLSession(configuration: .default) + guard case let url? = URL(string: url) else { return } + var request = URLRequest(url: url) + request.httpMethod = "POST" + request.setValue("application/json", forHTTPHeaderField: "Content-Type") + let task = session.uploadTask(with: request, from: data) { data, response, error in + let statusCode = (response as? HTTPURLResponse)?.statusCode + completion(data, statusCode, error) + session.finishTasksAndInvalidate() + } + task.resume() + } +} diff --git a/RespectU/Guide/Achievement/Achievement.storyboard b/RespectU/Sources/Storyboards/Achievement.storyboard similarity index 92% rename from RespectU/Guide/Achievement/Achievement.storyboard rename to RespectU/Sources/Storyboards/Achievement.storyboard index b933004..3cadefe 100644 --- a/RespectU/Guide/Achievement/Achievement.storyboard +++ b/RespectU/Sources/Storyboards/Achievement.storyboard @@ -1,11 +1,7 @@ - - - - + - - + @@ -15,11 +11,11 @@ - + - + - + @@ -52,7 +48,7 @@ - + diff --git a/RespectU/Guide/Download/Download.storyboard b/RespectU/Sources/Storyboards/Download.storyboard similarity index 89% rename from RespectU/Guide/Download/Download.storyboard rename to RespectU/Sources/Storyboards/Download.storyboard index 2fc4f59..d0f578e 100644 --- a/RespectU/Guide/Download/Download.storyboard +++ b/RespectU/Sources/Storyboards/Download.storyboard @@ -1,11 +1,7 @@ - - - - + - - + @@ -15,18 +11,18 @@ - + - + - + - - + - + diff --git a/RespectU/Init/Init.storyboard b/RespectU/Sources/Storyboards/Init.storyboard similarity index 88% rename from RespectU/Init/Init.storyboard rename to RespectU/Sources/Storyboards/Init.storyboard index 7939356..d26ad23 100644 --- a/RespectU/Init/Init.storyboard +++ b/RespectU/Sources/Storyboards/Init.storyboard @@ -1,11 +1,7 @@ - - - - + - - + @@ -15,27 +11,27 @@ - + - + - + - - + @@ -45,11 +41,11 @@ - + - + @@ -86,11 +82,11 @@ - + - + @@ -239,19 +235,19 @@ - + - + - + - + @@ -472,19 +468,19 @@ - + - + - + - + - + - + - + - + - + - + @@ -125,11 +122,11 @@ - + - + - + - - - @@ -226,10 +223,10 @@ - + - - - - @@ -298,7 +295,7 @@ - + @@ -334,7 +331,7 @@ - + @@ -347,11 +344,11 @@ - + - + - + @@ -382,7 +379,7 @@