SSAC_iOS_Day 9 | TIL

린다·2021년 10월 8일
0

SSAC_iOS_Dev

목록 보기
5/33
post-thumbnail

👩‍💻 수업 & 추가 스터디

📂 함수 매개변수와 반환값

매개변수를 사용하지 않고 반환 타입이 없는 함수

// Void는 생략 가능
func sayHello() -> Void {
 print("안녕하세요")
}

func sayHello() {
 print("안녕하세요")
}

sayHello()

반환값이 있는 함수

  • 화살표 뒤에 반환타입을 작성하여 지정해준다.
func sayHello2() -> String {
 return "안녕"
}

print("자기소개: \(sayHello2())")
  • 배열을 리턴하는 함수의 경우, 변수에 할당 후 인덱스로 접근하여 사용할 수 있다.
func bmiResult() -> [String] {
    let name = "고래밥"
    let result = "정상"
    
    return [name, result]
}

let value = bmiResult()
print(value[0] + "님의 BMI 지수는 " + value[1] + "입니다.")

Tuple

  • 컬렉션(집단 자료형): 배열, 딕셔너리, 집합 + 튜플
  • 튜플은 원하는대로 자유롭게 만들 수 있다.(다른 자료형에 비해 제한사항이 없음)
  • 따라서 만드는대로 형식이 정해진다.
let userInfo: (String, String, Bool, Double) = ("고래밥", "jack@jack.com", true, 4.5)
// 순서대로 요소를 가져올 수 있음
print(userInfo.0)
print(userInfo.1)
  • 튜플을 활용하여 함수의 반환 타입을 지정해줄 수도 있다.
func loginGame() -> (Int, String) {
	return (333, "도적")
}

let value = loginGame()
print("레벨 \(value.0)\(value.1)이 로그인하셨습니다.")

Implicit returns

  • Swift 5.1부터 return 키워드를 생략할 수 있다.
  • 함수 안에 코드가 한 줄만 있는데 그게 return문인 경우 생략이 가능하다.
func getMovieReport2() -> (Int, Int) {
    (1000, 30000)
}

@discardableResult

  • 반환값을 무시하는 기능
  • 반환값이 있으나 이를 사용하지 않는 경우 해당 메서드 위에 @discardable키워드를 작성해주면 return값을 사용하지 않아도 경고가 뜨지 않는다.

📂 Enumeration(열거형)

열거형이란?

  • 무작위로 값이 입력되는 것을 방지해 코드의 안정성을 높여준다.
  • 입력받아야 할 정보를 입력하는 대신, 선택할 수 있도록 만들어준다.
enum AppleDevice {
    case iPhone
    case iPad
    case watch
}

자료형과의 차이점

  • 배열, 집합, 딕셔너리 등의 자료형은 삭제나 변경이 가능하지만 열거형은 해당 구문 자체를 수정하지 않는 경우 요소를 임의대로 수정이 불가능하다.
  • 자료형은 잘못된 타입을 입력하거나 문제가 발생하는 경우 런타임시점에서 오류를 확인할 수 있지만 열거형은 컴파일오류로 바로 확인할 수 있기 때문에 버그 수정하기 훨씬 편리하다.

열거형을 주로 사용하는 경우

  • 원하지 않는 값이 잘못 입력되는 것을 막고싶을 때
  • 입력 받을 값을 미리 특정할 수 있을 때
  • 제한된 값 중에서만 선택할 수 있도록 강제하고 싶을 때

Switch문과 열거형

  • 열거형은 제공된 경우 외의 입력값은 없다고 단정할 수 있기 때문에 switch문을 활용하더라도 default를 설정해주지 않아도 된다.
enum HTTPCode: Int {
    case OK = 200
    case SERVER_ERROR = 500
    case NO_PAGE
    
    func showStatus() -> String {
        switch self {
        case .NO_PAGE:
            return "잘못된 주소입니다."
        case .SERVER_ERROR:
            return "서버 점검중입니다. 서버에 문제가 생겨서 잠시 후 시도해주세요."
        case .OK:
            return "정상입니다."
        }
    }
}

var status: HTTPCode = .OK

