2015년 11월 5일 목요일

Swift 2.0에 추가된 에러 처리 구문에 대한 데모입니다. xCode 7.1에서 실행하면 됩니다.

 Swift 2.0에 추가된 에러 처리 구문에 대한 데모입니다. xCode 7.1에서 실행하면 됩니다.
  1. 1. DyTryCatch프로젝트를 싱글뷰로 생성한다. 언어는  스위프트 
  2. 2. Date.swift파일을 추가한다
  3. 3. 아래와 같이 코딩한다.
//
//  Date.swift
//  DoTryCatch
//
//  Created by papasmf1 on 2015. 11. 6..
//  Copyright © 2015 com.mulcam70. All rights reserved.
//

import Foundation

//에러 타입에서 사용되는 열거형을 정의할 때는 반드시 ErrorType이라는 
//프로토콜을 구현해야 한다(내부에 아무런 멤버도 선언되어 있지 않다. 이름만 약속!)
enum DateParseError : ErrorType {
    case OverSizeString
    case UnderSizeString
    case IncorrectFormat(part:String)
    case IncorrectData(part:String)
}

struct Date {
    var year : Int
    var month : Int
    var date : Int
}

func parseDate(param:NSString) throws -> Date {
    //입력된 문자열의 길이가 10 아닐 경우 분석이 불가능하므로 오류
    guard param.length == 10 else {
        if param.length > 10 {
            throw DateParseError.OverSizeString
        } else {
            throw DateParseError.UnderSizeString
        }
    }
    
    //반환할 객체 타입 선언
    var dateResult = Date(year: 0, month: 0, date: 0)
    
    //연도 정보 분석
    if let year = Int(param.substringWithRange(NSRange(location: 0, length: 4)))
    {
        dateResult.year = year
    } else {
        //연도 분석 오류
        throw DateParseError.IncorrectFormat(part: "year")
    }
    
    // 정보 분석
    if let month = Int(param.substringWithRange(NSRange(location: 5, length: 2))) {
        //월에 대한 값은 1 ~ 12까지만 가능하므로 외의 범위는 잘못된 값으로 처리 
        guard month > 0 && month < 13 else {
            throw DateParseError.IncorrectData(part: "month")
        }
        dateResult.month = month
    } else {
        // 분석 오류
    }
    
    if let date = Int(param.substringWithRange(NSRange(location: 8, length: 2))) {
        //일에 대한 값은 1 ~ 31까지만 가능하므로 외의 범위는 잘못된 값으로 처리 
        guard date>0 && date<32 else {
            throw DateParseError.IncorrectData(part: "date")
        }
        dateResult.date = date
    } else {
        // 분석 오류 
        throw DateParseError.IncorrectFormat(part: "date")
    }
    
    return dateResult
}

  1. 4. ViewController.swift파일에 아래와 같이 코드를 추가한다.
//
//  ViewController.swift
//  DoTryCatch
//
//  Created by papasmf1 on 2015. 11. 6..
//  Copyright © 2015 com.mulcam70. All rights reserved.
//

import UIKit

class ViewController: UIViewController {

    func getPartsDate(param: String, type: String) {
        do {
            
            //호출할 이름 앞에 try키워드를 붙여야 한다
            //try키워드 없이 함수를 호출하면 컴파일러에 의한 오류가 발생한다.
            let date = try parseDate(param)
            
            switch type {
                case "year":
                    print("\(date.year) 입니다")
                case "month":
                    print("\(date.month) 입니다")
                case "date":
                    print("\(date.date) 입니다")
                default:
                    print("입력값에 해당하는 날짜정보가 없습니다.")
            }
        } catch DateParseError.OverSizeString {
            print("입력된 문자열이 너무 깁니다. 줄여주세요")
        } catch DateParseError.UnderSizeString {
            print("입력된 문자열이 불충분합니다. 줄여주세요")
        } catch DateParseError.IncorrectFormat(let part) {
            print("입력값의\(part) 해당하는 형식이 잘못되었습니다.")
        } catch DateParseError.IncorrectData(let part) {
            print("입력값의\(part) 해당하는 형식이 잘못되었습니다.")
        } catch {
            print(" 없는 오류가 발생했습니다.")
        }
        
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        
        getPartsDate("2015-12-31", type: "year")
        //(출력)
        //2015 입니다

        getPartsDate("2015-12-31", type: "month")
        //12 입니다

        getPartsDate("2015-13-31", type: "month")
        //입력값의month 해당하는 형식이 잘못되었습니다.
        
        getPartsDate("2015-12-40", type: "date")
        //입력값의date 해당하는 형식이 잘못되었습니다.
        
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

}


댓글 없음:

댓글 쓰기

참고: 블로그의 회원만 댓글을 작성할 수 있습니다.

5월 14일 새벽에 chatGPT 4o가 발표되었습니다. 옵티마이즈, 옴니라는 의미인데 실시간 통역, 다자간 회의, 멀티모달 기능의 강화등이 보이네요.

  초격차로 OpenAI진영이 다시 앞서가는 모양을 보여주고 있습니다. 저도 새벽에 일어나자 마자 올라온 영상들과 글을 정리하고 있습니다. ㅎㅎ 영화 HER의 사진이 새벽에 많이 올라왔었는데 저도 안본 영화입니다. 주말에 한번 봐야 할 것 같습니다....