ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 웹개발자의 iOS 개발기(5) - 예외 처리, 프로토콜, 제네릭
    iOS 2025. 1. 24. 22:57

    예외 처리, 프로토콜, 제네릭에 대하여 공부해 보았습니다.

    01. 예외처리 - 만약 에러가 발생한다면?

    import SwiftUI
    
    struct _1_Exception: View {
        
        @State var inputNumber = ""
        @State var resultNumber: Float = 0
        
        var body: some View {
            VStack {
                TextField("나눌 숫자를 입력해주세요", text: $inputNumber)
                Text("나눈 결과는 다음과 같아요 \\(resultNumber)")
                Button {
                    
                    do {
                        try resultNumber = devideTen(with: (Float(inputNumber) ?? 1.0))
                    } catch DivideError.dividedByZero {
                        print("0으로 나누었대요")
                        resultNumber = 0
                    } catch {
                        print(error.localizedDescription)
                    }
                    
                } label: {
                    Text("나누기")
                }
            }
        }
        
        func devideTen(with inputNumber: Float) throws -> Float {
            var result: Float = 0
            
            if inputNumber == 0 {
                throw DivideError.dividedByZero
            } else {
                result = 10 / inputNumber
            }
            
            return result
        }
    }
    
    enum DivideError: Error {
        case dividedByZero
    }
    
    #Preview {
        _1_Exception()
    }
    
    

    02. 프로토콜 - 설계하고 설계대로 만드는 방법

    import SwiftUI
    
    struct _2_Protocol: View {
        
        var myCar: KIA = KIA()
        var broCar: Hyundai = Hyundai()
        let cars: [Driveable] = [KIA(), Hyundai()]
        
        @State var speed: Int = 10
        
        var body: some View {
            VStack {
                Text("speed : \\(speed)")
                
                Button {
                    //speed = myCar.speedDown(with: speed)
                    speed = broCar.speedDown(with: speed)
                } label: {
                    Text("감속!")
                }
            }
            
    //        ForEach(cars) { item in
    //            
    //        }
            
        }
    }
    
    /*
     * 위의 ForEach를 수행하기 위해서 Identifiable 키워드 사용
     * 자동으로 var id: ObjectIdentifier도 생성된다.
     */
    //struct KIA: Driveable, Identifiable {
    struct KIA: Driveable {
        
        //var id: ObjectIdentifier
        
        func speedDown(with speed: Int) -> Int {
            print("속도가 천천히 줄어듭니다.")
            return speed - 5
        }
    }
    
    struct Hyundai: Driveable {
        func speedDown(with speed: Int) -> Int {
            print("속도가 빠르게 줄어듭니다.")
            return speed - 9
        }
    }
    
    protocol Driveable {
        func speedDown(with speed: Int) -> Int
    }
    
    #Preview {
        _2_Protocol()
    }
    
    

    자바의 인터페이스와 유사

    03. 제네릭 - 모든 타입을 커버하는 방법

    제네릭

    • 타입에 의존하지 않는 범용코드
    import SwiftUI
    
    struct _3_Generic: View {
        
        @State var input = ""
        //@State var myStack = MyStack()
        //@State var myFloatStack = MyFloatStack()
        @State var myStack = MyStack<Int>()
        
        var body: some View {
            VStack {
                TextField("숫자를 입력해주세요", text: $input)
                Button{
                    myStack.insertValue(input: Int(input) ?? 0)
                } label: {
                    Text("저장")
                }
                Button {
                    myStack.showData()
                } label: {
                    Text("출력")
                }
            }
            
        }
    }
    
    //struct MyStack {
    //    var data: [Int] = []
    //    
    //    mutating func insertValue(input: Int) {
    //        data.append(input)
    //    }
    //    
    //    func showData() {
    //        data.forEach { item in
    //            print(item)
    //        }
    //    }
    //}
    
    /*
     Generic을 사용하지 않으면 타입별 구조체를 생성해야 한다.
     */
    //struct MyFloatStack {
    //    var data: [Float] = []
    //    
    //    mutating func insertValue(input: Float) {
    //        data.append(input)
    //    }
    //    
    //    func showData() {
    //        data.forEach { item in
    //            print(item)
    //        }
    //    }
    //}
    
    /*
     Generic을 이용한 리팩토링
     */
    struct MyStack<T> {
        var data: [T] = []
        
        mutating func insertValue(input: T) {
            data.append(input)
        }
        
        func showData() {
            data.forEach { item in
                print(item)
            }
        }
    }
    
    #Preview {
        _3_Generic()
    }
    
    
Designed by Tistory.