https://youtu.be/R8OWOgCNt4M?si=bldau6gYEZ3seGj2
위 영상을 보고 정리한 글입니다. (37:05 ~ 39:30)
print(_:seperator:terminator:)
print("일 이 삼")
print("1 2 3")
print(1, 2, 3)
print(1.0, 2.0, 3.0)
print(1, 2, 3, separator: "...")
for n in 1...3 {
print(n)
}
for n in 1...3 {
print(n, terminator: " ")
}
- 출력값
일 이 삼
1 2 3
1 2 3
1.0 2.0 3.0
1...2...3
1
2
3
1 2 3
forced unwrapping
var x : Int
x = 10
if x != nil {
print(x!)
}
else {
print("nil")
}
var x1 : Int?
if x1 != nil {
print(x1!)
}
else {
print("nil")
}
옵셔널을 언래핑하는 여러가지 방법
var x : String? = "Hi"
print(x!)
if let a = x {
print(a)
}
let b = x?.count
print(b!)
let c = x ?? ""
print(c)
- Forced unwrapping - unsafe.
x! - Optional binding - safe.
if let a = x {
print(a)
} - Optional chaning - safe.
let b = x?.count - Nil coalescing operator - safe.
let x = x ?? ""
Optional Chaining 쓰는 이유
- 옵셔널 타입으로 정의된 값이 프로퍼티나 메서드를 가지고 있을 때, 다중 if를 쓰지 않고 간결하게 코드를 작성하기 위해
- 옵셔널 타입의 데이터는 연산이 불가능함
- 연산을 하기 위해서는 옵셔널을 해제 해야 하는데, 많은 양의 옵셔널 타입의 데이터의 경우 다시 한 번 옵셔널 타입으로 변경을 하면서 해제를 시켜줌
if let s = p.sns {
if let f = s.fb {
print("\(f.account)")
}
}
print("\(p.sns!.fb!.account)")
print("\(p.sns?.fb?.account)") // 옵셔널 체인, 옵셔널 타입이 됨
Optional Chaining 예
- 옵셔널의 프로퍼티나 메서드 호출 뒤에 "?" 사용
선언할 때는 자료형 뒤에 "?" (Int?) - (pLocation?.coordinate.latitude)!
- tabBarController?.selectedIndex = 1
- cell.textLabel?.text = items[(indexPath as NSIndexPath).row]
- rectangleAdView?.delegate = self
- audioPlayer?.volume = columeControl.value
- audioRecorder?.recording
- audioRecorder?.record()
- locationManager?.requestWhenInUseAutorization()
- 옵셔널 요소 내부의 프로퍼티로 옵셔널이 연속적으로 연결되는 경우 유용
- 클래스나 구조체 안에 또 다른 클래스나 구조체 인스턴스가 있을 때 인스턴스를 점으로 연속해서 접근
- 프로퍼티가 옵셔널인 경우 nil인지 아닌지 매번 체크를 해야하므로 번거로움
class Person {
var age : Int = 1
var addr : Address?
}
class Address {
var city = "Seoul"
}
let kim = Person() // kim의 addr은 nil로 초기화
print(kim.addr!.city) // crash, 강제 언래핑
print(kim.addr?.city) // nil, 옵셔널 체이닝하면 최종 결과가 옵셔널로 나옴, 결과가 없으면 nil
Optional chain 예제
class Person {
var name : String?
var age : Int?
var sns : SNS()
}
class SNS {
var fb : FaceBook? = FaceBook()
var tt : Twitter?
}
class FaceBook {
var account : String = "aaa@bbb.com"
}
class Twitter {
var account : String = ""
}
let p = Person()
if let s = p.sns {
if let f = s.fb {
print("1:\(f.account)")
}
}
if let account = p.sns?.fb?.account {
print("2: \(account)")
}
print("3: \(p.sns?.fb?.account)!)")
print("4: \(p.sns!.fb!.account)")
//print("5: \(p.sns?.tt?.account)") // nil
//print("6: \(p.sns!.tt!.account)") // 오류
'iOS프로그래밍기초(Smile Han) > 문법 정리' 카테고리의 다른 글
[Swift] 문법 정리 - 오류 처리(Error Handling), Generic<> (0) | 2024.12.01 |
---|---|
[Swift] 문법 정리 - 클래스(class) vs 구조체(struct) vs 열거형(enum) (0) | 2024.11.24 |
[Swift] 문법 정리 - 열거형(enum) (1) | 2024.11.17 |
[Swift] 문법 정리 - extension, Swift 접근 제어(access control), 프로토콜(protocol) (0) | 2024.11.17 |
[Swift] 문법 정리 - 상속 (3) | 2024.11.10 |