print(status.rawValue) // 값이 부여되지 않았으면 순서대로 0, 1, 2, .. 등등 int가 자동으로 부여됨
status.showStatus() // 정상입니다

RawValue

  • 열거형의 case별로 독립적인 값을 설정할 수 있다.
  • 아래의 코드와 같이 일부의 항목에만 문자열 형식의 rawValue를 설정해준 경우, 설정되지 않은 case들은 case 이름 자체를 rawValue로 갖게 된다.
enum GameJob: String {
    case rogue = "도적"
    case warrior = "전사"
    case mystic = "도사"
    case shaman
    case fight
}

let selectJob: GameJob = GameJob.mystic
// let selectJob: GameJob = .mystic (타입이 명확하게 선언돼있으면 GameJob 생략가능함)

print("당신은 \(selectJob.rawValue)입니다.") // 도사
  • 정수 타입의 경우, 0부터 1씩 늘어난 값을 가지게 된다.
enum School: Int {
	case elementary
    case middle
    case high = 300
    case university
}

print(school.elementary.rawValue) // 0
print(school.middle.rawValue) // 1
print(school.high.rawValue) // 300
print(school.university.rawValue) // 301

📂 Local Notification

  • 사용자의 허락이 가장 중요
  • 앱 재사용률(Retention)에 기여
  • 앱이 종료된 경우에도 사용자에게 새로운 정보를 표시

Authorization -> Request -> Notification
Authorization: Alert, Badge, Sound
Request: Content(title, body, badge), Trigger(time(시간간격), calendar(보내고 싶은 날짜 및 시간), location)

권한 요청

func requestNotificationAuthorization() {
        // 권한에 대한 항목
        let authOptions = UNAuthorizationOptions(arrayLiteral: .alert, .badge, .sound)
        userNotificationCenter.requestAuthorization(options: authOptions) { success, error in
            if success {
                self.sendNotification()
            }
        }
    }

알림 요청

  • UNMutableNotificationContent()
    알림을 통해 전달할 정보와 관련된 클래스
    title, subtitle, body, sound 등의 정보를 작성할 수 있고 attachment를 통해 부가적인 정보 표현도 가능하다.
  • 알림 트리거
    시간간격, 캘린더, 위치 기반으로 알림을 보낼 수 있다.
  • UNNotificationRequest
    로컬 알림을 예약하기 위해 요청하는 클래스
    전달할 정보, 트리거, Identifier를 포함하고 있다.

Identifier
알림을 구분하는 고유한 값으로 Identifier가 동일하다면 알림 내용이 수정되는 형태로 동작한다.
만약 Identifier가 다르다면 스택 형태로 알림이 쌓인다.

    func sendNotification() {
        
        // 어떤 정보를 보낼지 컨텐츠 구성
        let notificationContent = UNMutableNotificationContent()

        notificationContent.title = "물 마실 시간이에요!"
        notificationContent.body = "하루 2리터 목표 달성을 위해 열심히 달려보아요"
        notificationContent.badge = 100
        
        // 언제 보낼지 설정: 1. 간격, 2. 캘린더, 3. 위치
        let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 60, repeats: true)
        let request = UNNotificationRequest(identifier: "\(Date())",
                                            content: notificationContent,
                                            trigger: trigger)

        userNotificationCenter.add(request) { error in
            if let error = error {
                print("Notification Error: ", error)
            }
        }
    }

📂 Alert

@IBAction func buttonTapped(_ sender: UIButton) {
        // 1. UIAlertController 생성: 밑바탕 + 타이틀 + 본문
        let alert = UIAlertController(title: "타이틀입니다", message: "메세지입니다", preferredStyle: .actionSheet)
        // 2. UIAlertAction 생성: 버튼들
        let ok = UIAlertAction(title: "OK", style: .default)
        let cancel = UIAlertAction(title: "cancel", style: .cancel)
        let delete = UIAlertAction(title: "delete", style: .destructive)
        // 3. 1, 2번 합쳐주기
        alert.addAction(ok)
        alert.addAction(cancel)
        alert.addAction(delete)
        // 4. 화면 띄워주기
        present(alert, animated: true, completion: nil)
}

0개의 댓글