diff --git a/Projects/Data/Sources/Repository/PostureRepository.swift b/Projects/Data/Sources/Repository/PostureRepository.swift index f68ff1a7..2817a8ab 100644 --- a/Projects/Data/Sources/Repository/PostureRepository.swift +++ b/Projects/Data/Sources/Repository/PostureRepository.swift @@ -19,6 +19,10 @@ public class PostureRepository: PostureRepositoryInterface { return networkService.requestDetailData(type: type) } + public func getSearchData() -> Single { + return networkService.requestSearchData() + } + public init(networkService: PostureService) { self.networkService = networkService } diff --git a/Projects/Domain/Sources/Model/Posture/PostureSearchModel.swift b/Projects/Domain/Sources/Model/Posture/PostureSearchModel.swift new file mode 100644 index 00000000..d56f5dd2 --- /dev/null +++ b/Projects/Domain/Sources/Model/Posture/PostureSearchModel.swift @@ -0,0 +1,24 @@ +import UIKit + +public struct PostureSearchModel { + public var searchResultData: [PostureSearchContentModel] + + public init(searchResultData: [PostureSearchContentModel]) { + self.searchResultData = searchResultData + } +} + +public struct PostureSearchContentModel { + public var exerciseImage: UIImage + public var exerciseName: String + public var exercisePart: String + + public init(exerciseImage: UIImage, + exerciseName: String, + exercisePart: String + ) { + self.exerciseImage = exerciseImage + self.exerciseName = exerciseName + self.exercisePart = exercisePart + } +} diff --git a/Projects/Domain/Sources/RepositoryInterface/PostureRepositoryInterface.swift b/Projects/Domain/Sources/RepositoryInterface/PostureRepositoryInterface.swift index 65b76315..a25e09b5 100644 --- a/Projects/Domain/Sources/RepositoryInterface/PostureRepositoryInterface.swift +++ b/Projects/Domain/Sources/RepositoryInterface/PostureRepositoryInterface.swift @@ -15,4 +15,5 @@ public protocol PostureRepositoryInterface { func getRecommandData() -> Single<[PostureRecommandModel]> func getPartData(type: PosturePartType) -> Single func getDetailData(type: PostureDetailType) -> Single + func getSearchData() -> Single } diff --git a/Projects/Domain/Sources/UseCase/PostureUseCase.swift b/Projects/Domain/Sources/UseCase/PostureUseCase.swift index 3bc2837b..74636de2 100644 --- a/Projects/Domain/Sources/UseCase/PostureUseCase.swift +++ b/Projects/Domain/Sources/UseCase/PostureUseCase.swift @@ -6,10 +6,12 @@ public protocol PostureUseCase { var recommandData: PublishSubject<[PostureRecommandModel]> { get } var partData: PublishSubject { get } var detailData: PublishSubject { get } + var searchData: PublishSubject { get } func getRecommandData() func getPartData(type: PosturePartType) func getDetailData(type: PostureDetailType) + func getSearchData() } public class DefaultPostureUseCase { @@ -19,6 +21,7 @@ public class DefaultPostureUseCase { public let recommandData = PublishSubject<[PostureRecommandModel]>() public let partData = PublishSubject() public let detailData = PublishSubject() + public let searchData = PublishSubject() public init(repository: PostureRepositoryInterface) { self.repository = repository @@ -56,4 +59,14 @@ extension DefaultPostureUseCase: PostureUseCase { print("PostureUseCase getDetailData error occurred: \(error)") }).disposed(by: disposeBag) } + + public func getSearchData() { + repository.getSearchData() + .subscribe(onSuccess: { [weak self] searchData in + self?.searchData.onNext(searchData) + }, + onFailure: { error in + print("PostureUseCase getSearchData error occurred: \(error)") + }).disposed(by: disposeBag) + } } diff --git a/Projects/Features/PostureFeature/Demo/Sources/SceneDelegate.swift b/Projects/Features/PostureFeature/Demo/Sources/SceneDelegate.swift index 98008a74..b8b452dd 100644 --- a/Projects/Features/PostureFeature/Demo/Sources/SceneDelegate.swift +++ b/Projects/Features/PostureFeature/Demo/Sources/SceneDelegate.swift @@ -21,8 +21,8 @@ class SceneDelegate: UIResponder, UIWindowSceneDelegate { guard let windowScene = (scene as? UIWindowScene) else { return } window = UIWindow(windowScene: windowScene) let useCase = DefaultPostureUseCase(repository: PostureRepository(networkService: PostureService())) - let viewModel = PostureDetailViewModel(useCase: useCase) - let viewController = PostureDetailViewController(viewModel) + let viewModel = PostureSearchViewModel(useCase: useCase) + let viewController = PostureSearchViewController(viewModel) window?.rootViewController = UINavigationController( rootViewController: viewController) window?.makeKeyAndVisible() diff --git a/Projects/Features/PostureFeature/Sources/PostureScene/View/Detail/PostureDetailViewController.swift b/Projects/Features/PostureFeature/Sources/PostureScene/View/Detail/PostureDetailViewController.swift index 5b20213a..4fc05d93 100644 --- a/Projects/Features/PostureFeature/Sources/PostureScene/View/Detail/PostureDetailViewController.swift +++ b/Projects/Features/PostureFeature/Sources/PostureScene/View/Detail/PostureDetailViewController.swift @@ -79,7 +79,7 @@ public class PostureDetailViewController: BaseViewController { - - private var searchModel = PostureSearchModel.second - - private var searchBarView = MGSearchView(backgroundColor: PostureResourcesService.Colors.gray50) - + + private var searchModel = PostureSearchModel(searchResultData: []) + + private var searchBarView = MGSearchView() + private var postureSearchTableView = UITableView().then { $0.showsVerticalScrollIndicator = false $0.showsHorizontalScrollIndicator = false $0.backgroundColor = .white $0.separatorStyle = .none - $0.register(PostureSearchTableViewCell.self, forCellReuseIdentifier: PostureSearchTableViewCell.identifier) } - + public override func attribute() { super.attribute() postureSearchTableView.dataSource = self postureSearchTableView.delegate = self } - + override public func layout() { - [searchBarView, postureSearchTableView].forEach { view.addSubview($0) } - + super.layout() + + view.addSubviews([searchBarView, postureSearchTableView]) + searchBarView.snp.makeConstraints { $0.top.equalTo(view.safeAreaLayoutGuide) $0.leading.trailing.equalToSuperview().inset(20.0) $0.height.equalTo(40.0) } - + postureSearchTableView.snp.makeConstraints { $0.top.equalTo(searchBarView.snp.bottom) $0.leading.trailing.equalToSuperview() - $0.width.equalToSuperview() - $0.height.equalToSuperview() + $0.bottom.equalToSuperview() } } + + public override func bindViewModel() { + super.bindViewModel() + + let useCase = DefaultPostureUseCase(repository: PostureRepository(networkService: PostureService())) + + viewModel = PostureSearchViewModel(useCase: useCase) + + let input = PostureSearchViewModel.Input( + getSearchData: Observable.just(()).asDriver(onErrorDriveWith: .never()) + ) + + let output = viewModel.transform(input, action: { optput in + optput.searchData + .subscribe(onNext: { searchData in + MGLogger.debug("searchData: \(searchData)") + self.searchModel = searchData + }).disposed(by: disposeBag) + } + ) + } } extension PostureSearchViewController: UITableViewDelegate { @@ -60,17 +89,14 @@ extension PostureSearchViewController: UITableViewDelegate { extension PostureSearchViewController: UITableViewDataSource { public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - searchModel.data.count + searchModel.searchResultData.count } - + public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: PostureSearchTableViewCell.identifier, for: indexPath) as? PostureSearchTableViewCell - - let exercise = searchModel.data[indexPath.row] - cell?.setup(image: exercise.image, name: exercise.exerciseName, part: exercise.exercisePart) + let model = searchModel.searchResultData[indexPath.row] + cell?.setup(with: model) cell?.selectionStyle = .none return cell ?? UITableViewCell() } - - } diff --git a/Projects/Features/PostureFeature/Sources/PostureScene/View/Tab/PostureBackViewController.swift b/Projects/Features/PostureFeature/Sources/PostureScene/View/Tab/PostureBackViewController.swift index 077fecc5..76d18a23 100644 --- a/Projects/Features/PostureFeature/Sources/PostureScene/View/Tab/PostureBackViewController.swift +++ b/Projects/Features/PostureFeature/Sources/PostureScene/View/Tab/PostureBackViewController.swift @@ -105,15 +105,15 @@ public class PostureBackViewController: BaseViewController let output = viewModel.transform(input, action: { output in output.backData .subscribe(onNext: { backData in - MGLogger.debug("Chest Data: \(backData)") + MGLogger.debug("backData: \(backData)") self.backData = backData self.backExerciesData = backData.allExerciseData }).disposed(by: disposeBag) output.backModelState - .subscribe(onNext: { chestModelState in - MGLogger.debug("Chest Model State: \(chestModelState)") - switch chestModelState { + .subscribe(onNext: { backModelState in + MGLogger.debug("backModelState: \(backModelState)") + switch backModelState { case .all: self.backExerciesData = self.backData.allExerciseData case .body: diff --git a/Projects/Features/PostureFeature/Sources/PostureScene/ViewModel/PostureSearchViewModel.swift b/Projects/Features/PostureFeature/Sources/PostureScene/ViewModel/PostureSearchViewModel.swift index 5c28f9a6..21be8740 100644 --- a/Projects/Features/PostureFeature/Sources/PostureScene/ViewModel/PostureSearchViewModel.swift +++ b/Projects/Features/PostureFeature/Sources/PostureScene/ViewModel/PostureSearchViewModel.swift @@ -5,22 +5,51 @@ import RxCocoa import RxSwift import Core +import Domain +import MGLogger public class PostureSearchViewModel: BaseViewModel { - public func transform(_ input: Input, action: (Output) -> Void) -> Output { - return Output() - } - public struct Input { + private let disposeBag = DisposeBag() + + private let useCase: PostureUseCase + public struct Input { + let getSearchData: Driver } public struct Output { + var searchData: Observable + } + + private let searchDataSubject = PublishSubject() + public init(useCase: PostureUseCase) { + self.useCase = useCase } - public init() { + public func transform(_ input: Input, action: (Output) -> Void) -> Output { + let output = Output( + searchData: + searchDataSubject.asObservable() + ) + + action(output) + + self.bindOutput(output: output) + + input.getSearchData + .drive(onNext: { [weak self] _ in + self?.useCase.getSearchData() + }).disposed(by: disposeBag) + return output } -} + private func bindOutput(output: Output) { + useCase.searchData + .subscribe(onNext: { searchData in + self.searchDataSubject.onNext(searchData) + }).disposed(by: disposeBag) + } +} diff --git a/Projects/Features/PostureFeature/Sources/Supporter/Search/PostureSearchModel.swift b/Projects/Features/PostureFeature/Sources/Supporter/Search/PostureSearchModel.swift deleted file mode 100644 index 7d7e1076..00000000 --- a/Projects/Features/PostureFeature/Sources/Supporter/Search/PostureSearchModel.swift +++ /dev/null @@ -1,49 +0,0 @@ -import UIKit - -import DSKit -import MGNetworks - -public struct SearchElement { - public var image: UIImage - public var exerciseName: String - public var exercisePart: String -} - -public enum PostureSearchModel { - case first - case second - - public var data: [SearchElement] { - switch self { - case .first: - return [ - SearchElement(image: PostureResourcesService.Assets.postureChestTest6, exerciseName: "바벨 백스쿼트", exercisePart: "하체"), - SearchElement(image: PostureResourcesService.Assets.postureChestTest7, exerciseName: "바벨 불가리안 스플릿 스쿼트", exercisePart: "하체"), - SearchElement(image: PostureResourcesService.Assets.postureChestTest2, exerciseName: "바벨 힙 쓰러스트", exercisePart: "하체"), - SearchElement(image: PostureResourcesService.Assets.postureChestTest3, exerciseName: "점프 스쿼트", exercisePart: "등"), - SearchElement(image: PostureResourcesService.Assets.postureChestTest5, exerciseName: "인클라인 바벨 로우", exercisePart: "등"), - SearchElement(image: PostureResourcesService.Assets.postureChestTest6, exerciseName: "바벨 백스쿼트", exercisePart: "하체"), - SearchElement(image: PostureResourcesService.Assets.postureChestTest7, exerciseName: "바벨 불가리안 스플릿 스쿼트", exercisePart: "하체"), - SearchElement(image: PostureResourcesService.Assets.postureChestTest2, exerciseName: "바벨 힙 쓰러스트", exercisePart: "하체"), - SearchElement(image: PostureResourcesService.Assets.postureChestTest3, exerciseName: "점프 스쿼트", exercisePart: "등"), - SearchElement(image: PostureResourcesService.Assets.postureChestTest5, exerciseName: "인클라인 바벨 로우", exercisePart: "등") - - ] - case .second: - return [ - SearchElement(image: PostureResourcesService.Assets.postureChestTest6, exerciseName: "바벨 컬", exercisePart: "필"), - SearchElement(image: PostureResourcesService.Assets.postureChestTest7, exerciseName: "덤벨 컬", exercisePart: "필"), - SearchElement(image: PostureResourcesService.Assets.postureChestTest2, exerciseName: "이지바 컬", exercisePart: "팔"), - SearchElement(image: PostureResourcesService.Assets.postureChestTest3, exerciseName: "덤벨 헤머 컬", exercisePart: "팔"), - SearchElement(image: PostureResourcesService.Assets.postureChestTest5, exerciseName: "C컬", exercisePart: "팔"), - SearchElement(image: PostureResourcesService.Assets.postureChestTest6, exerciseName: "바벨 백스쿼트", exercisePart: "하체"), - SearchElement(image: PostureResourcesService.Assets.postureChestTest7, exerciseName: "바벨 불가리안 스플릿 스쿼트", exercisePart: "하체"), - SearchElement(image: PostureResourcesService.Assets.postureChestTest2, exerciseName: "바벨 힙 쓰러스트", exercisePart: "하체"), - SearchElement(image: PostureResourcesService.Assets.postureChestTest3, exerciseName: "점프 스쿼트", exercisePart: "등"), - SearchElement(image: PostureResourcesService.Assets.postureChestTest5, exerciseName: "인클라인 바벨 로우", exercisePart: "등") - ] - } - } - - -} diff --git a/Projects/Features/PostureFeature/Sources/Supporter/Search/PostureSearchTableViewCell.swift b/Projects/Features/PostureFeature/Sources/Supporter/Search/PostureSearchTableViewCell.swift index 94e5c554..4bbedcdd 100644 --- a/Projects/Features/PostureFeature/Sources/Supporter/Search/PostureSearchTableViewCell.swift +++ b/Projects/Features/PostureFeature/Sources/Supporter/Search/PostureSearchTableViewCell.swift @@ -5,12 +5,16 @@ import Then import DSKit import Core +import Domain + import MGNetworks -public class PostureSearchTableViewCell: UITableViewCell { +public class PostureSearchTableViewCell: BaseTableViewCell { public static let identifier: String = PostureResourcesService.Identifier.postureSearchTableViewCell + private var containerView = BaseView() + private var searchImageView = UIImageView().then { $0.contentMode = .scaleAspectFit $0.backgroundColor = PostureResourcesService.Colors.gray50 @@ -23,42 +27,45 @@ public class PostureSearchTableViewCell: UITableViewCell { ) private var exercisePartLabel = MGLabel(font: UIFont.Pretendard.bodyMedium, - textColor: DSKitAsset.Colors.gray400.color, + textColor: PostureResourcesService.Colors.gray400, isCenter: false ) - public func setup(image: UIImage, name: String, part: String) { - searchImageView.image = image - exerciseNameLabel.text = name - exercisePartLabel.text = part - - addViews() - setupViews() - } - - private func addViews() { - addSubviews([searchImageView, exerciseNameLabel, exercisePartLabel]) - } - - private func setupViews() { + public override func layout() { + super.layout() + + addSubviews([searchImageView, containerView]) + containerView.addSubviews([exerciseNameLabel, exercisePartLabel]) + searchImageView.snp.makeConstraints { $0.top.bottom.equalToSuperview().inset(16.0) $0.leading.equalToSuperview().offset(20.0) $0.width.height.equalTo(64.0) } - - exerciseNameLabel.snp.makeConstraints { - $0.top.equalToSuperview().offset(26.0) + + containerView.snp.makeConstraints { + $0.top.bottom.equalToSuperview().inset(26.0) $0.leading.equalTo(searchImageView.snp.trailing).offset(18.0) - $0.width.equalToSuperview() + $0.trailing.equalToSuperview() + } + + exerciseNameLabel.snp.makeConstraints { + $0.top.leading.trailing.equalToSuperview() $0.height.equalTo(20.0) } - + exercisePartLabel.snp.makeConstraints { $0.top.equalTo(exerciseNameLabel.snp.bottom).offset(4.0) - $0.leading.equalTo(searchImageView.snp.trailing).offset(18.0) - $0.width.equalToSuperview() + $0.leading.trailing.equalToSuperview() $0.height.equalTo(20.0) } } } + +public extension PostureSearchTableViewCell { + func setup(with model: PostureSearchContentModel) { + searchImageView.image = model.exerciseImage + exerciseNameLabel.changeText(text: model.exerciseName) + exercisePartLabel.changeText(text: model.exercisePart) + } +} diff --git a/Projects/Modules/DSKit/Sources/Components/MaeumGaGymTextField/MG+SearchTextField.swift b/Projects/Modules/DSKit/Sources/Components/MaeumGaGymTextField/MG+SearchTextField.swift deleted file mode 100644 index 459e6af7..00000000 --- a/Projects/Modules/DSKit/Sources/Components/MaeumGaGymTextField/MG+SearchTextField.swift +++ /dev/null @@ -1,45 +0,0 @@ -import UIKit -import SnapKit -import Then - -open class MGSearchTextField: UITextField { - - private let placeholderLabel = UILabel().then { - $0.font = UIFont.Pretendard.bodyMedium - $0.textColor = DSKitAsset.Colors.gray300.color - $0.contentMode = .left - $0.text = "자세 검색" - } - - public convenience init(placeholder: String) { - self.init(frame: .zero) - - placeholderLabel.text = placeholder - } - - override init(frame: CGRect) { - super.init(frame: frame) - setupUI() - } - - required public init?(coder: NSCoder) { - super.init(coder: coder) - setupUI() - } - - private func setupUI() { - configure() - - self.tintColor = DSKitAsset.Colors.blue500.color - } - - private func configure() { - addSubview(placeholderLabel) - - placeholderLabel.snp.makeConstraints { - $0.leading.trailing.equalToSuperview() - $0.top.bottom.equalToSuperview().inset(10.0) - - } - } -} diff --git a/Projects/Modules/DSKit/Sources/Components/MaeumGaGymVIew/MG+SearchView.swift b/Projects/Modules/DSKit/Sources/Components/MaeumGaGymVIew/MG+SearchView.swift index 15b662cf..f5270523 100644 --- a/Projects/Modules/DSKit/Sources/Components/MaeumGaGymVIew/MG+SearchView.swift +++ b/Projects/Modules/DSKit/Sources/Components/MaeumGaGymVIew/MG+SearchView.swift @@ -1,68 +1,90 @@ import UIKit + +import RxCocoa +import RxSwift + import SnapKit import Then -open class MGSearchView: UIView { +import Core + +open class MGSearchView: BaseView { + private var searchImage = UIImageView().then { $0.contentMode = .scaleAspectFit - $0.image = DSKitAsset.Assets.searchActIcon.image + $0.image = DSKitAsset.Assets.blackSearchActIcon.image } - - private let searchTextField = MGSearchTextField() - - private var cancelImage = UIImageView().then { - $0.contentMode = .scaleAspectFit - $0.image = DSKitAsset.Assets.blackCancel.image + + public let searchTextField = UITextField().then { + $0.tintColor = DSKitAsset.Colors.blue500.color + $0.font = UIFont.Pretendard.bodyMedium + let placeholder = "자세 검색" + let placeholderAttributes: [NSAttributedString.Key: Any] = [.foregroundColor: DSKitAsset.Colors.gray300.color] + $0.attributedPlaceholder = NSAttributedString(string: placeholder, attributes: placeholderAttributes) + } + + private var cancelButton = UIButton().then { + $0.setImage(DSKitAsset.Assets.blackCancel.image, for: .normal) $0.isHidden = true } - - public init (backgroundColor: UIColor) { + + public init () { super.init(frame: .zero) - - self.backgroundColor = backgroundColor - self.layer.cornerRadius = 8.0 - - if (backgroundColor == DSKitAsset.Colors.gray800.color ) { - searchImage.image = DSKitAsset.Assets.searchActIcon.image - cancelImage.image = DSKitAsset.Assets.searchActIcon.image - } - self.searchTextField.placeholder = "자세 검색" - - setupUI() + bind() } - + required public init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } - - public func hideCancelButton() { - self.cancelImage.isHidden = true - } - - public func showCancelButton() { - self.cancelImage.isHidden = true + + public override func attribute() { + super.attribute() + + self.backgroundColor = DSKitAsset.Colors.gray50.color + self.layer.cornerRadius = 8.0 } - - private func setupUI() { - self.addSubviews([searchImage, searchTextField, cancelImage]) - + + public override func layout() { + addSubviews([searchImage, searchTextField, cancelButton]) + searchImage.snp.makeConstraints { $0.leading.equalToSuperview().offset(12.0) $0.top.bottom.equalToSuperview().inset(8.0) $0.width.height.equalTo(24.0) } - + searchTextField.snp.makeConstraints { $0.top.bottom.equalToSuperview().inset(10.0) $0.leading.equalTo(searchImage.snp.trailing).offset(8.0) - $0.trailing.equalTo(cancelImage.snp.leading).offset(-8.0) + $0.trailing.equalTo(cancelButton.snp.leading).offset(-8.0) $0.height.equalTo(40.0) } - - cancelImage.snp.makeConstraints { + + cancelButton.snp.makeConstraints { $0.trailing.equalToSuperview().offset(-12.0) $0.top.bottom.equalToSuperview().inset(8.0) $0.width.height.equalTo(24.0) } } + + private func bind() { + searchTextField.rx.text.orEmpty + .map { $0.isEmpty } + .bind(to: cancelButton.rx.isHidden) + .disposed(by: disposeBag) + + cancelButton.rx.tap.subscribe(onNext: { [weak self] in + self?.searchTextField.text = "" + }).disposed(by: disposeBag) + } +} + +public extension MGSearchView { + func hideCancelButton() { + self.cancelButton.isHidden = true + } + + func showCancelButton() { + self.cancelButton.isHidden = true + } } diff --git a/Projects/Modules/MGNetworks/Sources/ResourcesService/PostureDetailTextViewCollectionViewCell.swift b/Projects/Modules/MGNetworks/Sources/ResourcesService/PostureDetailTextViewCollectionViewCell.swift deleted file mode 100644 index b6649558..00000000 --- a/Projects/Modules/MGNetworks/Sources/ResourcesService/PostureDetailTextViewCollectionViewCell.swift +++ /dev/null @@ -1,33 +0,0 @@ -import UIKit - -import SnapKit -import Then - -import DSKit -import Domain -import MGNetworks - -public class PostureDetailTextViewCollectionViewCell: UICollectionViewCell { - - static let identifier: String = PostureResourcesService.Identifier.postureDetailTextViewCollectionViewCell - - private var detailTextLabel = MGPostureInfoLabel() - - private func layout() { - contentView.addSubviews([detailTextLabel]) - - detailTextLabel.snp.makeConstraints { - $0.edges.equalToSuperview() - } - } -} - -public extension PostureDetailTextViewCollectionViewCell { - func setup( index: Int, with model: PostureDetailInfoTextModel) { - detailTextLabel.setup(index: index, - text: model.text - ) - - layout() - } -} diff --git a/Projects/Modules/MGNetworks/Sources/Service/PostureService.swift b/Projects/Modules/MGNetworks/Sources/Service/PostureService.swift index 79fc191d..5c91616c 100644 --- a/Projects/Modules/MGNetworks/Sources/Service/PostureService.swift +++ b/Projects/Modules/MGNetworks/Sources/Service/PostureService.swift @@ -48,6 +48,35 @@ public class PostureService { } } + public func requestSearchData() -> Single { + return.just( + PostureSearchModel( + searchResultData: [ + PostureSearchContentModel(exerciseImage: PostureResourcesService.Assets.airSqt, + exerciseName: "에어 스쿼트", exercisePart: "하체"), + PostureSearchContentModel(exerciseImage: PostureResourcesService.Assets.archPushUp, + exerciseName: "아치 푸시업", exercisePart: "하체"), + PostureSearchContentModel(exerciseImage: PostureResourcesService.Assets.babelLow, + exerciseName: "바벨 로우", exercisePart: "팔"), + PostureSearchContentModel(exerciseImage: PostureResourcesService.Assets.babelBackSqt, + exerciseName: "바벨 백 스쿼트", exercisePart: "하체"), + PostureSearchContentModel(exerciseImage: PostureResourcesService.Assets.babelBgrSplitSqt, + exerciseName: "바벨 불가리안 스플릿 스쿼트", exercisePart: "하체"), + PostureSearchContentModel(exerciseImage: PostureResourcesService.Assets.bodySplitSqt, + exerciseName: "바디 스플릿 스쿼트", exercisePart: "하체"), + PostureSearchContentModel(exerciseImage: PostureResourcesService.Assets.clapPushUp, + exerciseName: "클랩 푸시업", exercisePart: "가슴"), + PostureSearchContentModel(exerciseImage: PostureResourcesService.Assets.invertedLow, + exerciseName: "인버티드 로우", exercisePart: "하체"), + PostureSearchContentModel(exerciseImage: PostureResourcesService.Assets.pullUp, + exerciseName: "풀업", exercisePart: "등"), + PostureSearchContentModel(exerciseImage: PostureResourcesService.Assets.weightDeeps, + exerciseName: "중량 딥스", exercisePart: "가슴"), + ] + ) + ) + } + public init() { }