├── .gitignore ├── .ruby-version ├── Gemfile ├── Gemfile.lock ├── Podfile ├── Podfile.lock ├── README.md ├── iosdc2018-livecoding.xcodeproj ├── project.pbxproj └── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ └── IDEWorkspaceChecks.plist ├── iosdc2018-livecoding.xcworkspace ├── contents.xcworkspacedata └── xcshareddata │ └── IDEWorkspaceChecks.plist ├── iosdc2018-livecoding ├── AppDelegate.swift ├── Assets.xcassets │ ├── AppIcon.appiconset │ │ └── Contents.json │ └── Contents.json ├── Base.lproj │ ├── LaunchScreen.storyboard │ └── Main.storyboard ├── Info.plist ├── TweetReactor.swift ├── TweetViewController.swift ├── TwitterService.swift └── ViewController.swift ├── iosdc2018-livecodingTests ├── Info.plist └── iosdc2018_livecodingTests.swift └── iosdc2018-livecodingUITests ├── Info.plist └── iosdc2018_livecodingUITests.swift /.gitignore: -------------------------------------------------------------------------------- 1 | ### https://raw.github.com/github/gitignore/5a7a3cddf3fcecb926a84019f58abf0c43730a61/Global/macOS.gitignore 2 | 3 | # General 4 | .DS_Store 5 | .AppleDouble 6 | .LSOverride 7 | 8 | # Icon must end with two \r 9 | Icon 10 | 11 | # Thumbnails 12 | ._* 13 | 14 | # Files that might appear in the root of a volume 15 | .DocumentRevisions-V100 16 | .fseventsd 17 | .Spotlight-V100 18 | .TemporaryItems 19 | .Trashes 20 | .VolumeIcon.icns 21 | .com.apple.timemachine.donotpresent 22 | 23 | # Directories potentially created on remote AFP share 24 | .AppleDB 25 | .AppleDesktop 26 | Network Trash Folder 27 | Temporary Items 28 | .apdisk 29 | 30 | 31 | ### https://raw.github.com/github/gitignore/5a7a3cddf3fcecb926a84019f58abf0c43730a61/Global/Xcode.gitignore 32 | 33 | # Xcode 34 | # 35 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore 36 | 37 | ## User settings 38 | xcuserdata/ 39 | 40 | ## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9) 41 | *.xcscmblueprint 42 | *.xccheckout 43 | 44 | ## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4) 45 | build/ 46 | DerivedData/ 47 | *.moved-aside 48 | *.pbxuser 49 | !default.pbxuser 50 | *.mode1v3 51 | !default.mode1v3 52 | *.mode2v3 53 | !default.mode2v3 54 | *.perspectivev3 55 | !default.perspectivev3 56 | 57 | 58 | ### https://raw.github.com/github/gitignore/5a7a3cddf3fcecb926a84019f58abf0c43730a61/Swift.gitignore 59 | 60 | # Xcode 61 | # 62 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore 63 | 64 | ## Build generated 65 | build/ 66 | DerivedData/ 67 | 68 | ## Various settings 69 | *.pbxuser 70 | !default.pbxuser 71 | *.mode1v3 72 | !default.mode1v3 73 | *.mode2v3 74 | !default.mode2v3 75 | *.perspectivev3 76 | !default.perspectivev3 77 | xcuserdata/ 78 | 79 | ## Other 80 | *.moved-aside 81 | *.xccheckout 82 | *.xcscmblueprint 83 | 84 | ## Obj-C/Swift specific 85 | *.hmap 86 | *.ipa 87 | *.dSYM.zip 88 | *.dSYM 89 | 90 | ## Playgrounds 91 | timeline.xctimeline 92 | playground.xcworkspace 93 | 94 | # Swift Package Manager 95 | # 96 | # Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. 97 | # Packages/ 98 | # Package.pins 99 | # Package.resolved 100 | .build/ 101 | 102 | # CocoaPods 103 | # 104 | # We recommend against adding the Pods directory to your .gitignore. However 105 | # you should judge for yourself, the pros and cons are mentioned at: 106 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control 107 | # 108 | Pods/ 109 | # 110 | # Add this line if you want to avoid checking in source code from the Xcode workspace 111 | # *.xcworkspace 112 | 113 | # Carthage 114 | # 115 | # Add this line if you want to avoid checking in source code from Carthage dependencies. 116 | # Carthage/Checkouts 117 | 118 | Carthage/Build 119 | 120 | # fastlane 121 | # 122 | # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the 123 | # screenshots whenever they are needed. 124 | # For more information about the recommended setup visit: 125 | # https://docs.fastlane.tools/best-practices/source-control/#source-control 126 | 127 | fastlane/report.xml 128 | fastlane/Preview.html 129 | fastlane/screenshots/**/*.png 130 | fastlane/test_output 131 | 132 | # Bundler 133 | .bundle 134 | -------------------------------------------------------------------------------- /.ruby-version: -------------------------------------------------------------------------------- 1 | 2.5.0 2 | -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | source "https://rubygems.org" 2 | 3 | gem 'cocoapods' 4 | -------------------------------------------------------------------------------- /Gemfile.lock: -------------------------------------------------------------------------------- 1 | GEM 2 | remote: https://rubygems.org/ 3 | specs: 4 | CFPropertyList (3.0.0) 5 | activesupport (4.2.10) 6 | i18n (~> 0.7) 7 | minitest (~> 5.1) 8 | thread_safe (~> 0.3, >= 0.3.4) 9 | tzinfo (~> 1.1) 10 | atomos (0.1.3) 11 | claide (1.0.2) 12 | cocoapods (1.5.3) 13 | activesupport (>= 4.0.2, < 5) 14 | claide (>= 1.0.2, < 2.0) 15 | cocoapods-core (= 1.5.3) 16 | cocoapods-deintegrate (>= 1.0.2, < 2.0) 17 | cocoapods-downloader (>= 1.2.0, < 2.0) 18 | cocoapods-plugins (>= 1.0.0, < 2.0) 19 | cocoapods-search (>= 1.0.0, < 2.0) 20 | cocoapods-stats (>= 1.0.0, < 2.0) 21 | cocoapods-trunk (>= 1.3.0, < 2.0) 22 | cocoapods-try (>= 1.1.0, < 2.0) 23 | colored2 (~> 3.1) 24 | escape (~> 0.0.4) 25 | fourflusher (~> 2.0.1) 26 | gh_inspector (~> 1.0) 27 | molinillo (~> 0.6.5) 28 | nap (~> 1.0) 29 | ruby-macho (~> 1.1) 30 | xcodeproj (>= 1.5.7, < 2.0) 31 | cocoapods-core (1.5.3) 32 | activesupport (>= 4.0.2, < 6) 33 | fuzzy_match (~> 2.0.4) 34 | nap (~> 1.0) 35 | cocoapods-deintegrate (1.0.2) 36 | cocoapods-downloader (1.2.1) 37 | cocoapods-plugins (1.0.0) 38 | nap 39 | cocoapods-search (1.0.0) 40 | cocoapods-stats (1.0.0) 41 | cocoapods-trunk (1.3.0) 42 | nap (>= 0.8, < 2.0) 43 | netrc (~> 0.11) 44 | cocoapods-try (1.1.0) 45 | colored2 (3.1.2) 46 | concurrent-ruby (1.0.5) 47 | escape (0.0.4) 48 | fourflusher (2.0.1) 49 | fuzzy_match (2.0.4) 50 | gh_inspector (1.1.3) 51 | i18n (0.9.5) 52 | concurrent-ruby (~> 1.0) 53 | minitest (5.11.3) 54 | molinillo (0.6.6) 55 | nanaimo (0.2.6) 56 | nap (1.1.0) 57 | netrc (0.11.0) 58 | ruby-macho (1.2.0) 59 | thread_safe (0.3.6) 60 | tzinfo (1.2.5) 61 | thread_safe (~> 0.1) 62 | xcodeproj (1.5.9) 63 | CFPropertyList (>= 2.3.3, < 4.0) 64 | atomos (~> 0.1.2) 65 | claide (>= 1.0.2, < 2.0) 66 | colored2 (~> 3.1) 67 | nanaimo (~> 0.2.5) 68 | 69 | PLATFORMS 70 | ruby 71 | 72 | DEPENDENCIES 73 | cocoapods 74 | 75 | BUNDLED WITH 76 | 1.16.1 77 | -------------------------------------------------------------------------------- /Podfile: -------------------------------------------------------------------------------- 1 | platform :ios, '11.0' 2 | use_frameworks! 3 | inhibit_all_warnings! 4 | 5 | # ASCII Order 6 | target 'iosdc2018-livecoding' do 7 | pod 'RxCocoa' 8 | pod 'RxSwift' 9 | pod 'Then' 10 | pod 'UITextView+Placeholder' 11 | pod 'ReactorKit' 12 | pod 'Reveal-SDK', :configurations => ['Debug'] 13 | pod 'SnapKit' 14 | end 15 | 16 | post_install do |installer| # Fix for: https://github.com/wantedly/visit-ios/issues/14 17 | podsTargets = installer.pods_project.targets.find_all { |target| target.name.start_with?('Pods') } 18 | podsTargets.each do |target| 19 | target.frameworks_build_phase.clear 20 | end 21 | end 22 | -------------------------------------------------------------------------------- /Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - ReactorKit (1.1.0): 3 | - RxSwift (>= 4.0.0) 4 | - Reveal-SDK (17) 5 | - RxCocoa (4.2.0): 6 | - RxSwift (~> 4.0) 7 | - RxSwift (4.2.0) 8 | - SnapKit (4.0.0) 9 | - Then (2.3.0) 10 | - "UITextView+Placeholder (1.2.1)" 11 | 12 | DEPENDENCIES: 13 | - ReactorKit 14 | - Reveal-SDK 15 | - RxCocoa 16 | - RxSwift 17 | - SnapKit 18 | - Then 19 | - "UITextView+Placeholder" 20 | 21 | SPEC REPOS: 22 | https://github.com/cocoapods/specs.git: 23 | - ReactorKit 24 | - Reveal-SDK 25 | - RxCocoa 26 | - RxSwift 27 | - SnapKit 28 | - Then 29 | - "UITextView+Placeholder" 30 | 31 | SPEC CHECKSUMS: 32 | ReactorKit: 26470a9eff5094fae909a30af0be7cd0cf8a182d 33 | Reveal-SDK: a6df49f47319bd19a110c960c498af32df72c0af 34 | RxCocoa: 0b54909c902e1e581212a03e690bbd94032d8baa 35 | RxSwift: 99e10317ddfcc7fbe01356aafd118fde4a0be104 36 | SnapKit: a42d492c16e80209130a3379f73596c3454b7694 37 | Then: ee21c97b85ff6062b9b0080c9abb1eea46743345 38 | "UITextView+Placeholder": 0c3efd97f37ea64bde7f34cc6e90fe02e87b3909 39 | 40 | PODFILE CHECKSUM: bbad684543f9f7385a58d9eac664f425d794e137 41 | 42 | COCOAPODS: 1.5.3 43 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # iosdc2018-livecoding 2 | -------------------------------------------------------------------------------- /iosdc2018-livecoding.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 50; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 1E63747B7AE0F655B9697BF8 /* Pods_iosdc2018_livecoding.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3A04B59BE3F5D5A87C29BEB4 /* Pods_iosdc2018_livecoding.framework */; }; 11 | DD7200CC211C24C200641BCA /* TwitterService.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD7200CB211C24C200641BCA /* TwitterService.swift */; }; 12 | DD7200D0211C261B00641BCA /* TweetViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD7200CF211C261B00641BCA /* TweetViewController.swift */; }; 13 | DDAE341A211C005D00B8B0D3 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDAE3419211C005D00B8B0D3 /* AppDelegate.swift */; }; 14 | DDAE341C211C005D00B8B0D3 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDAE341B211C005D00B8B0D3 /* ViewController.swift */; }; 15 | DDAE341F211C005D00B8B0D3 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = DDAE341D211C005D00B8B0D3 /* Main.storyboard */; }; 16 | DDAE3421211C005E00B8B0D3 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = DDAE3420211C005E00B8B0D3 /* Assets.xcassets */; }; 17 | DDAE3424211C005E00B8B0D3 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = DDAE3422211C005E00B8B0D3 /* LaunchScreen.storyboard */; }; 18 | DDAE342F211C005E00B8B0D3 /* iosdc2018_livecodingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDAE342E211C005E00B8B0D3 /* iosdc2018_livecodingTests.swift */; }; 19 | DDAE343A211C005E00B8B0D3 /* iosdc2018_livecodingUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDAE3439211C005E00B8B0D3 /* iosdc2018_livecodingUITests.swift */; }; 20 | DDB14739213921B600DB7822 /* TweetReactor.swift in Sources */ = {isa = PBXBuildFile; fileRef = DDB14738213921B600DB7822 /* TweetReactor.swift */; }; 21 | /* End PBXBuildFile section */ 22 | 23 | /* Begin PBXContainerItemProxy section */ 24 | DDAE342B211C005E00B8B0D3 /* PBXContainerItemProxy */ = { 25 | isa = PBXContainerItemProxy; 26 | containerPortal = DDAE340E211C005D00B8B0D3 /* Project object */; 27 | proxyType = 1; 28 | remoteGlobalIDString = DDAE3415211C005D00B8B0D3; 29 | remoteInfo = "iosdc2018-livecoding"; 30 | }; 31 | DDAE3436211C005E00B8B0D3 /* PBXContainerItemProxy */ = { 32 | isa = PBXContainerItemProxy; 33 | containerPortal = DDAE340E211C005D00B8B0D3 /* Project object */; 34 | proxyType = 1; 35 | remoteGlobalIDString = DDAE3415211C005D00B8B0D3; 36 | remoteInfo = "iosdc2018-livecoding"; 37 | }; 38 | /* End PBXContainerItemProxy section */ 39 | 40 | /* Begin PBXFileReference section */ 41 | 2246DA61DDAEA52CF55D637E /* Pods-iosdc2018-livecoding.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-iosdc2018-livecoding.debug.xcconfig"; path = "Pods/Target Support Files/Pods-iosdc2018-livecoding/Pods-iosdc2018-livecoding.debug.xcconfig"; sourceTree = ""; }; 42 | 3A04B59BE3F5D5A87C29BEB4 /* Pods_iosdc2018_livecoding.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_iosdc2018_livecoding.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 43 | BA9898522657B2E20C834300 /* Pods-iosdc2018-livecoding.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-iosdc2018-livecoding.release.xcconfig"; path = "Pods/Target Support Files/Pods-iosdc2018-livecoding/Pods-iosdc2018-livecoding.release.xcconfig"; sourceTree = ""; }; 44 | DD7200CB211C24C200641BCA /* TwitterService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TwitterService.swift; sourceTree = ""; }; 45 | DD7200CF211C261B00641BCA /* TweetViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TweetViewController.swift; sourceTree = ""; }; 46 | DDAE3416211C005D00B8B0D3 /* iosdc2018-livecoding.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "iosdc2018-livecoding.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 47 | DDAE3419211C005D00B8B0D3 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 48 | DDAE341B211C005D00B8B0D3 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; 49 | DDAE341E211C005D00B8B0D3 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 50 | DDAE3420211C005E00B8B0D3 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 51 | DDAE3423211C005E00B8B0D3 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 52 | DDAE3425211C005E00B8B0D3 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 53 | DDAE342A211C005E00B8B0D3 /* iosdc2018-livecodingTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "iosdc2018-livecodingTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 54 | DDAE342E211C005E00B8B0D3 /* iosdc2018_livecodingTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = iosdc2018_livecodingTests.swift; sourceTree = ""; }; 55 | DDAE3430211C005E00B8B0D3 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 56 | DDAE3435211C005E00B8B0D3 /* iosdc2018-livecodingUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "iosdc2018-livecodingUITests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 57 | DDAE3439211C005E00B8B0D3 /* iosdc2018_livecodingUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = iosdc2018_livecodingUITests.swift; sourceTree = ""; }; 58 | DDAE343B211C005E00B8B0D3 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 59 | DDB14738213921B600DB7822 /* TweetReactor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TweetReactor.swift; sourceTree = ""; }; 60 | /* End PBXFileReference section */ 61 | 62 | /* Begin PBXFrameworksBuildPhase section */ 63 | DDAE3413211C005D00B8B0D3 /* Frameworks */ = { 64 | isa = PBXFrameworksBuildPhase; 65 | buildActionMask = 2147483647; 66 | files = ( 67 | 1E63747B7AE0F655B9697BF8 /* Pods_iosdc2018_livecoding.framework in Frameworks */, 68 | ); 69 | runOnlyForDeploymentPostprocessing = 0; 70 | }; 71 | DDAE3427211C005E00B8B0D3 /* Frameworks */ = { 72 | isa = PBXFrameworksBuildPhase; 73 | buildActionMask = 2147483647; 74 | files = ( 75 | ); 76 | runOnlyForDeploymentPostprocessing = 0; 77 | }; 78 | DDAE3432211C005E00B8B0D3 /* Frameworks */ = { 79 | isa = PBXFrameworksBuildPhase; 80 | buildActionMask = 2147483647; 81 | files = ( 82 | ); 83 | runOnlyForDeploymentPostprocessing = 0; 84 | }; 85 | /* End PBXFrameworksBuildPhase section */ 86 | 87 | /* Begin PBXGroup section */ 88 | 47069E3813F47FBA66CD6312 /* Frameworks */ = { 89 | isa = PBXGroup; 90 | children = ( 91 | 3A04B59BE3F5D5A87C29BEB4 /* Pods_iosdc2018_livecoding.framework */, 92 | ); 93 | name = Frameworks; 94 | sourceTree = ""; 95 | }; 96 | 7CDF6EF4A1F3E5CAA938BB12 /* Pods */ = { 97 | isa = PBXGroup; 98 | children = ( 99 | 2246DA61DDAEA52CF55D637E /* Pods-iosdc2018-livecoding.debug.xcconfig */, 100 | BA9898522657B2E20C834300 /* Pods-iosdc2018-livecoding.release.xcconfig */, 101 | ); 102 | name = Pods; 103 | sourceTree = ""; 104 | }; 105 | DDAE340D211C005D00B8B0D3 = { 106 | isa = PBXGroup; 107 | children = ( 108 | DDAE3418211C005D00B8B0D3 /* iosdc2018-livecoding */, 109 | DDAE342D211C005E00B8B0D3 /* iosdc2018-livecodingTests */, 110 | DDAE3438211C005E00B8B0D3 /* iosdc2018-livecodingUITests */, 111 | DDAE3417211C005D00B8B0D3 /* Products */, 112 | 7CDF6EF4A1F3E5CAA938BB12 /* Pods */, 113 | 47069E3813F47FBA66CD6312 /* Frameworks */, 114 | ); 115 | sourceTree = ""; 116 | }; 117 | DDAE3417211C005D00B8B0D3 /* Products */ = { 118 | isa = PBXGroup; 119 | children = ( 120 | DDAE3416211C005D00B8B0D3 /* iosdc2018-livecoding.app */, 121 | DDAE342A211C005E00B8B0D3 /* iosdc2018-livecodingTests.xctest */, 122 | DDAE3435211C005E00B8B0D3 /* iosdc2018-livecodingUITests.xctest */, 123 | ); 124 | name = Products; 125 | sourceTree = ""; 126 | }; 127 | DDAE3418211C005D00B8B0D3 /* iosdc2018-livecoding */ = { 128 | isa = PBXGroup; 129 | children = ( 130 | DDAE3419211C005D00B8B0D3 /* AppDelegate.swift */, 131 | DDAE3420211C005E00B8B0D3 /* Assets.xcassets */, 132 | DDAE3425211C005E00B8B0D3 /* Info.plist */, 133 | DDAE3422211C005E00B8B0D3 /* LaunchScreen.storyboard */, 134 | DDAE341D211C005D00B8B0D3 /* Main.storyboard */, 135 | DD7200CF211C261B00641BCA /* TweetViewController.swift */, 136 | DD7200CB211C24C200641BCA /* TwitterService.swift */, 137 | DDAE341B211C005D00B8B0D3 /* ViewController.swift */, 138 | DDB14738213921B600DB7822 /* TweetReactor.swift */, 139 | ); 140 | path = "iosdc2018-livecoding"; 141 | sourceTree = ""; 142 | }; 143 | DDAE342D211C005E00B8B0D3 /* iosdc2018-livecodingTests */ = { 144 | isa = PBXGroup; 145 | children = ( 146 | DDAE342E211C005E00B8B0D3 /* iosdc2018_livecodingTests.swift */, 147 | DDAE3430211C005E00B8B0D3 /* Info.plist */, 148 | ); 149 | path = "iosdc2018-livecodingTests"; 150 | sourceTree = ""; 151 | }; 152 | DDAE3438211C005E00B8B0D3 /* iosdc2018-livecodingUITests */ = { 153 | isa = PBXGroup; 154 | children = ( 155 | DDAE3439211C005E00B8B0D3 /* iosdc2018_livecodingUITests.swift */, 156 | DDAE343B211C005E00B8B0D3 /* Info.plist */, 157 | ); 158 | path = "iosdc2018-livecodingUITests"; 159 | sourceTree = ""; 160 | }; 161 | /* End PBXGroup section */ 162 | 163 | /* Begin PBXNativeTarget section */ 164 | DDAE3415211C005D00B8B0D3 /* iosdc2018-livecoding */ = { 165 | isa = PBXNativeTarget; 166 | buildConfigurationList = DDAE343E211C005E00B8B0D3 /* Build configuration list for PBXNativeTarget "iosdc2018-livecoding" */; 167 | buildPhases = ( 168 | C754DBA90FE6C85DB37E4BAD /* [CP] Check Pods Manifest.lock */, 169 | DDAE3412211C005D00B8B0D3 /* Sources */, 170 | DDAE3413211C005D00B8B0D3 /* Frameworks */, 171 | DDAE3414211C005D00B8B0D3 /* Resources */, 172 | 531DE66C203D9ADD306A8B90 /* [CP] Embed Pods Frameworks */, 173 | ); 174 | buildRules = ( 175 | ); 176 | dependencies = ( 177 | ); 178 | name = "iosdc2018-livecoding"; 179 | productName = "iosdc2018-livecoding"; 180 | productReference = DDAE3416211C005D00B8B0D3 /* iosdc2018-livecoding.app */; 181 | productType = "com.apple.product-type.application"; 182 | }; 183 | DDAE3429211C005E00B8B0D3 /* iosdc2018-livecodingTests */ = { 184 | isa = PBXNativeTarget; 185 | buildConfigurationList = DDAE3441211C005E00B8B0D3 /* Build configuration list for PBXNativeTarget "iosdc2018-livecodingTests" */; 186 | buildPhases = ( 187 | DDAE3426211C005E00B8B0D3 /* Sources */, 188 | DDAE3427211C005E00B8B0D3 /* Frameworks */, 189 | DDAE3428211C005E00B8B0D3 /* Resources */, 190 | ); 191 | buildRules = ( 192 | ); 193 | dependencies = ( 194 | DDAE342C211C005E00B8B0D3 /* PBXTargetDependency */, 195 | ); 196 | name = "iosdc2018-livecodingTests"; 197 | productName = "iosdc2018-livecodingTests"; 198 | productReference = DDAE342A211C005E00B8B0D3 /* iosdc2018-livecodingTests.xctest */; 199 | productType = "com.apple.product-type.bundle.unit-test"; 200 | }; 201 | DDAE3434211C005E00B8B0D3 /* iosdc2018-livecodingUITests */ = { 202 | isa = PBXNativeTarget; 203 | buildConfigurationList = DDAE3444211C005E00B8B0D3 /* Build configuration list for PBXNativeTarget "iosdc2018-livecodingUITests" */; 204 | buildPhases = ( 205 | DDAE3431211C005E00B8B0D3 /* Sources */, 206 | DDAE3432211C005E00B8B0D3 /* Frameworks */, 207 | DDAE3433211C005E00B8B0D3 /* Resources */, 208 | ); 209 | buildRules = ( 210 | ); 211 | dependencies = ( 212 | DDAE3437211C005E00B8B0D3 /* PBXTargetDependency */, 213 | ); 214 | name = "iosdc2018-livecodingUITests"; 215 | productName = "iosdc2018-livecodingUITests"; 216 | productReference = DDAE3435211C005E00B8B0D3 /* iosdc2018-livecodingUITests.xctest */; 217 | productType = "com.apple.product-type.bundle.ui-testing"; 218 | }; 219 | /* End PBXNativeTarget section */ 220 | 221 | /* Begin PBXProject section */ 222 | DDAE340E211C005D00B8B0D3 /* Project object */ = { 223 | isa = PBXProject; 224 | attributes = { 225 | LastSwiftUpdateCheck = 0940; 226 | LastUpgradeCheck = 0940; 227 | ORGANIZATIONNAME = Wantedly; 228 | TargetAttributes = { 229 | DDAE3415211C005D00B8B0D3 = { 230 | CreatedOnToolsVersion = 9.4; 231 | }; 232 | DDAE3429211C005E00B8B0D3 = { 233 | CreatedOnToolsVersion = 9.4; 234 | TestTargetID = DDAE3415211C005D00B8B0D3; 235 | }; 236 | DDAE3434211C005E00B8B0D3 = { 237 | CreatedOnToolsVersion = 9.4; 238 | TestTargetID = DDAE3415211C005D00B8B0D3; 239 | }; 240 | }; 241 | }; 242 | buildConfigurationList = DDAE3411211C005D00B8B0D3 /* Build configuration list for PBXProject "iosdc2018-livecoding" */; 243 | compatibilityVersion = "Xcode 9.3"; 244 | developmentRegion = en; 245 | hasScannedForEncodings = 0; 246 | knownRegions = ( 247 | en, 248 | Base, 249 | ); 250 | mainGroup = DDAE340D211C005D00B8B0D3; 251 | productRefGroup = DDAE3417211C005D00B8B0D3 /* Products */; 252 | projectDirPath = ""; 253 | projectRoot = ""; 254 | targets = ( 255 | DDAE3415211C005D00B8B0D3 /* iosdc2018-livecoding */, 256 | DDAE3429211C005E00B8B0D3 /* iosdc2018-livecodingTests */, 257 | DDAE3434211C005E00B8B0D3 /* iosdc2018-livecodingUITests */, 258 | ); 259 | }; 260 | /* End PBXProject section */ 261 | 262 | /* Begin PBXResourcesBuildPhase section */ 263 | DDAE3414211C005D00B8B0D3 /* Resources */ = { 264 | isa = PBXResourcesBuildPhase; 265 | buildActionMask = 2147483647; 266 | files = ( 267 | DDAE3424211C005E00B8B0D3 /* LaunchScreen.storyboard in Resources */, 268 | DDAE3421211C005E00B8B0D3 /* Assets.xcassets in Resources */, 269 | DDAE341F211C005D00B8B0D3 /* Main.storyboard in Resources */, 270 | ); 271 | runOnlyForDeploymentPostprocessing = 0; 272 | }; 273 | DDAE3428211C005E00B8B0D3 /* Resources */ = { 274 | isa = PBXResourcesBuildPhase; 275 | buildActionMask = 2147483647; 276 | files = ( 277 | ); 278 | runOnlyForDeploymentPostprocessing = 0; 279 | }; 280 | DDAE3433211C005E00B8B0D3 /* Resources */ = { 281 | isa = PBXResourcesBuildPhase; 282 | buildActionMask = 2147483647; 283 | files = ( 284 | ); 285 | runOnlyForDeploymentPostprocessing = 0; 286 | }; 287 | /* End PBXResourcesBuildPhase section */ 288 | 289 | /* Begin PBXShellScriptBuildPhase section */ 290 | 531DE66C203D9ADD306A8B90 /* [CP] Embed Pods Frameworks */ = { 291 | isa = PBXShellScriptBuildPhase; 292 | buildActionMask = 2147483647; 293 | files = ( 294 | ); 295 | inputPaths = ( 296 | "${SRCROOT}/Pods/Target Support Files/Pods-iosdc2018-livecoding/Pods-iosdc2018-livecoding-frameworks.sh", 297 | "${BUILT_PRODUCTS_DIR}/ReactorKit/ReactorKit.framework", 298 | "${PODS_ROOT}/Reveal-SDK/RevealServer-17/iOS/RevealServer.framework", 299 | "${BUILT_PRODUCTS_DIR}/RxCocoa/RxCocoa.framework", 300 | "${BUILT_PRODUCTS_DIR}/RxSwift/RxSwift.framework", 301 | "${BUILT_PRODUCTS_DIR}/SnapKit/SnapKit.framework", 302 | "${BUILT_PRODUCTS_DIR}/Then/Then.framework", 303 | "${BUILT_PRODUCTS_DIR}/UITextView+Placeholder/UITextView_Placeholder.framework", 304 | ); 305 | name = "[CP] Embed Pods Frameworks"; 306 | outputPaths = ( 307 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ReactorKit.framework", 308 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RevealServer.framework", 309 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RxCocoa.framework", 310 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RxSwift.framework", 311 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SnapKit.framework", 312 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Then.framework", 313 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/UITextView_Placeholder.framework", 314 | ); 315 | runOnlyForDeploymentPostprocessing = 0; 316 | shellPath = /bin/sh; 317 | shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-iosdc2018-livecoding/Pods-iosdc2018-livecoding-frameworks.sh\"\n"; 318 | showEnvVarsInLog = 0; 319 | }; 320 | C754DBA90FE6C85DB37E4BAD /* [CP] Check Pods Manifest.lock */ = { 321 | isa = PBXShellScriptBuildPhase; 322 | buildActionMask = 2147483647; 323 | files = ( 324 | ); 325 | inputPaths = ( 326 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 327 | "${PODS_ROOT}/Manifest.lock", 328 | ); 329 | name = "[CP] Check Pods Manifest.lock"; 330 | outputPaths = ( 331 | "$(DERIVED_FILE_DIR)/Pods-iosdc2018-livecoding-checkManifestLockResult.txt", 332 | ); 333 | runOnlyForDeploymentPostprocessing = 0; 334 | shellPath = /bin/sh; 335 | 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"; 336 | showEnvVarsInLog = 0; 337 | }; 338 | /* End PBXShellScriptBuildPhase section */ 339 | 340 | /* Begin PBXSourcesBuildPhase section */ 341 | DDAE3412211C005D00B8B0D3 /* Sources */ = { 342 | isa = PBXSourcesBuildPhase; 343 | buildActionMask = 2147483647; 344 | files = ( 345 | DDAE341C211C005D00B8B0D3 /* ViewController.swift in Sources */, 346 | DDAE341A211C005D00B8B0D3 /* AppDelegate.swift in Sources */, 347 | DD7200D0211C261B00641BCA /* TweetViewController.swift in Sources */, 348 | DDB14739213921B600DB7822 /* TweetReactor.swift in Sources */, 349 | DD7200CC211C24C200641BCA /* TwitterService.swift in Sources */, 350 | ); 351 | runOnlyForDeploymentPostprocessing = 0; 352 | }; 353 | DDAE3426211C005E00B8B0D3 /* Sources */ = { 354 | isa = PBXSourcesBuildPhase; 355 | buildActionMask = 2147483647; 356 | files = ( 357 | DDAE342F211C005E00B8B0D3 /* iosdc2018_livecodingTests.swift in Sources */, 358 | ); 359 | runOnlyForDeploymentPostprocessing = 0; 360 | }; 361 | DDAE3431211C005E00B8B0D3 /* Sources */ = { 362 | isa = PBXSourcesBuildPhase; 363 | buildActionMask = 2147483647; 364 | files = ( 365 | DDAE343A211C005E00B8B0D3 /* iosdc2018_livecodingUITests.swift in Sources */, 366 | ); 367 | runOnlyForDeploymentPostprocessing = 0; 368 | }; 369 | /* End PBXSourcesBuildPhase section */ 370 | 371 | /* Begin PBXTargetDependency section */ 372 | DDAE342C211C005E00B8B0D3 /* PBXTargetDependency */ = { 373 | isa = PBXTargetDependency; 374 | target = DDAE3415211C005D00B8B0D3 /* iosdc2018-livecoding */; 375 | targetProxy = DDAE342B211C005E00B8B0D3 /* PBXContainerItemProxy */; 376 | }; 377 | DDAE3437211C005E00B8B0D3 /* PBXTargetDependency */ = { 378 | isa = PBXTargetDependency; 379 | target = DDAE3415211C005D00B8B0D3 /* iosdc2018-livecoding */; 380 | targetProxy = DDAE3436211C005E00B8B0D3 /* PBXContainerItemProxy */; 381 | }; 382 | /* End PBXTargetDependency section */ 383 | 384 | /* Begin PBXVariantGroup section */ 385 | DDAE341D211C005D00B8B0D3 /* Main.storyboard */ = { 386 | isa = PBXVariantGroup; 387 | children = ( 388 | DDAE341E211C005D00B8B0D3 /* Base */, 389 | ); 390 | name = Main.storyboard; 391 | sourceTree = ""; 392 | }; 393 | DDAE3422211C005E00B8B0D3 /* LaunchScreen.storyboard */ = { 394 | isa = PBXVariantGroup; 395 | children = ( 396 | DDAE3423211C005E00B8B0D3 /* Base */, 397 | ); 398 | name = LaunchScreen.storyboard; 399 | sourceTree = ""; 400 | }; 401 | /* End PBXVariantGroup section */ 402 | 403 | /* Begin XCBuildConfiguration section */ 404 | DDAE343C211C005E00B8B0D3 /* Debug */ = { 405 | isa = XCBuildConfiguration; 406 | buildSettings = { 407 | ALWAYS_SEARCH_USER_PATHS = NO; 408 | CLANG_ANALYZER_NONNULL = YES; 409 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 410 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 411 | CLANG_CXX_LIBRARY = "libc++"; 412 | CLANG_ENABLE_MODULES = YES; 413 | CLANG_ENABLE_OBJC_ARC = YES; 414 | CLANG_ENABLE_OBJC_WEAK = YES; 415 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 416 | CLANG_WARN_BOOL_CONVERSION = YES; 417 | CLANG_WARN_COMMA = YES; 418 | CLANG_WARN_CONSTANT_CONVERSION = YES; 419 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 420 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 421 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 422 | CLANG_WARN_EMPTY_BODY = YES; 423 | CLANG_WARN_ENUM_CONVERSION = YES; 424 | CLANG_WARN_INFINITE_RECURSION = YES; 425 | CLANG_WARN_INT_CONVERSION = YES; 426 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 427 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 428 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 429 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 430 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 431 | CLANG_WARN_STRICT_PROTOTYPES = YES; 432 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 433 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 434 | CLANG_WARN_UNREACHABLE_CODE = YES; 435 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 436 | CODE_SIGN_IDENTITY = "iPhone Developer"; 437 | COPY_PHASE_STRIP = NO; 438 | DEBUG_INFORMATION_FORMAT = dwarf; 439 | ENABLE_STRICT_OBJC_MSGSEND = YES; 440 | ENABLE_TESTABILITY = YES; 441 | GCC_C_LANGUAGE_STANDARD = gnu11; 442 | GCC_DYNAMIC_NO_PIC = NO; 443 | GCC_NO_COMMON_BLOCKS = YES; 444 | GCC_OPTIMIZATION_LEVEL = 0; 445 | GCC_PREPROCESSOR_DEFINITIONS = ( 446 | "DEBUG=1", 447 | "$(inherited)", 448 | ); 449 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 450 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 451 | GCC_WARN_UNDECLARED_SELECTOR = YES; 452 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 453 | GCC_WARN_UNUSED_FUNCTION = YES; 454 | GCC_WARN_UNUSED_VARIABLE = YES; 455 | IPHONEOS_DEPLOYMENT_TARGET = 11.4; 456 | MTL_ENABLE_DEBUG_INFO = YES; 457 | ONLY_ACTIVE_ARCH = YES; 458 | SDKROOT = iphoneos; 459 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 460 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 461 | }; 462 | name = Debug; 463 | }; 464 | DDAE343D211C005E00B8B0D3 /* Release */ = { 465 | isa = XCBuildConfiguration; 466 | buildSettings = { 467 | ALWAYS_SEARCH_USER_PATHS = NO; 468 | CLANG_ANALYZER_NONNULL = YES; 469 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 470 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 471 | CLANG_CXX_LIBRARY = "libc++"; 472 | CLANG_ENABLE_MODULES = YES; 473 | CLANG_ENABLE_OBJC_ARC = YES; 474 | CLANG_ENABLE_OBJC_WEAK = YES; 475 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 476 | CLANG_WARN_BOOL_CONVERSION = YES; 477 | CLANG_WARN_COMMA = YES; 478 | CLANG_WARN_CONSTANT_CONVERSION = YES; 479 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 480 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 481 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 482 | CLANG_WARN_EMPTY_BODY = YES; 483 | CLANG_WARN_ENUM_CONVERSION = YES; 484 | CLANG_WARN_INFINITE_RECURSION = YES; 485 | CLANG_WARN_INT_CONVERSION = YES; 486 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 487 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 488 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 489 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 490 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 491 | CLANG_WARN_STRICT_PROTOTYPES = YES; 492 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 493 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 494 | CLANG_WARN_UNREACHABLE_CODE = YES; 495 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 496 | CODE_SIGN_IDENTITY = "iPhone Developer"; 497 | COPY_PHASE_STRIP = NO; 498 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 499 | ENABLE_NS_ASSERTIONS = NO; 500 | ENABLE_STRICT_OBJC_MSGSEND = YES; 501 | GCC_C_LANGUAGE_STANDARD = gnu11; 502 | GCC_NO_COMMON_BLOCKS = YES; 503 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 504 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 505 | GCC_WARN_UNDECLARED_SELECTOR = YES; 506 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 507 | GCC_WARN_UNUSED_FUNCTION = YES; 508 | GCC_WARN_UNUSED_VARIABLE = YES; 509 | IPHONEOS_DEPLOYMENT_TARGET = 11.4; 510 | MTL_ENABLE_DEBUG_INFO = NO; 511 | SDKROOT = iphoneos; 512 | SWIFT_COMPILATION_MODE = wholemodule; 513 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 514 | VALIDATE_PRODUCT = YES; 515 | }; 516 | name = Release; 517 | }; 518 | DDAE343F211C005E00B8B0D3 /* Debug */ = { 519 | isa = XCBuildConfiguration; 520 | baseConfigurationReference = 2246DA61DDAEA52CF55D637E /* Pods-iosdc2018-livecoding.debug.xcconfig */; 521 | buildSettings = { 522 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 523 | CODE_SIGN_STYLE = Automatic; 524 | DEVELOPMENT_TEAM = 42Z77KT2BJ; 525 | INFOPLIST_FILE = "iosdc2018-livecoding/Info.plist"; 526 | LD_RUNPATH_SEARCH_PATHS = ( 527 | "$(inherited)", 528 | "@executable_path/Frameworks", 529 | ); 530 | PRODUCT_BUNDLE_IDENTIFIER = "com.wantedly.iosdc2018-livecoding"; 531 | PRODUCT_NAME = "$(TARGET_NAME)"; 532 | SWIFT_VERSION = 4.0; 533 | TARGETED_DEVICE_FAMILY = "1,2"; 534 | }; 535 | name = Debug; 536 | }; 537 | DDAE3440211C005E00B8B0D3 /* Release */ = { 538 | isa = XCBuildConfiguration; 539 | baseConfigurationReference = BA9898522657B2E20C834300 /* Pods-iosdc2018-livecoding.release.xcconfig */; 540 | buildSettings = { 541 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 542 | CODE_SIGN_STYLE = Automatic; 543 | DEVELOPMENT_TEAM = 42Z77KT2BJ; 544 | INFOPLIST_FILE = "iosdc2018-livecoding/Info.plist"; 545 | LD_RUNPATH_SEARCH_PATHS = ( 546 | "$(inherited)", 547 | "@executable_path/Frameworks", 548 | ); 549 | PRODUCT_BUNDLE_IDENTIFIER = "com.wantedly.iosdc2018-livecoding"; 550 | PRODUCT_NAME = "$(TARGET_NAME)"; 551 | SWIFT_VERSION = 4.0; 552 | TARGETED_DEVICE_FAMILY = "1,2"; 553 | }; 554 | name = Release; 555 | }; 556 | DDAE3442211C005E00B8B0D3 /* Debug */ = { 557 | isa = XCBuildConfiguration; 558 | buildSettings = { 559 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 560 | BUNDLE_LOADER = "$(TEST_HOST)"; 561 | CODE_SIGN_STYLE = Automatic; 562 | DEVELOPMENT_TEAM = 42Z77KT2BJ; 563 | INFOPLIST_FILE = "iosdc2018-livecodingTests/Info.plist"; 564 | LD_RUNPATH_SEARCH_PATHS = ( 565 | "$(inherited)", 566 | "@executable_path/Frameworks", 567 | "@loader_path/Frameworks", 568 | ); 569 | PRODUCT_BUNDLE_IDENTIFIER = "com.wantedly.iosdc2018-livecodingTests"; 570 | PRODUCT_NAME = "$(TARGET_NAME)"; 571 | SWIFT_VERSION = 4.0; 572 | TARGETED_DEVICE_FAMILY = "1,2"; 573 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/iosdc2018-livecoding.app/iosdc2018-livecoding"; 574 | }; 575 | name = Debug; 576 | }; 577 | DDAE3443211C005E00B8B0D3 /* Release */ = { 578 | isa = XCBuildConfiguration; 579 | buildSettings = { 580 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 581 | BUNDLE_LOADER = "$(TEST_HOST)"; 582 | CODE_SIGN_STYLE = Automatic; 583 | DEVELOPMENT_TEAM = 42Z77KT2BJ; 584 | INFOPLIST_FILE = "iosdc2018-livecodingTests/Info.plist"; 585 | LD_RUNPATH_SEARCH_PATHS = ( 586 | "$(inherited)", 587 | "@executable_path/Frameworks", 588 | "@loader_path/Frameworks", 589 | ); 590 | PRODUCT_BUNDLE_IDENTIFIER = "com.wantedly.iosdc2018-livecodingTests"; 591 | PRODUCT_NAME = "$(TARGET_NAME)"; 592 | SWIFT_VERSION = 4.0; 593 | TARGETED_DEVICE_FAMILY = "1,2"; 594 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/iosdc2018-livecoding.app/iosdc2018-livecoding"; 595 | }; 596 | name = Release; 597 | }; 598 | DDAE3445211C005E00B8B0D3 /* Debug */ = { 599 | isa = XCBuildConfiguration; 600 | buildSettings = { 601 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 602 | CODE_SIGN_STYLE = Automatic; 603 | DEVELOPMENT_TEAM = 42Z77KT2BJ; 604 | INFOPLIST_FILE = "iosdc2018-livecodingUITests/Info.plist"; 605 | LD_RUNPATH_SEARCH_PATHS = ( 606 | "$(inherited)", 607 | "@executable_path/Frameworks", 608 | "@loader_path/Frameworks", 609 | ); 610 | PRODUCT_BUNDLE_IDENTIFIER = "com.wantedly.iosdc2018-livecodingUITests"; 611 | PRODUCT_NAME = "$(TARGET_NAME)"; 612 | SWIFT_VERSION = 4.0; 613 | TARGETED_DEVICE_FAMILY = "1,2"; 614 | TEST_TARGET_NAME = "iosdc2018-livecoding"; 615 | }; 616 | name = Debug; 617 | }; 618 | DDAE3446211C005E00B8B0D3 /* Release */ = { 619 | isa = XCBuildConfiguration; 620 | buildSettings = { 621 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 622 | CODE_SIGN_STYLE = Automatic; 623 | DEVELOPMENT_TEAM = 42Z77KT2BJ; 624 | INFOPLIST_FILE = "iosdc2018-livecodingUITests/Info.plist"; 625 | LD_RUNPATH_SEARCH_PATHS = ( 626 | "$(inherited)", 627 | "@executable_path/Frameworks", 628 | "@loader_path/Frameworks", 629 | ); 630 | PRODUCT_BUNDLE_IDENTIFIER = "com.wantedly.iosdc2018-livecodingUITests"; 631 | PRODUCT_NAME = "$(TARGET_NAME)"; 632 | SWIFT_VERSION = 4.0; 633 | TARGETED_DEVICE_FAMILY = "1,2"; 634 | TEST_TARGET_NAME = "iosdc2018-livecoding"; 635 | }; 636 | name = Release; 637 | }; 638 | /* End XCBuildConfiguration section */ 639 | 640 | /* Begin XCConfigurationList section */ 641 | DDAE3411211C005D00B8B0D3 /* Build configuration list for PBXProject "iosdc2018-livecoding" */ = { 642 | isa = XCConfigurationList; 643 | buildConfigurations = ( 644 | DDAE343C211C005E00B8B0D3 /* Debug */, 645 | DDAE343D211C005E00B8B0D3 /* Release */, 646 | ); 647 | defaultConfigurationIsVisible = 0; 648 | defaultConfigurationName = Release; 649 | }; 650 | DDAE343E211C005E00B8B0D3 /* Build configuration list for PBXNativeTarget "iosdc2018-livecoding" */ = { 651 | isa = XCConfigurationList; 652 | buildConfigurations = ( 653 | DDAE343F211C005E00B8B0D3 /* Debug */, 654 | DDAE3440211C005E00B8B0D3 /* Release */, 655 | ); 656 | defaultConfigurationIsVisible = 0; 657 | defaultConfigurationName = Release; 658 | }; 659 | DDAE3441211C005E00B8B0D3 /* Build configuration list for PBXNativeTarget "iosdc2018-livecodingTests" */ = { 660 | isa = XCConfigurationList; 661 | buildConfigurations = ( 662 | DDAE3442211C005E00B8B0D3 /* Debug */, 663 | DDAE3443211C005E00B8B0D3 /* Release */, 664 | ); 665 | defaultConfigurationIsVisible = 0; 666 | defaultConfigurationName = Release; 667 | }; 668 | DDAE3444211C005E00B8B0D3 /* Build configuration list for PBXNativeTarget "iosdc2018-livecodingUITests" */ = { 669 | isa = XCConfigurationList; 670 | buildConfigurations = ( 671 | DDAE3445211C005E00B8B0D3 /* Debug */, 672 | DDAE3446211C005E00B8B0D3 /* Release */, 673 | ); 674 | defaultConfigurationIsVisible = 0; 675 | defaultConfigurationName = Release; 676 | }; 677 | /* End XCConfigurationList section */ 678 | }; 679 | rootObject = DDAE340E211C005D00B8B0D3 /* Project object */; 680 | } 681 | -------------------------------------------------------------------------------- /iosdc2018-livecoding.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /iosdc2018-livecoding.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /iosdc2018-livecoding.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /iosdc2018-livecoding.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /iosdc2018-livecoding/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // iosdc2018-livecoding 4 | // 5 | // Created by Masatoshi Kubode on 2018/08/09. 6 | // Copyright © 2018 Wantedly. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | @UIApplicationMain 12 | class AppDelegate: UIResponder, UIApplicationDelegate { 13 | 14 | var window: UIWindow? 15 | 16 | 17 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 18 | // Override point for customization after application launch. 19 | return true 20 | } 21 | 22 | func applicationWillResignActive(_ application: UIApplication) { 23 | // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. 24 | // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. 25 | } 26 | 27 | func applicationDidEnterBackground(_ application: UIApplication) { 28 | // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 29 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 30 | } 31 | 32 | func applicationWillEnterForeground(_ application: UIApplication) { 33 | // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. 34 | } 35 | 36 | func applicationDidBecomeActive(_ application: UIApplication) { 37 | // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. 38 | } 39 | 40 | func applicationWillTerminate(_ application: UIApplication) { 41 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 42 | } 43 | 44 | 45 | } 46 | 47 | -------------------------------------------------------------------------------- /iosdc2018-livecoding/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "20x20", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "20x20", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "29x29", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "29x29", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "40x40", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "40x40", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "idiom" : "iphone", 35 | "size" : "60x60", 36 | "scale" : "2x" 37 | }, 38 | { 39 | "idiom" : "iphone", 40 | "size" : "60x60", 41 | "scale" : "3x" 42 | }, 43 | { 44 | "idiom" : "ipad", 45 | "size" : "20x20", 46 | "scale" : "1x" 47 | }, 48 | { 49 | "idiom" : "ipad", 50 | "size" : "20x20", 51 | "scale" : "2x" 52 | }, 53 | { 54 | "idiom" : "ipad", 55 | "size" : "29x29", 56 | "scale" : "1x" 57 | }, 58 | { 59 | "idiom" : "ipad", 60 | "size" : "29x29", 61 | "scale" : "2x" 62 | }, 63 | { 64 | "idiom" : "ipad", 65 | "size" : "40x40", 66 | "scale" : "1x" 67 | }, 68 | { 69 | "idiom" : "ipad", 70 | "size" : "40x40", 71 | "scale" : "2x" 72 | }, 73 | { 74 | "idiom" : "ipad", 75 | "size" : "76x76", 76 | "scale" : "1x" 77 | }, 78 | { 79 | "idiom" : "ipad", 80 | "size" : "76x76", 81 | "scale" : "2x" 82 | }, 83 | { 84 | "idiom" : "ipad", 85 | "size" : "83.5x83.5", 86 | "scale" : "2x" 87 | }, 88 | { 89 | "idiom" : "ios-marketing", 90 | "size" : "1024x1024", 91 | "scale" : "1x" 92 | } 93 | ], 94 | "info" : { 95 | "version" : 1, 96 | "author" : "xcode" 97 | } 98 | } -------------------------------------------------------------------------------- /iosdc2018-livecoding/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /iosdc2018-livecoding/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /iosdc2018-livecoding/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /iosdc2018-livecoding/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | LSRequiresIPhoneOS 22 | 23 | UILaunchStoryboardName 24 | LaunchScreen 25 | UIMainStoryboardFile 26 | Main 27 | UIRequiredDeviceCapabilities 28 | 29 | armv7 30 | 31 | UISupportedInterfaceOrientations 32 | 33 | UIInterfaceOrientationPortrait 34 | UIInterfaceOrientationLandscapeLeft 35 | UIInterfaceOrientationLandscapeRight 36 | 37 | UISupportedInterfaceOrientations~ipad 38 | 39 | UIInterfaceOrientationPortrait 40 | UIInterfaceOrientationPortraitUpsideDown 41 | UIInterfaceOrientationLandscapeLeft 42 | UIInterfaceOrientationLandscapeRight 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /iosdc2018-livecoding/TweetReactor.swift: -------------------------------------------------------------------------------- 1 | import ReactorKit 2 | import RxSwift 3 | 4 | class TweetReactor: Reactor { 5 | enum Action { 6 | case updateText(String) 7 | case submit 8 | } 9 | 10 | enum Mutation { 11 | case setText(String) 12 | case setSubmitting(Bool) 13 | } 14 | 15 | struct State { 16 | var text: String = "" 17 | var isSubmitting: Bool = false 18 | 19 | var remainingTextCount: Int { 20 | return TwitterService.MAX_TEXT_LENGTH - text.count 21 | } 22 | 23 | var isTweetButtonEnabled: Bool { 24 | return (1...TwitterService.MAX_TEXT_LENGTH).contains(text.count) 25 | } 26 | } 27 | 28 | let initialState = State() 29 | 30 | private let service = TwitterService() 31 | 32 | let completedRelay = PublishSubject() 33 | let errorRelay = PublishSubject() 34 | 35 | func mutate(action: Action) -> Observable { 36 | switch action { 37 | case .updateText(let text): 38 | return Observable.just(Mutation.setText(text)) 39 | case .submit: 40 | return Observable.concat([ 41 | Observable.just(Mutation.setSubmitting(true)), 42 | service.tweet(text: currentState.text) 43 | .asObservable() 44 | .do(onNext: { _ in self.completedRelay.onNext(()) }) 45 | .do(onError: { self.errorRelay.onNext($0) }) 46 | .flatMap { _ in Observable.empty() } 47 | .catchError { _ in Observable.empty() }, 48 | Observable.just(Mutation.setSubmitting(false)), 49 | ]) 50 | } 51 | } 52 | 53 | func reduce(state: State, mutation: Mutation) -> State { 54 | var state = state 55 | switch mutation { 56 | case .setText(let text): 57 | state.text = text 58 | case .setSubmitting(let isSubmitting): 59 | state.isSubmitting = isSubmitting 60 | } 61 | return state 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /iosdc2018-livecoding/TweetViewController.swift: -------------------------------------------------------------------------------- 1 | /* 2 | User stories: 3 | 4 | * [x] 140文字まで文字を書くことができ、今の残り文字数が分かる 5 | * [x] 文字数が1~140の時のみ投稿できることが分かる 6 | * [x] 現在入力されているテキストを投稿できる 7 | * [x] 投稿を開始してから完了するまで投稿中であることが分かる 8 | * [x] 投稿が正常に完了したことが分かる 9 | * [x] 2回連続で同じ内容の投稿した時にエラーになり、そのエラー内容が分かる 10 | 11 | */ 12 | 13 | import UIKit 14 | import Then 15 | import UITextView_Placeholder 16 | import SnapKit 17 | import RxSwift 18 | import ReactorKit 19 | import RxCocoa 20 | 21 | class TweetViewController: UIViewController, View { 22 | 23 | private let tweetButton = UIBarButtonItem( 24 | title: "Tweet", 25 | style: .done, 26 | target: nil, 27 | action: nil 28 | ) 29 | private let stackView = UIStackView().then { 30 | $0.axis = .vertical 31 | $0.layoutMargins = UIEdgeInsets(top: 8, left: 16, bottom: 8, right: 16) 32 | $0.isLayoutMarginsRelativeArrangement = true 33 | } 34 | private let textView = UITextView().then { 35 | $0.placeholder = "いまどうしてる?" 36 | } 37 | private let remainsLabel = UILabel().then { 38 | $0.text = "残りN文字" 39 | $0.textAlignment = .right 40 | } 41 | private let activityIndicator = UIActivityIndicatorView(activityIndicatorStyle: .gray).then { 42 | $0.backgroundColor = UIColor.gray.withAlphaComponent(0.5) 43 | } 44 | 45 | var disposeBag = DisposeBag() 46 | 47 | override func viewDidLoad() { 48 | super.viewDidLoad() 49 | 50 | // Setup 51 | view.backgroundColor = .white 52 | navigationItem.rightBarButtonItem = tweetButton 53 | navigationController?.navigationBar.backgroundColor = .white 54 | 55 | // Hierarchy 56 | view.addSubview(stackView.then { 57 | $0.addArrangedSubview(textView) 58 | $0.addArrangedSubview(remainsLabel) 59 | }) 60 | view.addSubview(activityIndicator) 61 | 62 | // Constraints 63 | activityIndicator.snp.makeConstraints { 64 | $0.edges.equalToSuperview() 65 | } 66 | stackView.snp.makeConstraints { 67 | $0.edges.equalTo(view.safeAreaLayoutGuide) 68 | } 69 | } 70 | 71 | func bind(reactor: TweetReactor) { 72 | // Action 73 | textView.rx.text.orEmpty 74 | .map { Reactor.Action.updateText($0) } 75 | .bind(to: reactor.action) 76 | .disposed(by: disposeBag) 77 | 78 | tweetButton.rx.tap 79 | .map { Reactor.Action.submit } 80 | .bind(to: reactor.action) 81 | .disposed(by: disposeBag) 82 | 83 | // State 84 | reactor.state 85 | .map { "残り\($0.remainingTextCount)文字" } 86 | .distinctUntilChanged() 87 | .bind(to: remainsLabel.rx.text) 88 | .disposed(by: disposeBag) 89 | 90 | reactor.state 91 | .map { $0.isTweetButtonEnabled } 92 | .distinctUntilChanged() 93 | .bind(to: tweetButton.rx.isEnabled) 94 | .disposed(by: disposeBag) 95 | 96 | reactor.state 97 | .map { $0.isSubmitting } 98 | .distinctUntilChanged() 99 | .bind(to: activityIndicator.rx.isAnimating) 100 | .disposed(by: disposeBag) 101 | 102 | // Relay 103 | reactor.completedRelay 104 | .observeOn(MainScheduler.instance) 105 | .subscribe(onNext: { [weak self] _ in self?.showCompletedAlert() }) 106 | .disposed(by: disposeBag) 107 | 108 | reactor.errorRelay 109 | .observeOn(MainScheduler.instance) 110 | .subscribe(onNext: { [weak self] in self?.showErrorAlert($0) }) 111 | .disposed(by: disposeBag) 112 | } 113 | 114 | private func showCompletedAlert() { 115 | let alert = UIAlertController( 116 | title: "Tweet successfully", 117 | message: nil, 118 | preferredStyle: .alert 119 | ).then { 120 | $0.addAction(UIAlertAction(title: "OK", style: .default)) 121 | } 122 | present(alert, animated: true) 123 | } 124 | 125 | private func showErrorAlert(_ error: Error) { 126 | let alert = UIAlertController( 127 | title: "Error", 128 | message: error.localizedDescription, 129 | preferredStyle: .alert 130 | ).then { 131 | $0.addAction(UIAlertAction(title: "OK", style: .default)) 132 | } 133 | present(alert, animated: true) 134 | } 135 | } 136 | -------------------------------------------------------------------------------- /iosdc2018-livecoding/TwitterService.swift: -------------------------------------------------------------------------------- 1 | import RxSwift 2 | 3 | enum TweetError: LocalizedError { 4 | case duplicated 5 | var errorDescription: String? { 6 | switch self { 7 | case .duplicated: 8 | return "Your tweet is duplicated with the last one." 9 | } 10 | } 11 | } 12 | 13 | class TwitterService { 14 | static let MAX_TEXT_LENGTH = 140 15 | 16 | private let scheduler = SerialDispatchQueueScheduler(internalSerialQueueName: "tweet") 17 | 18 | private var lastTweetedText: String? = nil 19 | 20 | func tweet(text: String) -> Single { 21 | if lastTweetedText == text { 22 | return Single.just(false) 23 | .delay(1, scheduler: scheduler) 24 | .flatMap { _ in Single.error(TweetError.duplicated) } 25 | .do(onError: { _ in NSLog("Error: \(text)") }) 26 | } 27 | lastTweetedText = text 28 | return Single.just(true) 29 | .delay(1, scheduler: scheduler) 30 | .do(onSuccess: { _ in NSLog("Succeeded: \(text)") }) 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /iosdc2018-livecoding/ViewController.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | 3 | class ViewController: UINavigationController { 4 | override func viewDidLoad() { 5 | super.viewDidLoad() 6 | viewControllers = [ 7 | TweetViewController().then { 8 | $0.reactor = TweetReactor() 9 | } 10 | ] 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /iosdc2018-livecodingTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /iosdc2018-livecodingTests/iosdc2018_livecodingTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // iosdc2018_livecodingTests.swift 3 | // iosdc2018-livecodingTests 4 | // 5 | // Created by Masatoshi Kubode on 2018/08/09. 6 | // Copyright © 2018 Wantedly. All rights reserved. 7 | // 8 | 9 | import XCTest 10 | @testable import iosdc2018_livecoding 11 | 12 | class iosdc2018_livecodingTests: XCTestCase { 13 | 14 | override func setUp() { 15 | super.setUp() 16 | // Put setup code here. This method is called before the invocation of each test method in the class. 17 | } 18 | 19 | override func tearDown() { 20 | // Put teardown code here. This method is called after the invocation of each test method in the class. 21 | super.tearDown() 22 | } 23 | 24 | func testExample() { 25 | // This is an example of a functional test case. 26 | // Use XCTAssert and related functions to verify your tests produce the correct results. 27 | } 28 | 29 | func testPerformanceExample() { 30 | // This is an example of a performance test case. 31 | self.measure { 32 | // Put the code you want to measure the time of here. 33 | } 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /iosdc2018-livecodingUITests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /iosdc2018-livecodingUITests/iosdc2018_livecodingUITests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // iosdc2018_livecodingUITests.swift 3 | // iosdc2018-livecodingUITests 4 | // 5 | // Created by Masatoshi Kubode on 2018/08/09. 6 | // Copyright © 2018 Wantedly. All rights reserved. 7 | // 8 | 9 | import XCTest 10 | 11 | class iosdc2018_livecodingUITests: XCTestCase { 12 | 13 | override func setUp() { 14 | super.setUp() 15 | 16 | // Put setup code here. This method is called before the invocation of each test method in the class. 17 | 18 | // In UI tests it is usually best to stop immediately when a failure occurs. 19 | continueAfterFailure = false 20 | // UI tests must launch the application that they test. Doing this in setup will make sure it happens for each test method. 21 | XCUIApplication().launch() 22 | 23 | // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this. 24 | } 25 | 26 | override func tearDown() { 27 | // Put teardown code here. This method is called after the invocation of each test method in the class. 28 | super.tearDown() 29 | } 30 | 31 | func testExample() { 32 | // Use recording to get started writing UI tests. 33 | // Use XCTAssert and related functions to verify your tests produce the correct results. 34 | } 35 | 36 | } 37 | --------------------------------------------------------------------------------