├── .gitignore ├── Contents ├── KickstarterStyle │ ├── Storyboard.storyboard │ ├── ViewController.swift │ ├── WikipediaSearchNewViewModel.swift │ ├── WikipediaSearchNewViewModelSpec.swift │ ├── WikipediaSearchViewModel.swift │ └── WikipediaSearchViewModelSpec.swift └── SergdortStyle │ ├── RxViewModelType.swift │ ├── Storyboard.storyboard │ ├── ViewController.swift │ ├── WikipediaSearchViewModel.swift │ └── WikipediaSearchViewModelSpec.swift ├── LICENSE ├── Library ├── MockWikipediaAPI.swift ├── WikipediaAPI.swift ├── WikipediaPage.swift └── materialized+elements.swift ├── README.md ├── RxSwiftBook3SampleCode.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ ├── IDEWorkspaceChecks.plist │ │ └── swiftpm │ │ └── Package.resolved └── xcshareddata │ └── xcschemes │ ├── RxSwiftBook3SampleCode.xcscheme │ └── SergdortStyle.xcscheme └── RxSwiftBook3SampleCode ├── AppDelegate.swift ├── Assets.xcassets ├── AppIcon.appiconset │ └── Contents.json └── Contents.json ├── Base.lproj └── Main.storyboard └── Info.plist /.gitignore: -------------------------------------------------------------------------------- 1 | # Xcode 2 | # 3 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore 4 | 5 | ## Build generated 6 | build/ 7 | DerivedData/ 8 | 9 | ## Various settings 10 | *.pbxuser 11 | !default.pbxuser 12 | *.mode1v3 13 | !default.mode1v3 14 | *.mode2v3 15 | !default.mode2v3 16 | *.perspectivev3 17 | !default.perspectivev3 18 | xcuserdata/ 19 | 20 | ## Other 21 | *.moved-aside 22 | *.xccheckout 23 | *.xcscmblueprint 24 | 25 | ## Obj-C/Swift specific 26 | *.hmap 27 | *.ipa 28 | *.dSYM.zip 29 | *.dSYM 30 | 31 | ## Playgrounds 32 | timeline.xctimeline 33 | playground.xcworkspace 34 | 35 | # Swift Package Manager 36 | # 37 | # Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. 38 | # Packages/ 39 | # Package.pins 40 | # Package.resolved 41 | .build/ 42 | 43 | # CocoaPods 44 | # 45 | # We recommend against adding the Pods directory to your .gitignore. However 46 | # you should judge for yourself, the pros and cons are mentioned at: 47 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control 48 | # 49 | Pods/ 50 | 51 | # 52 | # Add this line if you want to avoid checking in source code from the Xcode workspace 53 | # *.xcworkspace 54 | 55 | # Carthage 56 | # 57 | # Add this line if you want to avoid checking in source code from Carthage dependencies. 58 | # Carthage/Checkouts 59 | 60 | Carthage/Build 61 | 62 | # fastlane 63 | # 64 | # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the 65 | # screenshots whenever they are needed. 66 | # For more information about the recommended setup visit: 67 | # https://docs.fastlane.tools/best-practices/source-control/#source-control 68 | 69 | fastlane/report.xml 70 | fastlane/Preview.html 71 | fastlane/screenshots/**/*.png 72 | fastlane/test_output 73 | 74 | # Code Injection 75 | # 76 | # After new code Injection tools there's a generated folder /iOSInjectionProject 77 | # https://github.com/johnno1962/injectionforxcode 78 | 79 | iOSInjectionProject/ 80 | 81 | # gem 82 | Gemfile 83 | Gemfile.lock 84 | .ruby-version 85 | .bundle 86 | vendor/bundle 87 | -------------------------------------------------------------------------------- /Contents/KickstarterStyle/Storyboard.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 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 46 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | -------------------------------------------------------------------------------- /Contents/KickstarterStyle/ViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.swift 3 | // KickstarterStyle 4 | // 5 | // Created by Yoshinori Imajo on 2019/01/01. 6 | // Copyright © 2019 Yoshinori Imajo. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import RxSwift 11 | import RxCocoa 12 | import Library 13 | 14 | class ViewController: UIViewController { 15 | 16 | @IBOutlet private weak var searchBar: UISearchBar! 17 | @IBOutlet private weak var tableView: UITableView! 18 | private let disposeBag = DisposeBag() 19 | 20 | // 1. 21 | let viewModel: WikipediaSearchViewModelType = WikipediaSearchViewModel( 22 | wikipediaAPI: WikipediaDefaultAPI(URLSession: .shared) 23 | ) 24 | 25 | override func viewDidLoad() { 26 | super.viewDidLoad() 27 | 28 | searchBar.rx.text.orEmpty 29 | .subscribe(with: self, onNext: { owner, text in 30 | owner.viewModel.inputs.searchTextChanged(text) 31 | }) 32 | .disposed(by: disposeBag) 33 | 34 | viewModel.outputs.searchDescription 35 | .bind(to: navigationItem.rx.title) 36 | .disposed(by: disposeBag) 37 | 38 | // 3. 39 | viewModel.outputs.wikipediaPages 40 | .bind(to: tableView.rx.items(cellIdentifier: "Cell")) { index, result, cell in 41 | cell.textLabel?.text = result.title 42 | cell.detailTextLabel?.text = result.url.absoluteString 43 | } 44 | .disposed(by: disposeBag) 45 | 46 | // 4. 47 | viewModel.outputs.error 48 | .subscribe(onNext: { error in 49 | if let error = error as? URLError, 50 | error.code == URLError.notConnectedToInternet { 51 | // ここでネット接続していない旨を表示する 52 | print(error) 53 | } 54 | }) 55 | .disposed(by: disposeBag) 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /Contents/KickstarterStyle/WikipediaSearchNewViewModel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // WikipediaSearchNewViewModel.swift 3 | // KickstarterStyle 4 | // 5 | // Created by Yoshinori Imajo on 2019/01/24. 6 | // Copyright © 2019 Yoshinori Imajo. All rights reserved. 7 | // 8 | 9 | import RxSwift 10 | import RxCocoa 11 | import Library 12 | 13 | func wikipediaSearchViewModel( 14 | searchText: Observable, 15 | dependency: ( // 1. 16 | disposeBag: DisposeBag, 17 | wikipediaAPI: WikipediaAPI, 18 | scheduler: SchedulerType 19 | ) 20 | ) -> ( // 2. 21 | wikipediaPages: Observable<[WikipediaPage]>, 22 | searchDescription: Observable, 23 | error: Observable 24 | ) { 25 | let filteredText = searchText 26 | .debounce(.milliseconds(300), scheduler: dependency.scheduler) 27 | .share(replay: 1) 28 | 29 | let sequence = filteredText 30 | .flatMapLatest { text -> Observable> in 31 | guard !text.isEmpty else { 32 | return Observable.just([]).materialize() 33 | } 34 | 35 | return dependency.wikipediaAPI 36 | .search(from: text) 37 | .materialize() 38 | } 39 | .share(replay: 1) 40 | 41 | let wikipediaPages = sequence.elements() 42 | 43 | let _searchResultText = PublishRelay() 44 | 45 | wikipediaPages 46 | .withLatestFrom(filteredText) { (pages, word) -> String in 47 | return "\(word) \(pages.count)件" 48 | } 49 | .bind(to: _searchResultText) 50 | .disposed(by: dependency.disposeBag) 51 | 52 | return (wikipediaPages: wikipediaPages, 53 | searchDescription: _searchResultText.asObservable(), 54 | error: sequence.errors()) 55 | } 56 | -------------------------------------------------------------------------------- /Contents/KickstarterStyle/WikipediaSearchNewViewModelSpec.swift: -------------------------------------------------------------------------------- 1 | // 2 | // WikipediaSearchNewViewModelSpec.swift 3 | // KickstarterStyleTests 4 | // 5 | // Created by Yoshinori Imajo on 2019/01/24. 6 | // Copyright © 2019 Yoshinori Imajo. All rights reserved. 7 | // 8 | 9 | import RxSwift 10 | import RxTest 11 | import Quick 12 | import Nimble 13 | import Foundation 14 | 15 | @testable import Library 16 | @testable import KickstarterStyle 17 | 18 | class WikipediaSearchNewViewModelSpec: QuickSpec { 19 | 20 | let disposeBag = DisposeBag() 21 | 22 | override func spec() { 23 | describe("入力に対する出力") { 24 | context("フィルタ境界付近のデータが入力される") { 25 | let scheduler = TestScheduler(initialClock: 0, resolution: 0.1) 26 | 27 | // 条件の準備 28 | let inputTextObservable = [ 29 | Recorded.next(1, "S"), 30 | Recorded.next(2, "Swi"), 31 | Recorded.next(6, "Swif") 32 | ] 33 | 34 | let mockPage1 = try! JSONDecoder().decode( 35 | WikipediaPage.self, 36 | from: "{\"pageid\": 1, \"title\": \"スイフト\"}".data(using: .utf8)! 37 | ) 38 | 39 | let mockPage2 = try! JSONDecoder().decode( 40 | WikipediaPage.self, 41 | from: "{\"pageid\": 2, \"title\": \"テイラー\"}".data(using: .utf8)! 42 | ) 43 | 44 | let wikipediaAPI = MockWikipediaAPI( 45 | results: Observable.of([mockPage1, mockPage2]) 46 | ) 47 | 48 | it("境界を超えたタイミングでモック用データと同じ結果が出力される") { 49 | 50 | let pagesObserver: TestableObserver<[WikipediaPage]> 51 | let resultDescriptionObserver: TestableObserver 52 | 53 | do { 54 | let searchText = scheduler.createHotObservable(inputTextObservable) 55 | 56 | let outputs = wikipediaSearchViewModel( 57 | searchText: searchText.asObservable(), 58 | dependency: ( 59 | disposeBag: self.disposeBag, 60 | wikipediaAPI: wikipediaAPI, 61 | scheduler: scheduler 62 | ) 63 | ) 64 | 65 | pagesObserver = scheduler.createObserver([WikipediaPage].self) 66 | outputs.wikipediaPages 67 | .bind(to: pagesObserver) 68 | .disposed(by: self.disposeBag) 69 | 70 | resultDescriptionObserver = scheduler.createObserver(String.self) 71 | outputs.searchDescription 72 | .bind(to: resultDescriptionObserver) 73 | .disposed(by: self.disposeBag) 74 | 75 | scheduler.start() 76 | } 77 | 78 | expect(pagesObserver.events).to(equal([ 79 | Recorded.next(5, [mockPage1, mockPage2]), 80 | Recorded.next(9, [mockPage1, mockPage2]) 81 | ])) 82 | 83 | expect(resultDescriptionObserver.events).to(equal([ 84 | Recorded.next(5, "Swi 2件"), 85 | Recorded.next(9, "Swif 2件") 86 | ])) 87 | } 88 | } 89 | } 90 | } 91 | } 92 | -------------------------------------------------------------------------------- /Contents/KickstarterStyle/WikipediaSearchViewModel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // WikipediaSearchViewModel.swift 3 | // KickstarterStyle 4 | // 5 | // Created by Yoshinori Imajo on 2019/01/01. 6 | // Copyright © 2019 Yoshinori Imajo. All rights reserved. 7 | // 8 | 9 | import RxSwift 10 | import RxCocoa 11 | import Library 12 | 13 | // 1. 14 | protocol WikipediaSearchViewModelInputs { 15 | func searchTextChanged(_ searchText: String) 16 | } 17 | 18 | protocol WikipediaSearchViewModelOutputs { 19 | var searchDescription: Observable { get } 20 | // 内部ではSubjectだが書き込まれないようにObservableにしている 21 | var wikipediaPages: Observable<[WikipediaPage]> { get } 22 | var error: Observable { get } 23 | } 24 | 25 | protocol WikipediaSearchViewModelType { 26 | var inputs: WikipediaSearchViewModelInputs { get } 27 | var outputs: WikipediaSearchViewModelOutputs { get } 28 | } 29 | 30 | class WikipediaSearchViewModel: WikipediaSearchViewModelOutputs { 31 | private let disposeBag = DisposeBag() 32 | // 2. 33 | private let wikipediaAPI: WikipediaAPI 34 | private let scheduler: SchedulerType 35 | 36 | // 3. 37 | let searchDescription: Observable 38 | let wikipediaPages: Observable<[WikipediaPage]> 39 | let error: Observable 40 | 41 | private let searchTextChangedProperty = BehaviorRelay(value: "") 42 | 43 | init(wikipediaAPI: WikipediaAPI, 44 | scheduler: SchedulerType = ConcurrentMainScheduler.instance) { 45 | self.wikipediaAPI = wikipediaAPI 46 | self.scheduler = scheduler 47 | 48 | // 4. 49 | // BehaviorReplayにすると初期値を出力する。 50 | // 外部インターフェースはObservableなので初期値を持っているかどうか判断できないのでないほうがいい。 51 | let _wikipediaPages = PublishRelay<[WikipediaPage]>() 52 | self.wikipediaPages = _wikipediaPages.asObservable() 53 | 54 | // 最新の値をそのときに通知するだけで充分 55 | let _error = PublishRelay() 56 | self.error = _error.asObservable() 57 | 58 | let filteredText = searchTextChangedProperty 59 | .debounce(.milliseconds(300), scheduler: scheduler) 60 | .share(replay: 1) 61 | 62 | let _searchResultText = PublishRelay() 63 | searchDescription = _searchResultText.asObservable() 64 | 65 | let sequence = filteredText 66 | .flatMapLatest { [unowned self] text -> Observable> in 67 | return self.wikipediaAPI 68 | .search(from: text) 69 | .materialize() 70 | } 71 | .share(replay: 1) 72 | 73 | wikipediaPages 74 | .withLatestFrom(filteredText) { (pages, word) -> String in 75 | return "\(word) \(pages.count)件" 76 | } 77 | .bind(to: _searchResultText) 78 | .disposed(by: disposeBag) 79 | 80 | // 5. 81 | sequence 82 | .elements() 83 | .bind(to: _wikipediaPages) 84 | .disposed(by: disposeBag) 85 | 86 | sequence 87 | .errors() 88 | .bind(to: _error) 89 | .disposed(by: disposeBag) 90 | } 91 | } 92 | 93 | extension WikipediaSearchViewModel: WikipediaSearchViewModelInputs { 94 | func searchTextChanged(_ searchText: String) { 95 | searchTextChangedProperty.accept(searchText) 96 | } 97 | } 98 | 99 | // 6. 100 | extension WikipediaSearchViewModel: WikipediaSearchViewModelType { 101 | var inputs: WikipediaSearchViewModelInputs { return self } 102 | var outputs: WikipediaSearchViewModelOutputs { return self } 103 | } 104 | -------------------------------------------------------------------------------- /Contents/KickstarterStyle/WikipediaSearchViewModelSpec.swift: -------------------------------------------------------------------------------- 1 | // 2 | // WikipediaSearchViewModelSpec.swift 3 | // SergdortStyleTests 4 | // 5 | // Created by Yoshinori Imajo on 2019/01/03. 6 | // Copyright © 2019 Yoshinori Imajo. All rights reserved. 7 | // 8 | 9 | import RxSwift 10 | import RxTest 11 | import Quick 12 | import Nimble 13 | import Foundation 14 | 15 | @testable import Library 16 | @testable import KickstarterStyle 17 | 18 | class WikipediaSearchViewModelSpec: QuickSpec { 19 | let disposeBag = DisposeBag() 20 | 21 | override func spec() { 22 | describe("入力に対する出力") { 23 | context("フィルタ境界付近のデータが入力される") { 24 | // 1. 25 | let scheduler = TestScheduler(initialClock: 0, resolution: 0.1) 26 | // 条件の準備 27 | let inputTextObservable = [ 28 | Recorded.next(1, "S"), // 2. 29 | Recorded.next(2, "Swi"), // 3. 30 | Recorded.next(6, "Swif") // 4. 31 | ] 32 | 33 | let mockPage1 = try! JSONDecoder().decode( 34 | WikipediaPage.self, 35 | from: "{\"pageid\": 1, \"title\": \"スイフト\"}".data(using: .utf8)! 36 | ) 37 | 38 | let mockPage2 = try! JSONDecoder().decode( 39 | WikipediaPage.self, 40 | from: "{\"pageid\": 2, \"title\": \"テイラー\"}".data(using: .utf8)! 41 | ) 42 | 43 | let wikipediaAPI = MockWikipediaAPI( 44 | results: Observable.of([mockPage1, mockPage2]) 45 | ) 46 | 47 | it("境界を超えたタイミングでモック用データと同じ結果が出力される") { 48 | // 結果をbindするObserver 49 | let pagesObserver: TestableObserver<[WikipediaPage]> 50 | let resultDescriptionObserver: TestableObserver 51 | 52 | do { 53 | let viewModel: WikipediaSearchViewModelType = WikipediaSearchViewModel( 54 | wikipediaAPI: wikipediaAPI, 55 | scheduler: scheduler 56 | ) 57 | 58 | let searchText = scheduler.createHotObservable(inputTextObservable) 59 | 60 | searchText.asObservable() 61 | .subscribe(onNext: { 62 | viewModel.inputs.searchTextChanged($0) 63 | }) 64 | .disposed(by: self.disposeBag) 65 | 66 | pagesObserver = scheduler.createObserver([WikipediaPage].self) 67 | viewModel.outputs.wikipediaPages 68 | .bind(to: pagesObserver) 69 | .disposed(by: self.disposeBag) 70 | 71 | resultDescriptionObserver = scheduler.createObserver(String.self) 72 | viewModel.outputs.searchDescription 73 | .bind(to: resultDescriptionObserver) 74 | .disposed(by: self.disposeBag) 75 | 76 | scheduler.start() 77 | } 78 | 79 | expect(pagesObserver.events).to(equal([ 80 | Recorded.next(5, [mockPage1, mockPage2]), // 5. 81 | Recorded.next(9, [mockPage1, mockPage2]) // 6. 82 | ])) 83 | 84 | expect(resultDescriptionObserver.events).to(equal([ 85 | Recorded.next(5, "Swi 2件"), 86 | Recorded.next(9, "Swif 2件") 87 | ])) 88 | } 89 | } 90 | } 91 | } 92 | } 93 | -------------------------------------------------------------------------------- /Contents/SergdortStyle/RxViewModelType.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RxViewModelType.swift 3 | // SergdortStyle 4 | // 5 | // Created by Yoshinori Imajo on 2019/01/01. 6 | // Copyright © 2019 Yoshinori Imajo. All rights reserved. 7 | // 8 | 9 | protocol ViewModelType { 10 | associatedtype Input 11 | associatedtype Output 12 | 13 | func transform(input: Input) -> Output 14 | } 15 | -------------------------------------------------------------------------------- /Contents/SergdortStyle/Storyboard.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 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 46 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | -------------------------------------------------------------------------------- /Contents/SergdortStyle/ViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.swift 3 | // SergdortStyle 4 | // 5 | // Created by Yoshinori Imajo on 2019/01/01. 6 | // Copyright © 2019 Yoshinori Imajo. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import RxSwift 11 | import RxCocoa 12 | import Library 13 | 14 | class ViewController: UIViewController { 15 | 16 | @IBOutlet private weak var searchBar: UISearchBar! 17 | @IBOutlet private weak var tableView: UITableView! 18 | private let disposeBag = DisposeBag() 19 | 20 | // 1. 21 | private let viewModel = WikipediaSearchViewModel( 22 | wikipediaAPI: WikipediaDefaultAPI(URLSession: .shared) 23 | ) 24 | 25 | override func viewDidLoad() { 26 | super.viewDidLoad() 27 | 28 | let input = WikipediaSearchViewModel.Input( 29 | searchText: searchBar.rx.text.orEmpty.asObservable() 30 | ) 31 | 32 | // 2. 33 | let output = viewModel.transform(input: input) 34 | 35 | output.searchDescription 36 | .bind(to: navigationItem.rx.title) 37 | .disposed(by: disposeBag) 38 | 39 | // 3. 40 | output.wikipediaPages 41 | .bind(to: tableView.rx.items(cellIdentifier: "Cell")) { index, result, cell in 42 | cell.textLabel?.text = result.title 43 | cell.detailTextLabel?.text = result.url.absoluteString 44 | } 45 | .disposed(by: disposeBag) 46 | 47 | // 4. 48 | output.error 49 | .subscribe(onNext: { error in 50 | if let error = error as? URLError, 51 | error.code == URLError.notConnectedToInternet { 52 | // ここでネット接続していない旨を表示する 53 | print(error) 54 | } 55 | }) 56 | .disposed(by: disposeBag) 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /Contents/SergdortStyle/WikipediaSearchViewModel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // WikipediaSearchViewModel.swift 3 | // SergdortStyle 4 | // 5 | // Created by Yoshinori Imajo on 2019/01/01. 6 | // Copyright © 2019 Yoshinori Imajo. All rights reserved. 7 | // 8 | 9 | import RxSwift 10 | import RxCocoa 11 | import Library 12 | 13 | class WikipediaSearchViewModel { 14 | private let disposeBag = DisposeBag() 15 | 16 | private let wikipediaAPI: WikipediaAPI 17 | private let scheduler: SchedulerType 18 | 19 | init(wikipediaAPI: WikipediaAPI, 20 | scheduler: SchedulerType = ConcurrentMainScheduler.instance) { 21 | self.wikipediaAPI = wikipediaAPI 22 | // 1. 23 | self.scheduler = scheduler 24 | } 25 | } 26 | 27 | extension WikipediaSearchViewModel: ViewModelType { 28 | // 2. 29 | struct Input { 30 | let searchText: Observable 31 | } 32 | 33 | struct Output { 34 | let wikipediaPages: Observable<[WikipediaPage]> 35 | let searchDescription: Observable 36 | let error: Observable 37 | } 38 | 39 | func transform(input: Input) -> Output { 40 | 41 | let filteredText = input.searchText 42 | .debounce(.milliseconds(300), scheduler: scheduler) 43 | .share(replay: 1) 44 | 45 | let sequence = filteredText 46 | .flatMapLatest { [unowned self] text -> Observable> in 47 | return self.wikipediaAPI 48 | .search(from: text) 49 | .materialize() 50 | } 51 | .share(replay: 1) 52 | 53 | // 3. 54 | let wikipediaPages = sequence.elements() 55 | 56 | // 4. 57 | let _searchDescription = PublishRelay() 58 | 59 | // 5. 60 | wikipediaPages 61 | .withLatestFrom(filteredText) { (pages, word) -> String in 62 | return "\(word) \(pages.count)件" 63 | } 64 | .bind(to: _searchDescription) 65 | .disposed(by: disposeBag) 66 | 67 | return Output( 68 | wikipediaPages: wikipediaPages, 69 | searchDescription: _searchDescription.asObservable(), 70 | error: sequence.errors() // 6. 71 | ) 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /Contents/SergdortStyle/WikipediaSearchViewModelSpec.swift: -------------------------------------------------------------------------------- 1 | // 2 | // WikipediaSearchViewModelSpec.swift 3 | // SergdortStyleTests 4 | // 5 | // Created by Yoshinori Imajo on 2019/01/03. 6 | // Copyright © 2019 Yoshinori Imajo. All rights reserved. 7 | // 8 | 9 | import RxSwift 10 | import RxTest 11 | import RxCocoa 12 | import RxBlocking 13 | import Quick 14 | import Nimble 15 | import Foundation 16 | 17 | @testable import Library 18 | @testable import SergdortStyle 19 | 20 | class WikipediaSearchViewModelSpec: QuickSpec { 21 | let disposeBag = DisposeBag() 22 | 23 | override func spec() { 24 | describe("入力に対する出力") { 25 | context("フィルタ境界付近のデータが入力される") { 26 | // 1. 27 | let scheduler = TestScheduler(initialClock: 0, resolution: 0.1) 28 | // 条件の準備 29 | let inputTextObservable = [ 30 | Recorded.next(1, "S"), // 2. 31 | Recorded.next(2, "Swi"), // 3. 32 | Recorded.next(6, "Swif") // 4. 33 | ] 34 | 35 | let mockPage1 = try! JSONDecoder().decode( 36 | WikipediaPage.self, 37 | from: "{\"pageid\": 1, \"title\": \"スイフト\"}".data(using: .utf8)! 38 | ) 39 | 40 | let mockPage2 = try! JSONDecoder().decode( 41 | WikipediaPage.self, 42 | from: "{\"pageid\": 2, \"title\": \"テイラー\"}".data(using: .utf8)! 43 | ) 44 | 45 | let wikipediaAPI = MockWikipediaAPI( 46 | results: Observable.of([mockPage1, mockPage2]) 47 | ) 48 | 49 | it("境界を超えたタイミングでモック用データと同じ結果が出力される") { 50 | // 出力結果をbindするObserver 51 | let pagesObserver: TestableObserver<[WikipediaPage]> 52 | let resultDescriptionObserver: TestableObserver 53 | 54 | do { 55 | let searchText = scheduler.createHotObservable(inputTextObservable) 56 | let viewModel = WikipediaSearchViewModel(wikipediaAPI: wikipediaAPI, 57 | scheduler: scheduler) 58 | 59 | let input = WikipediaSearchViewModel.Input( 60 | searchText: searchText.asObservable() 61 | ) 62 | let output = viewModel.transform(input: input) 63 | 64 | pagesObserver = scheduler.createObserver([WikipediaPage].self) 65 | output.wikipediaPages 66 | .bind(to: pagesObserver) 67 | .disposed(by: self.disposeBag) 68 | 69 | resultDescriptionObserver = scheduler.createObserver(String.self) 70 | output.searchDescription 71 | .bind(to: resultDescriptionObserver) 72 | .disposed(by: self.disposeBag) 73 | 74 | scheduler.start() 75 | } 76 | 77 | expect(pagesObserver.events).to(equal([ 78 | Recorded.next(5, [mockPage1, mockPage2]), // 5. 79 | Recorded.next(9, [mockPage1, mockPage2]) // 6. 80 | ])) 81 | 82 | expect(resultDescriptionObserver.events).to(equal([ 83 | Recorded.next(5, "Swi 2件"), 84 | Recorded.next(9, "Swif 2件") 85 | ])) 86 | } 87 | } 88 | 89 | context("通信エラーが発生した場合") { 90 | it("エラーが出力される") { 91 | // 7. 92 | enum TestError: Error { case dummyError } 93 | 94 | let error: Error 95 | do { 96 | let testError = Observable<[WikipediaPage]>.error(TestError.dummyError) 97 | 98 | let input = WikipediaSearchViewModel.Input( 99 | searchText: Observable.just("") 100 | ) 101 | 102 | let viewModel = WikipediaSearchViewModel( 103 | wikipediaAPI: MockWikipediaAPI(results: testError) 104 | ) 105 | 106 | let output = viewModel.transform(input: input) 107 | error = try! output.error.toBlocking().first()! 108 | } 109 | 110 | expect(error as? TestError).to(equal(TestError.dummyError)) 111 | } 112 | } 113 | } 114 | } 115 | } 116 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | 2 | The MIT License (MIT) 3 | 4 | Copyright (c) 2019 yimajo 5 | 6 | Permission is hereby granted, free of charge, to any person obtaining a copy 7 | of this software and associated documentation files (the "Software"), to deal 8 | in the Software without restriction, including without limitation the rights 9 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | copies of the Software, and to permit persons to whom the Software is 11 | furnished to do so, subject to the following conditions: 12 | 13 | The above copyright notice and this permission notice shall be included in all 14 | copies or substantial portions of the Software. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | SOFTWARE. 23 | -------------------------------------------------------------------------------- /Library/MockWikipediaAPI.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MockWikipediaAPI.swift 3 | // Library 4 | // 5 | // Created by Yoshinori Imajo on 2019/02/10. 6 | // Copyright © 2019 Yoshinori Imajo. All rights reserved. 7 | // 8 | 9 | import RxSwift 10 | 11 | struct MockWikipediaAPI { 12 | private let results: Observable<[WikipediaPage]> 13 | // 1. 14 | init(results: Observable<[WikipediaPage]>) { 15 | self.results = results 16 | } 17 | } 18 | 19 | // 2. 20 | extension MockWikipediaAPI: WikipediaAPI { 21 | func search(from word: String) -> Observable<[WikipediaPage]> { 22 | return results 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /Library/WikipediaAPI.swift: -------------------------------------------------------------------------------- 1 | // 2 | // WikipediaAPI.swift 3 | // SergdortStyle 4 | // 5 | // Created by Yoshinori Imajo on 2019/01/01. 6 | // Copyright © 2019 Yoshinori Imajo. All rights reserved. 7 | // 8 | 9 | import RxSwift 10 | import RxCocoa 11 | import Foundation 12 | 13 | public protocol WikipediaAPI { 14 | func search(from word: String) -> Observable<[WikipediaPage]> 15 | } 16 | 17 | public class WikipediaDefaultAPI : WikipediaAPI { 18 | 19 | private let host = URL(string: "https://ja.wikipedia.org")! 20 | private let path = "/w/api.php" 21 | private let URLSession: Foundation.URLSession 22 | 23 | public init(URLSession: Foundation.URLSession) { 24 | self.URLSession = URLSession 25 | } 26 | 27 | public func search(from word: String) -> Observable<[WikipediaPage]> { 28 | 29 | var components = URLComponents(url: host, resolvingAgainstBaseURL: false)! 30 | components.path = path 31 | 32 | let items = [ 33 | URLQueryItem(name: "format", value: "json"), 34 | URLQueryItem(name: "action", value: "query"), 35 | URLQueryItem(name: "list", value: "search"), 36 | URLQueryItem(name: "srsearch", value: word) 37 | ] 38 | 39 | components.queryItems = items 40 | 41 | let request = URLRequest(url: components.url!) 42 | return URLSession.rx.response(request: request) 43 | .map { pair in 44 | do { 45 | let response = try JSONDecoder().decode(WikipediaSearchResponse.self, 46 | from: pair.data) 47 | 48 | return response.query.search 49 | } catch { 50 | throw error 51 | } 52 | } 53 | } 54 | } 55 | 56 | -------------------------------------------------------------------------------- /Library/WikipediaPage.swift: -------------------------------------------------------------------------------- 1 | // 2 | // WikipediaPage.swift 3 | // Library 4 | // 5 | // Created by Yoshinori Imajo on 2019/02/10. 6 | // Copyright © 2019 Yoshinori Imajo. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | public struct WikipediaSearchResponse: Decodable { 12 | public let query: Query 13 | 14 | public struct Query: Decodable { 15 | public let search: [Library.WikipediaPage] 16 | } 17 | } 18 | 19 | public struct WikipediaPage { 20 | public let id: String 21 | public let title: String 22 | public let url: URL 23 | } 24 | 25 | extension WikipediaPage: Equatable { 26 | public static func == (lhs: WikipediaPage, rhs: WikipediaPage) -> Bool { 27 | return lhs.id == rhs.id 28 | } 29 | } 30 | 31 | extension WikipediaPage: Decodable { 32 | private enum CodingKeys: String, CodingKey { 33 | case id = "pageid" 34 | case title 35 | } 36 | 37 | public init(from decoder: Decoder) throws { 38 | let container = try decoder.container(keyedBy: CodingKeys.self) 39 | 40 | self.id = String(try container.decode(Int.self, forKey: .id)) 41 | 42 | self.title = try container.decode(String.self, forKey: .title) 43 | // 2. 44 | self.url = URL(string: "https://ja.wikipedia.org/w/index.php?curid=\(id)")! 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /Library/materialized+elements.swift: -------------------------------------------------------------------------------- 1 | // 2 | // materialized+elements.swift 3 | // RxSwiftBook3Samples 4 | // 5 | // Created by Yoshinori Imajo on 2019/01/01. 6 | // Copyright © 2019 Yoshinori Imajo. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import RxSwift 11 | 12 | extension RxSwift.ObservableType where Element: RxSwift.EventConvertible { 13 | 14 | public func elements() -> RxSwift.Observable { 15 | return filter { $0.event.element != nil } 16 | .map { $0.event.element! } 17 | } 18 | 19 | public func errors() -> RxSwift.Observable { 20 | return filter { $0.event.error != nil } 21 | .map { $0.event.error! } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 『RxSwift研究読本3 ViewModel設計パターン入門編』サンプルコード 2 | 3 | ## 書籍について 4 | 5 | - [BOOTH: キュリオシティソフトウェア書店にてDL販売中](https://swift.booth.pm/items/1223536) 6 | 7 | ## 目次 8 | 9 | - 第3章 [サンプルコード](Contents/SergdortStyle/) 10 | - 第4章 [サンプルコード](Contents/KickstarterStyle/) 11 | 12 | ## 開発環境 13 | 14 | - Xcode 13.3.1 15 | - RxSwift 6.5.0 16 | 17 | ## ご注意 18 | 19 | 本サンプルコード、 20 | 本書の内容に基づく運用結果について、著者、ソフトウェアの開発元および提供元は一切の責任を負いかねますので、 21 | あらかじめご了承ください。 22 | -------------------------------------------------------------------------------- /RxSwiftBook3SampleCode.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 52; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | A56FB0062210463100010E36 /* WikipediaPage.swift in Sources */ = {isa = PBXBuildFile; fileRef = A56FB0052210463100010E36 /* WikipediaPage.swift */; }; 11 | A5ADB98322104C1300E26A20 /* WikipediaAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5ED4E8B22103C8400CD70D3 /* WikipediaAPI.swift */; }; 12 | A5ADB9962210514000E26A20 /* MockWikipediaAPI.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5ADB9952210514000E26A20 /* MockWikipediaAPI.swift */; }; 13 | A5ADB9A9221053AB00E26A20 /* SergdortStyle.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A5ADB9A0221053AB00E26A20 /* SergdortStyle.framework */; }; 14 | A5ADB9B5221053AB00E26A20 /* SergdortStyle.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A5ADB9A0221053AB00E26A20 /* SergdortStyle.framework */; }; 15 | A5ADB9B6221053AB00E26A20 /* SergdortStyle.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = A5ADB9A0221053AB00E26A20 /* SergdortStyle.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 16 | A5ADB9C02210543700E26A20 /* Storyboard.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = A5ADB9BD2210543500E26A20 /* Storyboard.storyboard */; }; 17 | A5ADB9C12210543700E26A20 /* WikipediaSearchViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5ADB9BE2210543600E26A20 /* WikipediaSearchViewModel.swift */; }; 18 | A5ADB9C22210543700E26A20 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5ADB9BF2210543700E26A20 /* ViewController.swift */; }; 19 | A5ADB9C42210543D00E26A20 /* RxViewModelType.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5ADB9C32210543D00E26A20 /* RxViewModelType.swift */; }; 20 | A5ADB9C82210560800E26A20 /* WikipediaSearchViewModelSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5ADB9C52210545200E26A20 /* WikipediaSearchViewModelSpec.swift */; }; 21 | A5ADB9D72210571E00E26A20 /* KickstarterStyle.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A5ADB9CE2210571E00E26A20 /* KickstarterStyle.framework */; }; 22 | A5ADB9E32210571E00E26A20 /* KickstarterStyle.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A5ADB9CE2210571E00E26A20 /* KickstarterStyle.framework */; }; 23 | A5ADB9E42210571E00E26A20 /* KickstarterStyle.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = A5ADB9CE2210571E00E26A20 /* KickstarterStyle.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 24 | A5ADB9EF2210574A00E26A20 /* Storyboard.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = A5ADB9EB2210574800E26A20 /* Storyboard.storyboard */; }; 25 | A5ADB9F02210574A00E26A20 /* WikipediaSearchNewViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5ADB9EC2210574900E26A20 /* WikipediaSearchNewViewModel.swift */; }; 26 | A5ADB9F12210574A00E26A20 /* WikipediaSearchViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5ADB9ED2210574900E26A20 /* WikipediaSearchViewModel.swift */; }; 27 | A5ADB9F22210574A00E26A20 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5ADB9EE2210574A00E26A20 /* ViewController.swift */; }; 28 | A5ADB9F52210589F00E26A20 /* WikipediaSearchViewModelSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5ADB9F32210589E00E26A20 /* WikipediaSearchViewModelSpec.swift */; }; 29 | A5ADB9F62210589F00E26A20 /* WikipediaSearchNewViewModelSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5ADB9F42210589E00E26A20 /* WikipediaSearchNewViewModelSpec.swift */; }; 30 | A5D1644C2814041600C0D439 /* RxCocoa in Frameworks */ = {isa = PBXBuildFile; productRef = A5D1644B2814041600C0D439 /* RxCocoa */; }; 31 | A5D1644E2814041600C0D439 /* RxRelay in Frameworks */ = {isa = PBXBuildFile; productRef = A5D1644D2814041600C0D439 /* RxRelay */; }; 32 | A5D164502814041600C0D439 /* RxSwift in Frameworks */ = {isa = PBXBuildFile; productRef = A5D1644F2814041600C0D439 /* RxSwift */; }; 33 | A5D1645328140A9F00C0D439 /* RxCocoa in Frameworks */ = {isa = PBXBuildFile; productRef = A5D1645228140A9F00C0D439 /* RxCocoa */; }; 34 | A5D1645528140AA600C0D439 /* RxSwift in Frameworks */ = {isa = PBXBuildFile; productRef = A5D1645428140AA600C0D439 /* RxSwift */; }; 35 | A5D1645B28140B0A00C0D439 /* RxTest in Frameworks */ = {isa = PBXBuildFile; productRef = A5D1645A28140B0A00C0D439 /* RxTest */; }; 36 | A5D1645D28140B1A00C0D439 /* RxTest in Frameworks */ = {isa = PBXBuildFile; productRef = A5D1645C28140B1A00C0D439 /* RxTest */; }; 37 | A5D1646428140B4F00C0D439 /* RxCocoa in Frameworks */ = {isa = PBXBuildFile; productRef = A5D1646328140B4F00C0D439 /* RxCocoa */; }; 38 | A5D1646628140B5400C0D439 /* RxSwift in Frameworks */ = {isa = PBXBuildFile; productRef = A5D1646528140B5400C0D439 /* RxSwift */; }; 39 | A5E5854428140F5F008AF7C6 /* RxSwift in Frameworks */ = {isa = PBXBuildFile; productRef = A5E5854328140F5F008AF7C6 /* RxSwift */; }; 40 | A5E5854628140F6B008AF7C6 /* RxCocoa in Frameworks */ = {isa = PBXBuildFile; productRef = A5E5854528140F6B008AF7C6 /* RxCocoa */; }; 41 | A5E5854B28141068008AF7C6 /* Quick in Frameworks */ = {isa = PBXBuildFile; productRef = A5E5854A28141068008AF7C6 /* Quick */; }; 42 | A5E5854D2814106E008AF7C6 /* Quick in Frameworks */ = {isa = PBXBuildFile; productRef = A5E5854C2814106E008AF7C6 /* Quick */; }; 43 | A5E58550281410AE008AF7C6 /* Nimble in Frameworks */ = {isa = PBXBuildFile; productRef = A5E5854F281410AE008AF7C6 /* Nimble */; }; 44 | A5E58552281410CC008AF7C6 /* RxBlocking in Frameworks */ = {isa = PBXBuildFile; productRef = A5E58551281410CC008AF7C6 /* RxBlocking */; }; 45 | A5E58554281410D8008AF7C6 /* RxBlocking in Frameworks */ = {isa = PBXBuildFile; productRef = A5E58553281410D8008AF7C6 /* RxBlocking */; }; 46 | A5E58556281410DD008AF7C6 /* Nimble in Frameworks */ = {isa = PBXBuildFile; productRef = A5E58555281410DD008AF7C6 /* Nimble */; }; 47 | A5E58558281416EE008AF7C6 /* RxCocoa in Frameworks */ = {isa = PBXBuildFile; productRef = A5E58557281416EE008AF7C6 /* RxCocoa */; }; 48 | A5E5855A2814170A008AF7C6 /* RxCocoa in Frameworks */ = {isa = PBXBuildFile; productRef = A5E585592814170A008AF7C6 /* RxCocoa */; }; 49 | A5ED4E6222103B6A00CD70D3 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5ED4E6122103B6A00CD70D3 /* AppDelegate.swift */; }; 50 | A5ED4E6922103B6A00CD70D3 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = A5ED4E6722103B6A00CD70D3 /* Main.storyboard */; }; 51 | A5ED4E6B22103B6B00CD70D3 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = A5ED4E6A22103B6B00CD70D3 /* Assets.xcassets */; }; 52 | A5ED4E9D22103ECA00CD70D3 /* Library.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A5ED4E9622103ECA00CD70D3 /* Library.framework */; }; 53 | A5ED4E9E22103ECA00CD70D3 /* Library.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = A5ED4E9622103ECA00CD70D3 /* Library.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 54 | A5ED4EA322103EFC00CD70D3 /* materialized+elements.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5ED4EA222103EFC00CD70D3 /* materialized+elements.swift */; }; 55 | /* End PBXBuildFile section */ 56 | 57 | /* Begin PBXContainerItemProxy section */ 58 | A5ADB9AA221053AB00E26A20 /* PBXContainerItemProxy */ = { 59 | isa = PBXContainerItemProxy; 60 | containerPortal = A5ED4E5622103B6A00CD70D3 /* Project object */; 61 | proxyType = 1; 62 | remoteGlobalIDString = A5ADB99F221053AB00E26A20; 63 | remoteInfo = SergdortStyle; 64 | }; 65 | A5ADB9AC221053AB00E26A20 /* PBXContainerItemProxy */ = { 66 | isa = PBXContainerItemProxy; 67 | containerPortal = A5ED4E5622103B6A00CD70D3 /* Project object */; 68 | proxyType = 1; 69 | remoteGlobalIDString = A5ED4E5D22103B6A00CD70D3; 70 | remoteInfo = RxSwiftBook3SampleCode; 71 | }; 72 | A5ADB9B3221053AB00E26A20 /* PBXContainerItemProxy */ = { 73 | isa = PBXContainerItemProxy; 74 | containerPortal = A5ED4E5622103B6A00CD70D3 /* Project object */; 75 | proxyType = 1; 76 | remoteGlobalIDString = A5ADB99F221053AB00E26A20; 77 | remoteInfo = SergdortStyle; 78 | }; 79 | A5ADB9D82210571E00E26A20 /* PBXContainerItemProxy */ = { 80 | isa = PBXContainerItemProxy; 81 | containerPortal = A5ED4E5622103B6A00CD70D3 /* Project object */; 82 | proxyType = 1; 83 | remoteGlobalIDString = A5ADB9CD2210571E00E26A20; 84 | remoteInfo = KickstarterStyle; 85 | }; 86 | A5ADB9DA2210571E00E26A20 /* PBXContainerItemProxy */ = { 87 | isa = PBXContainerItemProxy; 88 | containerPortal = A5ED4E5622103B6A00CD70D3 /* Project object */; 89 | proxyType = 1; 90 | remoteGlobalIDString = A5ED4E5D22103B6A00CD70D3; 91 | remoteInfo = RxSwiftBook3SampleCode; 92 | }; 93 | A5ADB9E12210571E00E26A20 /* PBXContainerItemProxy */ = { 94 | isa = PBXContainerItemProxy; 95 | containerPortal = A5ED4E5622103B6A00CD70D3 /* Project object */; 96 | proxyType = 1; 97 | remoteGlobalIDString = A5ADB9CD2210571E00E26A20; 98 | remoteInfo = KickstarterStyle; 99 | }; 100 | A5ED4E9B22103ECA00CD70D3 /* PBXContainerItemProxy */ = { 101 | isa = PBXContainerItemProxy; 102 | containerPortal = A5ED4E5622103B6A00CD70D3 /* Project object */; 103 | proxyType = 1; 104 | remoteGlobalIDString = A5ED4E9522103ECA00CD70D3; 105 | remoteInfo = Library; 106 | }; 107 | /* End PBXContainerItemProxy section */ 108 | 109 | /* Begin PBXCopyFilesBuildPhase section */ 110 | A5ED4E8622103C4D00CD70D3 /* Embed Frameworks */ = { 111 | isa = PBXCopyFilesBuildPhase; 112 | buildActionMask = 2147483647; 113 | dstPath = ""; 114 | dstSubfolderSpec = 10; 115 | files = ( 116 | A5ED4E9E22103ECA00CD70D3 /* Library.framework in Embed Frameworks */, 117 | A5ADB9E42210571E00E26A20 /* KickstarterStyle.framework in Embed Frameworks */, 118 | A5ADB9B6221053AB00E26A20 /* SergdortStyle.framework in Embed Frameworks */, 119 | ); 120 | name = "Embed Frameworks"; 121 | runOnlyForDeploymentPostprocessing = 0; 122 | }; 123 | /* End PBXCopyFilesBuildPhase section */ 124 | 125 | /* Begin PBXFileReference section */ 126 | A56FB0052210463100010E36 /* WikipediaPage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WikipediaPage.swift; sourceTree = ""; }; 127 | A5ADB9952210514000E26A20 /* MockWikipediaAPI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockWikipediaAPI.swift; sourceTree = ""; }; 128 | A5ADB9A0221053AB00E26A20 /* SergdortStyle.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SergdortStyle.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 129 | A5ADB9A8221053AB00E26A20 /* SergdortStyleTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SergdortStyleTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 130 | A5ADB9BD2210543500E26A20 /* Storyboard.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Storyboard.storyboard; sourceTree = ""; }; 131 | A5ADB9BE2210543600E26A20 /* WikipediaSearchViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WikipediaSearchViewModel.swift; sourceTree = ""; }; 132 | A5ADB9BF2210543700E26A20 /* ViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; 133 | A5ADB9C32210543D00E26A20 /* RxViewModelType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RxViewModelType.swift; sourceTree = ""; }; 134 | A5ADB9C52210545200E26A20 /* WikipediaSearchViewModelSpec.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WikipediaSearchViewModelSpec.swift; sourceTree = ""; }; 135 | A5ADB9CE2210571E00E26A20 /* KickstarterStyle.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = KickstarterStyle.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 136 | A5ADB9D62210571E00E26A20 /* KickstarterStyleTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = KickstarterStyleTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 137 | A5ADB9EB2210574800E26A20 /* Storyboard.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Storyboard.storyboard; sourceTree = ""; }; 138 | A5ADB9EC2210574900E26A20 /* WikipediaSearchNewViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WikipediaSearchNewViewModel.swift; sourceTree = ""; }; 139 | A5ADB9ED2210574900E26A20 /* WikipediaSearchViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WikipediaSearchViewModel.swift; sourceTree = ""; }; 140 | A5ADB9EE2210574A00E26A20 /* ViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; 141 | A5ADB9F32210589E00E26A20 /* WikipediaSearchViewModelSpec.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WikipediaSearchViewModelSpec.swift; sourceTree = ""; }; 142 | A5ADB9F42210589E00E26A20 /* WikipediaSearchNewViewModelSpec.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WikipediaSearchNewViewModelSpec.swift; sourceTree = ""; }; 143 | A5ED4E5E22103B6A00CD70D3 /* RxSwiftBook3SampleCode.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = RxSwiftBook3SampleCode.app; sourceTree = BUILT_PRODUCTS_DIR; }; 144 | A5ED4E6122103B6A00CD70D3 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 145 | A5ED4E6822103B6A00CD70D3 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 146 | A5ED4E6A22103B6B00CD70D3 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 147 | A5ED4E6F22103B6B00CD70D3 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 148 | A5ED4E8B22103C8400CD70D3 /* WikipediaAPI.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WikipediaAPI.swift; sourceTree = ""; }; 149 | A5ED4E9622103ECA00CD70D3 /* Library.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Library.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 150 | A5ED4EA222103EFC00CD70D3 /* materialized+elements.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "materialized+elements.swift"; sourceTree = ""; }; 151 | /* End PBXFileReference section */ 152 | 153 | /* Begin PBXFrameworksBuildPhase section */ 154 | A5ADB99D221053AB00E26A20 /* Frameworks */ = { 155 | isa = PBXFrameworksBuildPhase; 156 | buildActionMask = 2147483647; 157 | files = ( 158 | A5E5854628140F6B008AF7C6 /* RxCocoa in Frameworks */, 159 | A5E5854428140F5F008AF7C6 /* RxSwift in Frameworks */, 160 | ); 161 | runOnlyForDeploymentPostprocessing = 0; 162 | }; 163 | A5ADB9A5221053AB00E26A20 /* Frameworks */ = { 164 | isa = PBXFrameworksBuildPhase; 165 | buildActionMask = 2147483647; 166 | files = ( 167 | A5E5855A2814170A008AF7C6 /* RxCocoa in Frameworks */, 168 | A5E5854B28141068008AF7C6 /* Quick in Frameworks */, 169 | A5E58550281410AE008AF7C6 /* Nimble in Frameworks */, 170 | A5D1645D28140B1A00C0D439 /* RxTest in Frameworks */, 171 | A5ADB9A9221053AB00E26A20 /* SergdortStyle.framework in Frameworks */, 172 | A5E58552281410CC008AF7C6 /* RxBlocking in Frameworks */, 173 | ); 174 | runOnlyForDeploymentPostprocessing = 0; 175 | }; 176 | A5ADB9CB2210571E00E26A20 /* Frameworks */ = { 177 | isa = PBXFrameworksBuildPhase; 178 | buildActionMask = 2147483647; 179 | files = ( 180 | A5D1645528140AA600C0D439 /* RxSwift in Frameworks */, 181 | A5D1645328140A9F00C0D439 /* RxCocoa in Frameworks */, 182 | ); 183 | runOnlyForDeploymentPostprocessing = 0; 184 | }; 185 | A5ADB9D32210571E00E26A20 /* Frameworks */ = { 186 | isa = PBXFrameworksBuildPhase; 187 | buildActionMask = 2147483647; 188 | files = ( 189 | A5E58558281416EE008AF7C6 /* RxCocoa in Frameworks */, 190 | A5E58556281410DD008AF7C6 /* Nimble in Frameworks */, 191 | A5E5854D2814106E008AF7C6 /* Quick in Frameworks */, 192 | A5E58554281410D8008AF7C6 /* RxBlocking in Frameworks */, 193 | A5D1645B28140B0A00C0D439 /* RxTest in Frameworks */, 194 | A5ADB9D72210571E00E26A20 /* KickstarterStyle.framework in Frameworks */, 195 | ); 196 | runOnlyForDeploymentPostprocessing = 0; 197 | }; 198 | A5ED4E5B22103B6A00CD70D3 /* Frameworks */ = { 199 | isa = PBXFrameworksBuildPhase; 200 | buildActionMask = 2147483647; 201 | files = ( 202 | A5D1644E2814041600C0D439 /* RxRelay in Frameworks */, 203 | A5ADB9E32210571E00E26A20 /* KickstarterStyle.framework in Frameworks */, 204 | A5ED4E9D22103ECA00CD70D3 /* Library.framework in Frameworks */, 205 | A5D1644C2814041600C0D439 /* RxCocoa in Frameworks */, 206 | A5ADB9B5221053AB00E26A20 /* SergdortStyle.framework in Frameworks */, 207 | A5D164502814041600C0D439 /* RxSwift in Frameworks */, 208 | ); 209 | runOnlyForDeploymentPostprocessing = 0; 210 | }; 211 | A5ED4E9322103ECA00CD70D3 /* Frameworks */ = { 212 | isa = PBXFrameworksBuildPhase; 213 | buildActionMask = 2147483647; 214 | files = ( 215 | A5D1646628140B5400C0D439 /* RxSwift in Frameworks */, 216 | A5D1646428140B4F00C0D439 /* RxCocoa in Frameworks */, 217 | ); 218 | runOnlyForDeploymentPostprocessing = 0; 219 | }; 220 | /* End PBXFrameworksBuildPhase section */ 221 | 222 | /* Begin PBXGroup section */ 223 | A5ADB9A1221053AB00E26A20 /* SergdortStyle */ = { 224 | isa = PBXGroup; 225 | children = ( 226 | A5ADB9BD2210543500E26A20 /* Storyboard.storyboard */, 227 | A5ADB9BF2210543700E26A20 /* ViewController.swift */, 228 | A5ADB9C32210543D00E26A20 /* RxViewModelType.swift */, 229 | A5ADB9BE2210543600E26A20 /* WikipediaSearchViewModel.swift */, 230 | A5ADB9C52210545200E26A20 /* WikipediaSearchViewModelSpec.swift */, 231 | ); 232 | path = SergdortStyle; 233 | sourceTree = ""; 234 | }; 235 | A5ADB9CF2210571E00E26A20 /* KickstarterStyle */ = { 236 | isa = PBXGroup; 237 | children = ( 238 | A5ADB9EB2210574800E26A20 /* Storyboard.storyboard */, 239 | A5ADB9EE2210574A00E26A20 /* ViewController.swift */, 240 | A5ADB9ED2210574900E26A20 /* WikipediaSearchViewModel.swift */, 241 | A5ADB9EC2210574900E26A20 /* WikipediaSearchNewViewModel.swift */, 242 | A5ADB9F42210589E00E26A20 /* WikipediaSearchNewViewModelSpec.swift */, 243 | A5ADB9F32210589E00E26A20 /* WikipediaSearchViewModelSpec.swift */, 244 | ); 245 | path = KickstarterStyle; 246 | sourceTree = ""; 247 | }; 248 | A5ADB9F72211353F00E26A20 /* Contents */ = { 249 | isa = PBXGroup; 250 | children = ( 251 | A5ADB9A1221053AB00E26A20 /* SergdortStyle */, 252 | A5ADB9CF2210571E00E26A20 /* KickstarterStyle */, 253 | ); 254 | path = Contents; 255 | sourceTree = ""; 256 | }; 257 | A5D1645128140A9F00C0D439 /* Frameworks */ = { 258 | isa = PBXGroup; 259 | children = ( 260 | ); 261 | name = Frameworks; 262 | sourceTree = ""; 263 | }; 264 | A5ED4E5522103B6A00CD70D3 = { 265 | isa = PBXGroup; 266 | children = ( 267 | A5ED4E6022103B6A00CD70D3 /* RxSwiftBook3SampleCode */, 268 | A5ED4E9722103ECA00CD70D3 /* Library */, 269 | A5ADB9F72211353F00E26A20 /* Contents */, 270 | A5ED4E5F22103B6A00CD70D3 /* Products */, 271 | A5D1645128140A9F00C0D439 /* Frameworks */, 272 | ); 273 | sourceTree = ""; 274 | }; 275 | A5ED4E5F22103B6A00CD70D3 /* Products */ = { 276 | isa = PBXGroup; 277 | children = ( 278 | A5ED4E5E22103B6A00CD70D3 /* RxSwiftBook3SampleCode.app */, 279 | A5ED4E9622103ECA00CD70D3 /* Library.framework */, 280 | A5ADB9A0221053AB00E26A20 /* SergdortStyle.framework */, 281 | A5ADB9A8221053AB00E26A20 /* SergdortStyleTests.xctest */, 282 | A5ADB9CE2210571E00E26A20 /* KickstarterStyle.framework */, 283 | A5ADB9D62210571E00E26A20 /* KickstarterStyleTests.xctest */, 284 | ); 285 | name = Products; 286 | sourceTree = ""; 287 | }; 288 | A5ED4E6022103B6A00CD70D3 /* RxSwiftBook3SampleCode */ = { 289 | isa = PBXGroup; 290 | children = ( 291 | A5ED4E6122103B6A00CD70D3 /* AppDelegate.swift */, 292 | A5ED4E6722103B6A00CD70D3 /* Main.storyboard */, 293 | A5ED4E6A22103B6B00CD70D3 /* Assets.xcassets */, 294 | A5ED4E6F22103B6B00CD70D3 /* Info.plist */, 295 | ); 296 | path = RxSwiftBook3SampleCode; 297 | sourceTree = ""; 298 | }; 299 | A5ED4E9722103ECA00CD70D3 /* Library */ = { 300 | isa = PBXGroup; 301 | children = ( 302 | A5ED4EA222103EFC00CD70D3 /* materialized+elements.swift */, 303 | A56FB0052210463100010E36 /* WikipediaPage.swift */, 304 | A5ED4E8B22103C8400CD70D3 /* WikipediaAPI.swift */, 305 | A5ADB9952210514000E26A20 /* MockWikipediaAPI.swift */, 306 | ); 307 | path = Library; 308 | sourceTree = ""; 309 | }; 310 | /* End PBXGroup section */ 311 | 312 | /* Begin PBXHeadersBuildPhase section */ 313 | A5ADB99B221053AB00E26A20 /* Headers */ = { 314 | isa = PBXHeadersBuildPhase; 315 | buildActionMask = 2147483647; 316 | files = ( 317 | ); 318 | runOnlyForDeploymentPostprocessing = 0; 319 | }; 320 | A5ADB9C92210571E00E26A20 /* Headers */ = { 321 | isa = PBXHeadersBuildPhase; 322 | buildActionMask = 2147483647; 323 | files = ( 324 | ); 325 | runOnlyForDeploymentPostprocessing = 0; 326 | }; 327 | A5ED4E9122103ECA00CD70D3 /* Headers */ = { 328 | isa = PBXHeadersBuildPhase; 329 | buildActionMask = 2147483647; 330 | files = ( 331 | ); 332 | runOnlyForDeploymentPostprocessing = 0; 333 | }; 334 | /* End PBXHeadersBuildPhase section */ 335 | 336 | /* Begin PBXNativeTarget section */ 337 | A5ADB99F221053AB00E26A20 /* SergdortStyle */ = { 338 | isa = PBXNativeTarget; 339 | buildConfigurationList = A5ADB9B7221053AB00E26A20 /* Build configuration list for PBXNativeTarget "SergdortStyle" */; 340 | buildPhases = ( 341 | A5ADB99B221053AB00E26A20 /* Headers */, 342 | A5ADB99C221053AB00E26A20 /* Sources */, 343 | A5ADB99D221053AB00E26A20 /* Frameworks */, 344 | A5ADB99E221053AB00E26A20 /* Resources */, 345 | ); 346 | buildRules = ( 347 | ); 348 | dependencies = ( 349 | ); 350 | name = SergdortStyle; 351 | packageProductDependencies = ( 352 | A5E5854328140F5F008AF7C6 /* RxSwift */, 353 | A5E5854528140F6B008AF7C6 /* RxCocoa */, 354 | ); 355 | productName = SergdortStyle; 356 | productReference = A5ADB9A0221053AB00E26A20 /* SergdortStyle.framework */; 357 | productType = "com.apple.product-type.framework"; 358 | }; 359 | A5ADB9A7221053AB00E26A20 /* SergdortStyleTests */ = { 360 | isa = PBXNativeTarget; 361 | buildConfigurationList = A5ADB9BA221053AB00E26A20 /* Build configuration list for PBXNativeTarget "SergdortStyleTests" */; 362 | buildPhases = ( 363 | A5ADB9A4221053AB00E26A20 /* Sources */, 364 | A5ADB9A5221053AB00E26A20 /* Frameworks */, 365 | A5ADB9A6221053AB00E26A20 /* Resources */, 366 | ); 367 | buildRules = ( 368 | ); 369 | dependencies = ( 370 | A5ADB9AB221053AB00E26A20 /* PBXTargetDependency */, 371 | A5ADB9AD221053AB00E26A20 /* PBXTargetDependency */, 372 | ); 373 | name = SergdortStyleTests; 374 | packageProductDependencies = ( 375 | A5D1645C28140B1A00C0D439 /* RxTest */, 376 | A5E5854A28141068008AF7C6 /* Quick */, 377 | A5E5854F281410AE008AF7C6 /* Nimble */, 378 | A5E58551281410CC008AF7C6 /* RxBlocking */, 379 | A5E585592814170A008AF7C6 /* RxCocoa */, 380 | ); 381 | productName = SergdortStyleTests; 382 | productReference = A5ADB9A8221053AB00E26A20 /* SergdortStyleTests.xctest */; 383 | productType = "com.apple.product-type.bundle.unit-test"; 384 | }; 385 | A5ADB9CD2210571E00E26A20 /* KickstarterStyle */ = { 386 | isa = PBXNativeTarget; 387 | buildConfigurationList = A5ADB9E52210571E00E26A20 /* Build configuration list for PBXNativeTarget "KickstarterStyle" */; 388 | buildPhases = ( 389 | A5ADB9C92210571E00E26A20 /* Headers */, 390 | A5ADB9CA2210571E00E26A20 /* Sources */, 391 | A5ADB9CB2210571E00E26A20 /* Frameworks */, 392 | A5ADB9CC2210571E00E26A20 /* Resources */, 393 | ); 394 | buildRules = ( 395 | ); 396 | dependencies = ( 397 | ); 398 | name = KickstarterStyle; 399 | packageProductDependencies = ( 400 | A5D1645228140A9F00C0D439 /* RxCocoa */, 401 | A5D1645428140AA600C0D439 /* RxSwift */, 402 | ); 403 | productName = KickstarterStyle; 404 | productReference = A5ADB9CE2210571E00E26A20 /* KickstarterStyle.framework */; 405 | productType = "com.apple.product-type.framework"; 406 | }; 407 | A5ADB9D52210571E00E26A20 /* KickstarterStyleTests */ = { 408 | isa = PBXNativeTarget; 409 | buildConfigurationList = A5ADB9E82210571E00E26A20 /* Build configuration list for PBXNativeTarget "KickstarterStyleTests" */; 410 | buildPhases = ( 411 | A5ADB9D22210571E00E26A20 /* Sources */, 412 | A5ADB9D32210571E00E26A20 /* Frameworks */, 413 | A5ADB9D42210571E00E26A20 /* Resources */, 414 | ); 415 | buildRules = ( 416 | ); 417 | dependencies = ( 418 | A5ADB9D92210571E00E26A20 /* PBXTargetDependency */, 419 | A5ADB9DB2210571E00E26A20 /* PBXTargetDependency */, 420 | ); 421 | name = KickstarterStyleTests; 422 | packageProductDependencies = ( 423 | A5D1645A28140B0A00C0D439 /* RxTest */, 424 | A5E5854C2814106E008AF7C6 /* Quick */, 425 | A5E58553281410D8008AF7C6 /* RxBlocking */, 426 | A5E58555281410DD008AF7C6 /* Nimble */, 427 | A5E58557281416EE008AF7C6 /* RxCocoa */, 428 | ); 429 | productName = KickstarterStyleTests; 430 | productReference = A5ADB9D62210571E00E26A20 /* KickstarterStyleTests.xctest */; 431 | productType = "com.apple.product-type.bundle.unit-test"; 432 | }; 433 | A5ED4E5D22103B6A00CD70D3 /* RxSwiftBook3SampleCode */ = { 434 | isa = PBXNativeTarget; 435 | buildConfigurationList = A5ED4E7222103B6B00CD70D3 /* Build configuration list for PBXNativeTarget "RxSwiftBook3SampleCode" */; 436 | buildPhases = ( 437 | A5ED4E5A22103B6A00CD70D3 /* Sources */, 438 | A5ED4E5B22103B6A00CD70D3 /* Frameworks */, 439 | A5ED4E5C22103B6A00CD70D3 /* Resources */, 440 | A5ED4E8622103C4D00CD70D3 /* Embed Frameworks */, 441 | ); 442 | buildRules = ( 443 | ); 444 | dependencies = ( 445 | A5ED4E9C22103ECA00CD70D3 /* PBXTargetDependency */, 446 | A5ADB9B4221053AB00E26A20 /* PBXTargetDependency */, 447 | A5ADB9E22210571E00E26A20 /* PBXTargetDependency */, 448 | ); 449 | name = RxSwiftBook3SampleCode; 450 | packageProductDependencies = ( 451 | A5D1644B2814041600C0D439 /* RxCocoa */, 452 | A5D1644D2814041600C0D439 /* RxRelay */, 453 | A5D1644F2814041600C0D439 /* RxSwift */, 454 | ); 455 | productName = RxSwiftBook3SampleCode; 456 | productReference = A5ED4E5E22103B6A00CD70D3 /* RxSwiftBook3SampleCode.app */; 457 | productType = "com.apple.product-type.application"; 458 | }; 459 | A5ED4E9522103ECA00CD70D3 /* Library */ = { 460 | isa = PBXNativeTarget; 461 | buildConfigurationList = A5ED4EA122103ECB00CD70D3 /* Build configuration list for PBXNativeTarget "Library" */; 462 | buildPhases = ( 463 | A5ED4E9122103ECA00CD70D3 /* Headers */, 464 | A5ED4E9222103ECA00CD70D3 /* Sources */, 465 | A5ED4E9322103ECA00CD70D3 /* Frameworks */, 466 | A5ED4E9422103ECA00CD70D3 /* Resources */, 467 | ); 468 | buildRules = ( 469 | ); 470 | dependencies = ( 471 | ); 472 | name = Library; 473 | packageProductDependencies = ( 474 | A5D1646328140B4F00C0D439 /* RxCocoa */, 475 | A5D1646528140B5400C0D439 /* RxSwift */, 476 | ); 477 | productName = Library; 478 | productReference = A5ED4E9622103ECA00CD70D3 /* Library.framework */; 479 | productType = "com.apple.product-type.framework"; 480 | }; 481 | /* End PBXNativeTarget section */ 482 | 483 | /* Begin PBXProject section */ 484 | A5ED4E5622103B6A00CD70D3 /* Project object */ = { 485 | isa = PBXProject; 486 | attributes = { 487 | LastSwiftUpdateCheck = 1010; 488 | LastUpgradeCheck = 1010; 489 | ORGANIZATIONNAME = "Yoshinori Imajo"; 490 | TargetAttributes = { 491 | A5ADB99F221053AB00E26A20 = { 492 | CreatedOnToolsVersion = 10.1; 493 | LastSwiftMigration = 1010; 494 | }; 495 | A5ADB9A7221053AB00E26A20 = { 496 | CreatedOnToolsVersion = 10.1; 497 | TestTargetID = A5ED4E5D22103B6A00CD70D3; 498 | }; 499 | A5ADB9CD2210571E00E26A20 = { 500 | CreatedOnToolsVersion = 10.1; 501 | LastSwiftMigration = 1010; 502 | }; 503 | A5ADB9D52210571E00E26A20 = { 504 | CreatedOnToolsVersion = 10.1; 505 | TestTargetID = A5ED4E5D22103B6A00CD70D3; 506 | }; 507 | A5ED4E5D22103B6A00CD70D3 = { 508 | CreatedOnToolsVersion = 10.1; 509 | }; 510 | A5ED4E9522103ECA00CD70D3 = { 511 | CreatedOnToolsVersion = 10.1; 512 | LastSwiftMigration = 1010; 513 | }; 514 | }; 515 | }; 516 | buildConfigurationList = A5ED4E5922103B6A00CD70D3 /* Build configuration list for PBXProject "RxSwiftBook3SampleCode" */; 517 | compatibilityVersion = "Xcode 9.3"; 518 | developmentRegion = en; 519 | hasScannedForEncodings = 0; 520 | knownRegions = ( 521 | en, 522 | Base, 523 | ); 524 | mainGroup = A5ED4E5522103B6A00CD70D3; 525 | packageReferences = ( 526 | A5D1644A2814041500C0D439 /* XCRemoteSwiftPackageReference "RxSwift" */, 527 | A5E5854728140FF4008AF7C6 /* XCRemoteSwiftPackageReference "Quick" */, 528 | A5E5854E281410AE008AF7C6 /* XCRemoteSwiftPackageReference "Nimble" */, 529 | ); 530 | productRefGroup = A5ED4E5F22103B6A00CD70D3 /* Products */; 531 | projectDirPath = ""; 532 | projectRoot = ""; 533 | targets = ( 534 | A5ED4E5D22103B6A00CD70D3 /* RxSwiftBook3SampleCode */, 535 | A5ED4E9522103ECA00CD70D3 /* Library */, 536 | A5ADB99F221053AB00E26A20 /* SergdortStyle */, 537 | A5ADB9A7221053AB00E26A20 /* SergdortStyleTests */, 538 | A5ADB9CD2210571E00E26A20 /* KickstarterStyle */, 539 | A5ADB9D52210571E00E26A20 /* KickstarterStyleTests */, 540 | ); 541 | }; 542 | /* End PBXProject section */ 543 | 544 | /* Begin PBXResourcesBuildPhase section */ 545 | A5ADB99E221053AB00E26A20 /* Resources */ = { 546 | isa = PBXResourcesBuildPhase; 547 | buildActionMask = 2147483647; 548 | files = ( 549 | A5ADB9C02210543700E26A20 /* Storyboard.storyboard in Resources */, 550 | ); 551 | runOnlyForDeploymentPostprocessing = 0; 552 | }; 553 | A5ADB9A6221053AB00E26A20 /* Resources */ = { 554 | isa = PBXResourcesBuildPhase; 555 | buildActionMask = 2147483647; 556 | files = ( 557 | ); 558 | runOnlyForDeploymentPostprocessing = 0; 559 | }; 560 | A5ADB9CC2210571E00E26A20 /* Resources */ = { 561 | isa = PBXResourcesBuildPhase; 562 | buildActionMask = 2147483647; 563 | files = ( 564 | A5ADB9EF2210574A00E26A20 /* Storyboard.storyboard in Resources */, 565 | ); 566 | runOnlyForDeploymentPostprocessing = 0; 567 | }; 568 | A5ADB9D42210571E00E26A20 /* Resources */ = { 569 | isa = PBXResourcesBuildPhase; 570 | buildActionMask = 2147483647; 571 | files = ( 572 | ); 573 | runOnlyForDeploymentPostprocessing = 0; 574 | }; 575 | A5ED4E5C22103B6A00CD70D3 /* Resources */ = { 576 | isa = PBXResourcesBuildPhase; 577 | buildActionMask = 2147483647; 578 | files = ( 579 | A5ED4E6B22103B6B00CD70D3 /* Assets.xcassets in Resources */, 580 | A5ED4E6922103B6A00CD70D3 /* Main.storyboard in Resources */, 581 | ); 582 | runOnlyForDeploymentPostprocessing = 0; 583 | }; 584 | A5ED4E9422103ECA00CD70D3 /* Resources */ = { 585 | isa = PBXResourcesBuildPhase; 586 | buildActionMask = 2147483647; 587 | files = ( 588 | ); 589 | runOnlyForDeploymentPostprocessing = 0; 590 | }; 591 | /* End PBXResourcesBuildPhase section */ 592 | 593 | /* Begin PBXSourcesBuildPhase section */ 594 | A5ADB99C221053AB00E26A20 /* Sources */ = { 595 | isa = PBXSourcesBuildPhase; 596 | buildActionMask = 2147483647; 597 | files = ( 598 | A5ADB9C22210543700E26A20 /* ViewController.swift in Sources */, 599 | A5ADB9C12210543700E26A20 /* WikipediaSearchViewModel.swift in Sources */, 600 | A5ADB9C42210543D00E26A20 /* RxViewModelType.swift in Sources */, 601 | ); 602 | runOnlyForDeploymentPostprocessing = 0; 603 | }; 604 | A5ADB9A4221053AB00E26A20 /* Sources */ = { 605 | isa = PBXSourcesBuildPhase; 606 | buildActionMask = 2147483647; 607 | files = ( 608 | A5ADB9C82210560800E26A20 /* WikipediaSearchViewModelSpec.swift in Sources */, 609 | ); 610 | runOnlyForDeploymentPostprocessing = 0; 611 | }; 612 | A5ADB9CA2210571E00E26A20 /* Sources */ = { 613 | isa = PBXSourcesBuildPhase; 614 | buildActionMask = 2147483647; 615 | files = ( 616 | A5ADB9F22210574A00E26A20 /* ViewController.swift in Sources */, 617 | A5ADB9F12210574A00E26A20 /* WikipediaSearchViewModel.swift in Sources */, 618 | A5ADB9F02210574A00E26A20 /* WikipediaSearchNewViewModel.swift in Sources */, 619 | ); 620 | runOnlyForDeploymentPostprocessing = 0; 621 | }; 622 | A5ADB9D22210571E00E26A20 /* Sources */ = { 623 | isa = PBXSourcesBuildPhase; 624 | buildActionMask = 2147483647; 625 | files = ( 626 | A5ADB9F52210589F00E26A20 /* WikipediaSearchViewModelSpec.swift in Sources */, 627 | A5ADB9F62210589F00E26A20 /* WikipediaSearchNewViewModelSpec.swift in Sources */, 628 | ); 629 | runOnlyForDeploymentPostprocessing = 0; 630 | }; 631 | A5ED4E5A22103B6A00CD70D3 /* Sources */ = { 632 | isa = PBXSourcesBuildPhase; 633 | buildActionMask = 2147483647; 634 | files = ( 635 | A5ED4E6222103B6A00CD70D3 /* AppDelegate.swift in Sources */, 636 | ); 637 | runOnlyForDeploymentPostprocessing = 0; 638 | }; 639 | A5ED4E9222103ECA00CD70D3 /* Sources */ = { 640 | isa = PBXSourcesBuildPhase; 641 | buildActionMask = 2147483647; 642 | files = ( 643 | A5ADB9962210514000E26A20 /* MockWikipediaAPI.swift in Sources */, 644 | A56FB0062210463100010E36 /* WikipediaPage.swift in Sources */, 645 | A5ADB98322104C1300E26A20 /* WikipediaAPI.swift in Sources */, 646 | A5ED4EA322103EFC00CD70D3 /* materialized+elements.swift in Sources */, 647 | ); 648 | runOnlyForDeploymentPostprocessing = 0; 649 | }; 650 | /* End PBXSourcesBuildPhase section */ 651 | 652 | /* Begin PBXTargetDependency section */ 653 | A5ADB9AB221053AB00E26A20 /* PBXTargetDependency */ = { 654 | isa = PBXTargetDependency; 655 | target = A5ADB99F221053AB00E26A20 /* SergdortStyle */; 656 | targetProxy = A5ADB9AA221053AB00E26A20 /* PBXContainerItemProxy */; 657 | }; 658 | A5ADB9AD221053AB00E26A20 /* PBXTargetDependency */ = { 659 | isa = PBXTargetDependency; 660 | target = A5ED4E5D22103B6A00CD70D3 /* RxSwiftBook3SampleCode */; 661 | targetProxy = A5ADB9AC221053AB00E26A20 /* PBXContainerItemProxy */; 662 | }; 663 | A5ADB9B4221053AB00E26A20 /* PBXTargetDependency */ = { 664 | isa = PBXTargetDependency; 665 | target = A5ADB99F221053AB00E26A20 /* SergdortStyle */; 666 | targetProxy = A5ADB9B3221053AB00E26A20 /* PBXContainerItemProxy */; 667 | }; 668 | A5ADB9D92210571E00E26A20 /* PBXTargetDependency */ = { 669 | isa = PBXTargetDependency; 670 | target = A5ADB9CD2210571E00E26A20 /* KickstarterStyle */; 671 | targetProxy = A5ADB9D82210571E00E26A20 /* PBXContainerItemProxy */; 672 | }; 673 | A5ADB9DB2210571E00E26A20 /* PBXTargetDependency */ = { 674 | isa = PBXTargetDependency; 675 | target = A5ED4E5D22103B6A00CD70D3 /* RxSwiftBook3SampleCode */; 676 | targetProxy = A5ADB9DA2210571E00E26A20 /* PBXContainerItemProxy */; 677 | }; 678 | A5ADB9E22210571E00E26A20 /* PBXTargetDependency */ = { 679 | isa = PBXTargetDependency; 680 | target = A5ADB9CD2210571E00E26A20 /* KickstarterStyle */; 681 | targetProxy = A5ADB9E12210571E00E26A20 /* PBXContainerItemProxy */; 682 | }; 683 | A5ED4E9C22103ECA00CD70D3 /* PBXTargetDependency */ = { 684 | isa = PBXTargetDependency; 685 | target = A5ED4E9522103ECA00CD70D3 /* Library */; 686 | targetProxy = A5ED4E9B22103ECA00CD70D3 /* PBXContainerItemProxy */; 687 | }; 688 | /* End PBXTargetDependency section */ 689 | 690 | /* Begin PBXVariantGroup section */ 691 | A5ED4E6722103B6A00CD70D3 /* Main.storyboard */ = { 692 | isa = PBXVariantGroup; 693 | children = ( 694 | A5ED4E6822103B6A00CD70D3 /* Base */, 695 | ); 696 | name = Main.storyboard; 697 | sourceTree = ""; 698 | }; 699 | /* End PBXVariantGroup section */ 700 | 701 | /* Begin XCBuildConfiguration section */ 702 | A5ADB9B8221053AB00E26A20 /* Debug */ = { 703 | isa = XCBuildConfiguration; 704 | buildSettings = { 705 | CLANG_ENABLE_MODULES = YES; 706 | CODE_SIGN_IDENTITY = ""; 707 | CODE_SIGN_STYLE = Automatic; 708 | CURRENT_PROJECT_VERSION = 1; 709 | DEFINES_MODULE = YES; 710 | DEVELOPMENT_TEAM = ""; 711 | DYLIB_COMPATIBILITY_VERSION = 1; 712 | DYLIB_CURRENT_VERSION = 1; 713 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 714 | INFOPLIST_FILE = RxSwiftBook3SampleCode/Info.plist; 715 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 716 | LD_RUNPATH_SEARCH_PATHS = ( 717 | "$(inherited)", 718 | "@executable_path/Frameworks", 719 | "@loader_path/Frameworks", 720 | ); 721 | PRODUCT_BUNDLE_IDENTIFIER = jp.co.curiosity.SergdortStyle; 722 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 723 | SKIP_INSTALL = YES; 724 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 725 | SWIFT_VERSION = 4.2; 726 | TARGETED_DEVICE_FAMILY = "1,2"; 727 | VERSIONING_SYSTEM = "apple-generic"; 728 | VERSION_INFO_PREFIX = ""; 729 | }; 730 | name = Debug; 731 | }; 732 | A5ADB9B9221053AB00E26A20 /* Release */ = { 733 | isa = XCBuildConfiguration; 734 | buildSettings = { 735 | CLANG_ENABLE_MODULES = YES; 736 | CODE_SIGN_IDENTITY = ""; 737 | CODE_SIGN_STYLE = Automatic; 738 | CURRENT_PROJECT_VERSION = 1; 739 | DEFINES_MODULE = YES; 740 | DEVELOPMENT_TEAM = ""; 741 | DYLIB_COMPATIBILITY_VERSION = 1; 742 | DYLIB_CURRENT_VERSION = 1; 743 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 744 | INFOPLIST_FILE = RxSwiftBook3SampleCode/Info.plist; 745 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 746 | LD_RUNPATH_SEARCH_PATHS = ( 747 | "$(inherited)", 748 | "@executable_path/Frameworks", 749 | "@loader_path/Frameworks", 750 | ); 751 | PRODUCT_BUNDLE_IDENTIFIER = jp.co.curiosity.SergdortStyle; 752 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 753 | SKIP_INSTALL = YES; 754 | SWIFT_VERSION = 4.2; 755 | TARGETED_DEVICE_FAMILY = "1,2"; 756 | VERSIONING_SYSTEM = "apple-generic"; 757 | VERSION_INFO_PREFIX = ""; 758 | }; 759 | name = Release; 760 | }; 761 | A5ADB9BB221053AB00E26A20 /* Debug */ = { 762 | isa = XCBuildConfiguration; 763 | buildSettings = { 764 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 765 | CODE_SIGN_STYLE = Automatic; 766 | DEVELOPMENT_TEAM = ""; 767 | INFOPLIST_FILE = RxSwiftBook3SampleCode/Info.plist; 768 | LD_RUNPATH_SEARCH_PATHS = ( 769 | "$(inherited)", 770 | "@executable_path/Frameworks", 771 | "@loader_path/Frameworks", 772 | ); 773 | PRODUCT_BUNDLE_IDENTIFIER = jp.co.curiosity.SergdortStyleTests; 774 | PRODUCT_NAME = "$(TARGET_NAME)"; 775 | SWIFT_VERSION = 4.2; 776 | TARGETED_DEVICE_FAMILY = "1,2"; 777 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/RxSwiftBook3SampleCode.app/RxSwiftBook3SampleCode"; 778 | }; 779 | name = Debug; 780 | }; 781 | A5ADB9BC221053AB00E26A20 /* Release */ = { 782 | isa = XCBuildConfiguration; 783 | buildSettings = { 784 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 785 | CODE_SIGN_STYLE = Automatic; 786 | DEVELOPMENT_TEAM = ""; 787 | INFOPLIST_FILE = RxSwiftBook3SampleCode/Info.plist; 788 | LD_RUNPATH_SEARCH_PATHS = ( 789 | "$(inherited)", 790 | "@executable_path/Frameworks", 791 | "@loader_path/Frameworks", 792 | ); 793 | PRODUCT_BUNDLE_IDENTIFIER = jp.co.curiosity.SergdortStyleTests; 794 | PRODUCT_NAME = "$(TARGET_NAME)"; 795 | SWIFT_VERSION = 4.2; 796 | TARGETED_DEVICE_FAMILY = "1,2"; 797 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/RxSwiftBook3SampleCode.app/RxSwiftBook3SampleCode"; 798 | }; 799 | name = Release; 800 | }; 801 | A5ADB9E62210571E00E26A20 /* Debug */ = { 802 | isa = XCBuildConfiguration; 803 | buildSettings = { 804 | CLANG_ENABLE_MODULES = YES; 805 | CODE_SIGN_IDENTITY = ""; 806 | CODE_SIGN_STYLE = Automatic; 807 | CURRENT_PROJECT_VERSION = 1; 808 | DEFINES_MODULE = YES; 809 | DEVELOPMENT_TEAM = ""; 810 | DYLIB_COMPATIBILITY_VERSION = 1; 811 | DYLIB_CURRENT_VERSION = 1; 812 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 813 | INFOPLIST_FILE = RxSwiftBook3SampleCode/Info.plist; 814 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 815 | LD_RUNPATH_SEARCH_PATHS = ( 816 | "$(inherited)", 817 | "@executable_path/Frameworks", 818 | "@loader_path/Frameworks", 819 | ); 820 | PRODUCT_BUNDLE_IDENTIFIER = jp.co.curiosity.KickstarterStyle; 821 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 822 | SKIP_INSTALL = YES; 823 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 824 | SWIFT_VERSION = 4.2; 825 | TARGETED_DEVICE_FAMILY = "1,2"; 826 | VERSIONING_SYSTEM = "apple-generic"; 827 | VERSION_INFO_PREFIX = ""; 828 | }; 829 | name = Debug; 830 | }; 831 | A5ADB9E72210571E00E26A20 /* Release */ = { 832 | isa = XCBuildConfiguration; 833 | buildSettings = { 834 | CLANG_ENABLE_MODULES = YES; 835 | CODE_SIGN_IDENTITY = ""; 836 | CODE_SIGN_STYLE = Automatic; 837 | CURRENT_PROJECT_VERSION = 1; 838 | DEFINES_MODULE = YES; 839 | DEVELOPMENT_TEAM = ""; 840 | DYLIB_COMPATIBILITY_VERSION = 1; 841 | DYLIB_CURRENT_VERSION = 1; 842 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 843 | INFOPLIST_FILE = RxSwiftBook3SampleCode/Info.plist; 844 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 845 | LD_RUNPATH_SEARCH_PATHS = ( 846 | "$(inherited)", 847 | "@executable_path/Frameworks", 848 | "@loader_path/Frameworks", 849 | ); 850 | PRODUCT_BUNDLE_IDENTIFIER = jp.co.curiosity.KickstarterStyle; 851 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 852 | SKIP_INSTALL = YES; 853 | SWIFT_VERSION = 4.2; 854 | TARGETED_DEVICE_FAMILY = "1,2"; 855 | VERSIONING_SYSTEM = "apple-generic"; 856 | VERSION_INFO_PREFIX = ""; 857 | }; 858 | name = Release; 859 | }; 860 | A5ADB9E92210571E00E26A20 /* Debug */ = { 861 | isa = XCBuildConfiguration; 862 | buildSettings = { 863 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 864 | CODE_SIGN_STYLE = Automatic; 865 | DEVELOPMENT_TEAM = ""; 866 | INFOPLIST_FILE = RxSwiftBook3SampleCode/Info.plist; 867 | LD_RUNPATH_SEARCH_PATHS = ( 868 | "$(inherited)", 869 | "@executable_path/Frameworks", 870 | "@loader_path/Frameworks", 871 | ); 872 | PRODUCT_BUNDLE_IDENTIFIER = jp.co.curiosity.KickstarterStyleTests; 873 | PRODUCT_NAME = "$(TARGET_NAME)"; 874 | SWIFT_VERSION = 4.2; 875 | TARGETED_DEVICE_FAMILY = "1,2"; 876 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/RxSwiftBook3SampleCode.app/RxSwiftBook3SampleCode"; 877 | }; 878 | name = Debug; 879 | }; 880 | A5ADB9EA2210571E00E26A20 /* Release */ = { 881 | isa = XCBuildConfiguration; 882 | buildSettings = { 883 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 884 | CODE_SIGN_STYLE = Automatic; 885 | DEVELOPMENT_TEAM = ""; 886 | INFOPLIST_FILE = RxSwiftBook3SampleCode/Info.plist; 887 | LD_RUNPATH_SEARCH_PATHS = ( 888 | "$(inherited)", 889 | "@executable_path/Frameworks", 890 | "@loader_path/Frameworks", 891 | ); 892 | PRODUCT_BUNDLE_IDENTIFIER = jp.co.curiosity.KickstarterStyleTests; 893 | PRODUCT_NAME = "$(TARGET_NAME)"; 894 | SWIFT_VERSION = 4.2; 895 | TARGETED_DEVICE_FAMILY = "1,2"; 896 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/RxSwiftBook3SampleCode.app/RxSwiftBook3SampleCode"; 897 | }; 898 | name = Release; 899 | }; 900 | A5ED4E7022103B6B00CD70D3 /* Debug */ = { 901 | isa = XCBuildConfiguration; 902 | buildSettings = { 903 | ALWAYS_SEARCH_USER_PATHS = NO; 904 | CLANG_ANALYZER_NONNULL = YES; 905 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 906 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 907 | CLANG_CXX_LIBRARY = "libc++"; 908 | CLANG_ENABLE_MODULES = YES; 909 | CLANG_ENABLE_OBJC_ARC = YES; 910 | CLANG_ENABLE_OBJC_WEAK = YES; 911 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 912 | CLANG_WARN_BOOL_CONVERSION = YES; 913 | CLANG_WARN_COMMA = YES; 914 | CLANG_WARN_CONSTANT_CONVERSION = YES; 915 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 916 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 917 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 918 | CLANG_WARN_EMPTY_BODY = YES; 919 | CLANG_WARN_ENUM_CONVERSION = YES; 920 | CLANG_WARN_INFINITE_RECURSION = YES; 921 | CLANG_WARN_INT_CONVERSION = YES; 922 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 923 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 924 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 925 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 926 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 927 | CLANG_WARN_STRICT_PROTOTYPES = YES; 928 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 929 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 930 | CLANG_WARN_UNREACHABLE_CODE = YES; 931 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 932 | CODE_SIGN_IDENTITY = "iPhone Developer"; 933 | COPY_PHASE_STRIP = NO; 934 | DEBUG_INFORMATION_FORMAT = dwarf; 935 | ENABLE_STRICT_OBJC_MSGSEND = YES; 936 | ENABLE_TESTABILITY = YES; 937 | GCC_C_LANGUAGE_STANDARD = gnu11; 938 | GCC_DYNAMIC_NO_PIC = NO; 939 | GCC_NO_COMMON_BLOCKS = YES; 940 | GCC_OPTIMIZATION_LEVEL = 0; 941 | GCC_PREPROCESSOR_DEFINITIONS = ( 942 | "DEBUG=1", 943 | "$(inherited)", 944 | ); 945 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 946 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 947 | GCC_WARN_UNDECLARED_SELECTOR = YES; 948 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 949 | GCC_WARN_UNUSED_FUNCTION = YES; 950 | GCC_WARN_UNUSED_VARIABLE = YES; 951 | IPHONEOS_DEPLOYMENT_TARGET = 12.1; 952 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 953 | MTL_FAST_MATH = YES; 954 | ONLY_ACTIVE_ARCH = YES; 955 | SDKROOT = iphoneos; 956 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 957 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 958 | SWIFT_VERSION = 5.0; 959 | }; 960 | name = Debug; 961 | }; 962 | A5ED4E7122103B6B00CD70D3 /* Release */ = { 963 | isa = XCBuildConfiguration; 964 | buildSettings = { 965 | ALWAYS_SEARCH_USER_PATHS = NO; 966 | CLANG_ANALYZER_NONNULL = YES; 967 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 968 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 969 | CLANG_CXX_LIBRARY = "libc++"; 970 | CLANG_ENABLE_MODULES = YES; 971 | CLANG_ENABLE_OBJC_ARC = YES; 972 | CLANG_ENABLE_OBJC_WEAK = YES; 973 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 974 | CLANG_WARN_BOOL_CONVERSION = YES; 975 | CLANG_WARN_COMMA = YES; 976 | CLANG_WARN_CONSTANT_CONVERSION = YES; 977 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 978 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 979 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 980 | CLANG_WARN_EMPTY_BODY = YES; 981 | CLANG_WARN_ENUM_CONVERSION = YES; 982 | CLANG_WARN_INFINITE_RECURSION = YES; 983 | CLANG_WARN_INT_CONVERSION = YES; 984 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 985 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 986 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 987 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 988 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 989 | CLANG_WARN_STRICT_PROTOTYPES = YES; 990 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 991 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 992 | CLANG_WARN_UNREACHABLE_CODE = YES; 993 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 994 | CODE_SIGN_IDENTITY = "iPhone Developer"; 995 | COPY_PHASE_STRIP = NO; 996 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 997 | ENABLE_NS_ASSERTIONS = NO; 998 | ENABLE_STRICT_OBJC_MSGSEND = YES; 999 | GCC_C_LANGUAGE_STANDARD = gnu11; 1000 | GCC_NO_COMMON_BLOCKS = YES; 1001 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 1002 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 1003 | GCC_WARN_UNDECLARED_SELECTOR = YES; 1004 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 1005 | GCC_WARN_UNUSED_FUNCTION = YES; 1006 | GCC_WARN_UNUSED_VARIABLE = YES; 1007 | IPHONEOS_DEPLOYMENT_TARGET = 12.1; 1008 | MTL_ENABLE_DEBUG_INFO = NO; 1009 | MTL_FAST_MATH = YES; 1010 | SDKROOT = iphoneos; 1011 | SWIFT_COMPILATION_MODE = wholemodule; 1012 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 1013 | SWIFT_VERSION = 5.0; 1014 | VALIDATE_PRODUCT = YES; 1015 | }; 1016 | name = Release; 1017 | }; 1018 | A5ED4E7322103B6B00CD70D3 /* Debug */ = { 1019 | isa = XCBuildConfiguration; 1020 | buildSettings = { 1021 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 1022 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 1023 | CODE_SIGN_IDENTITY = "iPhone Developer"; 1024 | CODE_SIGN_STYLE = Automatic; 1025 | DEVELOPMENT_TEAM = ""; 1026 | INFOPLIST_FILE = RxSwiftBook3SampleCode/Info.plist; 1027 | LD_RUNPATH_SEARCH_PATHS = ( 1028 | "$(inherited)", 1029 | "@executable_path/Frameworks", 1030 | ); 1031 | PRODUCT_BUNDLE_IDENTIFIER = jp.co.curiosity.RxSwiftBook3SampleCode; 1032 | PRODUCT_NAME = "$(TARGET_NAME)"; 1033 | PROVISIONING_PROFILE_SPECIFIER = ""; 1034 | SWIFT_VERSION = 4.2; 1035 | TARGETED_DEVICE_FAMILY = "1,2"; 1036 | }; 1037 | name = Debug; 1038 | }; 1039 | A5ED4E7422103B6B00CD70D3 /* Release */ = { 1040 | isa = XCBuildConfiguration; 1041 | buildSettings = { 1042 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 1043 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 1044 | CODE_SIGN_IDENTITY = "iPhone Developer"; 1045 | CODE_SIGN_STYLE = Automatic; 1046 | DEVELOPMENT_TEAM = ""; 1047 | INFOPLIST_FILE = RxSwiftBook3SampleCode/Info.plist; 1048 | LD_RUNPATH_SEARCH_PATHS = ( 1049 | "$(inherited)", 1050 | "@executable_path/Frameworks", 1051 | ); 1052 | PRODUCT_BUNDLE_IDENTIFIER = jp.co.curiosity.RxSwiftBook3SampleCode; 1053 | PRODUCT_NAME = "$(TARGET_NAME)"; 1054 | PROVISIONING_PROFILE_SPECIFIER = ""; 1055 | SWIFT_VERSION = 4.2; 1056 | TARGETED_DEVICE_FAMILY = "1,2"; 1057 | }; 1058 | name = Release; 1059 | }; 1060 | A5ED4E9F22103ECB00CD70D3 /* Debug */ = { 1061 | isa = XCBuildConfiguration; 1062 | buildSettings = { 1063 | CLANG_ENABLE_MODULES = YES; 1064 | CODE_SIGN_IDENTITY = ""; 1065 | CODE_SIGN_STYLE = Automatic; 1066 | CURRENT_PROJECT_VERSION = 1; 1067 | DEFINES_MODULE = YES; 1068 | DEVELOPMENT_TEAM = ""; 1069 | DYLIB_COMPATIBILITY_VERSION = 1; 1070 | DYLIB_CURRENT_VERSION = 1; 1071 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 1072 | INFOPLIST_FILE = RxSwiftBook3SampleCode/Info.plist; 1073 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 1074 | LD_RUNPATH_SEARCH_PATHS = ( 1075 | "$(inherited)", 1076 | "@executable_path/Frameworks", 1077 | "@loader_path/Frameworks", 1078 | ); 1079 | PRODUCT_BUNDLE_IDENTIFIER = jp.co.curiosity.Library; 1080 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 1081 | SKIP_INSTALL = YES; 1082 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 1083 | SWIFT_VERSION = 4.2; 1084 | TARGETED_DEVICE_FAMILY = "1,2"; 1085 | VERSIONING_SYSTEM = "apple-generic"; 1086 | VERSION_INFO_PREFIX = ""; 1087 | }; 1088 | name = Debug; 1089 | }; 1090 | A5ED4EA022103ECB00CD70D3 /* Release */ = { 1091 | isa = XCBuildConfiguration; 1092 | buildSettings = { 1093 | CLANG_ENABLE_MODULES = YES; 1094 | CODE_SIGN_IDENTITY = ""; 1095 | CODE_SIGN_STYLE = Automatic; 1096 | CURRENT_PROJECT_VERSION = 1; 1097 | DEFINES_MODULE = YES; 1098 | DEVELOPMENT_TEAM = ""; 1099 | DYLIB_COMPATIBILITY_VERSION = 1; 1100 | DYLIB_CURRENT_VERSION = 1; 1101 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 1102 | INFOPLIST_FILE = RxSwiftBook3SampleCode/Info.plist; 1103 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 1104 | LD_RUNPATH_SEARCH_PATHS = ( 1105 | "$(inherited)", 1106 | "@executable_path/Frameworks", 1107 | "@loader_path/Frameworks", 1108 | ); 1109 | PRODUCT_BUNDLE_IDENTIFIER = jp.co.curiosity.Library; 1110 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 1111 | SKIP_INSTALL = YES; 1112 | SWIFT_VERSION = 4.2; 1113 | TARGETED_DEVICE_FAMILY = "1,2"; 1114 | VERSIONING_SYSTEM = "apple-generic"; 1115 | VERSION_INFO_PREFIX = ""; 1116 | }; 1117 | name = Release; 1118 | }; 1119 | /* End XCBuildConfiguration section */ 1120 | 1121 | /* Begin XCConfigurationList section */ 1122 | A5ADB9B7221053AB00E26A20 /* Build configuration list for PBXNativeTarget "SergdortStyle" */ = { 1123 | isa = XCConfigurationList; 1124 | buildConfigurations = ( 1125 | A5ADB9B8221053AB00E26A20 /* Debug */, 1126 | A5ADB9B9221053AB00E26A20 /* Release */, 1127 | ); 1128 | defaultConfigurationIsVisible = 0; 1129 | defaultConfigurationName = Release; 1130 | }; 1131 | A5ADB9BA221053AB00E26A20 /* Build configuration list for PBXNativeTarget "SergdortStyleTests" */ = { 1132 | isa = XCConfigurationList; 1133 | buildConfigurations = ( 1134 | A5ADB9BB221053AB00E26A20 /* Debug */, 1135 | A5ADB9BC221053AB00E26A20 /* Release */, 1136 | ); 1137 | defaultConfigurationIsVisible = 0; 1138 | defaultConfigurationName = Release; 1139 | }; 1140 | A5ADB9E52210571E00E26A20 /* Build configuration list for PBXNativeTarget "KickstarterStyle" */ = { 1141 | isa = XCConfigurationList; 1142 | buildConfigurations = ( 1143 | A5ADB9E62210571E00E26A20 /* Debug */, 1144 | A5ADB9E72210571E00E26A20 /* Release */, 1145 | ); 1146 | defaultConfigurationIsVisible = 0; 1147 | defaultConfigurationName = Release; 1148 | }; 1149 | A5ADB9E82210571E00E26A20 /* Build configuration list for PBXNativeTarget "KickstarterStyleTests" */ = { 1150 | isa = XCConfigurationList; 1151 | buildConfigurations = ( 1152 | A5ADB9E92210571E00E26A20 /* Debug */, 1153 | A5ADB9EA2210571E00E26A20 /* Release */, 1154 | ); 1155 | defaultConfigurationIsVisible = 0; 1156 | defaultConfigurationName = Release; 1157 | }; 1158 | A5ED4E5922103B6A00CD70D3 /* Build configuration list for PBXProject "RxSwiftBook3SampleCode" */ = { 1159 | isa = XCConfigurationList; 1160 | buildConfigurations = ( 1161 | A5ED4E7022103B6B00CD70D3 /* Debug */, 1162 | A5ED4E7122103B6B00CD70D3 /* Release */, 1163 | ); 1164 | defaultConfigurationIsVisible = 0; 1165 | defaultConfigurationName = Release; 1166 | }; 1167 | A5ED4E7222103B6B00CD70D3 /* Build configuration list for PBXNativeTarget "RxSwiftBook3SampleCode" */ = { 1168 | isa = XCConfigurationList; 1169 | buildConfigurations = ( 1170 | A5ED4E7322103B6B00CD70D3 /* Debug */, 1171 | A5ED4E7422103B6B00CD70D3 /* Release */, 1172 | ); 1173 | defaultConfigurationIsVisible = 0; 1174 | defaultConfigurationName = Release; 1175 | }; 1176 | A5ED4EA122103ECB00CD70D3 /* Build configuration list for PBXNativeTarget "Library" */ = { 1177 | isa = XCConfigurationList; 1178 | buildConfigurations = ( 1179 | A5ED4E9F22103ECB00CD70D3 /* Debug */, 1180 | A5ED4EA022103ECB00CD70D3 /* Release */, 1181 | ); 1182 | defaultConfigurationIsVisible = 0; 1183 | defaultConfigurationName = Release; 1184 | }; 1185 | /* End XCConfigurationList section */ 1186 | 1187 | /* Begin XCRemoteSwiftPackageReference section */ 1188 | A5D1644A2814041500C0D439 /* XCRemoteSwiftPackageReference "RxSwift" */ = { 1189 | isa = XCRemoteSwiftPackageReference; 1190 | repositoryURL = "https://github.com/ReactiveX/RxSwift"; 1191 | requirement = { 1192 | kind = exactVersion; 1193 | version = 6.5.0; 1194 | }; 1195 | }; 1196 | A5E5854728140FF4008AF7C6 /* XCRemoteSwiftPackageReference "Quick" */ = { 1197 | isa = XCRemoteSwiftPackageReference; 1198 | repositoryURL = "https://github.com/Quick/Quick"; 1199 | requirement = { 1200 | kind = exactVersion; 1201 | version = 5.0.1; 1202 | }; 1203 | }; 1204 | A5E5854E281410AE008AF7C6 /* XCRemoteSwiftPackageReference "Nimble" */ = { 1205 | isa = XCRemoteSwiftPackageReference; 1206 | repositoryURL = "https://github.com/Quick/Nimble"; 1207 | requirement = { 1208 | kind = exactVersion; 1209 | version = 9.2.1; 1210 | }; 1211 | }; 1212 | /* End XCRemoteSwiftPackageReference section */ 1213 | 1214 | /* Begin XCSwiftPackageProductDependency section */ 1215 | A5D1644B2814041600C0D439 /* RxCocoa */ = { 1216 | isa = XCSwiftPackageProductDependency; 1217 | package = A5D1644A2814041500C0D439 /* XCRemoteSwiftPackageReference "RxSwift" */; 1218 | productName = RxCocoa; 1219 | }; 1220 | A5D1644D2814041600C0D439 /* RxRelay */ = { 1221 | isa = XCSwiftPackageProductDependency; 1222 | package = A5D1644A2814041500C0D439 /* XCRemoteSwiftPackageReference "RxSwift" */; 1223 | productName = RxRelay; 1224 | }; 1225 | A5D1644F2814041600C0D439 /* RxSwift */ = { 1226 | isa = XCSwiftPackageProductDependency; 1227 | package = A5D1644A2814041500C0D439 /* XCRemoteSwiftPackageReference "RxSwift" */; 1228 | productName = RxSwift; 1229 | }; 1230 | A5D1645228140A9F00C0D439 /* RxCocoa */ = { 1231 | isa = XCSwiftPackageProductDependency; 1232 | package = A5D1644A2814041500C0D439 /* XCRemoteSwiftPackageReference "RxSwift" */; 1233 | productName = RxCocoa; 1234 | }; 1235 | A5D1645428140AA600C0D439 /* RxSwift */ = { 1236 | isa = XCSwiftPackageProductDependency; 1237 | package = A5D1644A2814041500C0D439 /* XCRemoteSwiftPackageReference "RxSwift" */; 1238 | productName = RxSwift; 1239 | }; 1240 | A5D1645A28140B0A00C0D439 /* RxTest */ = { 1241 | isa = XCSwiftPackageProductDependency; 1242 | package = A5D1644A2814041500C0D439 /* XCRemoteSwiftPackageReference "RxSwift" */; 1243 | productName = RxTest; 1244 | }; 1245 | A5D1645C28140B1A00C0D439 /* RxTest */ = { 1246 | isa = XCSwiftPackageProductDependency; 1247 | package = A5D1644A2814041500C0D439 /* XCRemoteSwiftPackageReference "RxSwift" */; 1248 | productName = RxTest; 1249 | }; 1250 | A5D1646328140B4F00C0D439 /* RxCocoa */ = { 1251 | isa = XCSwiftPackageProductDependency; 1252 | package = A5D1644A2814041500C0D439 /* XCRemoteSwiftPackageReference "RxSwift" */; 1253 | productName = RxCocoa; 1254 | }; 1255 | A5D1646528140B5400C0D439 /* RxSwift */ = { 1256 | isa = XCSwiftPackageProductDependency; 1257 | package = A5D1644A2814041500C0D439 /* XCRemoteSwiftPackageReference "RxSwift" */; 1258 | productName = RxSwift; 1259 | }; 1260 | A5E5854328140F5F008AF7C6 /* RxSwift */ = { 1261 | isa = XCSwiftPackageProductDependency; 1262 | package = A5D1644A2814041500C0D439 /* XCRemoteSwiftPackageReference "RxSwift" */; 1263 | productName = RxSwift; 1264 | }; 1265 | A5E5854528140F6B008AF7C6 /* RxCocoa */ = { 1266 | isa = XCSwiftPackageProductDependency; 1267 | package = A5D1644A2814041500C0D439 /* XCRemoteSwiftPackageReference "RxSwift" */; 1268 | productName = RxCocoa; 1269 | }; 1270 | A5E5854A28141068008AF7C6 /* Quick */ = { 1271 | isa = XCSwiftPackageProductDependency; 1272 | package = A5E5854728140FF4008AF7C6 /* XCRemoteSwiftPackageReference "Quick" */; 1273 | productName = Quick; 1274 | }; 1275 | A5E5854C2814106E008AF7C6 /* Quick */ = { 1276 | isa = XCSwiftPackageProductDependency; 1277 | package = A5E5854728140FF4008AF7C6 /* XCRemoteSwiftPackageReference "Quick" */; 1278 | productName = Quick; 1279 | }; 1280 | A5E5854F281410AE008AF7C6 /* Nimble */ = { 1281 | isa = XCSwiftPackageProductDependency; 1282 | package = A5E5854E281410AE008AF7C6 /* XCRemoteSwiftPackageReference "Nimble" */; 1283 | productName = Nimble; 1284 | }; 1285 | A5E58551281410CC008AF7C6 /* RxBlocking */ = { 1286 | isa = XCSwiftPackageProductDependency; 1287 | package = A5D1644A2814041500C0D439 /* XCRemoteSwiftPackageReference "RxSwift" */; 1288 | productName = RxBlocking; 1289 | }; 1290 | A5E58553281410D8008AF7C6 /* RxBlocking */ = { 1291 | isa = XCSwiftPackageProductDependency; 1292 | package = A5D1644A2814041500C0D439 /* XCRemoteSwiftPackageReference "RxSwift" */; 1293 | productName = RxBlocking; 1294 | }; 1295 | A5E58555281410DD008AF7C6 /* Nimble */ = { 1296 | isa = XCSwiftPackageProductDependency; 1297 | package = A5E5854E281410AE008AF7C6 /* XCRemoteSwiftPackageReference "Nimble" */; 1298 | productName = Nimble; 1299 | }; 1300 | A5E58557281416EE008AF7C6 /* RxCocoa */ = { 1301 | isa = XCSwiftPackageProductDependency; 1302 | package = A5D1644A2814041500C0D439 /* XCRemoteSwiftPackageReference "RxSwift" */; 1303 | productName = RxCocoa; 1304 | }; 1305 | A5E585592814170A008AF7C6 /* RxCocoa */ = { 1306 | isa = XCSwiftPackageProductDependency; 1307 | package = A5D1644A2814041500C0D439 /* XCRemoteSwiftPackageReference "RxSwift" */; 1308 | productName = RxCocoa; 1309 | }; 1310 | /* End XCSwiftPackageProductDependency section */ 1311 | }; 1312 | rootObject = A5ED4E5622103B6A00CD70D3 /* Project object */; 1313 | } 1314 | -------------------------------------------------------------------------------- /RxSwiftBook3SampleCode.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /RxSwiftBook3SampleCode.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /RxSwiftBook3SampleCode.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved: -------------------------------------------------------------------------------- 1 | { 2 | "pins" : [ 3 | { 4 | "identity" : "cwlcatchexception", 5 | "kind" : "remoteSourceControl", 6 | "location" : "https://github.com/mattgallagher/CwlCatchException.git", 7 | "state" : { 8 | "revision" : "35f9e770f54ce62dd8526470f14c6e137cef3eea", 9 | "version" : "2.1.1" 10 | } 11 | }, 12 | { 13 | "identity" : "cwlpreconditiontesting", 14 | "kind" : "remoteSourceControl", 15 | "location" : "https://github.com/mattgallagher/CwlPreconditionTesting.git", 16 | "state" : { 17 | "revision" : "c21f7bab5ca8eee0a9998bbd17ca1d0eb45d4688", 18 | "version" : "2.1.0" 19 | } 20 | }, 21 | { 22 | "identity" : "nimble", 23 | "kind" : "remoteSourceControl", 24 | "location" : "https://github.com/Quick/Nimble", 25 | "state" : { 26 | "revision" : "c93f16c25af5770f0d3e6af27c9634640946b068", 27 | "version" : "9.2.1" 28 | } 29 | }, 30 | { 31 | "identity" : "quick", 32 | "kind" : "remoteSourceControl", 33 | "location" : "https://github.com/Quick/Quick", 34 | "state" : { 35 | "revision" : "f9d519828bb03dfc8125467d8f7b93131951124c", 36 | "version" : "5.0.1" 37 | } 38 | }, 39 | { 40 | "identity" : "rxswift", 41 | "kind" : "remoteSourceControl", 42 | "location" : "https://github.com/ReactiveX/RxSwift", 43 | "state" : { 44 | "revision" : "b4307ba0b6425c0ba4178e138799946c3da594f8", 45 | "version" : "6.5.0" 46 | } 47 | } 48 | ], 49 | "version" : 2 50 | } 51 | -------------------------------------------------------------------------------- /RxSwiftBook3SampleCode.xcodeproj/xcshareddata/xcschemes/RxSwiftBook3SampleCode.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 33 | 39 | 40 | 41 | 43 | 49 | 50 | 51 | 53 | 59 | 60 | 61 | 62 | 63 | 69 | 70 | 71 | 72 | 73 | 74 | 84 | 86 | 92 | 93 | 94 | 95 | 96 | 97 | 103 | 105 | 111 | 112 | 113 | 114 | 116 | 117 | 120 | 121 | 122 | -------------------------------------------------------------------------------- /RxSwiftBook3SampleCode.xcodeproj/xcshareddata/xcschemes/SergdortStyle.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 37 | 38 | 39 | 40 | 42 | 48 | 49 | 50 | 52 | 58 | 59 | 60 | 61 | 62 | 72 | 73 | 79 | 80 | 81 | 82 | 88 | 89 | 95 | 96 | 97 | 98 | 100 | 101 | 104 | 105 | 106 | -------------------------------------------------------------------------------- /RxSwiftBook3SampleCode/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // RxSwiftBook3SampleCode 4 | // 5 | // Created by Yoshinori Imajo on 2019/02/10. 6 | // Copyright © 2019 Yoshinori Imajo. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | @UIApplicationMain 12 | class AppDelegate: UIResponder, UIApplicationDelegate, UISplitViewControllerDelegate { 13 | 14 | var window: UIWindow? 15 | 16 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { 17 | return true 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /RxSwiftBook3SampleCode/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 | } -------------------------------------------------------------------------------- /RxSwiftBook3SampleCode/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /RxSwiftBook3SampleCode/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 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | -------------------------------------------------------------------------------- /RxSwiftBook3SampleCode/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 | UIStatusBarTintParameters 32 | 33 | UINavigationBar 34 | 35 | Style 36 | UIBarStyleDefault 37 | Translucent 38 | 39 | 40 | 41 | UISupportedInterfaceOrientations 42 | 43 | UIInterfaceOrientationPortrait 44 | UIInterfaceOrientationLandscapeLeft 45 | UIInterfaceOrientationLandscapeRight 46 | 47 | UISupportedInterfaceOrientations~ipad 48 | 49 | UIInterfaceOrientationPortrait 50 | UIInterfaceOrientationPortraitUpsideDown 51 | UIInterfaceOrientationLandscapeLeft 52 | UIInterfaceOrientationLandscapeRight 53 | 54 | 55 | 56 | --------------------------------------------------------------------------------