-iOS 5기 사전캠프 퀘스트 Step.3-

퀘스트명: 운동 관리 시스템을 구축해요

함수와 연산자에 대해 학습하고, 이를 활용하여 운동 관리 시스템을 구축해보자.


Swift 함수와 연산자

함수 선언하기

    1. 함수의 기본 형태
func (함수 이름)((매개변수): (매개변수 타입)) -> (반환타입) { // 매개변수와 반환타입은 생략할 수 있고, 반환타입을 생략하면 Void 타입이 된다
 실행할 코드
 return 반환값
}
    1. 전달인자 레이블이란?
      함수에서 매개변수를 호출할 때 가독성을 높이고, 매개변수의 역할을 더 명확하게 표현하고자 할 때 사용
func (함수이름)(전달인자레이블 매개변수 1, 전달인자레이블 매개변수 2...) -> (반환타입) { return }
    1. 사용 예시:
func printHelloWorld() {
 print("hello world")
}
printHelloWorld // hello world

Swift 연산자

  • 산술 연산자: 덧셈, 뺄셈, 곱셈, 나눗셈, 나머지 연산한 결과값을 반환하는 연산자
  • 비교 연산자: 비교한 값을 true와 false로 반환하는 연산자
  • 논리 연산자: 논리적으로 비교한 값을 true와 false로 반환하는 연산자
  • 범위 연산자: 범위를 나타내는 연산자
  • 삼항 연산자: question ? answer1 : answer2 형식으로, question의 답이 true면 answer1을 false면 answer2 값을 사용하는 연산자.

퀘스트 진행

// 1. 특정 운동을 했을 때, 운동 시간을 더하는 함수를 만드세요.
func workOut(to exercise: String, time: Int) {
    if time >= 60 {
        print("\(exercise) 운동을 많이 했습니다!")
    } else {
        print("\(exercise) 운동을 더 해보세요.")
    }
}

workOut(to: "Leg press", time: 60)
workOut(to: "squat", time: 30)

// 2. 몸무게 비교 함수를 만들어 주세요.
func weightComparison(first: (String, Int), second: (String, Int)) -> String {
    var comparisonResult: String = ""
    var differenceWeight: Int = first.1 - second.1
    
    if differenceWeight < 0 {
        differenceWeight = differenceWeight * -1
        
        if first.1 > second.1 {
            comparisonResult.append("\(first.0) 이/가 \(second.0) 보다 \(differenceWeight)kg 만큼 몸무게가 많습니다.")
        } else {
            comparisonResult.append("\(second.0) 이/가 \(first.0) 보다 \(differenceWeight)kg 만큼 몸무게가 많습니다.")
        }
        
    } else {
        if first.1 > second.1 {
            comparisonResult.append("\(first.0) 이/가 \(second.0) 보다 \(differenceWeight)kg 만큼 몸무게가 많습니다.")
        } else {
            comparisonResult.append("\(second.0) 이/가 \(first.0) 보다 \(differenceWeight)kg 만큼 몸무게가 많습니다.")
        }
    }
    
    return comparisonResult
}

print(weightComparison(first: ("르탄이", 80), second: ("배캠이", 105)))

// 3. 논리 연산자를 사용해, 체온과 체력 상태에 따라 운동 가능 여부를 판단하세요.
func healthCheck(temperature: Double, strength: Int) {
    guard temperature <= 36.5, strength >= 70 else {
        print("운동을 할 수 없습니다.")
        return
    }
    print("운동이 가능합니다!")
}

healthCheck(temperature: 37.0, strength: 80)
healthCheck(temperature: 35.6, strength: 100)

// 4. 운동 횟수를 기록할 때 1부터 10까지의 범위에서만 가능하도록 해주세요.
func exerciseCount(count: Int) {
    if (1...10).contains(count) {
        print("운동횟수가 \(count)회로 1~10회 이내 입니다")
    } else {
        print("운동횟수가 \(count)회로 1~10회 범위를 벗어납니다!")
    }
}

exerciseCount(count: 5)
exerciseCount(count: 15)

// 5. 운동 시간 판단하기
let exerciseTime: Int = 30

var healthTime = exerciseTime >= 30 ? "적당히 운동했습니다." : "운동이 부족합니다."
print(healthTime)

-팀 프로젝트 진행-

오늘의 진행 내용

  • 회원가입 및 로그인 기능 완전 구현

ViewReview

