mvvm, rxswift, rxcocoa
import UIKit
import RxSwift
import SnapKit
import RxCocoa
import UIKit
class ViewController: UIViewController {
var disposedBag = DisposeBag()
let countViewModel = CountViewModel()
func setBind() {
//바인딩
countViewModel.count
.bind(to: countLabel.rx.text)
.disposed(by: disposedBag)
//위로버튼 눌렀을때 바인딩
upButton.rx.tap
.bind{ [weak self] in
//print("gkdlgkld")
self?.countViewModel.increaseCount()
}
.disposed(by: disposedBag)
//아래로 버튼 눌렀을 때 바인딩
downButton.rx.tap
.bind{ [weak self] in
self?.countViewModel.decreaseCount()
}
.disposed(by: disposedBag)
}
let countLabel: UILabel = {
var label = UILabel()
label.text = "0"
label.font = .systemFont(ofSize: 30)
return label
}()
let upButton: UIButton = {
var button = UIButton(type: .system)
button.setTitle("위로~", for: .normal)
button.setTitleColor(.red, for: .normal)
return button
}()
let downButton: UIButton = {
var button = UIButton(type: .system)
button.setTitle("아래로~", for: .normal)
button.setTitleColor(.blue, for: .normal)
return button
}()
lazy var buttonStackView: UIStackView = {
var st = UIStackView(arrangedSubviews: [
upButton, downButton
])
st.spacing = 15
st.axis = .horizontal
st.backgroundColor = .green
st.alignment = .center
st.distribution = .fillEqually
return st
}()
lazy var finalStackView: UIStackView = {
var st = UIStackView(arrangedSubviews: [
countLabel, buttonStackView
])
st.spacing = 10
st.alignment = .center
st.axis = .vertical
st.alignment = .center
st.distribution = .fillEqually
return st
}()
func makeUI() {
finalStackView.snp.makeConstraints { make in
make.top.equalTo(view.safeAreaLayoutGuide).offset(50)
make.centerX.equalToSuperview()
setBind()
}
}
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .white
view.addSubview(finalStackView)
makeUI()
// Do any additional setup after loading the view.
}
}
//
// countViewModel.swift
// UPDown
//
// Created by 정다함 on 2023/03/21.
//
import UIKit
import RxSwift
import SnapKit
import RxCocoa
import UIKit
class CountViewModel{
//서브젝트 생성
var count = BehaviorSubject<String>(value: "0")
init() {
count.onNext("1")
}
func increaseCount() {
var tempCount = try! count.value()
tempCount = String(Int(tempCount)! + 1)
count
.onNext(tempCount)
}
func decreaseCount() {
var tempCount = try! count.value()
tempCount = String(Int(tempCount)! - 1)
count
.onNext(tempCount)
}
}
튜토리얼? 완료
그리고 chat gpt
안녕하세요! 코드리뷰를 해드리겠습니다.
- 코드 구조 현재 코드 구조는 ViewController와 CountViewModel이 한 파일에 모두 작성되어 있습니다. 일반적으로는 각 클래스/구조체마다 별도의 파일에 작성하는 것이 좋습니다. 이러한 작업을 통해 코드의 유지보수성을 높일 수 있습니다.
- 불필요한 import UIKit과 RxCocoa를 두 번 import 하고 있습니다. 불필요한 import를 제거하여 코드의 가독성을 높일 수 있습니다.
- disposedBag RxSwift의 disposedBag은 메모리 릭을 방지하기 위한 도구입니다. 코드상으로는 문제가 없지만, 필요한 경우에만 사용하도록 합니다. 현재 코드에서는 disposedBag를 특별한 이유 없이 사용하고 있지 않습니다.
- makeUI 함수와 setBind 함수 makeUI 함수에서는 setBind 함수를 호출하고 있습니다. 이러한 형태는 올바르지 않습니다. makeUI 함수는 UI를 설정하는 함수이고, setBind 함수는 데이터를 바인딩하는 함수입니다. 이러한 함수들은 각각의 역할에 맞게 분리하여 사용하는 것이 좋습니다.
- CountViewModel CountViewModel에서 BehaviorSubject를 사용하고 있습니다. 이 방식은 가능하지만, 현재의 경우에는 간단한 Int 변수로 대체가 가능합니다. 또한, 현재 코드에서는 처음 count를 "1"로 설정하고 있지만, 이는 현재 카운트 값을 "0"으로 설정하는 것이 더 적합합니다.
- 소문자 변수명 Swift에서는 변수명은 camelCase로 작성하는 것이 권장됩니다. 현재 코드에서는 label, button, stackView 등의 변수명이 대문자로 시작하고 있습니다. 이를 camelCase로 수정하여 가독성을 높이는 것이 좋습니다.
아래는 위의 내용들을 바탕으로 수정된 코드입니다.
'Swift > UIKit' 카테고리의 다른 글
[UIkit] Tableview 코드로 만들기 (0) | 2023.03.21 |
---|---|
[Swift] Icon 색과 크기 변경하는 방법 (0) | 2023.03.21 |
[UIkit] 공공데이터 활용하기, serviceKey, Application_ERROR 해결 (0) | 2023.03.14 |
[Swift] IOS 스토리보드없이 코드로만 UI 만들기! (0) | 2023.02.23 |
[Xcode] Snippet 사용법 - 자주쓰는 코드를 저장하자! (0) | 2023.02.21 |