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.
    }

}


댓글 없음:

댓글 쓰기

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

'일론 머스크' '젠슨 황' AI 리더들, 그들의 성공 비결은 바로 이것 - 누가 부자가 되는가 영상입니다. ㅎㅎ

  책을 통해서만 접했던 내용들을 영상으로 보니 더 실감이 납니다. KBS에서 방송된 내용인데 주말에 보시면 좋은 영상입니다. 엔비디아의 주가가 이해가 됩니다. ㅋㅋ 생각보다 미국시장이 강한 것이 AI는 거의 미국과 중국이 주도하는 시장이 되고 있습...