Swift 기본 문법 ⓓ (Optional, function, Closure)

krystal·2022년 10월 3일
0

Swift 기초

목록 보기
4/11
post-thumbnail

Optional | Apple Developer Document
40시간만에 Swift로 iOS 앱 만들기
[Swift] 함수 선언 및 사용법
The Swift Language Guide (한국어)
클로져 정복하기

Optional

Swift에서 값이 없는 상태를 nil 이라고 부른다. (None, null과 같은 느낌)
값이 있을 수도 있고 없을 수도 있는 상황에서 변수를 정의할 때 ?를 붙여서 사용하는데 이것을 옵서녈(optional) 이라 한다.

옵셔널로 정의한 변수와 그냥 정의한 변수와는 차이점이 존재한다.
옵셔널은 실제 코드가 실행되기 전까지는 값의 유무를 모르기 때문에 옵셔널로 정의된 변수를 다른 변수에 대입할 수 없게된다.

let shortForm: Int? = Int("42")
let longForm: Optional<Int> = Int("42")
// 둘다 같은 코드
let fruit: String? = "apple"
let apple: String = fruit 



Optional Binding

옵셔널을 정의했으니 사용해야하지않나?
옵셔널의 값을 가져오고 싶은 경우는 어떻게 해야할까?🤔

이 때 사용하는 방법을 옵셔널 바인딩 (optional binding) 이다.

✅ 옵셔널의 값의 유무를 판단한 뒤, 존재한다면 해당 값을 다른 변수에 대입시킨다. (if let 혹은 if var을 사용한다)

if let email = optionalEmail {
  print(email) 
}
// optionalEmail의 값의 유무에 따라 
// if문을 실행하거나 지나치게 된다.
var optionalAge: Int? = 22

if let age = optionalAge, age >= 20 {
}
// 존재 유무와 범위를 동시에 확인 가능

Optional Chaining

연속적으로 옵셔널을 사용한다는 뜻인 옵셔널 체이닝(Optional Chaining)
이는 옵셔널의 속성에 접근할 때 옵셔널 바인딩 과정을 ? 키워드로 줄여주는 역할을 한다.

📌 옵셔널 체이닝을 쓰지 않았을 경우

let array: [String]? = []
var isEmptyArray = false

if let array = array, array.isEmpty {
  isEmptyArray = true
} else {
  isEmptyArray = false
}

isEmptyArray

📌 옵셔널 체이닝을 썼을 경우

let array: [String]? = []
let isEmptyArray = array?.isEmpty == true

Optional Unwrapping

강제 언랩핑 방식으로는 뒤에 !을 통해서 언랩핑 시킨다.
주의해야할 점은 옵셔널의 값이 nil인 경우 런타임 에러를 발생하게 된다고 한다.

var optionalEmail: String? = "123@gmail.com"
print(optionalEmail) // Optional("123@gmail.com")
print(optionalEmail!) // 123@gmail.com
var optionalEmail: String?
print(optionalEmail!) // 런타임 에러 발생




Function

  1. func을 사용해서 정의한다.
  2. -> 을 통해 함수의 반환 타입을 지정한다. (반환 값이 없을 경우 생략 가능)
  3. 함수 호출 시 파라미터 이름을 지정해주어야 한다.
  4. _ 를 사용하면 파라미터 이름을 생략할 수 있다.
  5. 파라미터의 기본 값을 지정할 수 있다.
  6. 함수 안에 함수를 호출할 수 있다.

func hello(name: String, time: Int) -> String {
  var string = ""
  for _ in 0..<time {
    string += "\(name)님 안녕하세요!\n"
  }
  return string
}

전달 인자 레이블

외부에서 함수 호출 시 파라미터 명과 함수 내에 사용되는 변수명을 달리 사용하기 위함이다.
func setName(name friend:String = "홍길동") -> Void {
    print("이름 : \(friend)")
}

setName(name: "완득이") // 이름 : 완득이
setName() // 이름 : 홍길동

가변 매개 변수

파라미터 개수가 일정하지 않을 때 사용한다.
❗ 사용 시 파라미터의 맨 마지막에 선언해야한다 ❗

func sum(_ numbers: Int...) -> Int {
  var sum = 0
  for number in numbers {
    sum += number
  }
  return sum
}

sum(1, 2)
sum(3, 4, 5)




Closure

  1. func도 클로져(closure)의 한 종류이다. (Named Closure)
  2. 보통 클로져라고 하면 익명함수라고 인식하기는 하나, 헷갈리지 말 것
  3. 클로져에선 함수에서처럼 Argument Label을 사용하지않는다.
{ (parameters) -> return type in
    statements
}
// 1. 인자로 넣을 parameters
// 2. 인자 값으로 처리할 내용을 기술하는 statements
// 3. return type

Closure Head와 Closure Body(실행구문)를 구분짓는 것은 in이다

let closure = { (name: String) -> String in
    return "Hello, \(name)"
}

closure("홍길동")
closure(name: "홍길동")  // 에러 발생



profile
https://source-coding.tistory.com/

0개의 댓글