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>