Optional | Apple Developer Document
40시간만에 Swift로 iOS 앱 만들기
[Swift] 함수 선언 및 사용법
The Swift Language Guide (한국어)
클로져 정복하기
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) 이다.
✅ 옵셔널의 값의 유무를 판단한 뒤, 존재한다면 해당 값을 다른 변수에 대입시킨다. (if let 혹은 if var을 사용한다)
if let email = optionalEmail {
print(email)
}
// optionalEmail의 값의 유무에 따라
// if문을 실행하거나 지나치게 된다.
var optionalAge: Int? = 22
if let age = optionalAge, age >= 20 {
}
// 존재 유무와 범위를 동시에 확인 가능
연속적으로 옵셔널을 사용한다는 뜻인 옵셔널 체이닝(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
강제 언랩핑 방식으로는 뒤에 !을 통해서 언랩핑 시킨다.
주의해야할 점은 옵셔널의 값이 nil인 경우 런타임 에러를 발생하게 된다고 한다.
var optionalEmail: String? = "123@gmail.com"
print(optionalEmail) // Optional("123@gmail.com")
print(optionalEmail!) // 123@gmail.com
var optionalEmail: String?
print(optionalEmail!) // 런타임 에러 발생
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)
{ (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: "홍길동") // 에러 발생