1. restricted와 denied는 합쳐도 될 것 같다. case .restricted: //기본적으로 새싹캠퍼스의 날씨지만, 레이블은 서울만 표시(현대카드 웨더처럼) allHidden() locationButton.image = UIImage(systemName: "location") hud.show(in: view) AddressAPIManager.shared.getLocationData(lat: lat, lon: lon) { value in self.locationLabel.text = "\(value.regionFirst)" WeatherAPIManager.shared.getWeatherData(lat: self.lat, lon: self.lon) { value in //첫번째 뷰 let i..
네트워크 통신 로직 분리 싱글톤패턴을 이용해 네트워크 통신 매니저를 따로 만듦. 위처럼 API별로 전부 매니저를 만들어줌. 이때 completionHandler를 이용해 통신이 끝난 이후에 데이터를 담을 수 있게함. 그리고 뷰컨트롤러에서는 아래의 함수를 실행하도록 함. 이때 뷰와 관련된 코드는 반드시 메인스레드에서 작성해야하기때문에 DispatchQueue.main.async내에서 실행시킴. 고차함수 이용 이전에는 데이터를 받아오면 반복문을 이용. map을 이용해 아래처럼 간단하게 바꿈. 마지막에 completionHandler의 매개변수로 list를 넘겨주어 뷰컨트롤러의 코드에서 사용할 수 있게함. map을 이용해 dictionary로 만들고 싶을때 아래와 같이 변수 하나를 만들어서 해결했음. 꼭 변수..
싱글톤패턴으로 UserDefaults 코드 수정 class UserDefaultsHelper { //인스턴스 생성방지 private init() {} //인스턴스 생성 static let shared = UserDefaultsHelper() let userDefaults = UserDefaults.standard let domain = Bundle.main.bundleIdentifier! //userdefaults 키 -> rawValue로 사용 enum Keys: String { case name case tamagotchi case status } var name: String { get { return userDefaults.string(forKey: Keys.name.rawValue) ?? "" ..
정성스러운 피드백을 받고 하나하나 고쳐보려고 노력했다. 1. 폴더 및 파일 이름 수정 Scene끼리는 한 번 더 묶을 수 있을 것 같고, Struct라는 이름대신 Entity나 Model이라는 이름을 사용하면 좋을 것 같다. Entity란 "저장되고 관리되어야하는 데이터의 집합" - Zedd님 블로그 2. Storyboard init 자주 사용하는데 반복사용을 줄일 수 있지 않을까. 계속해서 let sb = UIStoryboard(name: "", bundel: nil)을 반복해서 사용해왔다. 뷰컨트롤러선언까지 한 번에 함수로 만들고싶었지만 타입 캐스팅을 할 때 서로 다른 클래스로 하는거라 매개변수로 받을 수가 없었다. 아래처럼 선언해서 조금 줄일 수 있었음. 아래에 문자열 하드코딩도 enum을 이용해 ..
연산 프로퍼티를 사용해서 뷰컨트롤러에서의 코드 줄임. 수정 전 struct Status: Codable { var level: Int var food: Int var water: Int } 수정 후 struct Status: Codable { var food: Int var water: Int var typeNumber: String = "0" // 다마고치별 이미지 앞 숫자 var level: Int { get { let exp = (Double(food) / 5) + (Double(water) / 2) switch exp { case 0..
- Total
- Today
- Yesterday