├── .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 |
--------------------------------------------------------------------------------