포켓몬 전화번호부 앱 개발

호씨·2024년 12월 10일
0

포켓몬 전화번호부 앱 개발

주요 기능 및 기술 스택

사용된 기술

  • CoreData: 연락처 정보 저장 및 관리
  • SnapKit: Auto Layout 구현
  • UIKit: UI 구현
  • URLSession: 포켓몬 API 통신
  • SwiftUI Preview: UI 미리보기

주요 구현 내용 🛠

1. CoreData 모델 설계

@objc(PokemonPhoneBook)
public class PokemonPhoneBook: NSManagedObject {
    public static let className = "PokemonPhoneBook"
    
    public enum Key {
        static let name = "name"
        static let phoneNumber = "phoneNumber"
        static let profileImage = "profileImage"
    }
}
  • 클래스 이름을 static 상수로 관리하여 문자열 오타 방지
  • Key enum을 통한 프로퍼티 이름 관리로 타입 안정성 확보

2. 커스텀 테이블뷰 셀

class ContactCell: UITableViewCell {
    private let profileImageView = UIImageView()
    private let nameLabel = UILabel()
    private let phoneLabel = UILabel()
    
    private func setupCell() {
        profileImageView.layer.cornerRadius = 25
        profileImageView.clipsToBounds = true
        
        // SnapKit을 활용한 Auto Layout
        profileImageView.snp.makeConstraints { make in
            make.centerY.equalToSuperview()
            make.leading.equalToSuperview().offset(40)
            make.width.height.equalTo(50)
        }
        // ... 나머지 제약조건
    }
}
  • SnapKit을 활용한 깔끔한 레이아웃 구현
  • 재사용 가능한 커스텀 셀 디자인

3. 이미지 처리

func configure(with contact: PokemonPhoneBook) {
    if let imageString = contact.profileImage,
       let imageData = Data(base64Encoded: imageString),
       let image = UIImage(data: imageData) {
        profileImageView.image = image
    } else {
        profileImageView.image = nil
        profileImageView.backgroundColor = .lightGray
    }
}
  • Base64 인코딩을 통한 이미지 데이터 저장
  • 옵셔널 체이닝을 통한 안전한 이미지 처리

4. 포켓몬 API 연동

@objc private func randomPokemonButtonTapped() {
    let randomId = Int.random(in: 1...1000)
    let urlString = "https://pokeapi.co/api/v2/pokemon/\(randomId)"
    
    URLSession.shared.dataTask(with: URL(string: urlString)!) { [weak self] data, response, error in
        // API 응답 처리
        DispatchQueue.main.async {
            self?.profileImageView.image = UIImage(data: imageData)
        }
    }.resume()
}
  • 랜덤 포켓몬 이미지 가져오기 구현
  • 메모리 누수 방지를 위한 weak self 사용

5. SwiftUI Preview 활용

#Preview {
    UINavigationController(rootViewController: ViewController())
}
  • 실시간 UI 확인을 위한 프리뷰 구현
  • 네비게이션 컨트롤러 포함한 실제 환경 테스트

개선이 필요한 부분

  1. 이미지 선택 관련

    • 시뮬레이터에서 이미지 폴더 접근팝업 안뜨게 수정필요
  2. 전화번호 포맷팅

    • XXX-XXXX-XXXX 형식으로 표시되도록 포맷팅 함수 구현 필요
    // 추가 예정인 포맷팅 함수
    func formatPhoneNumber(_ number: String) -> String {
        // 구현 예정
    }
  3. 테이블뷰 레이아웃

    • 셀 내부 요소들의 정렬 및 간격 조정 필요
    • 레이블 크기 및 위치 최적화 필요
  4. UI 개선사항

    • 테이블뷰 셀 내부 레이아웃 정밀 조정
    • 레이블 크기와 위치 재조정

현재 만들면서 어려운부분(추가공부필요)

  • 테이블뷰에 대한 구조 및 개념 공부 필요
  • coredata 구조 및 개념 공부 필요
profile
이것저것 많이 해보고싶은 사람

0개의 댓글