반응형
** edwith - Swift 프로그래밍 입문 강의 참고 **
# 반복문 #
for - in 구문
// for-in 구문 기본 형태
for item in items {
/* 실행 구문 */
}
// 예시
var number = [1, 2, 3]
let people = ["yagom": 10, "eric": 15, "mike": 12]
for num in number {
print(num)
}
for (name, age) in people {
print("\(name): \(age)")
}
repeat - while 구문
// repeat-while 구문 기본 형태
repeat {
/* 실행 구문 */
} while /* 조건 */
// 예시
repeat {
number.removeLast()
} while number.count > 0
# 옵셔널 #
- 값이 있을 수도, 없을 수도 있음을 표현
- nil이 할당 될 수 있는지 없는지 표현
?? 옵셔널을 쓰는 이유 ??
명시적 표현 | 안전한 사용 |
1. nil의 가능성을 코드만으로 표현 가능 2. 문서/주석 작성 시간 절약 |
1. 전달받은 값이 옵셔널이 아니라면 nil 체크를 하지 않고 사용가능 2. 예외 상황을 최소화 하는 안전한 코딩 3. 효율적 코딩 |
옵셔널 문법과 선언
// 옵셔널 문법 : enum + general
// 옵셔널 선언
enum Optional<Wrapped>: ExpressibleByNiliteral {
case none
case some(Wrapped)
}
let optionalValue: Optional<Int> = nil
let optionalValue: Int? = nil
! 를 이용한 암시적 추출 옵셔널 - nil 할당 가능
// Implicitly Unwrapped Optional
var iuoValue: Int! = 100
switch iuoValue {
case .none:
print("This Optional variable is nil.")
case .some(let value):
print("Value is \(value).")
}
// nil 할당 가능
iuoValue = nil
? 를 이용한 옵셔널 - nil 할당 가능
// Optional
var optValue: Int? = 100
switch optValue {
case .none:
print("This Optional variable is nil.")
case .some(let value):
print("Value is \(value).")
}
// nil 할당 가능
optValue = nil
! 와 ? 의 차이
var someValue: Int? = nil
var value: Int = someValue // Int와 Int?는 엄연히 타입이 다르기 때문에 오류발생
var value: Int = someValue!
// !를 통해 "강제로" someValue의 값을 추출하기 때문에 컴파일러에서는 오류가 뜨지 않아요.
// 하지만 런타임 오류가 발생합니다.
# 옵셔널 추출 #
- 옵셔널에 들어있는 값을 사용하기 위해 꺼내오는 것
옵셔널 바인딩 |
1. nil 체크 + 안전한 추출 2. 옵셔널 안에 값이 들어있는지 확인하고, 값이 있으면 값을 꺼내옵니다. 3. if-let 방식 사용 |
func printName(_ name: String) {
print(name)
}
var myName: String? = nil
// 이때 printName(myName)을 하게 되면, 전달되는 type이 다르기 때문에 오류!!
// 그래서 이렇게 nil인지 검사하고 추출해야 함
if let name: String = myName {
printName(name)
} else {
print("myName is nil.")
}
var yourName: String! = nil
if let name: String = yourName {
printName(name)
} else {
print("yourName is nil.")
}
// 이때 name상수는 if-let 구문 내에서만 사용 가능
myName = "been"
yourName = nil
if let name = myName, let friend = yourName {
print("\(name) and \(friend)")
}
// yourName이 nil이기 때문에 실행되지 않음.
// ,를 사용한 여러 옵셔널을 바인딩 하는 것은 모든 옵셔널에 값이 있을 때만 동작
yourName = "hye"
if let name = myName, let friend = yourName {
print("\(name) and \(friend)")
}
// been and hye
강제 추출 (unwrapping)
/* 옵셔널에 값이 들어있는지 아닌지 확인하지 않고 강제로 값을 꺼내는 방식 */
/* 만약 값이 없을 경우(nil), 런타임 오류 발생 */
var myName: String? = been
var yourName: String! = nil
printName(myName!) // been
myName = nil
printName(myName!) // 런타임 오류
yourName = nil
printName(yourName) // 런타임 오류
# 옵셔널 체이닝 (Optional Chaining) #
- 여러 객체를 혼합해서 사용 할 때, 옵셔널끼리 연산이 필요한 경우가 있습니다. 이 때, 객체마다 옵셔널 바인딩을 사용하면 복잡한 if문이 나오게 됩니다. 이 때, Optional Chaining을 사용하면 더 간단하게 처리할 수 있습니다.
class X {
var y: Y?
}
class Y {
var z: String?
}
var x: X = X()
if x.y?.z {
/* x.y?.z를 통해 y의 옵셔널, z의 옵셔널 바인딩을 모두 처리합니다. */
}
반응형
'iOS > Swift' 카테고리의 다른 글
Swift-4. 클로저, 프로퍼티 (0) | 2023.02.24 |
---|---|
Swift-3. 구조체, 열거형 (0) | 2023.02.24 |
Swift-1. 변수, 리스트, 함수 (0) | 2023.02.24 |
[Swift 5.5] Async / Await (0) | 2021.12.20 |
Swift 접근 제어자 (Access Control) (0) | 2021.05.07 |
댓글