iOS프로그래밍기초(Smile Han)/문법 정리
[Swift] 문법 정리 - 오류 처리(Error Handling), Generic<>
wse46
2024. 12. 1. 23:44
https://youtu.be/R8OWOgCNt4M?si=bldau6gYEZ3seGj2
위 영상을 보고 정리한 글입니다. (39:30 ~ 42:31)
# throwing function
매개변수 괄호 다음에 throws라는 키워드가 있는 함수는 그냥 사용할 수 없고 error handling을 해야 함
func can() throws
- error handling을 해야하는 함수
func canThrowErrors() throws -> String
- error handling 할 수 없는 함수
func cannotThrowErrors() -> String
# 오류 발생 가능 함수의 호출 방식 : do~try~catch
do {
audioPlayer = try AVAudioPlayer(contentsOf: audioFile)
} catch let error as NSError {
print("Error~initPlay : \(error)")
}
- AVAudioPlater(contentsOf: audioFile)
위처럼 호출은 불가 - do~try~catch로 error handling 하지 않으면 오류 발생
"Call can throw, but it is not marked with 'try' and the error is not handled"
# do~catch을 이용한 error handling
do {
try 오류 발생 코드
오류가 발생하지 않으면 실행할 코드
} catch 오류패턴1 {
처리 코드
} catch 오류패턴2 where 조건 {
처리 코드
} catch {
처리 코드
}
# Generic <>
기능은 같고 매개변수형만 다른 함수
func swapInt(_ a: inout Int, _ b: inout Int) {
let temp = a
a = b
b = temp
}
func swapDouble(_ a: inout Double, _ b: inout Double) {
let temp = a
a = b
b = temp
}
func swapString(_ a: inout String, _ b: inout String) {
let temp = a
a = b
b = temp
}
func swapAny<T>(_ a: inout T, _ b: inout T) {
let temp = a
a = b
b = temp
} //T는 type이름
func swapAny<T>(_ a: inout T, _ b: inout T) {
let temp = a
a = b
b = temp
}
var x = 10
var y = 20
swapAny(&x, &y)
print(x, y)
var xd = 10.3
var yd = 20.7
swapAny(&xd, &yd)
print(xd, yd)
var xs = "Hi"
var ys = "Hello"
swapAny(&xs, &ys)
print(xs, ys)
- 출력값
20 10
20.7 10.3
Hello Hi
# 일반 구조체 vs generic 구조체
- 일반 구조체
struct IntStack {
var items = [Int]()
mutating func push(_ item: Int) {
items.append(item)
}
mutating func pop() -> Int {
return item.removeLast()
}
}
- 구조체는 value타입이라 메서드 안에서 프로퍼티 값 변경 불가
- mutating 키워드를 쓰면 가능
- generic 구조체
struct Stack <T> {
var items = [T]()
mutating func push(_ item: T) {
items.append(item)
}
mutating func pop() -> T {
return items.removeLast()
}
}
- Generic 스택 구조체에서 Int형 사용
var stackOfInt = Stack<Int>()
//var stackOfInt = IntStack()
print(stackOfInt.items) // []
stackOfInt.push(1)
print(stackOfInt.items) // [1]
stackOfInt.push(2)
print(stackOfInt.items) // [1, 2]
stackOfInt.push(3)
print(stackOfInt.items) // [1, 2, 3]
print(stackOfInt.pop()) // 3
print(stackOfInt.items) // [1, 2]
print(stackOfInt.pop()) // 2
print(stackOfInt.items) // [1]
print(stackOfInt.pop()) // 1
print(stackOfInt.items) // []
- 출력값
[]
[1]
[1, 2]
[1, 2, 3]
3
[1, 2]
2
[1]
1
[]
- Generic 스택 구조체에서 Int형, String형 사용
var stackOfInt = Stack<Int>()
stackOfInt.push(1)
print(stackOfInt.items) // [1]
stackOfInt.push(2)
print(stackOfInt.items) // [1, 2]
print(stackOfInt.pop()) // 2
print(stackOfInt.items) // [1]
print(stackOfInt.pop()) // 1
var stackOfString = Stack<String>()
stackOfString.push("일")
print(stackOfString.items) // ["일"]
stackOfString.push("이")
print(stackOfString.items) // ["일", "이"]
print(stackOfString.pop()) // "이"
print(stackOfString.items) // ["일"]
print(stackOfString.pop()) // "일"
- 출력값
[1]
[1, 2]
2
[1]
1
["일"]
["일", "이"]
"이"
["일"]
"일"
# Swift의 배열도 generic 구조체
var x : [Int] = [] // 빈 배열
var y = [Int]()
var z : Array<Int> = []
var a : [Int] = [1, 2, 3, 4]
// var a = [1, 2, 3, 4]
var b : Array<Int> = [1, 2, 3, 4]
// var b = [1, 2, 3, 4]
var c : Array<Double> = [1.2, 2.3, 3.5, 4.1]
// var c = [1.2, 2.3, 3.5, 4.1]
- @frozen은 저장 프로퍼티 추가, 삭제 불가
@frozen struct Array<Element>