SignUpView
어제 구현에 실패했던 유저 정보 저장 및 로그인 시 활용을 구현하기 위해 여러가지 방법을 시도했다.
기존에 시도하려던 방법은 유저 데이터를 저장하는 UserInformationView를 별도로 생성하고, 해당 뷰에 class타입으로 유저의 정보를 저장하는 클래스를 생성하여 이를 활용한 유저 데이터 저장 및 불러오기를 진행하려고 하였다.
그러나 이를 시도하는 과정에서 시행착오를 무수히 겪고, 계속해서 난관에 부딪혔다. 때문에 방법을 바꾸기로 하였고, 이에 따라 로컬 데이터 저장소인 UserDefaults를 활용하기로 하였다.

1. 이메일 형식을 준수하는지 체크

회원가입시 입력하는 ID는 이메일 형식을 준수하여야 한다. 때문에 이를 확인하기 위한 함수를 하나 생성하였다.

func isValidEmail(id: String) -> Bool {
    let emailRegEx = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}"
    let emailTest = NSPredicate(format: "SELF MATCHES %@", emailRegEx)
    return emailTest.evaluate(with: id)
}

2. UserDefaults를 사용한 유저 정보 저장

SignUpView에서 조건을 달성하면 UserDefaults에 유저 정보를 저장하는 코드를 작성한다.

// 로그인 버튼을 클릭하는 경우
Button(action: {
	print("Login button clicked")
    // 패스워드와 컨펌패스워드가 동일한가?
	guard self.signUpUserPassword == self.confirmUserPassword else {
		self.errorShowing = true
        self.error = .confirmError
		self.signUpUserPassword = ""
		self.confirmUserPassword = ""
		return
	}
    // 아이디가 이메일 형식을 준수하는가?             
	guard isValidEmail(id: self.signUpUserEmail) else {
		self.signUpUserEmail = ""
		self.errorShowing = true
		self.error = .emailError
		return
	}
    // 이메일, 패스워드, 컨펌패스워드의 3개의 텍스트필드의 값이 모두 0이 아닌가?            
	if self.signUpUserEmail.count > 0 && self.signUpUserPassword.count > 0 && self.confirmUserPassword.count > 0 {
    	// true일 시 "userEmail"과"userPassword"키에 유저의 정보를 저장
		UserDefaults.standard.set(self.signUpUserEmail, forKey: "userEmail")
		UserDefaults.standard.set(self.signUpUserPassword, forKey: "userPassword")
                    
		withAnimation {
			self.loginStatus = .signUp
			self.state = .loading
		}
	} else {
		self.error = .blankError
		self.errorShowing = true
	}
}
// 중략...

3. 로그인뷰에서 데이터 불러오기

SignUpView에서 작업을 마친 후 LoginView에서 저장된 유저 데이터와 현재 입력된 값을 비교하여 로그인 성공 여부를 결정하는 코드를 작성한다.

Button(action: {
	print("Log In")
    // 새로운 상수를 선언하여 UserDefaults에 저장된 유저 정보를 가져온다.
	let savedUserEmail = UserDefaults.standard.string(forKey: "userEmail")
	let savedUserPassword = UserDefaults.standard.string(forKey: "userPassword")
    
    // guard문으로 현재 입력값과 불러온 유저 정보가 동일한지 확인한다.
	guard savedUserEmail == self.userEmail && savedUserPassword == self.userPassword else {
		return showing = true
	}
	withAnimation {
    	// 로그인 성공
		self.loginStatus = .loginSucces
		self.state = .loading                        
	}                
}
// 중략...

실행 결과물

이메일 형식이 잘못된 경우회원가입에 성공한 경우
등록되지 않은 유저 정보일 경우로그인에 성공한 경우

-오늘의 학습 후기-

오늘은 iOS 5기 사전캠프 퀘스트로 함수와 연산자에 대해 학습했다.
이미 알고있던 내용이었기 때문에 어렵진 않았지만, 오랜만에 하려니 굳어진 머리 탓에 속도가 더뎠다.
팀 프로젝트로 지난번 구현에 실패했던 유저 정보 저장, 불러오기 기능을 오늘 구현에 성공하여 무척 기뻤다.
비록 원하던 방식이 아니었지만, 결국은 성공을 했다는 것이 중요하다고 생각한다.
이번에 구현하지 못한 방식은 추후 학습을 통해 나의 개발수준이 몇 단계 상승한다면 무리없이 구현할 수 있으리라고 믿는다.
개발자로서 더욱 성장하기 위해 앞으로 더 다양하고 많은 공부를 해야함을 느꼈다.
profile
이유있는 코드를 쓰자!!

0개의 댓글